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,268 +1,280 @@
1
1
  <script context="module">
2
- const inputs = {
3
- "Mouse": {
4
- events: [
5
- { name: "onMouseDown", triggerable: true, controllable: false },
6
- { name: "onMouseUp", triggerable: true, controllable: false },
7
- { name: "onMouseMove", triggerable: true, controllable: false },
8
- { name: "onClick", triggerable: true, controllable: false },
9
- ]
10
- },
11
- "Keyboard": {
12
- events: [
13
- { name: "onKeyDown", triggerable: true, controllable: false },
14
- { name: "onKeyPress", triggerable: true, controllable: false },
15
- { name: "onKeyUp", triggerable: true, controllable: false },
16
- ]
17
- },
18
- "MIDI": {
19
- events: [
20
- { name: "onNoteOn", triggerable: true, controllable: false },
21
- { name: "onNoteOff", triggerable: true, controllable: false },
22
- { name: "onNumberOn", triggerable: true, controllable: false },
23
- { name: "onNumberOff", triggerable: true, controllable: false },
24
- { name: "onControlChange", triggerable: false, controllable: true },
25
- ],
26
- }
27
- };
2
+ const inputs = {
3
+ Mouse: {
4
+ events: [
5
+ { name: 'onMouseDown', triggerable: true, controllable: false },
6
+ { name: 'onMouseUp', triggerable: true, controllable: false },
7
+ { name: 'onMouseMove', triggerable: true, controllable: false },
8
+ { name: 'onClick', triggerable: true, controllable: false },
9
+ ],
10
+ },
11
+ Keyboard: {
12
+ events: [
13
+ { name: 'onKeyDown', triggerable: true, controllable: false },
14
+ { name: 'onKeyPress', triggerable: true, controllable: false },
15
+ { name: 'onKeyUp', triggerable: true, controllable: false },
16
+ ],
17
+ },
18
+ MIDI: {
19
+ events: [
20
+ { name: 'onNoteOn', triggerable: true, controllable: false },
21
+ { name: 'onNoteOff', triggerable: true, controllable: false },
22
+ { name: 'onNumberOn', triggerable: true, controllable: false },
23
+ { name: 'onNumberOff', triggerable: true, controllable: false },
24
+ {
25
+ name: 'onControlChange',
26
+ triggerable: false,
27
+ controllable: true,
28
+ },
29
+ ],
30
+ },
31
+ };
28
32
  </script>
29
33
 
30
34
  <script>
