fragment-tools 0.1.20 → 0.2.0

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 (104) 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/run.js +1 -1
  5. package/src/cli/templates/three-fragment/index.js +6 -6
  6. package/src/cli/templates/three-orthographic/index.js +3 -3
  7. package/src/cli/templates/three-perspective/index.js +3 -3
  8. package/src/client/app/actions/resize.js +14 -0
  9. package/src/client/app/components/HintLoading.svelte +94 -0
  10. package/src/client/app/components/HintPaused.svelte +88 -0
  11. package/src/client/app/components/HintRecord.svelte +62 -0
  12. package/src/client/app/components/IconLocked.svelte +51 -0
  13. package/src/client/app/components/IconTriggers.svelte +48 -0
  14. package/src/client/app/components/Init.svelte +14 -27
  15. package/src/client/app/components/KeyBinding.svelte +3 -6
  16. package/src/client/app/helpers.js +4 -40
  17. package/src/client/app/hooks.js +41 -17
  18. package/src/client/app/inputs/MIDI.js +2 -1
  19. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +6 -1
  20. package/src/client/app/lib/gl/Renderer.js +1 -0
  21. package/src/client/app/lib/svelte-json-tree/ErrorNode.svelte +28 -0
  22. package/src/client/app/lib/svelte-json-tree/ErrorStack.svelte +31 -0
  23. package/src/client/app/lib/svelte-json-tree/Expandable.svelte +25 -0
  24. package/src/client/app/lib/svelte-json-tree/JSONArrayNode.svelte +38 -0
  25. package/src/client/app/lib/svelte-json-tree/JSONArrow.svelte +47 -0
  26. package/src/client/app/lib/svelte-json-tree/JSONFunctionNode.svelte +114 -0
  27. package/src/client/app/lib/svelte-json-tree/JSONIterableArrayNode.svelte +60 -0
  28. package/src/client/app/lib/svelte-json-tree/JSONIterableMapNode.svelte +87 -0
  29. package/src/client/app/lib/svelte-json-tree/JSONNested.svelte +94 -0
  30. package/src/client/app/lib/svelte-json-tree/JSONNode.svelte +91 -0
  31. package/src/client/app/lib/svelte-json-tree/JSONObjectNode.svelte +40 -0
  32. package/src/client/app/lib/svelte-json-tree/JSONStringNode.svelte +31 -0
  33. package/src/client/app/lib/svelte-json-tree/JSONValueNode.svelte +31 -0
  34. package/src/client/app/lib/svelte-json-tree/PreviewList.svelte +38 -0
  35. package/src/client/app/lib/svelte-json-tree/RegExpNode.svelte +42 -0
  36. package/src/client/app/lib/svelte-json-tree/Root.svelte +75 -0
  37. package/src/client/app/lib/svelte-json-tree/Summary.svelte +9 -0
  38. package/src/client/app/lib/svelte-json-tree/TypedArrayNode.svelte +56 -0
  39. package/src/client/app/lib/svelte-json-tree/index.js +1 -0
  40. package/src/client/app/lib/svelte-json-tree/utils.js +57 -0
  41. package/src/client/app/modules/Console/ConsoleLine.svelte +12 -11
  42. package/src/client/app/modules/Console.svelte +82 -17
  43. package/src/client/app/modules/Exports.svelte +48 -48
  44. package/src/client/app/modules/MidiPanel.svelte +12 -19
  45. package/src/client/app/modules/Monitor.svelte +147 -55
  46. package/src/client/app/modules/Params.svelte +127 -80
  47. package/src/client/app/renderers/2DRenderer.js +1 -0
  48. package/src/client/app/renderers/FragmentRenderer.js +1 -1
  49. package/src/client/app/renderers/P5GLRenderer.js +11 -5
  50. package/src/client/app/renderers/P5Renderer.js +7 -3
  51. package/src/client/app/renderers/THREERenderer.js +42 -79
  52. package/src/client/app/state/Sketch.svelte.js +538 -0
  53. package/src/client/app/state/errors.svelte.js +17 -0
  54. package/src/client/app/state/exports.svelte.js +152 -0
  55. package/src/client/app/state/layout.svelte.js +205 -0
  56. package/src/client/app/state/monitors.svelte.js +36 -0
  57. package/src/client/app/state/renderers.svelte.js +77 -0
  58. package/src/client/app/state/rendering.svelte.js +697 -0
  59. package/src/client/app/state/sketches.svelte.js +73 -0
  60. package/src/client/app/state/utils.svelte.js +65 -0
  61. package/src/client/app/ui/Build.svelte +53 -60
  62. package/src/client/app/ui/ErrorOverlay.svelte +2 -2
  63. package/src/client/app/ui/Field.svelte +63 -189
  64. package/src/client/app/ui/FieldGroup.svelte +4 -5
  65. package/src/client/app/ui/FieldSection.svelte +14 -9
  66. package/src/client/app/ui/FieldSpace.svelte +1 -1
  67. package/src/client/app/ui/FieldTrigger.svelte +86 -84
  68. package/src/client/app/ui/FieldTriggers.svelte +25 -24
  69. package/src/client/app/ui/FloatingParams.svelte +50 -12
  70. package/src/client/app/ui/Layout.svelte +24 -13
  71. package/src/client/app/ui/LayoutColumn.svelte +2 -2
  72. package/src/client/app/ui/LayoutComponent.svelte +86 -195
  73. package/src/client/app/ui/LayoutResizer.svelte +25 -37
  74. package/src/client/app/ui/LayoutRoot.svelte +3 -5
  75. package/src/client/app/ui/LayoutRow.svelte +2 -2
  76. package/src/client/app/ui/LayoutToolbar.svelte +17 -76
  77. package/src/client/app/ui/Module.svelte +31 -35
  78. package/src/client/app/ui/ModuleHeaderAction.svelte +23 -16
  79. package/src/client/app/ui/ModuleHeaderButton.svelte +3 -3
  80. package/src/client/app/ui/ModuleHeaderSelect.svelte +4 -12
  81. package/src/client/app/ui/ModuleRenderer.svelte +84 -22
  82. package/src/client/app/ui/ParamsOutput.svelte +61 -77
  83. package/src/client/app/ui/Preview.svelte +15 -4
  84. package/src/client/app/ui/SelectChevrons.svelte +1 -2
  85. package/src/client/app/ui/SketchRenderer.svelte +89 -701
  86. package/src/client/app/ui/SketchSelect.svelte +14 -49
  87. package/src/client/app/ui/fields/ButtonInput.svelte +14 -11
  88. package/src/client/app/ui/fields/CheckboxInput.svelte +5 -12
  89. package/src/client/app/ui/fields/ColorInput.svelte +46 -121
  90. package/src/client/app/ui/fields/FieldInputRow.svelte +5 -1
  91. package/src/client/app/ui/fields/ImageInput.svelte +14 -14
  92. package/src/client/app/ui/fields/Input.svelte +19 -25
  93. package/src/client/app/ui/fields/IntervalInput.svelte +22 -22
  94. package/src/client/app/ui/fields/NumberInput.svelte +32 -38
  95. package/src/client/app/ui/fields/ProgressInput.svelte +14 -13
  96. package/src/client/app/ui/fields/Select.svelte +34 -45
  97. package/src/client/app/ui/fields/TextInput.svelte +10 -6
  98. package/src/client/app/ui/fields/VectorInput.svelte +25 -30
  99. package/src/client/app/utils/canvas.utils.js +8 -8
  100. package/src/client/app/utils/color.utils.js +46 -13
  101. package/src/client/app/utils/fields.utils.js +1 -1
  102. package/src/client/app/utils/glsl.utils.js +1 -1
  103. package/src/client/app/utils/glslErrors.js +1 -1
  104. 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.0",
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
 
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
 
