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
@@ -1,10 +1,15 @@
1
1
  <script>
2
- export let key;
3
- export let visible = true;
4
- export let secondary = false;
5
- export let interactive = false;
6
- export let displayName = undefined;
7
- export let disabled = false;
2
+ let {
3
+ key,
4
+ visible = true,
5
+ secondary,
6
+ interactive,
7
+ displayName = undefined,
8
+ disabled = false,
9
+ children,
10
+ infos,
11
+ onclick,
12
+ } = $props();
8
13
  </script>
9
14
 
10
15
  <div
@@ -16,17 +21,17 @@
16
21
  <div class="field__infos">
17
22
  {#if displayName !== null}
18
23
  {#if interactive}
19
- <button class="field__label" {disabled} on:click
24
+ <button class="field__label" {disabled} {onclick}
20
25
  >{displayName ?? key}</button
21
26
  >
22
27
  {:else}
23
28
  <span class="field__label">{displayName ?? key}</span>
24
29
  {/if}
25
30
  {/if}
26
- <slot name="infos" />
31
+ {@render infos?.()}
27
32
  </div>
28
33
  <div class="field__input">
29
- <slot />
34
+ {@render children?.()}
30
35
  </div>
31
36
  </div>
32
37
 
@@ -1,5 +1,5 @@
1
1
  <script>
2
- export let height = 20;
2
+ let { height = 20 } = $props();
3
3
  </script>
4
4
 
5
5
  <div class="field-space" style="height: {height}px"></div>
@@ -38,25 +38,67 @@
38
38
  import Select from './fields/Select.svelte';
39
39
  import TextInput from './fields/TextInput.svelte';
40
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
-
41
+ import { onMount } from 'svelte';
42
+
43
+ let {
44
+ index,
45
+ inputType,
46
+ eventName,
47
+ enabled,
48
+ controllable = false,
49
+ triggerable = false,
50
+ context,
51
+ onchange = () => {},
52
+ onTrigger = () => {},
53
+ onDelete = () => {},
54
+ params = { key: [] },
55
+ } = $props();
56
+
57
+ let validInputs = $derived.by(() =>
58
+ [...Object.keys(inputs)].reduce((all, inputName) => {
59
+ const input = inputs[inputName];
60
+ const { disabled, events } = input;
61
+ const filteredEvents = events.filter((event) => {
62
+ return (
63
+ event.triggerable === triggerable &&
64
+ event.controllable === controllable
65
+ );
66
+ });
67
+
68
+ if (filteredEvents.length > 0) {
69
+ all[inputName] = { events: filteredEvents, disabled };
70
+ }
71
+
72
+ return all;
73
+ }, {}),
74
+ );
75
+
76
+ let inputOptions = $derived([
77
+ { label: 'Select input', value: undefined, disabled: true },
78
+ ...Object.keys(validInputs).map((inputName) => ({
79
+ value: inputName,
80
+ disabled: validInputs[inputName].disabled,
81
+ })),
82
+ ]);
83
+
84
+ let eventOptions = $derived(
85
+ inputType
86
+ ? [
87
+ { label: '-', value: undefined, disabled: true },
88
+ ...validInputs[inputType].events.map((event) => ({
89
+ value: event.name,
90
+ })),
91
+ ]
92
+ : [],
93
+ );
94
+
95
+ let isValid = $derived(inputType && eventName);
96
+ let key = $derived(params.key);
53
97
  let trigger;
54
- let dispatch = createEventDispatcher();
55
98
 
56
99
  function registerTrigger() {
100
+ let wasEnabled = trigger?.enabled;
57
101
  if (trigger) {
58
- enabled = trigger.enabled;
59
-
60
102
  trigger.destroy();
61
103
  trigger = null;
62
104
  }
@@ -64,15 +106,17 @@
64
106
  const createTrigger = triggersMap[eventName];
65
107
 
66
108
  trigger = createTrigger(onTrigger, {
67
- ...params,
109
+ ...$state.snapshot(params),
68
110
  context,
69
111
  hot: false,
70
- enabled,
112
+ enabled: wasEnabled,
71
113
  });
114
+
115
+ onchange(index, trigger);
72
116
  }
73
117
 
74
- function onTypeChange(event) {
75
- inputType = event.detail;
118
+ function onTypeChange(value) {
119
+ inputType = value;
76
120
 
77
121
  if (!eventOptions.includes(eventName)) {
78
122
  eventName = undefined;
@@ -85,93 +129,51 @@
85
129
  }
86
130
  }
87
131
 
88
- function onEventChange(event) {
132
+ function onEventChange(value) {
89
133
  const clearParams =
90
134
  inputType === 'MIDI' &&
91
135
  eventName !== undefined &&
92
- ((eventName.includes('Number') && event.detail.includes('Note')) ||
93
- (eventName.includes('Note') &&
94
- event.detail.includes('Number')));
136
+ ((eventName.includes('Number') && value.includes('Note')) ||
137
+ (eventName.includes('Note') && value.includes('Number')));
95
138
 
96
- eventName = event.detail;
139
+ eventName = value;
97
140
 
98
141
  if (clearParams) {
99
142
  params.key = '';
100
143
  }
101
144
 
102
- if (inputType === 'Mouse') {
145
+ if (inputType === 'Mouse' || inputType === 'Keyboard') {
103
146
  registerTrigger();
104
147
  }
105
148
  }
106
149
 
107
- function onTextChange(e) {
108
- params.key = e.detail;
150
+ function onTextChange(event) {
151
+ params.key = event.currentTarget.value;
109
152
 
110
153
  registerTrigger();
111
154
  }
112
155
 
113
156
  function handleClickDelete() {
114
- dispatch('delete', index);
157
+ onDelete(index);
115
158
  }
116
159
 
117
160
  function toggleTrigger() {
118
161
  if (trigger) {
119
162
  trigger.enabled = !trigger.enabled;
163
+ registerTrigger();
120
164
  }
121
165
  }
122
166
 
123
167
  onMount(() => {
124
- if (
125
- (inputType === 'Mouse' && eventName) ||
126
- (inputType && eventName && params.key)
127
- ) {
168
+ if (isValid) {
128
169
  registerTrigger();
129
170
  }
130
- });
131
171
 
132
- onDestroy(() => {
133
- if (trigger) {
134
- trigger.destroy();
172
+ return () => {
173
+ trigger?.destroy();
135
174
  trigger = null;
136
- }
175
+ };
137
176
  });
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;
175
177
  </script>
176
178
 
177
179
  <div class="field-trigger {inputType ? inputType.toLowerCase() : ''}">
@@ -181,40 +183,40 @@
181
183
  <button
182
184
  class="activity"
183
185
  class:valid={isValid}
184
- class:enabled={trigger && trigger.enabled}
185
- class:disabled={!trigger || !trigger.enabled}
186
- on:click={toggleTrigger}
186
+ class:enabled
187
+ class:disabled={!enabled}
188
+ onclick={toggleTrigger}
187
189
  ></button>
188
190
  <Select
189
191
  name="trigger-input"
190
192
  value={inputType}
191
193
  options={inputOptions}
192
- on:change={onTypeChange}
194
+ onchange={onTypeChange}
193
195
  />
194
196
  {#if inputType}
195
197
  <Select
196
198
  options={eventOptions}
197
- bind:value={eventName}
199
+ value={eventName}
198
200
  disabled={inputType === undefined}
199
- on:change={onEventChange}
201
+ onchange={onEventChange}
200
202
  />
201
203
  {/if}
202
204
  {#if inputType === 'Keyboard'}
203
- <TextInput bind:value={key} label="key" on:input={onTextChange} />
205
+ <TextInput value={key} label="key" oninput={onTextChange} />
204
206
  {/if}
205
207
  {#if inputType === 'MIDI'}
206
208
  <TextInput
207
- bind:value={key}
209
+ value={key}
208
210
  label={['onNoteOn', 'onNoteOff'].includes(eventName)
209
211
  ? 'note'
210
212
  : 'number'}
211
- on:input={onTextChange}
213
+ oninput={onTextChange}
212
214
  />
213
215
  {/if}
214
216
  <ButtonInput
215
217
  label="delete"
216
218
  showLabel={false}
217
- on:click={handleClickDelete}
219
+ onclick={handleClickDelete}
218
220
  --color-text="white"
219
221
  --background-color="var(--color-red)"
220
222
  --box-shadow-color-active="var(--color-lightred)"
@@ -2,46 +2,47 @@
2
2
  import FieldTrigger from './FieldTrigger.svelte';
3
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
+ let {
6
+ context,
7
+ onTrigger,
8
+ triggers = $bindable(),
9
+ triggerable = false,
10
+ controllable = false,
11
+ } = $props();
10
12
 
11
- function onTriggerDelete(e) {
12
- const triggerIndex = e.detail;
13
-
14
- $triggers = $triggers.filter((t, i) => i !== triggerIndex);
13
+ function onTriggerDelete(triggerIndex) {
14
+ triggers.splice(triggerIndex, 1);
15
+ // triggers = triggers.filter((t, i) => i !== triggerIndex);
15
16
  }
16
17
 
17
18
  function handleClickAdd() {
18
- triggers.update((current) => {
19
- return [
20
- ...current,
21
- {
22
- inputType: undefined,
23
- eventName: undefined,
24
- },
25
- ];
19
+ triggers.push({
20
+ inputType: undefined,
21
+ eventName: undefined,
22
+ enabled: false,
23
+ params: {},
26
24
  });
27
25
  }
28
26
  </script>
29
27
 
30
28
  {#if onTrigger}
31
- <ButtonInput label="add trigger" on:click={handleClickAdd} />
29
+ <ButtonInput label="add trigger" onclick={handleClickAdd} />
32
30
  <div class="field-triggers">
33
- {#each $triggers as trigger, index}
31
+ {#each triggers as trigger, index}
34
32
  <FieldTrigger
35
33
  {index}
36
- bind:inputType={trigger.inputType}
37
- bind:eventName={trigger.eventName}
38
- bind:params={trigger.params}
39
- bind:enabled={trigger.enabled}
34
+ inputType={trigger.inputType}
35
+ eventName={trigger.eventName}
36
+ params={trigger.params}
37
+ enabled={trigger.enabled}
40
38
  {onTrigger}
41
39
  {context}
42
40
  {controllable}
43
41
  {triggerable}
44
- on:delete={onTriggerDelete}
42
+ onchange={(index, trigger) => {
43
+ triggers[index] = trigger;
44
+ }}
45
+ onDelete={onTriggerDelete}
45
46
  />
46
47
  {/each}
47
48
  </div>
@@ -1,29 +1,54 @@
1
1
  <script>
2
2
  import KeyBinding from '../components/KeyBinding.svelte';
3
3
  import Params from '../modules/Params.svelte';
4
+ import { setContext } from 'svelte';
4
5
 
5
- export let size = 0.3;
6
- export let align = 'right';
7
- export let output = false;
8
- export let hidden = false;
6
+ let {
7
+ size = '340px',
8
+ align = 'right',
9
+ output = false,
10
+ hidden = false,
11
+ minimize = false,
12
+ } = $props();
9
13
 
10
- $: visible = !hidden;
11
- $: width = typeof size === 'number' ? `${size * 100}%` : size;
14
+ let visible = $state(!hidden);
15
+ let width = $derived(typeof size === 'number' ? `${size * 100}%` : size);
16
+ let current = $state({
17
+ minimized: minimize,
18
+ });
19
+
20
+ let minimizedSave = minimize;
21
+ let minimizedProp = $derived(minimize);
22
+ let minimized = $derived(current.minimized);
23
+
24
+ $effect(() => {
25
+ // override current.minimized state if prop changes
26
+ if (minimizedProp !== minimizedSave) {
27
+ current.minimized = minimizedProp;
28
+ minimizedSave = minimizedProp;
29
+ }
30
+ });
31
+
32
+ setContext('parent', current);
33
+ setContext('minimize', () => {
34
+ current.minimized = !current.minimized;
35
+ });
12
36
  </script>
13
37
 
14
38
  <div
15
- class="container"
39
+ class="floating-params"
16
40
  class:hidden={!visible}
17
41
  class:align-left={align === 'left'}
18
42
  class:align-right={align === 'right'}
43
+ class:minimized
19
44
  style={`width: ${width};`}
20
45
  >
21
46
  <Params {output} />
22
47
  </div>
23
- <KeyBinding key="h" on:trigger={() => (visible = !visible)} />
48
+ <KeyBinding key="h" onTrigger={() => (visible = !visible)} />
24
49
 
25
50
  <style>
26
- .container {
51
+ .floating-params {
27
52
  --padding: 16px;
28
53
  position: absolute;
29
54
  top: var(--padding);
@@ -34,15 +59,28 @@
34
59
  overflow: hidden;
35
60
  }
36
61
 
37
- .container.hidden {
62
+ .floating-params > :global(*) {
63
+ height: auto;
64
+ max-height: calc(100vh - 2 * var(--padding));
65
+ }
66
+
67
+ .floating-params :global(.module__container) {
68
+ max-height: calc(100vh - 2 * var(--padding) - var(--header-height));
69
+ }
70
+
71
+ .floating-params.minimized {
72
+ height: 25px;
73
+ }
74
+
75
+ .floating-params.hidden {
38
76
  display: none;
39
77
  }
40
78
 
41
- .container.align-left {
79
+ .floating-params.align-left {
42
80
  left: var(--padding);
43
81
  }
44
82
 
45
- .container.align-right {
83
+ .floating-params.align-right {
46
84
  right: var(--padding);
47
85
  }
48
86
  </style>
@@ -4,32 +4,43 @@
4
4
  import Build from './Build.svelte';
5
5
  import Row from './LayoutRow.svelte';
6
6
  import ModuleRenderer from './ModuleRenderer.svelte';
7
- import { layout } from '../stores/layout.js';
7
+ import { layout } from '../state/layout.svelte.js';
8
8
  import KeyBinding from '../components/KeyBinding.svelte';
9
- import { monitors, preview } from '../stores/rendering';
10
9
 
11
10
  function toggleEdition() {
12
- $layout.editing = !$layout.editing;
11
+ layout.editing = !layout.editing;
13
12
  }
14
13
 
14
+ let components = [];
15
+
15
16
  function togglePreview() {
16
- if ($monitors.length === 1 && !$layout.previewing) {
17
- $preview = $monitors[0].selected;
17
+ if (!layout.previewing) {
18
+ components = [...layout.components];
19
+ layout.components = layout.components
20
+ .filter((c) => c.root)
21
+ .map((root) => {
22
+ return {
23
+ ...root,
24
+ children: [],
25
+ };
26
+ });
27
+ } else {
28
+ layout.components = components;
18
29
  }
19
30
 
20
- $layout.previewing = !$layout.previewing;
31
+ layout.previewing = !layout.previewing;
21
32
  }
22
33
  </script>
23
34
 
24
35
  <Root>
25
- {#if __BUILD__ || $layout.previewing}
36
+ {#if __BUILD__ || layout.previewing}
26
37
  <Build />
27
38
  {:else}
28
39
  <Row size={1}>
29
- <Column size={0.65}>
40
+ <Column size={1.5}>
30
41
  <ModuleRenderer name="monitor" />
31
42
  </Column>
32
- <Column size={0.35}>
43
+ <Column size={1}>
33
44
  <Row size={1}>
34
45
  <ModuleRenderer name="exports" />
35
46
  </Row>
@@ -41,9 +52,9 @@
41
52
  {/if}
42
53
  </Root>
43
54
  {#if !__BUILD__}
44
- <KeyBinding key="w" on:trigger={toggleEdition} />
45
- <KeyBinding key="p" on:trigger={togglePreview} />
55
+ <KeyBinding key="w" onTrigger={toggleEdition} />
56
+ <KeyBinding key="p" onTrigger={togglePreview} />
46
57
  {/if}
47
- {#if $layout.editing}
48
- <KeyBinding key="Escape" type="down" on:trigger={toggleEdition} />
58
+ {#if layout.editing}
59
+ <KeyBinding key="Escape" type="down" onTrigger={toggleEdition} />
49
60
  {/if}
@@ -1,9 +1,9 @@
1
1
  <script>
2
2
  import LayoutComponent from './LayoutComponent.svelte';
3
3
 
4
- export let size = 1;
4
+ let { size = 1, children } = $props();
5
5
  </script>
6
6
 
7
7
  <LayoutComponent {size} type="column">
8
- <slot />
8
+ {@render children?.()}
9
9
  </LayoutComponent>