31
- import IconCross from "../components/IconCross.svelte";
32
- import ButtonInput from "./fields/ButtonInput.svelte";
33
- import FieldInputRow from "./fields/FieldInputRow.svelte";
34
- import Select from "./fields/Select.svelte";
35
- import TextInput from "./fields/TextInput.svelte";
36
- import * as triggersMap from "../triggers/index.js";
37
- import { createEventDispatcher, onDestroy, onMount } from "svelte";
38
-
39
- export let index;
40
- export let inputType = undefined;
41
- export let eventName = undefined;
42
- export let enabled = true;
43
- export let controllable = false;
44
- export let triggerable = false;
45
- export let context;
46
- export let onTrigger = () => {};
47
- export let params = { key: []};
48
-
49
- let trigger;
50
- let dispatch = createEventDispatcher();
51
-
52
- function registerTrigger() {
53
- if (trigger) {
54
- enabled = trigger.enabled;
55
-
56
- trigger.destroy();
57
- trigger = null;
58
- }
59
-
60
- const createTrigger = triggersMap[eventName];
61
-
62
- trigger = createTrigger(onTrigger, {
63
- ...params,
64
- context,
65
- hot: false,
66
- enabled,
67
- });
68
- }
69
-
70
- function onTypeChange(event) {
71
- inputType = event.detail;
72
-
73
- if (!eventOptions.includes(eventName)) {
74
- eventName = undefined;
75
- params.key = null;
76
- }
77
-
78
- if (trigger) {
79
- trigger.destroy();
80
- trigger = null;
81
- }
82
- }
83
-
84
- function onEventChange(event) {
85
- const clearParams = (inputType === "MIDI" && eventName !== undefined &&
86
- ((eventName.includes("Number") && event.detail.includes("Note")) ||
87
- (eventName.includes("Note") && event.detail.includes("Number")))
88
- );
89
-
90
- eventName = event.detail;
91
-
92
- if (clearParams) {
93
- params.key = "";
94
- }
95
-
96
- if (inputType === "Mouse") {
97
- registerTrigger();
98
- }
99
- }
100
-
101
- function onTextChange(e) {
102
- params.key = e.detail;
103
-
104
- registerTrigger();
105
- }
106
-
107
- function handleClickDelete() {
108
- dispatch('delete', index);
109
- }
110
-
111
- function toggleTrigger() {
112
- if (trigger) {
113
- trigger.enabled = !trigger.enabled;
114
- }
115
- }
116
-
117
- onMount(() => {
118
- if (
119
- (inputType === "Mouse" && eventName) ||
120
- (inputType && eventName && params.key)
121
- ) {
122
- registerTrigger();
123
- }
124
- });
125
-
126
- onDestroy(() => {
127
- if (trigger) {
128
- trigger.destroy();
129
- trigger = null;
130
- }
131
- });
132
-
133
- $: validInputs = [...Object.keys(inputs)].reduce((all, inputName) => {
134
- const input = inputs[inputName];
135
- const { disabled, events } = input;
136
- const filteredEvents = events.filter((event) => {
137
- return event.triggerable === triggerable && event.controllable === controllable;
138
- });
139
-
140
- if (filteredEvents.length > 0) {
141
- all[inputName] = { events: filteredEvents, disabled };
142
- };
143
-
144
- return all;
145
- }, {});
146
-
147
- $: inputOptions = [
148
- { label: "Select input", value: undefined, disabled: true },
149
- ...Object.keys(validInputs).map((inputName) => ({
150
- value: inputName,
151
- disabled: validInputs[inputName].disabled,
152
- }))
153
- ];
154
-
155
- $: eventOptions = inputType ? [
156
- { label: "-", value: undefined, disabled: true },
157
- ...validInputs[inputType].events.map(event => ({ value: event.name }))
158
- ] : [];
159
-
160
- $: isValid = inputType && eventName;
161
- $: key = params.key;
162
-
35
+ import IconCross from '../components/IconCross.svelte';
36
+ import ButtonInput from './fields/ButtonInput.svelte';
37
+ import FieldInputRow from './fields/FieldInputRow.svelte';
38
+ import Select from './fields/Select.svelte';
39
+ import TextInput from './fields/TextInput.svelte';
40
+ import * as triggersMap from '../triggers/index.js';
41
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
42
+
43
+ export let index;
44
+ export let inputType = undefined;
45
+ export let eventName = undefined;
46
+ export let enabled = true;
47
+ export let controllable = false;
48
+ export let triggerable = false;
49
+ export let context;
50
+ export let onTrigger = () => {};
51
+ export let params = { key: [] };
52
+
53
+ let trigger;
54
+ let dispatch = createEventDispatcher();
55
+
56
+ function registerTrigger() {
57
+ if (trigger) {
58
+ enabled = trigger.enabled;
59
+
60
+ trigger.destroy();
61
+ trigger = null;
62
+ }
63
+
64
+ const createTrigger = triggersMap[eventName];
65
+
66
+ trigger = createTrigger(onTrigger, {
67
+ ...params,
68
+ context,
69
+ hot: false,
70
+ enabled,
71
+ });
72
+ }
73
+
74
+ function onTypeChange(event) {
75
+ inputType = event.detail;
76
+
77
+ if (!eventOptions.includes(eventName)) {
78
+ eventName = undefined;
79
+ params.key = null;
80
+ }
81
+
82
+ if (trigger) {
83
+ trigger.destroy();
84
+ trigger = null;
85
+ }
86
+ }
87
+
88
+ function onEventChange(event) {
89
+ const clearParams =
90
+ inputType === 'MIDI' &&
91
+ eventName !== undefined &&
92
+ ((eventName.includes('Number') && event.detail.includes('Note')) ||
93
+ (eventName.includes('Note') &&
94
+ event.detail.includes('Number')));
95
+
96
+ eventName = event.detail;
97
+
98
+ if (clearParams) {
99
+ params.key = '';
100
+ }
101
+
102
+ if (inputType === 'Mouse') {
103
+ registerTrigger();
104
+ }
105
+ }
106
+
107
+ function onTextChange(e) {
108
+ params.key = e.detail;
109
+
110
+ registerTrigger();
111
+ }
112
+
113
+ function handleClickDelete() {
114
+ dispatch('delete', index);
115
+ }
116
+
117
+ function toggleTrigger() {
118
+ if (trigger) {
119
+ trigger.enabled = !trigger.enabled;
120
+ }
121
+ }
122
+
123
+ onMount(() => {
124
+ if (
125
+ (inputType === 'Mouse' && eventName) ||
126
+ (inputType && eventName && params.key)
127
+ ) {
128
+ registerTrigger();
129
+ }
130
+ });
131
+
132
+ onDestroy(() => {
133
+ if (trigger) {
134
+ trigger.destroy();
135
+ trigger = null;
136
+ }
137
+ });
138
+
139
+ $: validInputs = [...Object.keys(inputs)].reduce((all, inputName) => {
140
+ const input = inputs[inputName];
141
+ const { disabled, events } = input;
142
+ const filteredEvents = events.filter((event) => {
143
+ return (
144
+ event.triggerable === triggerable &&
145
+ event.controllable === controllable
146
+ );
147
+ });
148
+
149
+ if (filteredEvents.length > 0) {
150
+ all[inputName] = { events: filteredEvents, disabled };
151
+ }
152
+
153
+ return all;
154
+ }, {});
155
+
156
+ $: inputOptions = [
157
+ { label: 'Select input', value: undefined, disabled: true },
158
+ ...Object.keys(validInputs).map((inputName) => ({
159
+ value: inputName,
160
+ disabled: validInputs[inputName].disabled,
161
+ })),
162
+ ];
163
+
164
+ $: eventOptions = inputType
165
+ ? [
166
+ { label: '-', value: undefined, disabled: true },
167
+ ...validInputs[inputType].events.map((event) => ({
168
+ value: event.name,
169
+ })),
170
+ ]
171
+ : [];
172
+
173
+ $: isValid = inputType && eventName;
174
+ $: key = params.key;
163
175
  </script>
