@pixerate/editor-svelte 0.26.1 → 0.28.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 (61) hide show
  1. package/README.md +1 -0
  2. package/dist/agentTools.svelte.d.ts +1 -1
  3. package/dist/canvas/CanvasDrawLayer.svelte +171 -0
  4. package/dist/canvas/CanvasDrawLayer.svelte.d.ts +19 -0
  5. package/dist/canvas/CanvasDrawLayer.svelte.d.ts.map +1 -0
  6. package/dist/canvas/createCanvasAnimation.svelte.d.ts.map +1 -1
  7. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  8. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -1
  9. package/dist/canvas/createCanvasComponents.svelte.d.ts.map +1 -1
  10. package/dist/canvas/createCanvasDraw.svelte.d.ts +29 -0
  11. package/dist/canvas/createCanvasDraw.svelte.d.ts.map +1 -0
  12. package/dist/canvas/createCanvasDraw.svelte.js +46 -0
  13. package/dist/canvas/index.d.ts +2 -0
  14. package/dist/canvas/index.d.ts.map +1 -1
  15. package/dist/canvas/index.js +3 -0
  16. package/dist/parameters/KeyframeDiamond.svelte +41 -0
  17. package/dist/parameters/KeyframeDiamond.svelte.d.ts +13 -0
  18. package/dist/parameters/KeyframeDiamond.svelte.d.ts.map +1 -0
  19. package/dist/parameters/ParameterColor.svelte +109 -0
  20. package/dist/parameters/ParameterColor.svelte.d.ts +15 -0
  21. package/dist/parameters/ParameterColor.svelte.d.ts.map +1 -0
  22. package/dist/parameters/ParameterCommitInput.svelte +41 -0
  23. package/dist/parameters/ParameterCommitInput.svelte.d.ts +13 -0
  24. package/dist/parameters/ParameterCommitInput.svelte.d.ts.map +1 -0
  25. package/dist/parameters/ParameterFieldControl.svelte +41 -0
  26. package/dist/parameters/ParameterFieldControl.svelte.d.ts +15 -0
  27. package/dist/parameters/ParameterFieldControl.svelte.d.ts.map +1 -0
  28. package/dist/parameters/ParameterImage.svelte +77 -0
  29. package/dist/parameters/ParameterImage.svelte.d.ts +14 -0
  30. package/dist/parameters/ParameterImage.svelte.d.ts.map +1 -0
  31. package/dist/parameters/ParameterNumberInput.svelte +54 -0
  32. package/dist/parameters/ParameterNumberInput.svelte.d.ts +13 -0
  33. package/dist/parameters/ParameterNumberInput.svelte.d.ts.map +1 -0
  34. package/dist/parameters/ParameterSelect.svelte +54 -0
  35. package/dist/parameters/ParameterSelect.svelte.d.ts +12 -0
  36. package/dist/parameters/ParameterSelect.svelte.d.ts.map +1 -0
  37. package/dist/parameters/ParameterSlider.svelte +64 -0
  38. package/dist/parameters/ParameterSlider.svelte.d.ts +15 -0
  39. package/dist/parameters/ParameterSlider.svelte.d.ts.map +1 -0
  40. package/dist/parameters/ParameterText.svelte +26 -0
  41. package/dist/parameters/ParameterText.svelte.d.ts +12 -0
  42. package/dist/parameters/ParameterText.svelte.d.ts.map +1 -0
  43. package/dist/parameters/ParameterToggle.svelte +31 -0
  44. package/dist/parameters/ParameterToggle.svelte.d.ts +12 -0
  45. package/dist/parameters/ParameterToggle.svelte.d.ts.map +1 -0
  46. package/dist/parameters/ParameterVector.svelte +34 -0
  47. package/dist/parameters/ParameterVector.svelte.d.ts +12 -0
  48. package/dist/parameters/ParameterVector.svelte.d.ts.map +1 -0
  49. package/dist/parameters/ParametersPanel.svelte +239 -0
  50. package/dist/parameters/ParametersPanel.svelte.d.ts +28 -0
  51. package/dist/parameters/ParametersPanel.svelte.d.ts.map +1 -0
  52. package/dist/parameters/createParameters.svelte.d.ts +32 -0
  53. package/dist/parameters/createParameters.svelte.d.ts.map +1 -0
  54. package/dist/parameters/createParameters.svelte.js +41 -0
  55. package/dist/parameters/index.d.ts +18 -0
  56. package/dist/parameters/index.d.ts.map +1 -0
  57. package/dist/parameters/index.js +14 -0
  58. package/dist/parameters/styles.d.ts +4 -0
  59. package/dist/parameters/styles.d.ts.map +1 -0
  60. package/dist/parameters/styles.js +4 -0
  61. package/package.json +11 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterCommitInput.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterCommitInput.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,UAAU,KAAM,SAAQ,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,uGAAuG;IACvG,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,KAAK,IAAI,CAAC;IACjF,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BH,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import type { ParameterField, ParameterValue } from '@pixerate/editor/parameters';
