fragment-tools 0.1.20 → 0.2.1

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 (105) hide show
  1. package/bin/index.js +2 -2
  2. package/package.json +5 -6
  3. package/src/cli/build.js +1 -1
  4. package/src/cli/plugins/check-dependencies.js +19 -17
  5. package/src/cli/run.js +1 -1
  6. package/src/cli/templates/three-fragment/index.js +6 -6
  7. package/src/cli/templates/three-orthographic/index.js +3 -3
  8. package/src/cli/templates/three-perspective/index.js +3 -3
  9. package/src/client/app/actions/resize.js +14 -0
  10. package/src/client/app/components/HintLoading.svelte +94 -0
  11. package/src/client/app/components/HintPaused.svelte +88 -0
  12. package/src/client/app/components/HintRecord.svelte +62 -0
  13. package/src/client/app/components/IconLocked.svelte +51 -0
  14. package/src/client/app/components/IconTriggers.svelte +48 -0
  15. package/src/client/app/components/Init.svelte +14 -27
  16. package/src/client/app/components/KeyBinding.svelte +3 -6
  17. package/src/client/app/helpers.js +4 -40
  18. package/src/client/app/hooks.js +41 -17
  19. package/src/client/app/inputs/MIDI.js +2 -1
  20. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +6 -1
  21. package/src/client/app/lib/gl/Renderer.js +1 -0
  22. package/src/client/app/lib/svelte-json-tree/ErrorNode.svelte +28 -0
  23. package/src/client/app/lib/svelte-json-tree/ErrorStack.svelte +31 -0
  24. package/src/client/app/lib/svelte-json-tree/Expandable.svelte +25 -0
  25. package/src/client/app/lib/svelte-json-tree/JSONArrayNode.svelte +38 -0
  26. package/src/client/app/lib/svelte-json-tree/JSONArrow.svelte +47 -0
  27. package/src/client/app/lib/svelte-json-tree/JSONFunctionNode.svelte +114 -0
  28. package/src/client/app/lib/svelte-json-tree/JSONIterableArrayNode.svelte +60 -0
  29. package/src/client/app/lib/svelte-json-tree/JSONIterableMapNode.svelte +87 -0
  30. package/src/client/app/lib/svelte-json-tree/JSONNested.svelte +94 -0
  31. package/src/client/app/lib/svelte-json-tree/JSONNode.svelte +91 -0
  32. package/src/client/app/lib/svelte-json-tree/JSONObjectNode.svelte +40 -0
  33. package/src/client/app/lib/svelte-json-tree/JSONStringNode.svelte +31 -0
  34. package/src/client/app/lib/svelte-json-tree/JSONValueNode.svelte +31 -0
  35. package/src/client/app/lib/svelte-json-tree/PreviewList.svelte +38 -0
  36. package/src/client/app/lib/svelte-json-tree/RegExpNode.svelte +42 -0
  37. package/src/client/app/lib/svelte-json-tree/Root.svelte +75 -0
  38. package/src/client/app/lib/svelte-json-tree/Summary.svelte +9 -0
  39. package/src/client/app/lib/svelte-json-tree/TypedArrayNode.svelte +56 -0
  40. package/src/client/app/lib/svelte-json-tree/index.js +1 -0
  41. package/src/client/app/lib/svelte-json-tree/utils.js +57 -0
  42. package/src/client/app/modules/Console/ConsoleLine.svelte +12 -11
  43. package/src/client/app/modules/Console.svelte +82 -17
  44. package/src/client/app/modules/Exports.svelte +48 -48
  45. package/src/client/app/modules/MidiPanel.svelte +12 -19
  46. package/src/client/app/modules/Monitor.svelte +147 -55
  47. package/src/client/app/modules/Params.svelte +127 -80
  48. package/src/client/app/renderers/2DRenderer.js +1 -0
  49. package/src/client/app/renderers/FragmentRenderer.js +1 -1
  50. package/src/client/app/renderers/P5GLRenderer.js +11 -5
  51. package/src/client/app/renderers/P5Renderer.js +7 -3
  52. package/src/client/app/renderers/THREERenderer.js +42 -79
  53. package/src/client/app/state/Sketch.svelte.js +538 -0
  54. package/src/client/app/state/errors.svelte.js +17 -0
  55. package/src/client/app/state/exports.svelte.js +152 -0
  56. package/src/client/app/state/layout.svelte.js +205 -0
  57. package/src/client/app/state/monitors.svelte.js +36 -0
  58. package/src/client/app/state/renderers.svelte.js +77 -0
  59. package/src/client/app/state/rendering.svelte.js +697 -0
  60. package/src/client/app/state/sketches.svelte.js +73 -0
  61. package/src/client/app/state/utils.svelte.js +65 -0
  62. package/src/client/app/ui/Build.svelte +53 -60
  63. package/src/client/app/ui/ErrorOverlay.svelte +2 -2
  64. package/src/client/app/ui/Field.svelte +63 -189
  65. package/src/client/app/ui/FieldGroup.svelte +4 -5
  66. package/src/client/app/ui/FieldSection.svelte +14 -9
  67. package/src/client/app/ui/FieldSpace.svelte +1 -1
  68. package/src/client/app/ui/FieldTrigger.svelte +86 -84
  69. package/src/client/app/ui/FieldTriggers.svelte +25 -24
  70. package/src/client/app/ui/FloatingParams.svelte +50 -12
  71. package/src/client/app/ui/Layout.svelte +24 -13
  72. package/src/client/app/ui/LayoutColumn.svelte +2 -2
  73. package/src/client/app/ui/LayoutComponent.svelte +86 -195
  74. package/src/client/app/ui/LayoutResizer.svelte +25 -37
  75. package/src/client/app/ui/LayoutRoot.svelte +3 -5
  76. package/src/client/app/ui/LayoutRow.svelte +2 -2
  77. package/src/client/app/ui/LayoutToolbar.svelte +17 -76
  78. package/src/client/app/ui/Module.svelte +31 -35
  79. package/src/client/app/ui/ModuleHeaderAction.svelte +23 -16
  80. package/src/client/app/ui/ModuleHeaderButton.svelte +3 -3
  81. package/src/client/app/ui/ModuleHeaderSelect.svelte +4 -12
  82. package/src/client/app/ui/ModuleRenderer.svelte +84 -22
  83. package/src/client/app/ui/ParamsOutput.svelte +61 -77
  84. package/src/client/app/ui/Preview.svelte +15 -4
  85. package/src/client/app/ui/SelectChevrons.svelte +1 -2
  86. package/src/client/app/ui/SketchRenderer.svelte +89 -701
  87. package/src/client/app/ui/SketchSelect.svelte +14 -49
  88. package/src/client/app/ui/fields/ButtonInput.svelte +14 -11
  89. package/src/client/app/ui/fields/CheckboxInput.svelte +5 -12
  90. package/src/client/app/ui/fields/ColorInput.svelte +46 -121
  91. package/src/client/app/ui/fields/FieldInputRow.svelte +5 -1
  92. package/src/client/app/ui/fields/ImageInput.svelte +14 -14
  93. package/src/client/app/ui/fields/Input.svelte +19 -25
  94. package/src/client/app/ui/fields/IntervalInput.svelte +22 -22
  95. package/src/client/app/ui/fields/NumberInput.svelte +32 -38
  96. package/src/client/app/ui/fields/ProgressInput.svelte +14 -13
  97. package/src/client/app/ui/fields/Select.svelte +34 -45
  98. package/src/client/app/ui/fields/TextInput.svelte +10 -6
  99. package/src/client/app/ui/fields/VectorInput.svelte +25 -30
  100. package/src/client/app/utils/canvas.utils.js +8 -8
  101. package/src/client/app/utils/color.utils.js +46 -13
  102. package/src/client/app/utils/fields.utils.js +1 -1
  103. package/src/client/app/utils/glsl.utils.js +1 -1
  104. package/src/client/app/utils/glslErrors.js +1 -1
  105. package/src/client/main.js +2 -2
