fragment-tools 0.1.13 → 0.1.15

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 (184) hide show
  1. package/.prettierignore +1 -2
  2. package/.prettierrc +23 -7
  3. package/README.md +28 -9
  4. package/bin/index.js +70 -10
  5. package/package.json +14 -6
  6. package/src/cli/build.js +125 -0
  7. package/src/cli/create.js +238 -0
  8. package/src/cli/createConfig.js +82 -0
  9. package/src/cli/createFragmentFile.js +70 -0
  10. package/src/cli/getEntries.js +85 -0
  11. package/src/cli/log.js +36 -24
  12. package/src/cli/plugins/check-dependencies.js +88 -42
  13. package/src/cli/plugins/hot-shader-replacement.js +408 -0
  14. package/src/cli/plugins/hot-sketch-reload.js +21 -25
  15. package/src/cli/plugins/save.js +101 -0
  16. package/src/cli/preview.js +55 -0
  17. package/src/cli/prompts.js +260 -0
  18. package/src/cli/run.js +131 -0
  19. package/src/cli/templates/blank/index.js +33 -0
  20. package/src/cli/templates/blank/meta.json +4 -0
  21. package/src/cli/templates/default/index.js +39 -0
  22. package/src/cli/templates/default/meta.json +5 -0
  23. package/src/cli/templates/fragment-gl/index.js +37 -0
  24. package/src/cli/templates/fragment-gl/meta.json +4 -0
  25. package/src/cli/templates/p5/index.js +32 -0
  26. package/src/cli/templates/p5/meta.json +5 -0
  27. package/src/cli/templates/p5-webgl/fragment.fs +14 -0
  28. package/src/cli/templates/p5-webgl/index.js +67 -0
  29. package/src/cli/templates/p5-webgl/meta.json +5 -0
  30. package/src/cli/templates/three-fragment/fragment.fs +10 -0
  31. package/src/cli/templates/three-fragment/index.js +95 -0
  32. package/src/cli/templates/three-fragment/meta.json +5 -0
  33. package/src/cli/templates/three-orthographic/index.js +55 -0
  34. package/src/cli/templates/three-orthographic/meta.json +5 -0
  35. package/src/cli/templates/three-perspective/index.js +52 -0
  36. package/src/cli/templates/three-perspective/meta.json +5 -0
  37. package/src/cli/utils.js +70 -0
  38. package/src/cli/ws.js +87 -78
  39. package/src/client/app/App.svelte +3 -3
  40. package/src/client/app/client.js +55 -39
  41. package/src/client/app/components/IconCross.svelte +18 -18
  42. package/src/client/app/components/Init.svelte +40 -8
  43. package/src/client/app/components/KeyBinding.svelte +22 -22
  44. package/src/client/app/helpers.js +42 -0
  45. package/src/client/app/hooks.js +20 -0
  46. package/src/client/app/inputs/Input.js +9 -9
  47. package/src/client/app/inputs/Keyboard.js +13 -15
  48. package/src/client/app/inputs/MIDI.js +14 -15
  49. package/src/client/app/inputs/Mouse.js +1 -1
  50. package/src/client/app/inputs/Webcam.js +89 -88
  51. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +41 -21
  52. package/src/client/app/lib/canvas-recorder/FrameRecorder.js +7 -6
  53. package/src/client/app/lib/canvas-recorder/H264Recorder.js +45 -0
  54. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +7 -9
  55. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +3 -4
  56. package/src/client/app/lib/canvas-recorder/mp4.js +1649 -15
  57. package/src/client/app/lib/canvas-recorder/utils.js +33 -17
  58. package/src/client/app/lib/gl/Geometry.js +11 -8
  59. package/src/client/app/lib/gl/Program.js +38 -19
  60. package/src/client/app/lib/gl/Renderer.js +163 -156
  61. package/src/client/app/lib/gl/Texture.js +113 -85
  62. package/src/client/app/lib/gl/index.js +12 -12
  63. package/src/client/app/lib/gl/utils.js +1 -3
  64. package/src/client/app/lib/helpers/frameDebounce.js +30 -30
  65. package/src/client/app/lib/loader/index.js +10 -10
  66. package/src/client/app/lib/loader/loadImage.js +15 -15
  67. package/src/client/app/lib/loader/loadScript.js +1 -1
  68. package/src/client/app/lib/paper-sizes.js +75 -76
  69. package/src/client/app/lib/presets.js +25 -5
  70. package/src/client/app/lib/tempo/Analyser.js +18 -17
  71. package/src/client/app/lib/tempo/Range.js +15 -12
  72. package/src/client/app/lib/tempo/index.js +34 -27
  73. package/src/client/app/modules/AudioAnalyser/Range.svelte +69 -72
  74. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +20 -19
  75. package/src/client/app/modules/AudioAnalyser.svelte +52 -35
  76. package/src/client/app/modules/Console/ConsoleLine.svelte +193 -172
  77. package/src/client/app/modules/Console.svelte +76 -74
  78. package/src/client/app/modules/Exports.svelte +62 -43
  79. package/src/client/app/modules/MidiPanel.svelte +100 -101
  80. package/src/client/app/modules/Monitor.svelte +57 -57
  81. package/src/client/app/modules/Params.svelte +128 -103
  82. package/src/client/app/renderers/2DRenderer.js +3 -3
  83. package/src/client/app/renderers/FragmentRenderer.js +30 -23
  84. package/src/client/app/renderers/P5GLRenderer.js +144 -0
  85. package/src/client/app/renderers/P5Renderer.js +10 -7
  86. package/src/client/app/renderers/THREERenderer.js +136 -94
  87. package/src/client/app/stores/audioAnalysis.js +3 -4
  88. package/src/client/app/stores/console.js +9 -10
  89. package/src/client/app/stores/errors.js +1 -1
  90. package/src/client/app/stores/exports.js +36 -20
  91. package/src/client/app/stores/index.js +2 -2
  92. package/src/client/app/stores/layout.js +143 -138
  93. package/src/client/app/stores/multisampling.js +4 -4
  94. package/src/client/app/stores/props.js +76 -13
  95. package/src/client/app/stores/renderers.js +26 -15
  96. package/src/client/app/stores/rendering.js +108 -89
  97. package/src/client/app/stores/sketches.js +7 -9
  98. package/src/client/app/stores/time.js +18 -18
  99. package/src/client/app/stores/utils.js +95 -38
  100. package/src/client/app/transitions/fade.js +3 -3
  101. package/src/client/app/transitions/index.js +6 -7
  102. package/src/client/app/transitions/splitX.js +2 -2
  103. package/src/client/app/transitions/splitY.js +2 -2
  104. package/src/client/app/triggers/Keyboard.js +88 -79
  105. package/src/client/app/triggers/MIDI.js +110 -84
  106. package/src/client/app/triggers/Mouse.js +73 -65
  107. package/src/client/app/triggers/Trigger.js +59 -58
  108. package/src/client/app/triggers/index.js +7 -7
  109. package/src/client/app/triggers/shared.js +5 -5
  110. package/src/client/app/ui/Build.svelte +70 -71
  111. package/src/client/app/ui/ErrorOverlay.svelte +118 -104
  112. package/src/client/app/ui/Field.svelte +393 -258
  113. package/src/client/app/ui/FieldGroup.svelte +106 -94
  114. package/src/client/app/ui/FieldSection.svelte +127 -116
  115. package/src/client/app/ui/FieldSpace.svelte +29 -30
  116. package/src/client/app/ui/FieldTrigger.svelte +256 -244
  117. package/src/client/app/ui/FieldTriggers.svelte +46 -46
  118. package/src/client/app/ui/FloatingParams.svelte +29 -30
  119. package/src/client/app/ui/Layout.svelte +31 -32
  120. package/src/client/app/ui/LayoutColumn.svelte +4 -4
  121. package/src/client/app/ui/LayoutComponent.svelte +239 -225
  122. package/src/client/app/ui/LayoutResizer.svelte +195 -176
  123. package/src/client/app/ui/LayoutRoot.svelte +6 -6
  124. package/src/client/app/ui/LayoutRow.svelte +4 -4
  125. package/src/client/app/ui/LayoutToolbar.svelte +191 -194
  126. package/src/client/app/ui/Module.svelte +134 -135
  127. package/src/client/app/ui/ModuleHeaderAction.svelte +81 -78
  128. package/src/client/app/ui/ModuleHeaderButton.svelte +12 -12
  129. package/src/client/app/ui/ModuleHeaderSelect.svelte +47 -37
  130. package/src/client/app/ui/ModuleRenderer.svelte +26 -27
  131. package/src/client/app/ui/OutputRenderer.svelte +112 -105
  132. package/src/client/app/ui/ParamsMultisampling.svelte +96 -95
  133. package/src/client/app/ui/ParamsOutput.svelte +130 -113
  134. package/src/client/app/ui/Preview.svelte +7 -8
  135. package/src/client/app/ui/SelectChevrons.svelte +27 -15
  136. package/src/client/app/ui/SketchRenderer.svelte +780 -667
  137. package/src/client/app/ui/SketchSelect.svelte +50 -44
  138. package/src/client/app/ui/fields/ButtonInput.svelte +61 -48
  139. package/src/client/app/ui/fields/CheckboxInput.svelte +67 -61
  140. package/src/client/app/ui/fields/ColorInput.svelte +294 -238
  141. package/src/client/app/ui/fields/FieldInputRow.svelte +8 -8
  142. package/src/client/app/ui/fields/ImageInput.svelte +123 -121
  143. package/src/client/app/ui/fields/Input.svelte +100 -111
  144. package/src/client/app/ui/fields/IntervalInput.svelte +268 -0
  145. package/src/client/app/ui/fields/ListInput.svelte +96 -96
  146. package/src/client/app/ui/fields/NumberInput.svelte +120 -116
  147. package/src/client/app/ui/fields/ProgressInput.svelte +99 -73
  148. package/src/client/app/ui/fields/Select.svelte +137 -124
  149. package/src/client/app/ui/fields/TextInput.svelte +10 -11
  150. package/src/client/app/ui/fields/VectorInput.svelte +86 -82
  151. package/src/client/app/utils/canvas.utils.js +189 -208
  152. package/src/client/app/utils/color.utils.js +138 -101
  153. package/src/client/app/utils/fields.utils.js +131 -0
  154. package/src/client/app/utils/file.utils.js +209 -37
  155. package/src/client/app/utils/glsl.utils.js +2 -2
  156. package/src/client/app/utils/glslErrors.js +49 -31
  157. package/src/client/app/utils/index.js +32 -29
  158. package/src/client/app/utils/math.utils.js +14 -10
  159. package/src/client/index.html +16 -16
  160. package/src/client/main.js +4 -4
  161. package/src/client/public/css/global.css +26 -16
  162. package/src/cli/db.js +0 -17
  163. package/src/cli/index.js +0 -198
  164. package/src/cli/plugins/db.js +0 -12
  165. package/src/cli/plugins/hot-shader-reload.js +0 -86
  166. package/src/cli/plugins/screenshot.js +0 -46
  167. package/src/cli/server.js +0 -153
  168. package/src/cli/templates/2d.js +0 -15
  169. package/src/cli/templates/blank.js +0 -13
  170. package/src/cli/templates/fragment.js +0 -18
  171. package/src/cli/templates/index.js +0 -27
  172. package/src/cli/templates/p5.js +0 -13
  173. package/src/cli/templates/three-fragment.js +0 -53
  174. package/src/cli/templates/three-orthographic.js +0 -23
  175. package/src/cli/templates/three-perspective.js +0 -20
  176. package/src/client/app/lib/canvas-recorder/FFMPEGRecorder.js +0 -56
  177. package/src/client/app/utils/props.utils.js +0 -51
  178. package/src/client/public/fonts/Inter-Bold.woff2 +0 -0
  179. package/src/client/public/fonts/Inter-Italic.woff2 +0 -0
  180. package/src/client/public/fonts/Inter-Regular.woff2 +0 -0
  181. package/src/client/public/fonts/Inter-SemiBold.woff2 +0 -0
  182. package/src/client/public/js/ffmpeg.min.js +0 -2
  183. package/src/client/public/js/ffmpeg.min.js.map +0 -1
  184. /package/src/cli/templates/{fragment.fs → fragment-gl/fragment.fs} +0 -0
