fragment-tools 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/package.json +6 -7
  2. package/src/cli/createConfig.js +4 -0
  3. package/src/cli/plugins/sketches.js +44 -0
  4. package/src/client/app/components/Init.svelte +1 -1
  5. package/src/client/app/modules/Params.svelte +2 -4
  6. package/src/client/app/renderers/FragmentRenderer.js +1 -1
  7. package/src/client/app/state/Sketch.svelte.js +10 -0
  8. package/src/client/app/state/rendering.svelte.js +6 -3
  9. package/src/client/app/state/sketches.svelte.js +4 -2
  10. package/src/client/app/ui/Field.svelte +2 -6
  11. package/src/client/app/ui/FieldSection.svelte +5 -2
  12. package/src/client/app/ui/FieldTrigger.svelte +3 -3
  13. package/src/client/app/ui/FieldTriggers.svelte +2 -4
  14. package/src/client/app/ui/ModuleRenderer.svelte +0 -1
  15. package/src/client/app/ui/SketchRenderer.svelte +8 -6
  16. package/src/client/app/ui/fields/ButtonInput.svelte +5 -5
  17. package/src/client/app/ui/fields/ColorInput.svelte +8 -2
  18. package/src/client/app/ui/fields/IntervalInput.svelte +6 -5
  19. package/src/client/app/ui/fields/ProgressInput.svelte +1 -1
  20. package/src/client/index.html +3 -3
  21. package/src/client/public/css/global.css +1 -1
  22. package/screenshot.png +0 -0
  23. package/src/client/public/icons/chevron-bottom.svg +0 -3
  24. package/src/client/public/icons/chevron-right.svg +0 -3
  25. package/src/client/public/icons/chevron-top.svg +0 -3
  26. package/src/client/public/icons/columns-horizontal.svg +0 -4
  27. package/src/client/public/icons/columns-vertical.svg +0 -4
  28. package/src/client/public/icons/folder-plus.svg +0 -6
  29. package/src/client/public/icons/lock.svg +0 -4
  30. package/src/client/public/icons/picture-in-picture.svg +0 -4
  31. package/src/client/public/icons/trash.svg +0 -5
  32. package/src/client/public/icons/trigger.svg +0 -8
  33. package/src/client/public/icons/unlock.svg +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fragment-tools",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "A web development environment for creative coding",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -21,20 +21,19 @@
21
21
  },
22
22
  "homepage": "https://github.com/raphaelameaume/fragment#readme",
23
23
  "dependencies": {
24
- "@clack/core": "^0.3.3",
25
- "@sveltejs/vite-plugin-svelte": "^4.0.0-next.4",
26
- "body-parser": "^1.20.0",
24
+ "@clack/core": "^0.4.2",
25
+ "@sveltejs/vite-plugin-svelte": "^5.0.3",
26
+ "body-parser": "^2.2.0",
27
27
  "changedpi": "^1.0.4",
28
- "chokidar": "^3.5.2",
29
28
  "convert-length": "^1.0.1",
30
- "get-port": "^6.0.0",
29
+ "get-port": "^7.1.0",
31
30
  "gifenc": "^1.0.3",
32
31
  "glslify": "^7.1.1",
33
32
  "is-unicode-supported": "^2.0.0",
34
33
  "kleur": "^4.1.4",
35
34
  "sade": "^1.7.4",
36
35
  "svelte": "^5.19.0",
37
- "vite": "^5.4.12",
36
+ "vite": "^6.3.5",
38
37
  "webm-writer": "^1.0.0",
39
38
  "ws": "^8.2.3"
40
39
  },
@@ -6,6 +6,7 @@ import { svelte } from '@sveltejs/vite-plugin-svelte';
6
6
  import checkDependencies from './plugins/check-dependencies.js';
7
7
  import { file } from './utils.js';
8
8
  import { log } from './log.js';
9
+ import sketches from './plugins/sketches.js';
9
10
 