package/bin/index.js CHANGED
@@ -44,7 +44,7 @@ prog.command('run [entry]', '', { default: true })
44
44
  emptyOutDir: options.emptyOutDir,
45
45
  base: options.base,
46
46
  prompts: options.prompts,
47
- config: options.config,
47
+ configFilepath: options.config,
48
48
  });
49
49
  }
50
50
 
@@ -52,7 +52,7 @@ prog.command('run [entry]', '', { default: true })
52
52
  development: options.development,
53
53
  exportDir: options.exportDir,
54
54
  port: options.port,
55
- config: options.config,
55
+ configFilepath: options.config,
56
56
  });
57
57
  });
58
58
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fragment-tools",
3
- "version": "0.1.20",
3
+ "version": "0.2.1",
4
4
  "description": "A web development environment for creative coding",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  "homepage": "https://github.com/raphaelameaume/fragment#readme",
23
23
  "dependencies": {
24
24
  "@clack/core": "^0.3.3",
25
- "@sveltejs/vite-plugin-svelte": "^3.1.1",
25
+ "@sveltejs/vite-plugin-svelte": "^4.0.0-next.4",
26
26
  "body-parser": "^1.20.0",
27
27
  "changedpi": "^1.0.4",
28
28
  "chokidar": "^3.5.2",
@@ -33,14 +33,13 @@
33
33
  "is-unicode-supported": "^2.0.0",
34
34
  "kleur": "^4.1.4",
35
35
  "sade": "^1.7.4",
36
- "svelte": "^4.0.0",
37
- "svelte-json-tree": "^2.2.0",
38
- "vite": "^5.3.3",
36
+ "svelte": "^5.19.0",
37
+ "vite": "^5.4.12",
39
38
  "webm-writer": "^1.0.0",
40
39
  "ws": "^8.2.3"
41
40
  },