@@ -1,26 +1,30 @@
1
1
  <script>
2
- import Module from "../ui/Module.svelte";
3
- import Field from "../ui/Field.svelte";
4
- import FieldGroup from "../ui/FieldGroup.svelte";
5
- import { exports } from "../stores";
6
- import { recording, capturing, IMAGE_ENCODINGS, VIDEO_FORMATS } from "../stores/exports";
2
+ import Module from '../ui/Module.svelte';
3
+ import Field from '../ui/Field.svelte';
4
+ import FieldGroup from '../ui/FieldGroup.svelte';
5
+ import { exports } from '../stores';
6
+ import {
7
+ recording,
8
+ capturing,
9
+ IMAGE_ENCODINGS,
10
+ VIDEO_FORMATS,
11
+ } from '../stores/exports';
7
12
 
8
- export let mID;
9
- export let hasHeader = true;
13
+ export let mID;
14
+ export let hasHeader = true;
10
15
 
11
- const LABEL_RECORD = "start";
12
- const LABEL_RECORDING = "stop";
16
+ const LABEL_RECORD = 'start';
17
+ const LABEL_RECORDING = 'stop';
13
18
 
14
- function record () {
15
- $recording = !$recording;
16
- }
19
+ function record() {
20
+ $recording = !$recording;
21
+ }
17
22
 