@@ -1,42 +1,6 @@
1
- import { props } from './stores/props';
2
-
3
- const propHandler = {
4
- set: function (target, key, value, receiver) {
5
- Reflect.set(target, key, value, receiver);
6
-
7
- if (key === 'value') {
8
- props.update((currentProps) => currentProps);
9
- }
10
-
11
- return true;
12
- },
13
- };
14
-
15
- const propsHandler = {
16
- get: (target, key) => {
17
- if (typeof target[key] === 'object' && target[key] !== null) {
18
- return new Proxy(target[key], propHandler);
19
- }
20
- },
21
- set: (target, key, value) => {
22
- console.log('new set', target, key, value);
23
-
24
- target[key] = value;
25
-
26
- props.update((currentProps) => currentProps);
27
-
28
- return true;
29
- },
30
- deleteProperty: (target, prop) => {
31
- if (prop in target) {
32
- delete target[prop];
33
- props.update((currentProps) => currentProps);
34
-
35
- return true;
36
- }
37
- },
38
- };
39
-
40
1
  export function reactiveProps(props = {}) {
41
- return new Proxy(props, propsHandler);
2
+ console.warn(
3
+ `reactiveProps has been deprecated. Props are now reactive by default.`,
4
+ );
5
+ return props;
42
6
  }