164
176
 
165
- <div class="field-trigger {inputType ? inputType.toLowerCase() : ""}">
166
- <FieldInputRow --grid-template-columns="var(--width-activity) var(--width-cols) var(--width-delete)">
167
- <button
168
- class="activity"
169
- class:valid={isValid}
170
- class:enabled={trigger && trigger.enabled}
171
- class:disabled={!trigger || !trigger.enabled}
172
- on:click={toggleTrigger}
173
- ></button>
174
- <Select
175
- name="trigger-input"
176
- value={inputType}
177
- options={inputOptions}
178
- on:change={onTypeChange}
179
- />
180
- {#if inputType }
181
- <Select
182
- options={eventOptions}
183
- bind:value={eventName}
184
- disabled={inputType === undefined}
185
- on:change={onEventChange}
186
- />
187
- {/if}
188
- {#if inputType === 'Keyboard'}
189
- <TextInput
190
- bind:value={key}
191
- label="key"
192
- on:input={onTextChange}
193
- />
194
- {/if}
195
- {#if inputType === 'MIDI'}
196
- <TextInput
197
- bind:value={key}
198
- label={["onNoteOn", "onNoteOff"].includes(eventName) ? "note" : "number"}
199
- on:input={onTextChange}
200
- />
201
- {/if}
202
- <ButtonInput
203
- label="delete"
204
- showLabel={false}
205
- on:click={handleClickDelete}
206
- --color-text="white"
207
- --background-color="var(--color-red)"
208
- --box-shadow-color-active="var(--color-lightred)"
209
- >
210
- <IconCross />
211
- </ButtonInput>
212
- </FieldInputRow>
177
+ <div class="field-trigger {inputType ? inputType.toLowerCase() : ''}">
178
+ <FieldInputRow
179
+ --grid-template-columns="var(--width-activity) var(--width-cols) var(--width-delete)"
180
+ >
181
+ <button
182
+ class="activity"
183
+ class:valid={isValid}
184
+ class:enabled={trigger && trigger.enabled}
185
+ class:disabled={!trigger || !trigger.enabled}
186
+ on:click={toggleTrigger}
187
+ ></button>
188
+ <Select
189
+ name="trigger-input"
190
+ value={inputType}
191
+ options={inputOptions}
192
+ on:change={onTypeChange}
193
+ />
194
+ {#if inputType}
195
+ <Select
196
+ options={eventOptions}
197
+ bind:value={eventName}
198
+ disabled={inputType === undefined}
199
+ on:change={onEventChange}
200
+ />
201
+ {/if}
202
+ {#if inputType === 'Keyboard'}
203
+ <TextInput bind:value={key} label="key" on:input={onTextChange} />
204
+ {/if}
205
+ {#if inputType === 'MIDI'}
206
+ <TextInput
207
+ bind:value={key}
208
+ label={['onNoteOn', 'onNoteOff'].includes(eventName)
209
+ ? 'note'
210
+ : 'number'}
211
+ on:input={onTextChange}
212
+ />
213
+ {/if}
214
+ <ButtonInput
215
+ label="delete"
216
+ showLabel={false}
217
+ on:click={handleClickDelete}
218
+ --color-text="white"
219
+ --background-color="var(--color-red)"
220
+ --box-shadow-color-active="var(--color-lightred)"
221
+ >
222
+ <IconCross />
223
+ </ButtonInput>
224
+ </FieldInputRow>
213
225
  </div>
214
226
 
215
227
  <style>
228
+ .field-trigger {
229
+ --width-delete: var(--height-input);
230
+ --width-input: 90px;
231
+ --width-activity: 16px;
232
+ --width-cols: 1fr;
216
233
 
217
- .field-trigger {
218
- --width-delete: var(--height-input);
219
- --width-input: 90px;
220
- --width-activity: 16px;
221
- --width-cols: 1fr;
222
-
223
- width: 100%;
224
- }
234
+ width: 100%;
235
+ }
225
236
 
226
- .activity {
227
- --background-color: rgba(255, 255, 255, 0.5);
237
+ .activity {
238
+ --background-color: rgba(255, 255, 255, 0.5);
228
239
 
229
- position: relative;
240
+ position: relative;
230
241
 
231
- width: var(--width-activity);
232
- height: 100%;
242
+ width: var(--width-activity);
243
+ height: 100%;
233
244
 
234
- background-color: transparent;
235
- }
245
+ background-color: transparent;
246
+ }
236
247
 
237
- .activity:before {
238
- --size: 4px;
248
+ .activity:before {
249
+ --size: 4px;
239
250
 
240
- content: '';
251
+ content: '';
241
252
 
242
- position: absolute;
243
- top: calc(50% - var(--size) * 0.5);
244
- left: calc(50% - var(--size) * 0.5);
253
+ position: absolute;
254
+ top: calc(50% - var(--size) * 0.5);
255
+ left: calc(50% - var(--size) * 0.5);
245
256
 
246
- width: var(--size);
247
- height: var(--size);
248
- border-radius: 2px;
257
+ width: var(--size);
258
+ height: var(--size);
259
+ border-radius: 2px;
249
260
 
250
- background-color: var(--background-color);
251
- }
261
+ background-color: var(--background-color);
262
+ }
252
263
 
253
- .activity.valid.enabled {
254
- --background-color: var(--color-green);
255
- }
264
+ .activity.valid.enabled {
265
+ --background-color: var(--color-green);
266
+ }
256
267
 
257
- .activity.valid.disabled {
258
- --background-color: var(--color-red);
259
- }
268
+ .activity.valid.disabled {
269
+ --background-color: var(--color-red);
270
+ }
260
271
 
261
- .field-trigger.mouse {
262
- --width-cols: var(--width-input) 1fr;
263
- }
272
+ .field-trigger.mouse {
273
+ --width-cols: var(--width-input) 1fr;
274
+ }
264
275
 
265
- .field-trigger.keyboard, .field-trigger.midi {
266
- --width-cols: var(--width-input) 1fr 0.75fr;
267
- }
276
+ .field-trigger.keyboard,
277
+ .field-trigger.midi {
278
+ --width-cols: var(--width-input) 1fr 0.75fr;
279
+ }
268
280
  </style>
@@ -1,58 +1,58 @@
1
1
  <script>
2
- import FieldTrigger from "./FieldTrigger.svelte";
3
- import ButtonInput from "./fields/ButtonInput.svelte";
2
+ import FieldTrigger from './FieldTrigger.svelte';
3
+ import ButtonInput from './fields/ButtonInput.svelte';
4
4
 
5
- export let context;
6
- export let onTrigger;
7
- export let triggers;
8
- export let triggerable = false;
9
- export let controllable = false;
5
+ export let context;
6
+ export let onTrigger;
7
+ export let triggers;
8
+ export let triggerable = false;
9
+ export let controllable = false;
10
10
 
11
- function onTriggerDelete(e) {
12
- const triggerIndex = e.detail;
11
+ function onTriggerDelete(e) {
12
+ const triggerIndex = e.detail;
13
13
 
14
- $triggers = $triggers.filter((t, i) => i !== triggerIndex);
15
- }
14
+ $triggers = $triggers.filter((t, i) => i !== triggerIndex);
15
+ }
16
16
 
17
- function handleClickAdd() {
18
- triggers.update((current) => {
19
- return [
20
- ...current,
21
- {
22
- inputType: undefined,
23
- eventName: undefined,
24
- },
25
- ]
26
- });
27
- }
17
+ function handleClickAdd() {
18
+ triggers.update((current) => {
19
+ return [
20
+ ...current,
21
+ {
22
+ inputType: undefined,
23
+ eventName: undefined,
24
+ },
25
+ ];
26
+ });
27
+ }
28
28
  </script>
29
29
 
30
- {#if onTrigger }
31
- <ButtonInput label="add trigger" on:click={handleClickAdd} />
32
- <div class="field-triggers">
33
- {#each $triggers as trigger, index}
34
- <FieldTrigger
35
- {index}
36
- bind:inputType={trigger.inputType}
37
- bind:eventName={trigger.eventName}
38
- bind:params={trigger.params}
39
- bind:enabled={trigger.enabled}
40
- {onTrigger}
41
- {context}
42
- {controllable}
43
- {triggerable}
44
- on:delete={onTriggerDelete}
45
- />
46
- {/each}
47
- </div>
30
+ {#if onTrigger}
31
+ <ButtonInput label="add trigger" on:click={handleClickAdd} />
32
+ <div class="field-triggers">
33
+ {#each $triggers as trigger, index}
34
+ <FieldTrigger
35
+ {index}
36
+ bind:inputType={trigger.inputType}
37
+ bind:eventName={trigger.eventName}
38
+ bind:params={trigger.params}
39
+ bind:enabled={trigger.enabled}
40
+ {onTrigger}
41
+ {context}
42
+ {controllable}
43
+ {triggerable}
44
+ on:delete={onTriggerDelete}
45
+ />
46
+ {/each}
47
+ </div>
48
48
  {/if}
49
49
 
50
50
  <style>
51
- .field-triggers {
52
- width: 100%;
53
- }
51
+ .field-triggers {
52
+ width: 100%;
53
+ }
54
54
 
55
- .field-triggers:not(:empty) {
56
- margin-top: var(--column-gap);
57
- }
55
+ .field-triggers:not(:empty) {
56
+ margin-top: var(--column-gap);
57
+ }
58
58
  </style>