18
- function capture() {
19
- $capturing = !$capturing;
20
- }
21
-
22
- $: recordLabel = $recording ? LABEL_RECORDING : LABEL_RECORD;
23
+ function capture() {
24
+ $capturing = !$capturing;
25
+ }
23
26
 
27
+ $: recordLabel = $recording ? LABEL_RECORDING : LABEL_RECORD;
24
28
  </script>
25
29
 
26
30
  <Module {mID} {hasHeader} name="exports">
@@ -29,72 +33,87 @@ $: recordLabel = $recording ? LABEL_RECORDING : LABEL_RECORD;
29
33
  key="encoding"
30
34
  value={$exports.imageEncoding}
31
35
  params={{ options: IMAGE_ENCODINGS }}
32
- on:change={((e) => {
36
+ on:change={(e) => {
33
37
  $exports.imageEncoding = e.detail;
34
- })}
38
+ }}
35
39
  />
36
40
  <Field
37
41
  key="quality"
38
42
  value={$exports.imageQuality}
39
- params={{ min: 1, max: 100, suffix: "%", triggerable: false }}
40
- on:change={((e) => {
43
+ params={{ min: 1, max: 100, suffix: '%', triggerable: false }}
44
+ on:change={(e) => {
41
45
  $exports.imageQuality = e.detail;
42
- })}
46
+ }}
43
47
  />