42
41
  "devDependencies": {
43
42
  "prettier": "^3.2.5",
44
- "prettier-plugin-svelte": "^3.1.2"
43
+ "prettier-plugin-svelte": "^3.2.6"
45
44
  }
46
45
  }
package/src/cli/build.js CHANGED
@@ -102,7 +102,7 @@ export async function build(entry, options) {
102
102
  dev: options.development,
103
103
  build: true,
104
104
  },
105
- options.config,
105
+ options.configFilepath,
106
106
  cwd,
107
107
  );
108
108
 
@@ -93,26 +93,28 @@ export default function checkDependencies({
93
93
  })
94
94
  .flat();
95
95
 
96
+ const defines = {
97
+ __THREE_RENDERER__: JSON.stringify(
98
+ renderings.some((rendering) => rendering === 'three'),
99
+ ),
100
+ __P5_RENDERER__: JSON.stringify(
101
+ renderings.some((rendering) => rendering === 'p5'),
102
+ ),
103
+ __P5_WEBGL_RENDERER__: JSON.stringify(
104
+ renderings.some((rendering) => rendering === 'p5-webgl'),
105
+ ),
106
+ __FRAGMENT_RENDERER__: JSON.stringify(
107
+ renderings.some((rendering) => rendering === 'fragment'),
108
+ ),
109
+ __2D_RENDERER__: JSON.stringify(
110
+ renderings.some((rendering) => rendering === '2d'),
111
+ ),
112
+ };
113
+
96
114
  return {
97
115
  name: 'check-dependencies',
98
116
  config: () => ({
99
- define: {
100
- __THREE_RENDERER__: build
101
- ? renderings.some((rendering) => rendering === 'three')
102
- : true,
103
- __P5_RENDERER__: build
104
- ? renderings.some((rendering) => rendering === 'p5')
105
- : true,
106
- __P5_WEBGL_RENDERER__: build
107
- ? renderings.some((rendering) => rendering === 'p5-webgl')
108
- : true,
109
- __FRAGMENT_RENDERER__: build
110
- ? renderings.some((rendering) => rendering === 'fragment')
111
- : true,
112
- __2D_RENDERER__: build
113
- ? renderings.some((rendering) => rendering === '2d')
114
- : true,
115
- },
117
+ define: defines,
116
118
  }),
117
119
  load(id) {
118
120
  if (build && skipFiles.includes(id)) {
package/src/cli/run.js CHANGED
@@ -69,7 +69,7 @@ export async function run(entry, options = {}) {
69
69
  dev: options.development,
70
70
  build: false,
71
71
  },
72
- options.config,
72
+ options.configFilepath,
73
73
  cwd,
74
74
  );
75
75
 
@@ -10,7 +10,7 @@ let uniforms = {
10
10
  /**
11
11
  * @param {object} params
12
12
  * @param {HTMLCanvasElement} params.canvas
13
- * @param {THREE.Renderer} params.renderer
13
+ * @param {THREE.WebGLRenderer} params.renderer
14
14
  * @param {THREE.Scene} params.scene
15
15
  * @param {number} params.width
16
16
  * @param {number} params.height
@@ -54,7 +54,7 @@ export let init = ({ scene, width, height }) => {
54
54
  /**
55
55
  * @param {object} params
56
56
  * @param {HTMLCanvasElement} params.canvas
57
- * @param {THREE.Renderer} params.renderer
57
+ * @param {THREE.WebGLRenderer} params.renderer
58
58
  * @param {THREE.Scene} params.scene
59
59
  * @param {number} params.width
60
60
  * @param {number} params.height
@@ -74,15 +74,15 @@ export let update = ({ renderer, scene, time, deltaTime }) => {
74
74
  /**
75
75
  * @param {object} params
76
76
  * @param {HTMLCanvasElement} params.canvas
77
- * @param {THREE.Renderer} params.renderer
77
+ * @param {THREE.WebGLRenderer} params.renderer
78
78
  * @param {THREE.Scene} params.scene
79
79
  * @param {number} params.width
80
80
  * @param {number} params.height
81
81
  * @param {number} params.pixelRatio
82
82
  */
83
- export let resize = ({ width, height }) => {
84
- uniforms.uResolution.value.x = width;
85
- uniforms.uResolution.value.y = height;
83
+ export let resize = ({ width, height, pixelRatio }) => {
84
+ uniforms.uResolution.value.x = width * pixelRatio;
85
+ uniforms.uResolution.value.y = height * pixelRatio;
86
86
 
87
87
  camera.left = -width * 0.5;
88
88
  camera.right = width * 0.5;
@@ -5,7 +5,7 @@ let camera;
5
5
  /**
6
6
  * @param {object} params
7
7
  * @param {HTMLCanvasElement} params.canvas
8
- * @param {THREE.Renderer} params.renderer
8
+ * @param {THREE.WebGLRenderer} params.renderer
9
9
  * @param {THREE.Scene} params.scene
10
10
  * @param {number} params.width
11
11
  * @param {number} params.height
@@ -19,7 +19,7 @@ export let init = ({ scene, width, height }) => {
19
19
  /**
20
20
  * @param {object} params
21
21
  * @param {HTMLCanvasElement} params.canvas
22
- * @param {THREE.Renderer} params.renderer
22
+ * @param {THREE.WebGLRenderer} params.renderer
23
23
  * @param {THREE.Scene} params.scene
24
24
  * @param {number} params.width
25
25
  * @param {number} params.height
@@ -37,7 +37,7 @@ export let update = ({ renderer, scene, time, deltaTime }) => {
37
37
  /**
38
38
  * @param {object} params
39
39
  * @param {HTMLCanvasElement} params.canvas
40
- * @param {THREE.Renderer} params.renderer
40
+ * @param {THREE.WebGLRenderer} params.renderer
41
41
  * @param {THREE.Scene} params.scene
42
42
  * @param {number} params.width
43
43
  * @param {number} params.height
@@ -5,7 +5,7 @@ let camera;
5
5
  /**
6
6
  * @param {object} params
7
7
  * @param {HTMLCanvasElement} params.canvas
8
- * @param {THREE.Renderer} params.renderer
8
+ * @param {THREE.WebGLRenderer} params.renderer
9
9
  * @param {THREE.Scene} params.scene
10
10
  * @param {number} params.width
11
11
  * @param {number} params.height
@@ -20,7 +20,7 @@ export let init = ({ scene, width, height }) => {
20
20
  /**
21
21
  * @param {object} params
22
22
  * @param {HTMLCanvasElement} params.canvas
23
- * @param {THREE.Renderer} params.renderer
23
+ * @param {THREE.WebGLRenderer} params.renderer
24
24
  * @param {THREE.Scene} params.scene
25
25
  * @param {number} params.width
26
26
  * @param {number} params.height
@@ -38,7 +38,7 @@ export let update = ({ renderer, scene, time, deltaTime }) => {
38
38
  /**
39
39
  * @param {object} params
40
40
  * @param {HTMLCanvasElement} params.canvas
41
- * @param {THREE.Renderer} params.renderer
41
+ * @param {THREE.WebGLRenderer} params.renderer
42
42
  * @param {THREE.Scene} params.scene
43
43
  * @param {number} params.width
44
44
  * @param {number} params.height
@@ -0,0 +1,14 @@
1
+ export function resize(node, callback) {
2
+ if (typeof callback !== 'function') return;
3
+
4
+ let observer = new ResizeObserver(callback);
5
+
6
+ observer.observe(node);
7
+
8
+ return {
9
+ destroy: () => {
10
+ observer.disconnect();
11
+ observer = null;
12
+ },
13
+ };
14
+ }
@@ -0,0 +1,94 @@
1
+ <script>
2
+ import { onMount } from 'svelte';
3
+
4
+ let showLabel = $state(false);
5
+
6
+ onMount(() => {
7
+ let timeout = setTimeout(() => {
8
+ showLabel = true;
9
+ }, 250);
10
+
11
+ return () => {
12
+ clearTimeout(timeout);
13
+ timeout = null;
14
+ };
15
+ });
16
+ </script>
17
+
18
+ <div class="hint-loading">
19
+ {#if showLabel}
20
+ <div class="label">
21
+ <span>loading</span>
22
+ <svg width="10" height="6">
23
+ <circle cx="2" cy="5" r="1" fill="var(--color)" />
24
+ <circle cx="5" cy="5" r="1" fill="var(--color)" />
25
+ <circle cx="8" cy="5" r="1" fill="var(--color)" />
26
+ </svg>
27
+ </div>
28
+ {/if}
29
+ </div>
30
+
31
+ <style>
32
+ .hint-loading {
33
+ --color: #ffffff;
34
+
35
+ position: absolute;
36
+ top: 0;
37
+ left: 0;
38
+ bottom: 0;
39
+ right: 0;
40
+
41
+ width: 100%;
42
+
43
+ background: rgba(0, 0, 0, 0.5);
44
+ }
45
+ .label {
46
+ position: absolute;
47
+ top: 4px;
48
+ right: 4px;
49
+ z-index: 2;
50
+
51
+ display: flex;
52
+ place-items: center;
53
+
54
+ height: 16px;
55
+ padding: 0 2px;
56
+
57
+ color: var(--color);
58
+ font-size: 10px;
59
+
60
+ border: 1px solid var(--color);
61
+ border-radius: 2px;
62
+ text-transform: uppercase;
63
+
64
+ /* animation: fade 1s ease-in-out infinite; */
65
+ }
66
+
67
+ /* .label:before {
68
+ --size: 6px;
69
+ content: '';
70
+
71
+ width: var(--size);
72
+ height: var(--size);
73
+ margin: 0 3px 0 1px;
74
+
75
+ background-color: var(--color);
76
+ border-radius: 50%;
77
+
78
+ animation: fade 1s ease-in-out infinite;
79
+ } */
80
+
81
+ @keyframes fade {
82
+ 0% {
83
+ opacity: 0;
84
+ }
85
+
86
+ 50% {
87
+ opacity: 1;
88
+ }
89
+
90
+ 100% {
91
+ opacity: 0;
92
+ }
93
+ }
94
+ </style>
@@ -0,0 +1,88 @@
1
+ <div class="paused-hint">
2
+ <div class="label">
3
+ <svg width="10" height="6">
4
+ <rect
5
+ x="2"
6
+ y="0"
7
+ width="2"
8
+ height="8"
9
+ fill="var(--color)"
10
+ rx="1"
11
+ ry="1"
12
+ />
13
+ <rect
14
+ x="5"
15
+ y="0"
16
+ width="2"
17
+ height="8"
18
+ fill="var(--color)"
19
+ rx="1"
20
+ ry="1"
21
+ />
22
+ </svg>
23
+ <span>paused</span>
24
+ </div>
25
+ </div>
26
+
27
+ <style>
28
+ .paused-hint {
29
+ --color: #ffffff;
30
+
31
+ position: absolute;
32
+ top: 0;
33
+ left: 0;
34
+ bottom: 0;
35
+ right: 0;
36
+
37
+ width: 100%;
38
+
39
+ background: rgba(0, 0, 0, 0.5);
40
+ }
41
+ .label {
42
+ position: absolute;
43
+ top: 4px;
44
+ right: 4px;
45
+ z-index: 2;
46
+
47
+ display: flex;
48
+ place-items: center;
49
+
50
+ height: 16px;
51
+ padding: 0 2px;
52
+
53
+ color: var(--color);
54
+ font-size: 10px;
55
+
56
+ border: 1px solid var(--color);
57
+ border-radius: 2px;
58
+ text-transform: uppercase;
59
+ }
60
+
61
+ /* .label:before {
62
+ --size: 6px;
63
+ content: '';
64
+
65
+ width: var(--size);
66
+ height: var(--size);
67
+ margin: 0 3px 0 1px;
68
+
69
+ background-color: var(--color);
70
+ border-radius: 50%;
71
+
72
+ animation: fade 1s ease-in-out infinite;
73
+ } */
74
+
75
+ @keyframes fade {
76
+ 0% {
77
+ opacity: 0;
78
+ }
79
+
80
+ 50% {
81
+ opacity: 1;
82
+ }
83
+
84
+ 100% {
85
+ opacity: 0;
86
+ }
87
+ }
88
+ </style>
@@ -0,0 +1,62 @@
1
+ <div class="record-hint">
2
+ <span class="label">REC</span>
3
+ </div>
4
+
5
+ <style>
6
+ .record-hint {
7
+ position: absolute;
8
+ top: 0;
9
+ left: 0;
10
+ bottom: 0;
11
+ right: 0;
12
+
13
+ background: rgba(0, 0, 0, 0.5);
14
+ pointer-events: none;
15
+ }
16
+ .label {
17
+ position: absolute;
18
+ top: 4px;
19
+ right: 4px;
20
+ z-index: 2;
21
+
22
+ display: flex;
23
+ place-items: center;
24
+
25
+ height: 16px;
26
+ padding: 0 2px;
27
+
28
+ color: var(--color-red);
29
+ font-size: 10px;
30
+
31
+ border: 1px solid var(--color-red);
32
+ border-radius: 2px;
33
+ }
34
+
35
+ .label:before {
36
+ --size: 6px;
37
+ content: '';
38
+
39
+ width: var(--size);
40
+ height: var(--size);
41
+ margin: 0 3px 0 1px;
42
+
43
+ background-color: var(--color-red);
44
+ border-radius: 50%;
45
+
46
+ animation: fade 1s ease-in-out infinite;
47
+ }
48
+
49
+ @keyframes fade {
50
+ 0% {
51
+ opacity: 0;
52
+ }
53
+
54
+ 50% {
55
+ opacity: 1;
56
+ }
57
+
58
+ 100% {
59
+ opacity: 0;
60
+ }
61
+ }
62
+ </style>
@@ -0,0 +1,51 @@
1
+ <script>
2
+ let { locked = false } = $props();
3
+ </script>
4
+
5
+ {#if locked}
6
+ <svg
7
+ class="action__icon"
8
+ width="16"
9
+ height="16"
10
+ fill="none"
11
+ viewBox="0 0 24 24"
12
+ >
13
+ <path
14
+ stroke="currentColor"
15
+ stroke-linecap="round"
16
+ stroke-linejoin="round"
17
+ stroke-width="1.5"
18
+ 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"
19
+ />
20
+ <path
21
+ stroke="currentColor"
22
+ stroke-linecap="round"
23
+ stroke-linejoin="round"
24
+ stroke-width="1.5"
25
+ 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"
26
+ />
27
+ </svg>
28
+ {:else}
29
+ <svg
30
+ class="action__icon"
31
+ width="16"
32
+ height="16"
33
+ fill="none"
34
+ viewBox="0 0 24 24"
35
+ >
36
+ <path
37
+ stroke="currentColor"
38
+ stroke-linecap="round"
39
+ stroke-linejoin="round"
40
+ stroke-width="1.5"
41
+ 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"
42
+ />
43
+ <path
44
+ stroke="currentColor"
45
+ stroke-linecap="round"
46
+ stroke-linejoin="round"
47
+ stroke-width="1.5"
48
+ 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"
49
+ />
50
+ </svg>
51
+ {/if}
@@ -0,0 +1,48 @@
1
+ <svg width="16" height="16" fill="none" viewBox="0 0 24 24">
2
+ <path
3
+ stroke="currentColor"
4
+ stroke-linecap="round"
5
+ stroke-linejoin="round"
6
+ stroke-width="1.5"
7
+ d="M4.75 8H7.25"
8
+ />
9
+ <path
10
+ stroke="currentColor"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ stroke-width="1.5"
14
+ d="M12.75 8H19.25"
15
+ />
16
+ <path
17
+ stroke="currentColor"
18
+ stroke-linecap="round"
19
+ stroke-linejoin="round"
20
+ stroke-width="1.5"
21
+ d="M4.75 16H12.25"
22
+ />
23
+ <path
24
+ stroke="currentColor"
25
+ stroke-linecap="round"
26
+ stroke-linejoin="round"
27
+ stroke-width="1.5"
28
+ d="M17.75 16H19.25"
29
+ />
30
+ <circle
31
+ cx="10"
32
+ cy="8"
33
+ r="2.25"
34
+ stroke="currentColor"
35
+ stroke-linecap="round"
36
+ stroke-linejoin="round"
37
+ stroke-width="1.5"
38
+ />
39
+ <circle
40
+ cx="15"
41
+ cy="16"
42
+ r="2.25"
43
+ stroke="currentColor"
44
+ stroke-linecap="round"
45
+ stroke-linejoin="round"
46
+ stroke-width="1.5"
47
+ />
48
+ </svg>
@@ -1,43 +1,30 @@
1
1
  <script>
2
2
  import { assignSketchFiles } from '../triggers/shared.js';
3
- import { loadAll, sketchesKeys, sketches } from '../stores/sketches.js';
3
+ import { sketchesManager } from '../state/sketches.svelte.js';
4
4
  import { onSketchReload } from '@fragment/sketches';
5
5
  import { getFilename } from '../utils/file.utils.js';
6
6
  import '../utils/glslErrors.js';
7
- import { props, reconcile } from '../stores/props.js';
8
7
 
9
- sketches.subscribe((sketches) => {
10
- props.update((currentProps) => {
11
- Object.keys(sketches).forEach((key) => {
12
- const sketch = sketches[key];
13
-
14
- if (sketch) {
15
- // sketch can be undefined if failed to load
16
- currentProps[key] = reconcile(
17
- sketch.props,
18
- currentProps[key],
19
- );
20
- }
21
- });
22
-
23
- return currentProps;
24
- });
8
+ $effect(() => {
9
+ assignSketchFiles(sketchesManager.keys);
25
10
  });
26
11
 
27
- sketchesKeys.subscribe((keys) => {
28
- if (keys.length > 0) {
29
- assignSketchFiles(keys);
30
- }
12
+ $effect(() => {
13
+ Object.keys(sketchesManager.sketches).forEach((key) => {
14
+ sketchesManager.sketches[key].save();
15
+ });
31
16
  });
32
17
 
33
18
  onSketchReload(({ sketches }) => {
34
- loadAll(sketches);
19
+ sketchesManager.loadAll(sketches);
35
20
  });
36
21
 
37
- $: prefix =
38
- $sketchesKeys.length === 1 ? `${getFilename($sketchesKeys[0])} | ` : '';
39
-
40
- $: title = `${prefix}fragment`;
22
+ let prefix = $derived(
23
+ sketchesManager.keys.length === 1
24
+ ? `${getFilename(sketchesManager.keys[0])} | `
25
+ : '',
26
+ );
27
+ let title = $derived(`${prefix}fragment`);
41
28
  </script>
42
29
 
43
30
  <svelte:head>
@@ -1,11 +1,8 @@
1
1
  <script>
2
- import { createEventDispatcher, onDestroy, onMount } from 'svelte';
2
+ import { onDestroy, onMount } from 'svelte';
3
3
  import { onKeyPress, onKeyDown, onKeyUp } from '../triggers';
4
4
 
5
- export let key;
6
- export let type = 'press';
7
-
8
- const dispatch = createEventDispatcher();
5
+ let { key, type = 'press', onTrigger = () => {} } = $props();
9
6
 
10
7
  const triggers = {
11
8
  press: onKeyPress,
@@ -19,7 +16,7 @@
19
16
 
20
17
  onMount(() => {
21
18
  trigger = triggerType(key, (event) => {
22
- dispatch('trigger', event);
19
+ onTrigger(event);
23
20
  });
24
21
  });
25
22