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.
- package/bin/index.js +2 -2
- package/package.json +5 -6
- package/src/cli/build.js +1 -1
- package/src/cli/run.js +1 -1
- package/src/cli/templates/three-fragment/index.js +6 -6
- package/src/cli/templates/three-orthographic/index.js +3 -3
- package/src/cli/templates/three-perspective/index.js +3 -3
- package/src/client/app/actions/resize.js +14 -0
- package/src/client/app/components/HintLoading.svelte +94 -0
- package/src/client/app/components/HintPaused.svelte +88 -0
- package/src/client/app/components/HintRecord.svelte +62 -0
- package/src/client/app/components/IconLocked.svelte +51 -0
- package/src/client/app/components/IconTriggers.svelte +48 -0
- package/src/client/app/components/Init.svelte +14 -27
- package/src/client/app/components/KeyBinding.svelte +3 -6
- package/src/client/app/helpers.js +4 -40
- package/src/client/app/hooks.js +41 -17
- package/src/client/app/inputs/MIDI.js +2 -1
- package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +6 -1
- package/src/client/app/lib/gl/Renderer.js +1 -0
- package/src/client/app/lib/svelte-json-tree/ErrorNode.svelte +28 -0
- package/src/client/app/lib/svelte-json-tree/ErrorStack.svelte +31 -0
- package/src/client/app/lib/svelte-json-tree/Expandable.svelte +25 -0
- package/src/client/app/lib/svelte-json-tree/JSONArrayNode.svelte +38 -0
- package/src/client/app/lib/svelte-json-tree/JSONArrow.svelte +47 -0
- package/src/client/app/lib/svelte-json-tree/JSONFunctionNode.svelte +114 -0
- package/src/client/app/lib/svelte-json-tree/JSONIterableArrayNode.svelte +60 -0
- package/src/client/app/lib/svelte-json-tree/JSONIterableMapNode.svelte +87 -0
- package/src/client/app/lib/svelte-json-tree/JSONNested.svelte +94 -0
- package/src/client/app/lib/svelte-json-tree/JSONNode.svelte +91 -0
- package/src/client/app/lib/svelte-json-tree/JSONObjectNode.svelte +40 -0
- package/src/client/app/lib/svelte-json-tree/JSONStringNode.svelte +31 -0
- package/src/client/app/lib/svelte-json-tree/JSONValueNode.svelte +31 -0
- package/src/client/app/lib/svelte-json-tree/PreviewList.svelte +38 -0
- package/src/client/app/lib/svelte-json-tree/RegExpNode.svelte +42 -0
- package/src/client/app/lib/svelte-json-tree/Root.svelte +75 -0
- package/src/client/app/lib/svelte-json-tree/Summary.svelte +9 -0
- package/src/client/app/lib/svelte-json-tree/TypedArrayNode.svelte +56 -0
- package/src/client/app/lib/svelte-json-tree/index.js +1 -0
- package/src/client/app/lib/svelte-json-tree/utils.js +57 -0
- package/src/client/app/modules/Console/ConsoleLine.svelte +12 -11
- package/src/client/app/modules/Console.svelte +82 -17
- package/src/client/app/modules/Exports.svelte +48 -48
- package/src/client/app/modules/MidiPanel.svelte +12 -19
- package/src/client/app/modules/Monitor.svelte +147 -55
- package/src/client/app/modules/Params.svelte +127 -80
- package/src/client/app/renderers/2DRenderer.js +1 -0
- package/src/client/app/renderers/FragmentRenderer.js +1 -1
- package/src/client/app/renderers/P5GLRenderer.js +11 -5
- package/src/client/app/renderers/P5Renderer.js +7 -3
- package/src/client/app/renderers/THREERenderer.js +42 -79
- package/src/client/app/state/Sketch.svelte.js +538 -0
- package/src/client/app/state/errors.svelte.js +17 -0
- package/src/client/app/state/exports.svelte.js +152 -0
- package/src/client/app/state/layout.svelte.js +205 -0
- package/src/client/app/state/monitors.svelte.js +36 -0
- package/src/client/app/state/renderers.svelte.js +77 -0
- package/src/client/app/state/rendering.svelte.js +697 -0
- package/src/client/app/state/sketches.svelte.js +73 -0
- package/src/client/app/state/utils.svelte.js +65 -0
- package/src/client/app/ui/Build.svelte +53 -60
- package/src/client/app/ui/ErrorOverlay.svelte +2 -2
- package/src/client/app/ui/Field.svelte +63 -189
- package/src/client/app/ui/FieldGroup.svelte +4 -5
- package/src/client/app/ui/FieldSection.svelte +14 -9
- package/src/client/app/ui/FieldSpace.svelte +1 -1
- package/src/client/app/ui/FieldTrigger.svelte +86 -84
- package/src/client/app/ui/FieldTriggers.svelte +25 -24
- package/src/client/app/ui/FloatingParams.svelte +50 -12
- package/src/client/app/ui/Layout.svelte +24 -13
- package/src/client/app/ui/LayoutColumn.svelte +2 -2
- package/src/client/app/ui/LayoutComponent.svelte +86 -195
- package/src/client/app/ui/LayoutResizer.svelte +25 -37
- package/src/client/app/ui/LayoutRoot.svelte +3 -5
- package/src/client/app/ui/LayoutRow.svelte +2 -2
- package/src/client/app/ui/LayoutToolbar.svelte +17 -76
- package/src/client/app/ui/Module.svelte +31 -35
- package/src/client/app/ui/ModuleHeaderAction.svelte +23 -16
- package/src/client/app/ui/ModuleHeaderButton.svelte +3 -3
- package/src/client/app/ui/ModuleHeaderSelect.svelte +4 -12
- package/src/client/app/ui/ModuleRenderer.svelte +84 -22
- package/src/client/app/ui/ParamsOutput.svelte +61 -77
- package/src/client/app/ui/Preview.svelte +15 -4
- package/src/client/app/ui/SelectChevrons.svelte +1 -2
- package/src/client/app/ui/SketchRenderer.svelte +89 -701
- package/src/client/app/ui/SketchSelect.svelte +14 -49
- package/src/client/app/ui/fields/ButtonInput.svelte +14 -11
- package/src/client/app/ui/fields/CheckboxInput.svelte +5 -12
- package/src/client/app/ui/fields/ColorInput.svelte +46 -121
- package/src/client/app/ui/fields/FieldInputRow.svelte +5 -1
- package/src/client/app/ui/fields/ImageInput.svelte +14 -14
- package/src/client/app/ui/fields/Input.svelte +19 -25
- package/src/client/app/ui/fields/IntervalInput.svelte +22 -22
- package/src/client/app/ui/fields/NumberInput.svelte +32 -38
- package/src/client/app/ui/fields/ProgressInput.svelte +14 -13
- package/src/client/app/ui/fields/Select.svelte +34 -45
- package/src/client/app/ui/fields/TextInput.svelte +10 -6
- package/src/client/app/ui/fields/VectorInput.svelte +25 -30
- package/src/client/app/utils/canvas.utils.js +8 -8
- package/src/client/app/utils/color.utils.js +46 -13
- package/src/client/app/utils/fields.utils.js +1 -1
- package/src/client/app/utils/glsl.utils.js +1 -1
- package/src/client/app/utils/glslErrors.js +1 -1
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
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": "^
|
|
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": "^
|
|
37
|
-
"
|
|
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.
|
|
43
|
+
"prettier-plugin-svelte": "^3.2.6"
|
|
45
44
|
}
|
|
46
45
|
}
|
package/src/cli/build.js
CHANGED
package/src/cli/run.js
CHANGED
|
@@ -10,7 +10,7 @@ let uniforms = {
|
|
|
10
10
|
/**
|
|
11
11
|
* @param {object} params
|
|
12
12
|
* @param {HTMLCanvasElement} params.canvas
|
|
13
|
-
* @param {THREE.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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 {
|
|
2
|
+
import { onDestroy, onMount } from 'svelte';
|
|
3
3
|
import { onKeyPress, onKeyDown, onKeyUp } from '../triggers';
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
+
console.warn(
|
|
3
|
+
`reactiveProps has been deprecated. Props are now reactive by default.`,
|
|
4
|
+
);
|
|
5
|
+
return props;
|
|
42
6
|
}
|