44
48
  <Field
45
49
  key="pixelsPerInch"
46
50
  value={$exports.pixelsPerInch}
47
51
  params={{ step: 1 }}
48
- on:change={((e) => {
52
+ on:change={(e) => {
49
53
  $exports.pixelsPerInch = e.detail;
50
- })}
54
+ }}
55
+ />
56
+ <Field
57
+ key="count"
58
+ value={$exports.imageCount || 1}
59
+ params={{ step: 1 }}
60
+ on:change={(e) => {
61
+ console.log(e.detail, $exports.imageCount);
62
+ $exports.imageCount = e.detail;
63
+ }}
51
64
  />
52
65
  <Field
53
66
  key="screenshot"
54
67
  value={capture}
55
- params={{ label: "capture", triggerable: false }}
68
+ params={{ label: 'capture', triggerable: false }}
56
69
  />
57
70
  </FieldGroup>
58
71
  <FieldGroup name="video">
59
72
  <Field
60
73
  key="framerate"
61
74
  value={$exports.framerate}
62
- on:change={((e) => {
75
+ on:change={(e) => {
63
76
  $exports.framerate = e.detail;
64
- })}
77
+ }}
65
78
  />
66
79
  <Field
67
80
  key="format"
68
81
  value={$exports.videoFormat}
69
82
  params={{ options: Object.values(VIDEO_FORMATS) }}
70
- on:change={((e) => {
83
+ on:change={(e) => {
71
84
  $exports.videoFormat = e.detail;
72
- })}
85
+ }}
73
86
  />
74
87
  <Field
75
88
  key="quality"
76
89
  value={$exports.videoQuality}