3
+ import ParameterColor from './ParameterColor.svelte';
4
+ import ParameterImage from './ParameterImage.svelte';
5
+ import ParameterSelect from './ParameterSelect.svelte';
6
+ import ParameterSlider from './ParameterSlider.svelte';
7
+ import ParameterText from './ParameterText.svelte';
8
+ import ParameterToggle from './ParameterToggle.svelte';
9
+ import ParameterVector from './ParameterVector.svelte';
10
+
11
+ interface Props {
12
+ field: ParameterField;
13
+ value: ParameterValue;
14
+ onchange: (value: ParameterValue) => void;
15
+ ongesturestart?: () => void;
16
+ ongestureend?: () => void;
17
+ resolveFile?: (file: File) => string | Promise<string>;
18
+ disabled?: boolean;
19
+ id?: string;
20
+ }
21
+
22
+ let { field, value, onchange, ongesturestart, ongestureend, resolveFile, disabled = false, id }: Props = $props();
23
+ const set = $derived(onchange as (value: any) => void);
24
+ </script>
25
+
26
+ <!-- The control for any field type. -->
27
+ {#if field.type === 'number' || field.type === 'int'}
28
+ <ParameterSlider {field} value={value as number} onchange={set} {ongesturestart} {ongestureend} {disabled} {id} />
29
+ {:else if field.type === 'boolean'}
30
+ <ParameterToggle {field} value={value as boolean} onchange={set} {disabled} {id} />
31
+ {:else if field.type === 'choice'}
32
+ <ParameterSelect {field} value={value as string | number} onchange={set} {disabled} {id} />
33
+ {:else if field.type === 'color'}
34
+ <ParameterColor {field} value={value as string} onchange={set} {ongesturestart} {ongestureend} {disabled} {id} />
35
+ {:else if field.type === 'vector'}
36
+ <ParameterVector {field} value={value as number[]} onchange={set} {disabled} {id} />
37
+ {:else if field.type === 'image'}
38
+ <ParameterImage {field} value={value as string} onchange={set} {resolveFile} {disabled} {id} />
39
+ {:else if field.type === 'text'}
40
+ <ParameterText {field} value={value as string} onchange={set} {disabled} {id} />
41
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { ParameterField, ParameterValue } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: ParameterField;
4
+ value: ParameterValue;
5
+ onchange: (value: ParameterValue) => void;
6
+ ongesturestart?: () => void;
7
+ ongestureend?: () => void;
8
+ resolveFile?: (file: File) => string | Promise<string>;
9
+ disabled?: boolean;
10
+ id?: string;
11
+ }
12
+ declare const ParameterFieldControl: import("svelte").Component<Props, {}, "">;
13
+ type ParameterFieldControl = ReturnType<typeof ParameterFieldControl>;
14
+ export default ParameterFieldControl;
15
+ //# sourceMappingURL=ParameterFieldControl.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterFieldControl.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterFieldControl.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAUhF,UAAU,KAAK;IACb,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAmCH,QAAA,MAAM,qBAAqB,2CAAwC,CAAC;AACpE,KAAK,qBAAqB,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACtE,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,77 @@
1
+ <script lang="ts">
2
+ import { parameterLabel, type ImageParameterField } from '@pixerate/editor/parameters';
3
+ import ParameterCommitInput from './ParameterCommitInput.svelte';
4
+ import { parameterButtonClass } from './styles.js';
5
+
6
+ interface Props {
7
+ field: ImageParameterField;
8
+ value: string;
9
+ onchange: (value: string) => void;
10
+ /** Turns a picked file into a URL (upload it, or `URL.createObjectURL`). Without it there is no file button. */
11
+ resolveFile?: (file: File) => string | Promise<string>;
12
+ disabled?: boolean;
13
+ id?: string;
14
+ }
15
+
16
+ let { field, value, onchange, resolveFile, disabled = false, id }: Props = $props();
17
+
18
+ const off = $derived(disabled || !!field.readOnly);
19
+ const name = $derived(parameterLabel(field));
20
+
21
+ async function pick(e: Event & { currentTarget: HTMLInputElement }) {
22
+ const file = e.currentTarget.files?.[0];
23
+ e.currentTarget.value = '';
24
+ if (file && resolveFile) onchange(await resolveFile(file));
25
+ }
26
+ </script>
27
+
28
+ <!-- An image picker: suggested thumbnails, a URL box, an optional file button and a clear button. -->
29
+ <div class="space-y-1.5">
30
+ <div class="flex items-center gap-2">
31
+ <div class="flex h-12 w-16 shrink-0 items-center justify-center overflow-hidden rounded-md border border-input bg-muted">
32
+ {#if value}
33
+ <img src={value} alt={name} class="h-full w-full object-cover" />
34
+ {:else}
35
+ <span class="text-[10px] text-muted-foreground">None</span>
36
+ {/if}
37
+ </div>
38
+ <div class="flex min-w-0 flex-1 flex-col gap-1">
39
+ <ParameterCommitInput
40
+ {id}
41
+ aria-label="{name} URL"
42
+ placeholder="Image URL"
43
+ value={value.startsWith('data:') ? '' : value}
44
+ disabled={off}
45
+ oncommit={(text) => onchange(text.trim())}
46
+ />
47
+ <div class="flex gap-1">
48
+ {#if resolveFile}
49
+ <label class="{parameterButtonClass} cursor-pointer {off ? 'pointer-events-none opacity-50' : ''}">
50
+ Choose file…
51
+ <input type="file" class="sr-only" accept={field.accept ?? 'image/*'} disabled={off} aria-label="{name} file" onchange={pick} />
52
+ </label>
53
+ {/if}
54
+ {#if value}
55
+ <button type="button" class={parameterButtonClass} disabled={off} onclick={() => onchange('')} aria-label="Clear {name}">Clear</button>
56
+ {/if}
57
+ </div>
58
+ </div>
59
+ </div>
60
+ {#if field.options && field.options.length > 0}
61
+ <div class="flex flex-wrap gap-1">
62
+ {#each field.options as o (o.url)}
63
+ <button
64
+ type="button"
65
+ title={o.label ?? o.url}
66
+ aria-label={o.label ?? o.url}
67
+ aria-pressed={o.url === value}
68
+ disabled={off}
69
+ onclick={() => onchange(o.url)}
70
+ class="h-9 w-12 overflow-hidden rounded border border-input aria-pressed:ring-2 aria-pressed:ring-primary"
71
+ >
72
+ <img src={o.url} alt="" class="h-full w-full object-cover" />
73
+ </button>
74
+ {/each}
75
+ </div>
76
+ {/if}
77
+ </div>
@@ -0,0 +1,14 @@
1
+ import { type ImageParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: ImageParameterField;
4
+ value: string;
5
+ onchange: (value: string) => void;
6
+ /** Turns a picked file into a URL (upload it, or `URL.createObjectURL`). Without it there is no file button. */
7
+ resolveFile?: (file: File) => string | Promise<string>;
8
+ disabled?: boolean;
9
+ id?: string;
10
+ }
11
+ declare const ParameterImage: import("svelte").Component<Props, {}, "">;
12
+ type ParameterImage = ReturnType<typeof ParameterImage>;
13
+ export default ParameterImage;
14
+ //# sourceMappingURL=ParameterImage.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterImage.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterImage.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAKrF,UAAU,KAAK;IACb,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gHAAgH;IAChH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAyDH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import {
3
+ clampParameterNumber,
4
+ formatParameterNumber,
5
+ parameterLabel,
6
+ parameterStep,
7
+ parseParameterNumberInput,
8
+ type NumberParameterField
9
+ } from '@pixerate/editor/parameters';
10
+ import ParameterCommitInput from './ParameterCommitInput.svelte';
11
+ import { parameterInputClass } from './styles.js';
12
+
13
+ interface Props {
14
+ field: NumberParameterField;
15
+ value: number;
16
+ onchange: (value: number) => void;
17
+ disabled?: boolean;
18
+ id?: string;
19
+ 'aria-label'?: string;
20
+ }
21
+
22
+ let { field, value, onchange, disabled = false, id, 'aria-label': ariaLabel }: Props = $props();
23
+
24
+ const text = $derived(formatParameterNumber({ ...field, unit: undefined }, value));
25
+
26
+ function keydown(e: KeyboardEvent) {
27
+ if (e.key !== 'ArrowUp' && e.key !== 'ArrowDown') return;
28
+ e.preventDefault();
29
+ const step = parameterStep(field) * (e.shiftKey ? 10 : 1);
30
+ onchange(clampParameterNumber(field, value + (e.key === 'ArrowUp' ? step : -step)));
31
+ }
32
+ </script>
33
+
34
+ <!-- A number box: type a value (units allowed), or step with the arrow keys (Shift ×10). -->
35
+ <div class="relative min-w-0 flex-1">
36
+ <ParameterCommitInput
37
+ {id}
38
+ inputmode="decimal"
39
+ aria-label={ariaLabel ?? parameterLabel(field)}
40
+ value={text}
41
+ disabled={disabled || field.readOnly}
42
+ class="{parameterInputClass} {field.unit ? 'pr-6' : ''}"
43
+ onkeydown={keydown}
44
+ oncommit={(t, input) => {
45
+ const n = parseParameterNumberInput(field, t);
46
+ // Show the stored value again when the text was not a number or clamps to it.
47
+ if (n === null || n === value) input.value = text;
48
+ else onchange(n);
49
+ }}
50
+ />
51
+ {#if field.unit}
52
+ <span class="pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[10px] text-muted-foreground">{field.unit}</span>
53
+ {/if}
54
+ </div>
@@ -0,0 +1,13 @@
1
+ import { type NumberParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: NumberParameterField;
4
+ value: number;
5
+ onchange: (value: number) => void;
6
+ disabled?: boolean;
7
+ id?: string;
8
+ 'aria-label'?: string;
9
+ }
10
+ declare const ParameterNumberInput: import("svelte").Component<Props, {}, "">;
11
+ type ParameterNumberInput = ReturnType<typeof ParameterNumberInput>;
12
+ export default ParameterNumberInput;
13
+ //# sourceMappingURL=ParameterNumberInput.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterNumberInput.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterNumberInput.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAMH,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAKrC,UAAU,KAAK;IACb,KAAK,EAAE,oBAAoB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAkCH,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,54 @@
1
+ <script lang="ts">
2
+ import { choiceOptionLabel, getChoiceOptions, parameterLabel, type ChoiceParameterField } from '@pixerate/editor/parameters';
3
+ import { parameterInputClass } from './styles.js';
4
+
5
+ interface Props {
6
+ field: ChoiceParameterField;
7
+ value: string | number;
8
+ onchange: (value: string | number) => void;
9
+ disabled?: boolean;
10
+ id?: string;
11
+ }
12
+
13
+ let { field, value, onchange, disabled = false, id }: Props = $props();
14
+
15
+ const options = $derived(getChoiceOptions(field));
16
+ const off = $derived(disabled || !!field.readOnly);
17
+ </script>
18
+
19
+ <!-- A dropdown (or segmented buttons with `control: 'segmented'`) for `choice` fields. -->
20
+ {#if field.control === 'segmented'}
21
+ <div role="radiogroup" aria-label={parameterLabel(field)} class="inline-flex flex-wrap rounded-md border border-input bg-muted p-0.5">
22
+ {#each options as o (o.value)}
23
+ <button
24
+ type="button"
25
+ role="radio"
26
+ aria-checked={o.value === value}
27
+ title={o.description}
28
+ disabled={off}
29
+ onclick={() => onchange(o.value)}
30
+ class="rounded px-2 py-0.5 text-xs disabled:opacity-50 {o.value === value
31
+ ? 'bg-background text-foreground shadow-sm'
32
+ : 'text-muted-foreground hover:text-foreground'}"
33
+ >
34
+ {choiceOptionLabel(o)}
35
+ </button>
36
+ {/each}
37
+ </div>
38
+ {:else}
39
+ <select
40
+ {id}
41
+ aria-label={parameterLabel(field)}
42
+ value={String(options.findIndex((o) => o.value === value))}
43
+ disabled={off}
44
+ class={parameterInputClass}
45
+ onchange={(e) => {
46
+ const option = options[Number(e.currentTarget.value)];
47
+ if (option) onchange(option.value);
48
+ }}
49
+ >
50
+ {#each options as o, i (o.value)}
51
+ <option value={String(i)} title={o.description}>{choiceOptionLabel(o)}</option>
52
+ {/each}
53
+ </select>
54
+ {/if}
@@ -0,0 +1,12 @@
1
+ import { type ChoiceParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: ChoiceParameterField;
4
+ value: string | number;
5
+ onchange: (value: string | number) => void;
6
+ disabled?: boolean;
7
+ id?: string;
8
+ }
9
+ declare const ParameterSelect: import("svelte").Component<Props, {}, "">;
10
+ type ParameterSelect = ReturnType<typeof ParameterSelect>;
11
+ export default ParameterSelect;
12
+ //# sourceMappingURL=ParameterSelect.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterSelect.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterSelect.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuD,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAI3H,UAAU,KAAK;IACb,KAAK,EAAE,oBAAoB,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAoCH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import {
3
+ clampParameterNumber,
4
+ formatParameterNumber,
5
+ isSliderField,
6
+ parameterLabel,
7
+ parameterStep,
8
+ type NumberParameterField
9
+ } from '@pixerate/editor/parameters';
10
+ import ParameterNumberInput from './ParameterNumberInput.svelte';
11
+ import { parameterRangeClass } from './styles.js';
12
+
13
+ interface Props {
14
+ field: NumberParameterField;
15
+ value: number;
16
+ onchange: (value: number) => void;
17
+ /** A drag started: merge changes into one undo step until `ongestureend`. */
18
+ ongesturestart?: () => void;
19
+ ongestureend?: () => void;
20
+ disabled?: boolean;
21
+ id?: string;
22
+ }
23
+
24
+ let { field, value, onchange, ongesturestart, ongestureend, disabled = false, id }: Props = $props();
25
+
26
+ let dragging = false;
27
+ function start() {
28
+ if (dragging) return;
29
+ dragging = true;
30
+ ongesturestart?.();
31
+ }
32
+ function end() {
33
+ if (!dragging) return;
34
+ dragging = false;
35
+ ongestureend?.();
36
+ }
37
+ </script>
38
+
39
+ <!-- A slider plus number box for `number` / `int` fields (number box only for `control: 'input'` or unbounded fields). -->
40
+ {#if isSliderField(field)}
41
+ <div class="flex items-center gap-2">
42
+ <input
43
+ type="range"
44
+ aria-label={parameterLabel(field)}
45
+ aria-valuetext={formatParameterNumber(field, value)}
46
+ min={field.min}
47
+ max={field.max}
48
+ step={parameterStep(field)}
49
+ {value}
50
+ disabled={disabled || field.readOnly}
51
+ class={parameterRangeClass}
52
+ onpointerdown={start}
53
+ onpointerup={end}
54
+ onpointercancel={end}
55
+ onblur={end}
56
+ oninput={(e) => onchange(clampParameterNumber(field, Number(e.currentTarget.value)))}
57
+ />
58
+ <div class="w-20 shrink-0">
59
+ <ParameterNumberInput {field} {value} {onchange} {disabled} {id} aria-label="{parameterLabel(field)} value" />
60
+ </div>
61
+ </div>
62
+ {:else}
63
+ <ParameterNumberInput {field} {value} {onchange} {disabled} {id} />
64
+ {/if}
@@ -0,0 +1,15 @@
1
+ import { type NumberParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: NumberParameterField;
4
+ value: number;
5
+ onchange: (value: number) => void;
6
+ /** A drag started: merge changes into one undo step until `ongestureend`. */
7
+ ongesturestart?: () => void;
8
+ ongestureend?: () => void;
9
+ disabled?: boolean;
10
+ id?: string;
11
+ }
12
+ declare const ParameterSlider: import("svelte").Component<Props, {}, "">;
13
+ type ParameterSlider = ReturnType<typeof ParameterSlider>;
14
+ export default ParameterSlider;
15
+ //# sourceMappingURL=ParameterSlider.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterSlider.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterSlider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAMH,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAKrC,UAAU,KAAK;IACb,KAAK,EAAE,oBAAoB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAoCH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ import { parameterLabel, type TextParameterField } from '@pixerate/editor/parameters';
3
+ import ParameterCommitInput from './ParameterCommitInput.svelte';
4
+
5
+ interface Props {
6
+ field: TextParameterField;
7
+ value: string;
8
+ onchange: (value: string) => void;
9
+ disabled?: boolean;
10
+ id?: string;
11
+ }
12
+
13
+ let { field, value, onchange, disabled = false, id }: Props = $props();
14
+ </script>
15
+
16
+ <!-- A text box (or textarea with `multiline`) that commits on blur or Enter. -->
17
+ <ParameterCommitInput
18
+ {id}
19
+ aria-label={parameterLabel(field)}
20
+ multiline={field.multiline}
21
+ placeholder={field.placeholder}
22
+ maxlength={field.maxLength}
23
+ {value}
24
+ disabled={disabled || field.readOnly}
25
+ oncommit={onchange}
26
+ />
@@ -0,0 +1,12 @@
1
+ import { type TextParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: TextParameterField;
4
+ value: string;
5
+ onchange: (value: string) => void;
6
+ disabled?: boolean;
7
+ id?: string;
8
+ }
9
+ declare const ParameterText: import("svelte").Component<Props, {}, "">;
10
+ type ParameterText = ReturnType<typeof ParameterText>;
11
+ export default ParameterText;
12
+ //# sourceMappingURL=ParameterText.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterText.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterText.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAIpF,UAAU,KAAK;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAcH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import { parameterLabel, type BooleanParameterField } from '@pixerate/editor/parameters';
3
+
4
+ interface Props {
5
+ field: BooleanParameterField;
6
+ value: boolean;
7
+ onchange: (value: boolean) => void;
8
+ disabled?: boolean;
9
+ id?: string;
10
+ }
11
+
12
+ let { field, value, onchange, disabled = false, id }: Props = $props();
13
+ </script>
14
+
15
+ <!-- An on/off switch for `boolean` fields. -->
16
+ <button
17
+ type="button"
18
+ role="switch"
19
+ {id}
20
+ aria-checked={value}
21
+ aria-label={parameterLabel(field)}
22
+ disabled={disabled || field.readOnly}
23
+ onclick={() => onchange(!value)}
24
+ class="relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-transparent transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:opacity-50 {value
25
+ ? 'bg-primary'
26
+ : 'bg-muted'}"
27
+ >
28
+ <span
29
+ class="pointer-events-none block h-4 w-4 rounded-full bg-background shadow transition-transform {value ? 'translate-x-4' : 'translate-x-0.5'}"
30
+ ></span>
31
+ </button>
@@ -0,0 +1,12 @@
1
+ import { type BooleanParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: BooleanParameterField;
4
+ value: boolean;
5
+ onchange: (value: boolean) => void;
6
+ disabled?: boolean;
7
+ id?: string;
8
+ }
9
+ declare const ParameterToggle: import("svelte").Component<Props, {}, "">;
10
+ type ParameterToggle = ReturnType<typeof ParameterToggle>;
11
+ export default ParameterToggle;
12
+ //# sourceMappingURL=ParameterToggle.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterToggle.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterToggle.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAGvF,UAAU,KAAK;IACb,KAAK,EAAE,qBAAqB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAiBH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { parameterLabel, vectorComponentField, vectorSize, type VectorParameterField } from '@pixerate/editor/parameters';
3
+ import ParameterNumberInput from './ParameterNumberInput.svelte';
4
+
5
+ interface Props {
6
+ field: VectorParameterField;
7
+ value: number[];
8
+ onchange: (value: number[]) => void;
9
+ disabled?: boolean;
10
+ id?: string;
11
+ }
12
+
13
+ let { field, value, onchange, disabled = false, id }: Props = $props();
14
+
15
+ const size = $derived(vectorSize(field));
16
+ const components = $derived(Array.from({ length: size }, (_, i) => vectorComponentField(field, i)));
17
+ </script>
18
+
19
+ <!-- One number box per component for `vector` fields. -->
20
+ <div class="grid gap-1.5" style:grid-template-columns="repeat({size}, minmax(0, 1fr))">
21
+ {#each components as component, i (i)}
22
+ <label class="flex min-w-0 items-center gap-1">
23
+ <span class="w-3 shrink-0 text-[10px] uppercase text-muted-foreground">{component.label}</span>
24
+ <ParameterNumberInput
25
+ field={component}
26
+ value={value[i] ?? 0}
27
+ id={i === 0 ? id : undefined}
28
+ aria-label="{parameterLabel(field)} {component.label}"
29
+ disabled={disabled || field.readOnly}
30
+ onchange={(n) => onchange(Array.from({ length: size }, (_, j) => (j === i ? n : (value[j] ?? 0))))}
31
+ />
32
+ </label>
33
+ {/each}
34
+ </div>
@@ -0,0 +1,12 @@
1
+ import { type VectorParameterField } from '@pixerate/editor/parameters';
2
+ interface Props {
3
+ field: VectorParameterField;
4
+ value: number[];
5
+ onchange: (value: number[]) => void;
6
+ disabled?: boolean;
7
+ id?: string;
8
+ }
9
+ declare const ParameterVector: import("svelte").Component<Props, {}, "">;
10
+ type ParameterVector = ReturnType<typeof ParameterVector>;
11
+ export default ParameterVector;
12
+ //# sourceMappingURL=ParameterVector.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParameterVector.svelte.d.ts","sourceRoot":"","sources":["../../src/parameters/ParameterVector.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAIxH,UAAU,KAAK;IACb,KAAK,EAAE,oBAAoB,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAwBH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}