10
11
  export async function loadConfig({ cwd, filepath }) {
11
12
  try {
@@ -58,6 +59,7 @@ export async function createConfig(
58
59
  ) {
59
60
  const entriesPaths = entries.map((entry) => path.join(cwd, entry));
60
61
  const root = file('../client');
62
+ const publicDir = path.join(cwd, 'public');
61
63
  const app = path.join(root, 'app');
62
64
 
63
65
  log.info(`Creating Vite configuration...`);
@@ -72,6 +74,7 @@ export async function createConfig(
72
74
  configFile: false,
73
75
  root,
74
76
  logLevel: dev ? 'info' : 'silent',
77
+ publicDir,
75
78
  resolve: {
76
79
  alias: [
77
80
  {
@@ -110,6 +113,7 @@ export async function createConfig(
110
113
  entriesPaths,
111
114
  build,
112
115
  }),
116
+ sketches({ cwd, entries }),
113
117
  ],
114
118
  define: {
115
119
  __CWD__: `${JSON.stringify(cwd)}`,
@@ -0,0 +1,44 @@
1
+ import path from 'node:path';
2
+
3
+ export default function sketches({ cwd, entries }) {
4
+ const virtualModuleId = 'virtual:sketches';
5
+ const resolvedVirtualModuleId = '\0' + virtualModuleId;
6
+
7
+ return {
8
+ name: 'fragment-plugin-sketches',
9
+ resolveId(id) {
10
+ if (id === virtualModuleId) {
11
+ return resolvedVirtualModuleId;
12
+ }
13
+ },
14
+ load(id) {
15
+ if (id === resolvedVirtualModuleId) {
16
+ return `
17
+ export const sketches = {
18
+ ${entries
19
+ .map((entry) => {
20
+ const entryPath = path.join(cwd, entry);
21
+
22
+ return `"${entry}": () => import("${entryPath}")`;
23
+ })
24
+ .join(',')}
25
+ };
26
+
27
+ export const onSketchReload = (fn) => {
28
+ if (import.meta.hot) {
29
+ import.meta.hot.data.onSketchChange = fn;
30
+ }
31
+ };
32
+
33
+ if (import.meta.hot) {
34
+ import.meta.hot.accept((m) => {
35
+ if (typeof import.meta.hot.data.onSketchChange === "function") {
36
+ import.meta.hot.data.onSketchChange(m);
37
+ }
38
+ });
39
+ }
40
+ `;
41
+ }
42
+ },
43
+ };
44
+ }
@@ -1,7 +1,7 @@
1
1
  <script>
2
2
  import { assignSketchFiles } from '../triggers/shared.js';
3
3
  import { sketchesManager } from '../state/sketches.svelte.js';
4
- import { onSketchReload } from '@fragment/sketches';
4
+ import { onSketchReload } from 'virtual:sketches';
5
5
  import { getFilename } from '../utils/file.utils.js';
6
6
  import '../utils/glslErrors.js';
7
7
 
@@ -139,8 +139,6 @@
139
139
  disabled,
140
140
  __initialValue: initialValue,
141
141
  } = prop}
142
- {@const isDisabled =
143
- typeof disabled === 'function' ? disabled() : disabled}
144
142
  {#if !hidden}
145
143
  <Field
146
144
  context={sketch.key}
@@ -150,9 +148,9 @@
150
148
  {initialValue}
151
149
  {type}
152
150
  {index}
153
- disabled={isDisabled}
151
+ {disabled}
154
152
  bind:params={sketchProps[key].params}
155
- triggers={prop.triggers}
153
+ bind:triggers={prop.triggers}
156
154
  onclick={(event) => {
157
155
  sketch.version++;
158
156
  // value(event, sketch.params);
@@ -15,7 +15,7 @@ export let onMountPreview = ({ canvas, id }) => {
15
15
  frag,
16
16
  });
17
17
 
18
- return { frag };
18
+ return { canvas, frag };
19
19
  };
20
20
 
21
21
  export let onResizePreview = ({ id, width, height, pixelRatio }) => {
@@ -199,6 +199,10 @@ class Sketch {
199
199
  typeof instanceProp.hidden === 'function'
200
200
  ? instanceProp.hidden
201
201
  : () => instanceProp.hidden;
202
+ let __disabled =
203
+ typeof instanceProp.disabled === 'function'
204
+ ? instanceProp.disabled
205
+ : () => instanceProp.disabled;
202
206
 
203
207
  let initialValue = deepClone(value);
204
208
 
@@ -215,6 +219,9 @@ class Sketch {
215
219
  __initialValue: initialValue,
216
220
  __currentValue: deepClone(value),
217
221
  __hidden,
222
+ __disabled,
223
+ hidden: __hidden(),
224
+ disabled: __disabled(),
218
225
  type,
219
226
  params: structuredClone(params),
220
227
  triggers,
@@ -256,6 +263,7 @@ class Sketch {
256
263
 
257
264
  Object.keys(this.props).forEach((key) => {
258
265
  this.props[key].hidden = this.props[key].__hidden();
266
+ this.props[key].disabled = this.props[key].__disabled();
259
267
  });
260
268
 
261
269
  this.version++;
@@ -438,6 +446,8 @@ class Sketch {
438
446
 
439
447
  // sync hidden
440
448
  prop.hidden = prop.__hidden();
449
+ // sync disabled state
450
+ prop.disabled = prop.__disabled();
441
451
 
442
452
  // sync params
443
453
  if (instanceProp.params) {
@@ -150,7 +150,7 @@ class Rendering {
150
150
  }
151
151
 
152
152
  findRenderer({ renderingMode }) {
153
- return this.renderers[renderingMode].instance;
153
+ return this.renderers[renderingMode]?.instance;
154
154
  }
155
155
 
156
156
  override(config) {
@@ -605,7 +605,7 @@ export class Render {
605
605
  return;
606
606
  }
607
607
 
608
- this.record = await exports.record(this.canvas, {
608
+ this.record = exports.record(this.canvas, {
609
609
  filename: sketch.key,
610
610
  pattern: sketch.filenamePattern,
611
611
  exportDir: sketch.exportDir,
@@ -627,6 +627,8 @@ export class Render {
627
627
  onComplete: (params) => {
628
628
  sketch.afterRecord.forEach((fn) => fn(params));
629
629
  this.record = null;
630
+ this.paused = false;
631
+ this.recording = false;
630
632
  },
631
633
  });
632
634
  }
@@ -647,7 +649,8 @@ export class Render {
647
649
  this.sketch.instance?.dispose?.();
648
650
  this.sketch.reset();
649
651
 
650
- this.init();
652
+ this.loading = false;
653
+ this.loaded = false;
651
654
  } catch (error) {
652
655
  console.error(error);
653
656
  displayError(error, this.sketch.key);
@@ -1,5 +1,7 @@
1
1
  import { displayError } from '../state/errors.svelte.js';
2
- import { sketches as all } from '@fragment/sketches';
2
+
3
+ import { sketches as all } from 'virtual:sketches';
4
+
3
5
  import Sketch from './Sketch.svelte.js';
4
6
  import { rendering } from './rendering.svelte.js';
5
7
  import { removeHotListeners } from '../triggers/index.js';
@@ -15,7 +17,7 @@ class SketchesManager {
15
17
 
16
18
  await rendering.preloadRenderer({
17
19
  renderingMode: sketch.rendering,
18
- renderer: sketch.renderer,
20
+ customRenderer: sketch.renderer,
19
21
  });
20
22
 
21
23
  return sketch;
@@ -52,7 +52,7 @@
52
52
  onchange,
53
53
  onclick = () => {},
54
54
  children,
55
- triggers = [],
55
+ triggers = $bindable([]),
56
56
  } = $props();
57
57
 
58
58
  let showTriggers = $state(false);
@@ -165,7 +165,7 @@
165
165
  {#if triggerable}
166
166
  <FieldSection {key} visible={showTriggers} secondary>
167
167
  <FieldTriggers
168
- {triggers}
168
+ bind:triggers
169
169
  {onTrigger}
170
170
  {context}
171
171
  triggerable={fieldType === fieldTypes.BUTTON}
@@ -222,10 +222,6 @@
222
222
  padding-bottom: 0px !important;
223
223
  }
224
224
 
225
- .field.disabled {
226
- pointer-events: none;
227
- }
228
-
229
225
  .field__actions {
230
226
  display: flex;
231
227
  align-items: center;
@@ -16,6 +16,7 @@
16
16
  class="field__section"
17
17
  class:visible
18
18
  class:secondary
19
+ class:disabled
19
20
  class:nameless={displayName === null}
20
21
  >
21
22
  <div class="field__infos">
@@ -48,8 +49,10 @@
48
49
  grid-template-columns: 1fr;
49
50
  }
50
51
 
51
- :global(body:not(.fragment-dragging)) .field__section:hover .field__label,
52
- .field__section:focus-within .field__label {
52
+ :global(body:not(.fragment-dragging))
53
+ .field__section:not(.disabled):hover
54
+ .field__label,
55
+ .field__section:not(.disabled):focus-within .field__label {
53
56
  opacity: 1;
54
57
  }
55
58
 
@@ -51,7 +51,7 @@
51
51
  onchange = () => {},
52
52
  onTrigger = () => {},
53
53
  onDelete = () => {},
54
- params = { key: [] },
54
+ params = $bindable({ key: [] }),
55
55
  } = $props();
56
56
 
57
57
  let validInputs = $derived.by(() =>
@@ -202,11 +202,11 @@
202
202
  />
203
203
  {/if}
204
204
  {#if inputType === 'Keyboard'}
205
- <TextInput value={key} label="key" oninput={onTextChange} />
205
+ <TextInput bind:value={key} label="key" oninput={onTextChange} />
206
206
  {/if}
207
207
  {#if inputType === 'MIDI'}
208
208
  <TextInput
209
- value={key}
209
+ bind:value={key}
210
210
  label={['onNoteOn', 'onNoteOff'].includes(eventName)
211
211
  ? 'note'
212
212
  : 'number'}
@@ -31,17 +31,15 @@
31
31
  {#each triggers as trigger, index}
32
32
  <FieldTrigger
33
33
  {index}
34
+ bind:triggers
34
35
  inputType={trigger.inputType}
35
36
  eventName={trigger.eventName}
36
- params={trigger.params}
37
+ bind:params={trigger.params}
37
38
  enabled={trigger.enabled}
38
39
  {onTrigger}
39
40
  {context}
40
41
  {controllable}
41
42
  {triggerable}
42
- onchange={(index, trigger) => {
43
- triggers[index] = trigger;
44
- }}
45
43
  onDelete={onTriggerDelete}
46
44
  />
47
45
  {/each}
@@ -51,7 +51,6 @@
51
51
  Something went wrong while loading module:
52
52
  <span class="module-name">{name}</span>
53
53
  </p>
54
- <p class="error">{error.message}</p>
55
54
  </div>
56
55
  </div>
57
56
  </div>
@@ -63,6 +63,14 @@
63
63
  };
64
64
  });
65
65
 
66
+ $effect(() => {
67
+ if (exports.recording && !render?.recording) {
68
+ render.startRecording();
69
+ } else if (render?.recording && !exports.recording) {
70
+ render.stopRecording();
71
+ }
72
+ });
73
+
66
74
  function checkForRefresh(event) {
67
75
  if (!event.metaKey && !event.ctrlKey) {
68
76
  event.preventDefault();
@@ -97,12 +105,6 @@
97
105
  function checkForRecord(event) {
98
106
  if (event.shiftKey) {
99
107
  exports.recording = !exports.recording;
100
-
101
- if (exports.recording && !render.recording) {
102
- render.startRecording();
103
- } else if (render.recording && !exports.recording) {
104
- render.stopRecording();
105
- }
106
108
  }
107
109
  }
108
110
 
@@ -11,7 +11,7 @@
11
11
  } = $props();
12
12
  </script>
13
13
 
14
- <div class="button-container" class:disabled>
14
+ <div class="button-input" class:disabled>
15
15
  <button
16
16
  class="button"
17
17
  {disabled}
@@ -26,7 +26,7 @@
26
26
  </div>
27
27
 
28
28
  <style>
29
- .button-container {
29
+ .button-input {
30
30
  display: flex;
31
31
  width: 100%;
32
32
  }
@@ -57,15 +57,15 @@
57
57
  color: var(--color-text-input-disabled);
58
58
  }
59
59
 
60
- :global(body:not(.fragment-dragging)) .button:hover {
60
+ :global(body:not(.fragment-dragging)) .button:not(:disabled):hover {
61
61
  color: var(--color-text);
62
62
 
63
63
  box-shadow: inset 0 0 0 1px
64
64
  var(--box-shadow-color-active, var(--color-active));
65
65
  }
66
66
 
67
- :global(body:not(.fragment-dragging)) .button:active,
68
- :global(body:not(.fragment-dragging)) .button:focus-visible {
67
+ :global(body:not(.fragment-dragging)) .button:not(:disabled):active,
68
+ :global(body:not(.fragment-dragging)) .button:not(:disabled):focus-visible {
69
69
  box-shadow: 0 0 0 2px
70
70
  var(--box-shadow-color-active, var(--color-active));
71
71
  }
@@ -217,7 +217,9 @@
217
217
  pointer-events: none;
218
218
  }
219
219
 
220
- :global(body:not(.fragment-dragging)) .mirror:hover {
220
+ :global(body:not(.fragment-dragging))
221
+ .color-input:not(.disabled)
222
+ .mirror:hover {
221
223
  box-shadow: inset 0 0 0 1px var(--box-shadow-color, var(--color-active));
222
224
  }
223
225
 
@@ -229,8 +231,12 @@
229
231
  width: 100%;
230
232
  height: 100%;
231
233
  opacity: 0;
232
- cursor: pointer;
234
+
233
235
  background: transparent;
234
236
  border: none;
235
237
  }
238
+
239
+ .color-input:not(.disabled) .input {
240
+ cursor: pointer;
241
+ }
236
242
  </style>
@@ -81,7 +81,7 @@
81
81
  value[0] = newValues[0];
82
82
  value[1] = newValues[1];
83
83
 
84
- onchange(value);
84
+ onchange(newValues);
85
85
  }
86
86
  }
87
87
 
@@ -94,9 +94,10 @@
94
94
  }
95
95
 
96
96
  function handleValueChange(index, newValue) {
97
- value[index] = newValue;
97
+ let newValues = [...value];
98
+ newValues[index] = newValue;
98
99
 
99
- onchange(value);
100
+ onchange(newValues);
100
101
  }
101
102
 
102
103
  $effect(() => {
@@ -141,7 +142,7 @@
141
142
  {max}
142
143
  progress={false}
143
144
  value={value[0]}
144
- on:change={(event) => handleValueChange(0, event.detail)}
145
+ onchange={(event) => handleValueChange(0, event)}
145
146
  />
146
147
  <NumberInput
147
148
  {label}
@@ -154,7 +155,7 @@
154
155
  {max}
155
156
  progress={false}
156
157
  value={value[1]}
157
- on:change={(event) => handleValueChange(1, event.detail)}
158
+ onchange={(event) => handleValueChange(1, event)}
158
159
  />
159
160
  </div>
160
161
  </FieldInputRow>
@@ -87,7 +87,7 @@
87
87
  aria-valuemin={min}
88
88
  aria-valuemax={max}
89
89
  aria-valuenow={value}
90
- tabindex="0"
90
+ tabindex={disabled ? -1 : 0}
91
91
  >
92
92
  <div
93
93
  class="fill"
@@ -2,9 +2,9 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
- <link rel="icon" href="/favicon.ico" />
5
+ <link rel="icon" href="./public/favicon.ico" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <link rel="stylesheet" href="/css/global.css" />
7
+ <link rel="stylesheet" href="./public/css/global.css" />
8
8
  <title>fragment</title>
9
9
  </head>
10
10
  <body>
@@ -13,6 +13,6 @@
13
13
  <span class="loading__step">▢ Loading dependencies...</span>
14
14
  </div>
15
15
  <div id="app"></div>
16
- <script type="module" src="/main.js"></script>
16
+ <script type="module" src="./main.js"></script>
17
17
  </body>
18
18
  </html>
@@ -8,7 +8,7 @@
8
8
  local('Jetbrains-Mono-Regular'),
9
9
  local('Jetbrains Mono'),
10
10
  local('Jetbrains-Mono'),
11
- url('/fonts/JetBrainsMono-Regular.woff2') format('woff2');
11
+ url('../fonts/JetBrainsMono-Regular.woff2') format('woff2');
12
12
  }
13
13
 
14
14
  :root {
package/screenshot.png DELETED
Binary file
@@ -1,3 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15.25 10.75L12 14.25L8.75 10.75"></path>
3
- </svg>
@@ -1,3 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M10.75 8.75L14.25 12L10.75 15.25"/>
3
- </svg>
@@ -1,3 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15.25 14.25L12 10.75L8.75 14.25"></path>
3
- </svg>
@@ -1,4 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"/>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 12L5 12"/>
4
- </svg>
@@ -1,4 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"/>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 5V19"/>
4
- </svg>
@@ -1,6 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V7.75H17.25C18.3546 7.75 19.25 8.64543 19.25 9.75V12.25"/>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13.5 7.5L12.5685 5.7923C12.2181 5.14977 11.5446 4.75 10.8127 4.75H6.75C5.64543 4.75 4.75 5.64543 4.75 6.75V11"/>
4
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M17 14.75V19.25"/>
5
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19.25 17L14.75 17"/>
6
- </svg>
@@ -1,4 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5.75 11.75C5.75 11.1977 6.19772 10.75 6.75 10.75H17.25C17.8023 10.75 18.25 11.1977 18.25 11.75V17.25C18.25 18.3546 17.3546 19.25 16.25 19.25H7.75C6.64543 19.25 5.75 18.3546 5.75 17.25V11.75Z"></path>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7.75 10.5V10.3427C7.75 8.78147 7.65607 7.04125 8.74646 5.9239C9.36829 5.2867 10.3745 4.75 12 4.75C13.6255 4.75 14.6317 5.2867 15.2535 5.9239C16.3439 7.04125 16.25 8.78147 16.25 10.3427V10.5"></path>
4
- </svg>
@@ -1,4 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7.25 17.25H6.75C5.64543 17.25 4.75 16.3546 4.75 15.25V6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V9.25"/>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M10.75 13.75C10.75 13.1977 11.1977 12.75 11.75 12.75H18.25C18.8023 12.75 19.25 13.1977 19.25 13.75V18.25C19.25 18.8023 18.8023 19.25 18.25 19.25H11.75C11.1977 19.25 10.75 18.8023 10.75 18.25V13.75Z"/>
4
- </svg>
@@ -1,5 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6.75 7.75L7.59115 17.4233C7.68102 18.4568 8.54622 19.25 9.58363 19.25H14.4164C15.4538 19.25 16.319 18.4568 16.4088 17.4233L17.25 7.75"/>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.75 7.5V6.75C9.75 5.64543 10.6454 4.75 11.75 4.75H12.25C13.3546 4.75 14.25 5.64543 14.25 6.75V7.5"/>
4
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 7.75H19"/>
5
- </svg>
@@ -1,8 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 8H7.25"></path>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12.75 8H19.25"></path>
4
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 16H12.25"></path>
5
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M17.75 16H19.25"></path>
6
- <circle cx="10" cy="8" r="2.25" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></circle>
7
- <circle cx="15" cy="16" r="2.25" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"></circle>
8
- </svg>
@@ -1,4 +0,0 @@
1
- <svg width="24" height="24" fill="none" viewBox="0 0 24 24">
2
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5.75 11.75C5.75 11.1977 6.19772 10.75 6.75 10.75H17.25C17.8023 10.75 18.25 11.1977 18.25 11.75V17.25C18.25 18.3546 17.3546 19.25 16.25 19.25H7.75C6.64543 19.25 5.75 18.3546 5.75 17.25V11.75Z"></path>
3
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7.75 10.5V9.84343C7.75 8.61493 7.70093 7.29883 8.42416 6.30578C8.99862 5.51699 10.0568 4.75 12 4.75C14 4.75 15.25 6.25 15.25 6.25"></path>
4
- </svg>