77
- params={{ min: 1, max: 100, step: 1, suffix: "%", triggerable: false }}
78
- on:change={((e) => {
90
+ params={{
91
+ min: 1,
92
+ max: 100,
93
+ step: 1,
94
+ suffix: '%',
95
+ triggerable: false,
96
+ }}
97
+ on:change={(e) => {
79
98
  $exports.videoQuality = e.detail;
80
- })}
99
+ }}
81
100
  />
82
101
  <Field
83
102
  key="useDuration"
84
103
  value={$exports.useDuration}
85
- on:change={((e) => {
104
+ on:change={(e) => {
86
105
  $exports.useDuration = e.detail;
87
- })}
88
- />
89
- {#if $exports.useDuration }
90
- <Field
91
- key="loopCount"
92
- value={$exports.loopCount}
93
- params={{ step: 1 }}
94
- on:change={((e) => {
95
- $exports.loopCount = e.detail;
96
- })}
106
+ }}
97
107
  />
108
+ {#if $exports.useDuration}
109
+ <Field
110
+ key="loopCount"
111
+ value={$exports.loopCount}
112
+ params={{ step: 1 }}
113
+ on:change={(e) => {
114
+ $exports.loopCount = e.detail;
115
+ }}
116
+ />
98
117
  {/if}
99
118
  <Field
100
119
  key="record"
@@ -1,106 +1,105 @@
1
1
  <script>
2
- import { onMount } from "svelte";
3
- import Module from "../ui/Module.svelte";
4
- import Field from "../ui/Field.svelte";
5
- import MIDI from "../inputs/MIDI.js";
6
-
7
- export let mID;
8
- export let hasHeader;
9
-
10
- let input, output;
11
- let inputs = [], outputs = [];
12
-
13
- function createDeviceOptions(deviceMap = new Map()) {
14
- let options = [];
15
-
16
- if (deviceMap.size !== 0) {
17
- options.push({ value: "none", label: "No device selected." });
18
- }
19
-
20
- for (let entry of deviceMap) {
21
- let device = entry[1];
22
- const { id, name, manufacturer } = device;
23
-
24
- options.push({ value: id, label: `${manufacturer} ${name} – id: ${id}` });
25
- }
26
-
27
- if (options.length === 0) {
28
- options = [
29
- { value: "none", label: "No device detected."}
30
- ];
31
- }
32
-
33
- return options;
34
- }
35
-
36
- let messages = [];
37
-
38
- $: {
39
- MIDI.selectedInputID = input;
40
- }
41
-
42
- $: {
43
- MIDI.selectedOutputID = output;
44
- }
45
-
46
- onMount(async () => {
47
- await MIDI.request();
48
-
49
- function refresh() {
50
- inputs = createDeviceOptions(MIDI.inputs);
51
- outputs = createDeviceOptions(MIDI.outputs);
52
-
53
- // if a single device is connected, select it by default
54
- input = (inputs.length === 2 ? inputs[1].value : inputs[0].value);
55
- output = (outputs.length === 2 ? outputs[1].value : outputs[0].value);
56
- }
57
-
58
- MIDI.addEventListener("connected", refresh);
59
- MIDI.addEventListener("disconnected", () => {
60
- refresh();
61
- });
62
-
63
- MIDI.addEventListener("message", (event) => {
64
- const { type, note, channel, value } = event;
65
- let date = new Date();
66
- let time = `${date.getHours()}:${String(date.getMinutes()).padStart(2, "0")}:${String(date.getSeconds()).padStart(2, "0")}`;
67
-
68
- let noteLog = ["noteon", "noteoff"].includes(type) ? ` note:${note.name}` : ``;
69
-
70
- messages = [
71
- ...messages,
72
- `${time} ${type} number:${note.number}${noteLog}`,
73
- ]
74
- });
75
-
76
- refresh();
77
- });
78
-
2
+ import { onMount } from 'svelte';
3
+ import Module from '../ui/Module.svelte';
4
+ import Field from '../ui/Field.svelte';
5
+ import MIDI from '../inputs/MIDI.js';
6
+
7
+ export let mID;
8
+ export let hasHeader;
9
+
10
+ let input, output;
11
+ let inputs = [],
12
+ outputs = [];
13
+
14
+ function createDeviceOptions(deviceMap = new Map()) {
15
+ let options = [];
16
+
17
+ if (deviceMap.size !== 0) {
18
+ options.push({ value: 'none', label: 'No device selected.' });
19
+ }
20
+
21
+ for (let entry of deviceMap) {
22
+ let device = entry[1];
23
+ const { id, name, manufacturer } = device;
24
+
25
+ options.push({
26
+ value: id,
27
+ label: `${manufacturer} ${name} id: ${id}`,
28
+ });
29
+ }
30
+
31
+ if (options.length === 0) {
32
+ options = [{ value: 'none', label: 'No device detected.' }];
33
+ }
34
+
35
+ return options;
36
+ }
37
+
38
+ let messages = [];
39
+
40
+ $: {
41
+ MIDI.selectedInputID = input;
42
+ }
43
+
44
+ $: {
45
+ MIDI.selectedOutputID = output;
46
+ }
47
+
48
+ onMount(async () => {
49
+ await MIDI.request();
50
+
51
+ function refresh() {
52
+ inputs = createDeviceOptions(MIDI.inputs);
53
+ outputs = createDeviceOptions(MIDI.outputs);
54
+
55
+ // if a single device is connected, select it by default
56
+ input = inputs.length === 2 ? inputs[1].value : inputs[0].value;
57
+ output = outputs.length === 2 ? outputs[1].value : outputs[0].value;
58
+ }
59
+
60
+ MIDI.addEventListener('connected', refresh);
61
+ MIDI.addEventListener('disconnected', () => {
62
+ refresh();
63
+ });
64
+
65
+ MIDI.addEventListener('message', (event) => {
66
+ const { type, note, channel, value } = event;
67
+ let date = new Date();
68
+ let time = `${date.getHours()}:${String(date.getMinutes()).padStart(
69
+ 2,
70
+ '0',
71
+ )}:${String(date.getSeconds()).padStart(2, '0')}`;
72
+
73
+ let noteLog = ['noteon', 'noteoff'].includes(type)
74
+ ? ` note:${note.name}`
75
+ : ``;
76
+
77
+ messages = [
78
+ ...messages,
79
+ `${time} ${type} number:${note.number}${noteLog}`,
80
+ ];
81
+ });
82
+
83
+ refresh();
84
+ });
79
85
  </script>
80
86
 
81
87
  <Module {mID} {hasHeader} name="MIDI" {...$$props} slug="midi">
82
- <Field
83
- key="inputs"
84
- value={input}
85
- on:change={(event) => input = event.detail}
86
- params={{
87
- options: inputs,
88
- }}
89
- />
90
- <Field
91
- key="outputs"
92
- value={output}
93
- on:change={(event) => output = event.detail}
94
- params={{
95
- options: outputs,
96
- }}
97
- />
98
- <Field
99
- key="messages"
100
- value={messages}
101
- type="list"
102
- params={{
103
- disabled: true
104
- }}
105
- />
88
+ <Field
89
+ key="inputs"
90
+ value={input}
91
+ on:change={(event) => (input = event.detail)}
92
+ params={{
93
+ options: inputs,
94
+ }}
95
+ />
96
+ <Field
97
+ key="outputs"
98
+ value={output}
99
+ on:change={(event) => (output = event.detail)}
100
+ params={{
101
+ options: outputs,
102
+ }}
103
+ />
104
+ <Field key="messages" value={messages} type="list" disabled />
106
105
  </Module>
@@ -1,74 +1,74 @@
1
1
  <script context="module">
2
- let ID = 0;
2
+ let ID = 0;
3
3
  </script>
4
4
 
5
5
  <script>
6
- import { onMount, onDestroy } from "svelte";
7
- import Module from "../ui/Module.svelte";
8
- import SketchRenderer from "../ui/SketchRenderer.svelte";
9
- import OutputRenderer from "../ui/OutputRenderer.svelte";
10
- import SketchSelect from "../ui/SketchSelect.svelte";
11
- import { sketchesKeys } from "../stores/sketches.js";
12
- import { monitors, preview } from "../stores/rendering";
6
+ import { onMount, onDestroy } from 'svelte';
7
+ import Module from '../ui/Module.svelte';
8
+ import SketchRenderer from '../ui/SketchRenderer.svelte';
9
+ import OutputRenderer from '../ui/OutputRenderer.svelte';
10
+ import SketchSelect from '../ui/SketchSelect.svelte';
11
+ import { sketchesKeys } from '../stores/sketches.js';
12
+ import { monitors, preview } from '../stores/rendering';
13
13
 
14
- export let mID;
15
- export let hasHeader = true;
16
- export let sketchKey = null;
14
+ export let mID;
15
+ export let hasHeader = true;
16
+ export let sketchKey = null;
17
17
 
18
- let id = ID++;
19
- let name = "monitor";
20
- let selected = sketchKey ?
21
- sketchKey :
22
- ($preview ? $preview : $sketchesKeys[Math.min(id, $sketchesKeys.length - 1)]);
18
+ let id = ID++;
19
+ let name = 'monitor';
20
+ let selected = sketchKey
21
+ ? sketchKey
22
+ : $preview
23
+ ? $preview
24
+ : $sketchesKeys[Math.min(id, $sketchesKeys.length - 1)];
23
25
 
24
- sketchesKeys.subscribe((keys) => {
25
- if (!selected && keys.length > 0) {
26
- $monitors = $monitors.map(monitor => {
27
- if (monitor.id === id) {
28
- monitor.selected = $sketchesKeys[Math.min(id, $sketchesKeys.length - 1)];
29
- }
26
+ sketchesKeys.subscribe((keys) => {
27
+ if (!selected && keys.length > 0) {
28
+ $monitors = $monitors.map((monitor) => {
29
+ if (monitor.id === id) {
30
+ monitor.selected =
31
+ $sketchesKeys[Math.min(id, $sketchesKeys.length - 1)];
32
+ }
30
33
 
31
- return monitor;
32
- });
33
- }
34
- });
34
+ return monitor;
35
+ });
36
+ }
37
+ });
35
38
 
36
- onMount(() => {
37
- $monitors = [
38
- ...$monitors,
39
- {
40
- id,
41
- selected,
42
- }
43
- ];
44
- });
39
+ onMount(() => {
40
+ $monitors = [
41
+ ...$monitors,
42
+ {
43
+ id,
44
+ selected,
45
+ },
46
+ ];
47
+ });
45
48
 
46
- monitors.subscribe((all) => {
47
- const current = all.find((monitor) => monitor.id === id);
49
+ monitors.subscribe((all) => {
50
+ const current = all.find((monitor) => monitor.id === id);
48
51
 
49
- if (current && current.selected !== selected) {
50
- selected = current.selected;
51
- }
52
- })
52
+ if (current && current.selected !== selected) {
53
+ selected = current.selected;
54
+ }
55
+ });
53
56
 
54
- onDestroy(() => {
55
- $monitors = $monitors.filter((m) => m.id !== id);
56
- });
57
+ onDestroy(() => {
58
+ $monitors = $monitors.filter((m) => m.id !== id);
59
+ });
57
60
 
58
- $: index = $monitors.findIndex(monitor => monitor.id === id);
59
- $: moduleName = `${name} ${$monitors.length > 1 ? (index + 1) : ""}`;
61
+ $: index = $monitors.findIndex((monitor) => monitor.id === id);
62
+ $: moduleName = `${name} ${$monitors.length > 1 ? index + 1 : ''}`;
60
63
  </script>
61
64
 
62
65
  <Module {hasHeader} {mID} slug="monitor" name={moduleName} scrollable={false}>
63
- <svelte:fragment slot="header-left">
64
- <SketchSelect
65
- monitorID={id}
66
- {selected}
67
- />
68
- </svelte:fragment>
69
- {#if selected && selected !== "output"}
70
- <SketchRenderer key={selected} {id} />
71
- {:else if selected }
72
- <OutputRenderer />
73
- {/if}
66
+ <svelte:fragment slot="header-left">
67
+ <SketchSelect monitorID={id} {selected} />
68
+ </svelte:fragment>
69
+ {#if selected && selected !== 'output'}
70
+ <SketchRenderer key={selected} {id} />
71
+ {:else if selected}
72
+ <OutputRenderer />
73
+ {/if}
74
74
  </Module>