@pixerate/editor-svelte 0.22.0 → 0.24.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 (163) hide show
  1. package/README.md +6 -2
  2. package/dist/MergePreview.svelte +201 -0
  3. package/dist/MergePreview.svelte.d.ts +25 -0
  4. package/dist/MergePreview.svelte.d.ts.map +1 -0
  5. package/dist/StylesGallery.svelte +169 -0
  6. package/dist/StylesGallery.svelte.d.ts +27 -0
  7. package/dist/StylesGallery.svelte.d.ts.map +1 -0
  8. package/dist/TemplateRenderer.svelte +4 -10
  9. package/dist/TemplateRenderer.svelte.d.ts.map +1 -1
  10. package/dist/canvas/TokenBindingPicker.svelte +93 -0
  11. package/dist/canvas/TokenBindingPicker.svelte.d.ts +20 -0
  12. package/dist/canvas/TokenBindingPicker.svelte.d.ts.map +1 -0
  13. package/dist/canvas/TokenModeSwitcher.svelte +55 -0
  14. package/dist/canvas/TokenModeSwitcher.svelte.d.ts +18 -0
  15. package/dist/canvas/TokenModeSwitcher.svelte.d.ts.map +1 -0
  16. package/dist/canvas/createCanvasArrange.svelte.d.ts +4 -0
  17. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  18. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts +68 -0
  19. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -0
  20. package/dist/canvas/createCanvasAutoLayout.svelte.js +78 -0
  21. package/dist/canvas/createCanvasTokens.svelte.d.ts +31 -0
  22. package/dist/canvas/createCanvasTokens.svelte.d.ts.map +1 -0
  23. package/dist/canvas/createCanvasTokens.svelte.js +50 -0
  24. package/dist/canvas/index.d.ts +7 -0
  25. package/dist/canvas/index.d.ts.map +1 -1
  26. package/dist/canvas/index.js +10 -0
  27. package/dist/fileImport.svelte.d.ts +8 -1
  28. package/dist/fileImport.svelte.d.ts.map +1 -1
  29. package/dist/fileImport.svelte.js +11 -1
  30. package/dist/find-replace/FindReplaceBar.svelte +203 -0
  31. package/dist/find-replace/FindReplaceBar.svelte.d.ts +15 -0
  32. package/dist/find-replace/FindReplaceBar.svelte.d.ts.map +1 -0
  33. package/dist/find-replace/findReplace.svelte.d.ts +27 -0
  34. package/dist/find-replace/findReplace.svelte.d.ts.map +1 -0
  35. package/dist/find-replace/findReplace.svelte.js +79 -0
  36. package/dist/find-replace/index.d.ts +6 -0
  37. package/dist/find-replace/index.d.ts.map +1 -0
  38. package/dist/find-replace/index.js +2 -0
  39. package/dist/generation/AssetMentionChips.svelte +130 -0
  40. package/dist/generation/AssetMentionChips.svelte.d.ts +21 -0
  41. package/dist/generation/AssetMentionChips.svelte.d.ts.map +1 -0
  42. package/dist/generation/GenerationHistory.svelte +161 -0
  43. package/dist/generation/GenerationHistory.svelte.d.ts +28 -0
  44. package/dist/generation/GenerationHistory.svelte.d.ts.map +1 -0
  45. package/dist/generation/GenerationSettings.svelte +174 -0
  46. package/dist/generation/GenerationSettings.svelte.d.ts +23 -0
  47. package/dist/generation/GenerationSettings.svelte.d.ts.map +1 -0
  48. package/dist/generation/JobProgress.svelte +53 -0
  49. package/dist/generation/JobProgress.svelte.d.ts +17 -0
  50. package/dist/generation/JobProgress.svelte.d.ts.map +1 -0
  51. package/dist/generation/index.d.ts +17 -0
  52. package/dist/generation/index.d.ts.map +1 -0
  53. package/dist/generation/index.js +7 -0
  54. package/dist/generation/plan.svelte.d.ts +16 -0
  55. package/dist/generation/plan.svelte.d.ts.map +1 -0
  56. package/dist/generation/plan.svelte.js +26 -0
  57. package/dist/generation/progress.svelte.d.ts +25 -0
  58. package/dist/generation/progress.svelte.d.ts.map +1 -0
  59. package/dist/generation/progress.svelte.js +36 -0
  60. package/dist/generation/records.svelte.d.ts +18 -0
  61. package/dist/generation/records.svelte.d.ts.map +1 -0
  62. package/dist/generation/records.svelte.js +66 -0
  63. package/dist/image-editor/AdjustmentLayersPanel.svelte +309 -0
  64. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts +11 -0
  65. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts.map +1 -0
  66. package/dist/image-editor/ControlSlider.svelte +39 -0
  67. package/dist/image-editor/ControlSlider.svelte.d.ts +13 -0
  68. package/dist/image-editor/ControlSlider.svelte.d.ts.map +1 -0
  69. package/dist/image-editor/CurvesEditor.svelte +105 -0
  70. package/dist/image-editor/CurvesEditor.svelte.d.ts +13 -0
  71. package/dist/image-editor/CurvesEditor.svelte.d.ts.map +1 -0
  72. package/dist/image-editor/Histogram.svelte +49 -0
  73. package/dist/image-editor/Histogram.svelte.d.ts +12 -0
  74. package/dist/image-editor/Histogram.svelte.d.ts.map +1 -0
  75. package/dist/image-editor/ImageEditor.svelte +104 -141
  76. package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -1
  77. package/dist/image-editor/RefineEdgePanel.svelte +180 -0
  78. package/dist/image-editor/RefineEdgePanel.svelte.d.ts +13 -0
  79. package/dist/image-editor/RefineEdgePanel.svelte.d.ts.map +1 -0
  80. package/dist/image-editor/SelectionOptionsBar.svelte +135 -0
  81. package/dist/image-editor/SelectionOptionsBar.svelte.d.ts +15 -0
  82. package/dist/image-editor/SelectionOptionsBar.svelte.d.ts.map +1 -0
  83. package/dist/image-editor/imageEditorState.svelte.d.ts +14 -1
  84. package/dist/image-editor/imageEditorState.svelte.d.ts.map +1 -1
  85. package/dist/image-editor/imageEditorState.svelte.js +40 -0
  86. package/dist/image-editor/index.d.ts +18 -0
  87. package/dist/image-editor/index.d.ts.map +1 -1
  88. package/dist/image-editor/index.js +6 -0
  89. package/dist/index.d.ts +12 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +7 -0
  92. package/dist/merge.svelte.d.ts +51 -0
  93. package/dist/merge.svelte.d.ts.map +1 -0
  94. package/dist/merge.svelte.js +117 -0
  95. package/dist/paragraphStyles.svelte.d.ts +30 -0
  96. package/dist/paragraphStyles.svelte.d.ts.map +1 -0
  97. package/dist/paragraphStyles.svelte.js +44 -0
  98. package/dist/persistence/RecoveryPrompt.svelte +57 -0
  99. package/dist/persistence/RecoveryPrompt.svelte.d.ts +18 -0
  100. package/dist/persistence/RecoveryPrompt.svelte.d.ts.map +1 -0
  101. package/dist/persistence/autosave.svelte.d.ts +63 -0
  102. package/dist/persistence/autosave.svelte.d.ts.map +1 -0
  103. package/dist/persistence/autosave.svelte.js +110 -0
  104. package/dist/persistence/index.d.ts +6 -0
  105. package/dist/persistence/index.d.ts.map +1 -0
  106. package/dist/persistence/index.js +2 -0
  107. package/dist/review/TrackedChangesList.svelte +67 -0
  108. package/dist/review/TrackedChangesList.svelte.d.ts +13 -0
  109. package/dist/review/TrackedChangesList.svelte.d.ts.map +1 -0
  110. package/dist/review/documentCompare.svelte.d.ts +21 -0
  111. package/dist/review/documentCompare.svelte.d.ts.map +1 -0
  112. package/dist/review/documentCompare.svelte.js +23 -0
  113. package/dist/review/index.d.ts +4 -0
  114. package/dist/review/index.d.ts.map +1 -1
  115. package/dist/review/index.js +2 -0
  116. package/dist/review/review.svelte.d.ts +6 -0
  117. package/dist/review/review.svelte.d.ts.map +1 -1
  118. package/dist/review/review.svelte.js +3 -0
  119. package/dist/spreadsheet/FormulaBar.svelte +13 -4
  120. package/dist/spreadsheet/FormulaBar.svelte.d.ts.map +1 -1
  121. package/dist/spreadsheet/FormulaHints.svelte +7 -5
  122. package/dist/spreadsheet/FormulaHints.svelte.d.ts +3 -0
  123. package/dist/spreadsheet/FormulaHints.svelte.d.ts.map +1 -1
  124. package/dist/spreadsheet/NameManager.svelte +165 -0
  125. package/dist/spreadsheet/NameManager.svelte.d.ts +11 -0
  126. package/dist/spreadsheet/NameManager.svelte.d.ts.map +1 -0
  127. package/dist/spreadsheet/SheetTabs.svelte +161 -0
  128. package/dist/spreadsheet/SheetTabs.svelte.d.ts +10 -0
  129. package/dist/spreadsheet/SheetTabs.svelte.d.ts.map +1 -0
  130. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte +184 -0
  131. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte.d.ts +9 -0
  132. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte.d.ts.map +1 -0
  133. package/dist/spreadsheet/SpreadsheetContextMenu.svelte +13 -5
  134. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts +5 -1
  135. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts.map +1 -1
  136. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte +141 -0
  137. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte.d.ts +9 -0
  138. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte.d.ts.map +1 -0
  139. package/dist/spreadsheet/SpreadsheetEditor.svelte +199 -11
  140. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts +2 -0
  141. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -1
  142. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte +92 -0
  143. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte.d.ts +9 -0
  144. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte.d.ts.map +1 -0
  145. package/dist/spreadsheet/index.d.ts +9 -0
  146. package/dist/spreadsheet/index.d.ts.map +1 -1
  147. package/dist/spreadsheet/index.js +5 -0
  148. package/dist/spreadsheet/spreadsheet.svelte.d.ts +57 -2
  149. package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -1
  150. package/dist/spreadsheet/spreadsheet.svelte.js +105 -6
  151. package/dist/tokens/TokenSwatch.svelte +14 -0
  152. package/dist/tokens/TokenSwatch.svelte.d.ts +8 -0
  153. package/dist/tokens/TokenSwatch.svelte.d.ts.map +1 -0
  154. package/dist/tokens/TokensPanel.svelte +323 -0
  155. package/dist/tokens/TokensPanel.svelte.d.ts +14 -0
  156. package/dist/tokens/TokensPanel.svelte.d.ts.map +1 -0
  157. package/dist/tokens/createTokens.svelte.d.ts +31 -0
  158. package/dist/tokens/createTokens.svelte.d.ts.map +1 -0
  159. package/dist/tokens/createTokens.svelte.js +43 -0
  160. package/dist/tokens/index.d.ts +7 -0
  161. package/dist/tokens/index.d.ts.map +1 -0
  162. package/dist/tokens/index.js +3 -0
  163. package/package.json +26 -2
@@ -0,0 +1,28 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type AssetLookup, type GenerationRecord, type ModelCapabilities, type RecreateMode, type RecreateOptions, type RecreateResult } from '@pixerate/editor/generation';
3
+ type Template = NonNullable<RecreateOptions['templates']>[number];
4
+ interface Props {
5
+ records: readonly GenerationRecord[];
6
+ /** Current templates (drift detection, and resolution in `latest` mode). */
7
+ templates?: readonly Template[];
8
+ /** Current models (capability drift and re-planning). */
9
+ capabilities?: ModelCapabilities | readonly ModelCapabilities[];
10
+ /** Current assets (missing / changed asset drift). */
11
+ assets?: AssetLookup;
12
+ /** Recreate mode (bindable); starts at `exact`. */
13
+ mode?: RecreateMode;
14
+ onmodechange?: (mode: RecreateMode) => void;
15
+ /** "Recreate": receives the rebuilt request and drift report. */
16
+ onrecreate?: (result: RecreateResult, record: GenerationRecord) => void;
17
+ /** "Variation": same request with a new seed. */
18
+ onvariation?: (result: RecreateResult, record: GenerationRecord) => void;
19
+ onremove?: (record: GenerationRecord) => void;
20
+ /** Extra content per record (e.g. output thumbnails). */
21
+ preview?: Snippet<[GenerationRecord]>;
22
+ emptyText?: string;
23
+ class?: string;
24
+ }
25
+ declare const GenerationHistory: import("svelte").Component<Props, {}, "mode">;
26
+ type GenerationHistory = ReturnType<typeof GenerationHistory>;
27
+ export default GenerationHistory;
28
+ //# sourceMappingURL=GenerationHistory.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerationHistory.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/GenerationHistory.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAKH,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAIrC,KAAK,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,UAAU,KAAK;IACb,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,yDAAyD;IACzD,YAAY,CAAC,EAAE,iBAAiB,GAAG,SAAS,iBAAiB,EAAE,CAAC;IAChE,sDAAsD;IACtD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACxE,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqGH,QAAA,MAAM,iBAAiB,+CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,174 @@
1
+ <script lang="ts" module>
2
+ let nextId = 0;
3
+ </script>
4
+
5
+ <script lang="ts">
6
+ import type { Snippet } from 'svelte';
7
+ import {
8
+ getGenerationControls,
9
+ getReferenceSlots,
10
+ getRequestValue,
11
+ parseControlValue,
12
+ planGenerationRequest,
13
+ removeReference,
14
+ setRequestValue,
15
+ type GenerationControl,
16
+ type GenerationPlan,
17
+ type GenerationReference,
18
+ type GenerationRequest,
19
+ type ModelCapabilities,
20
+ type PlanStrategy,
21
+ type ReferenceRole
22
+ } from '@pixerate/editor/generation';
23
+
24
+ interface Props {
25
+ capabilities: ModelCapabilities;
26
+ /** The request being edited (controlled). */
27
+ value: GenerationRequest;
28
+ onchange: (next: GenerationRequest) => void;
29
+ /** A plan computed elsewhere; otherwise one is computed with `strategy`. */
30
+ plan?: GenerationPlan;
31
+ /** Strategy for the built-in plan (default `nearest`). */
32
+ strategy?: PlanStrategy;
33
+ /** List plan adjustments and errors under the controls (default `true`). */
34
+ showAdjustments?: boolean;
35
+ /** Shows an "Add" button per reference role; you pick the asset and call `onchange`. */
36
+ onaddreference?: (role: ReferenceRole) => void;
37
+ /** Custom rendering of a reference chip (default: its id). */
38
+ reference?: Snippet<[GenerationReference]>;
39
+ class?: string;
40
+ }
41
+
42
+ let {
43
+ capabilities,
44
+ value,
45
+ onchange,
46
+ plan: planProp,
47
+ strategy,
48
+ showAdjustments = true,
49
+ onaddreference,
50
+ reference,
51
+ class: className = ''
52
+ }: Props = $props();
53
+
54
+ const baseId = `generation-settings-${++nextId}`;
55
+ const controls = $derived(getGenerationControls(capabilities));
56
+ const plan = $derived(planProp ?? planGenerationRequest(value, capabilities, { strategy }));
57
+ const slots = $derived(getReferenceSlots(capabilities, value));
58
+
59
+ const inputClass =
60
+ 'w-full rounded-md border border-border bg-background px-2 py-1 text-sm outline-none focus:ring-1 focus:ring-ring';
61
+
62
+ const shown = (control: GenerationControl) => getRequestValue(value, control.key) ?? control.defaultValue;
63
+ const update = (control: GenerationControl, raw: string | boolean) =>
64
+ onchange(setRequestValue(value, control.key, parseControlValue(control, raw)));
65
+ </script>
66
+
67
+ <!-- Headless-styled settings form generated from a model's capabilities. -->
68
+ <div class="flex flex-col gap-3 text-sm {className}" data-generation-settings="" data-model={capabilities.id}>
69
+ {#each controls as control (control.key)}
70
+ {@const id = `${baseId}-${control.key}`}
71
+ {@const current = shown(control)}
72
+ <div class="flex flex-col gap-1" data-control={control.key}>
73
+ <label for={id} class="text-xs font-medium text-muted-foreground" title={control.description}>{control.label}</label>
74
+ {#if control.kind === 'checkbox'}
75
+ <input
76
+ {id}
77
+ type="checkbox"
78
+ data-field={control.key}
79
+ checked={Boolean(current)}
80
+ onchange={(e) => update(control, e.currentTarget.checked)}
81
+ />
82
+ {:else if control.kind === 'select'}
83
+ <select
84
+ {id}
85
+ data-field={control.key}
86
+ class={inputClass}
87
+ value={current === undefined ? '' : String(current)}
88
+ onchange={(e) => update(control, e.currentTarget.value)}
89
+ >
90
+ {#if current === undefined}<option value="">Default</option>{/if}
91
+ {#each control.options ?? [] as option (option.value)}
92
+ <option value={String(option.value)}>{option.label}</option>
93
+ {/each}
94
+ </select>
95
+ {:else if control.kind === 'textarea'}
96
+ <textarea
97
+ {id}
98
+ data-field={control.key}
99
+ class={inputClass}
100
+ rows="2"
101
+ maxlength={control.maxLength}
102
+ value={typeof getRequestValue(value, control.key) === 'string' ? (getRequestValue(value, control.key) as string) : ''}
103
+ oninput={(e) => update(control, e.currentTarget.value)}
104
+ ></textarea>
105
+ {:else}
106
+ <div class="flex items-center gap-2">
107
+ <input
108
+ {id}
109
+ type={control.kind === 'range' ? 'range' : 'number'}
110
+ data-field={control.key}
111
+ class={control.kind === 'range' ? 'flex-1' : inputClass}
112
+ min={control.min}
113
+ max={control.max}
114
+ step={control.step ?? 'any'}
115
+ value={typeof current === 'number' ? current : control.kind === 'range' ? (control.min ?? 0) : ''}
116
+ oninput={(e) => update(control, e.currentTarget.value)}
117
+ />
118
+ {#if control.kind === 'range'}
119
+ <span class="w-10 text-right tabular-nums text-muted-foreground" data-field-value="">
120
+ {typeof current === 'number' ? current : '–'}
121
+ </span>
122
+ {/if}
123
+ </div>
124
+ {/if}
125
+ </div>
126
+ {/each}
127
+
128
+ {#each slots as slot (slot.role)}
129
+ <fieldset class="flex flex-col gap-1" data-reference-role={slot.role}>
130
+ <legend class="text-xs font-medium text-muted-foreground" title={slot.description}>
131
+ {slot.label}
132
+ <span class="tabular-nums" data-reference-count="">({slot.references.length}/{slot.max})</span>
133
+ {#if slot.min > 0}<span class="text-destructive"> *</span>{/if}
134
+ </legend>
135
+ <ul class="flex flex-wrap gap-1">
136
+ {#each slot.references as ref (ref.id)}
137
+ <li class="flex items-center gap-1 rounded border border-border px-1.5 py-0.5" data-reference-id={ref.id}>
138
+ {#if reference}{@render reference(ref)}{:else}<span class="max-w-[10rem] truncate">{ref.id}</span>{/if}
139
+ <button
140
+ type="button"
141
+ aria-label="Remove {slot.label} {ref.id}"
142
+ class="text-muted-foreground hover:text-foreground"
143
+ onclick={() => onchange(removeReference(value, slot.role, ref.id))}>×</button
144
+ >
145
+ </li>
146
+ {/each}
147
+ {#if onaddreference && slot.canAdd}
148
+ <li>
149
+ <button
150
+ type="button"
151
+ class="rounded border border-dashed border-border px-1.5 py-0.5 text-muted-foreground hover:text-foreground"
152
+ onclick={() => onaddreference(slot.role)}>Add</button
153
+ >
154
+ </li>
155
+ {/if}
156
+ </ul>
157
+ </fieldset>
158
+ {/each}
159
+
160
+ {#if showAdjustments && plan.adjustments.length > 0}
161
+ <ul role="status" class="flex flex-col gap-0.5 text-xs text-muted-foreground" data-generation-adjustments="">
162
+ {#each plan.adjustments as adjustment, index (index)}
163
+ <li data-adjustment-field={adjustment.field} data-adjustment-kind={adjustment.kind}>{adjustment.reason}</li>
164
+ {/each}
165
+ </ul>
166
+ {/if}
167
+ {#if showAdjustments && plan.errors.length > 0}
168
+ <ul role="alert" class="flex flex-col gap-0.5 text-xs text-destructive" data-generation-errors="">
169
+ {#each plan.errors as error, index (index)}
170
+ <li data-error-field={error.field}>{error.message}</li>
171
+ {/each}
172
+ </ul>
173
+ {/if}
174
+ </div>
@@ -0,0 +1,23 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type GenerationPlan, type GenerationReference, type GenerationRequest, type ModelCapabilities, type PlanStrategy, type ReferenceRole } from '@pixerate/editor/generation';
3
+ interface Props {
4
+ capabilities: ModelCapabilities;
5
+ /** The request being edited (controlled). */
6
+ value: GenerationRequest;
7
+ onchange: (next: GenerationRequest) => void;
8
+ /** A plan computed elsewhere; otherwise one is computed with `strategy`. */
9
+ plan?: GenerationPlan;
10
+ /** Strategy for the built-in plan (default `nearest`). */
11
+ strategy?: PlanStrategy;
12
+ /** List plan adjustments and errors under the controls (default `true`). */
13
+ showAdjustments?: boolean;
14
+ /** Shows an "Add" button per reference role; you pick the asset and call `onchange`. */
15
+ onaddreference?: (role: ReferenceRole) => void;
16
+ /** Custom rendering of a reference chip (default: its id). */
17
+ reference?: Snippet<[GenerationReference]>;
18
+ class?: string;
19
+ }
20
+ declare const GenerationSettings: import("svelte").Component<Props, {}, "">;
21
+ type GenerationSettings = ReturnType<typeof GenerationSettings>;
22
+ export default GenerationSettings;
23
+ //# sourceMappingURL=GenerationSettings.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerationSettings.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/GenerationSettings.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EASH,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAGrC,UAAU,KAAK;IACb,YAAY,EAAE,iBAAiB,CAAC;IAChC,6CAA6C;IAC7C,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wFAAwF;IACxF,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyGH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,53 @@
1
+ <script lang="ts">
2
+ import { estimateJobProgress } from '@pixerate/editor/generation';
3
+
4
+ interface Props {
5
+ startedAt: number | Date | string;
6
+ expectedMs?: number;
7
+ done?: boolean;
8
+ /** Fixed current time (disables ticking; useful for SSR and tests). */
9
+ now?: number | Date | string;
10
+ /** Update interval while running in ms (default 1000). */
11
+ intervalMs?: number;
12
+ /** Text shown before the time label, e.g. the model name. */
13
+ title?: string;
14
+ /** Extra classes for the root. */
15
+ class?: string;
16
+ }
17
+
18
+ let { startedAt, expectedMs, done = false, now, intervalMs = 1000, title, class: className = '' }: Props = $props();
19
+
20
+ let tick = $state(Date.now());
21
+ const ticking = $derived(!done && now === undefined);
22
+
23
+ $effect(() => {
24
+ if (!ticking) return;
25
+ tick = Date.now();
26
+ const id = setInterval(() => (tick = Date.now()), Math.max(16, intervalMs));
27
+ return () => clearInterval(id);
28
+ });
29
+
30
+ const progress = $derived(estimateJobProgress({ startedAt, expectedMs, done, now: now ?? tick }));
31
+ </script>
32
+
33
+ <!-- Headless-styled, time-based job progress: held at 95% until `done`, with a "~2m left" / "Almost done…" label. -->
34
+ <div class="flex flex-col gap-1 text-sm {className}" data-job-progress="" data-done={done ? '' : undefined}>
35
+ <div class="flex items-center justify-between gap-2 text-muted-foreground">
36
+ {#if title}<span class="truncate text-foreground">{title}</span>{/if}
37
+ <span data-job-progress-label="" aria-live="polite">{progress.label}</span>
38
+ </div>
39
+ <div
40
+ role="progressbar"
41
+ aria-label={title ?? 'Generation progress'}
42
+ aria-valuemin={0}
43
+ aria-valuemax={100}
44
+ aria-valuenow={progress.percent}
45
+ aria-valuetext="{progress.percent}%, {progress.label}"
46
+ class="h-1.5 w-full overflow-hidden rounded-full bg-muted"
47
+ >
48
+ <div
49
+ class="h-full rounded-full bg-primary transition-[width] duration-500"
50
+ style="width: {progress.percent}%; background: var(--primary, currentColor);"
51
+ ></div>
52
+ </div>
53
+ </div>
@@ -0,0 +1,17 @@
1
+ interface Props {
2
+ startedAt: number | Date | string;
3
+ expectedMs?: number;
4
+ done?: boolean;
5
+ /** Fixed current time (disables ticking; useful for SSR and tests). */
6
+ now?: number | Date | string;
7
+ /** Update interval while running in ms (default 1000). */
8
+ intervalMs?: number;
9
+ /** Text shown before the time label, e.g. the model name. */
10
+ title?: string;
11
+ /** Extra classes for the root. */
12
+ class?: string;
13
+ }
14
+ declare const JobProgress: import("svelte").Component<Props, {}, "">;
15
+ type JobProgress = ReturnType<typeof JobProgress>;
16
+ export default JobProgress;
17
+ //# sourceMappingURL=JobProgress.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobProgress.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/JobProgress.svelte.ts"],"names":[],"mappings":"AAME,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiCH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ComponentProps } from "svelte";
2
+ import type GenerationSettingsComponent from "./GenerationSettings.svelte";
3
+ import type JobProgressComponent from "./JobProgress.svelte";
4
+ import type AssetMentionChipsComponent from "./AssetMentionChips.svelte";
5
+ import type GenerationHistoryComponent from "./GenerationHistory.svelte";
6
+ export { default as GenerationSettings } from "./GenerationSettings.svelte";
7
+ export { default as JobProgress } from "./JobProgress.svelte";
8
+ export { default as AssetMentionChips } from "./AssetMentionChips.svelte";
9
+ export { default as GenerationHistory } from "./GenerationHistory.svelte";
10
+ export * from "./plan.svelte.js";
11
+ export * from "./progress.svelte.js";
12
+ export * from "./records.svelte.js";
13
+ export type GenerationSettingsProps = ComponentProps<typeof GenerationSettingsComponent>;
14
+ export type JobProgressProps = ComponentProps<typeof JobProgressComponent>;
15
+ export type AssetMentionChipsProps = ComponentProps<typeof AssetMentionChipsComponent>;
16
+ export type GenerationHistoryProps = ComponentProps<typeof GenerationHistoryComponent>;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generation/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,2BAA2B,MAAM,6BAA6B,CAAC;AAC3E,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,0BAA0B,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,0BAA0B,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AAEpC,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACzF,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACvF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { default as GenerationSettings } from "./GenerationSettings.svelte";
2
+ export { default as JobProgress } from "./JobProgress.svelte";
3
+ export { default as AssetMentionChips } from "./AssetMentionChips.svelte";
4
+ export { default as GenerationHistory } from "./GenerationHistory.svelte";
5
+ export * from "./plan.svelte.js";
6
+ export * from "./progress.svelte.js";
7
+ export * from "./records.svelte.js";
@@ -0,0 +1,16 @@
1
+ import { type GenerationPlan, type GenerationRequest, type ModelCapabilities, type PlanAdjustment, type PlanError, type PlanOptions } from "@pixerate/editor/generation";
2
+ export interface SvelteGenerationPlan {
3
+ readonly plan: GenerationPlan;
4
+ readonly ok: boolean;
5
+ /** The adjusted request. */
6
+ readonly request: GenerationRequest;
7
+ readonly adjustments: PlanAdjustment[];
8
+ readonly errors: PlanError[];
9
+ }
10
+ /**
11
+ * Reactive `planGenerationRequest` (Svelte 5 runes). Pass getters so the plan
12
+ * follows `$state` request/capabilities/options:
13
+ * `createGenerationPlan(() => request, () => caps, () => ({ strategy }))`.
14
+ */
15
+ export declare function createGenerationPlan(request: () => GenerationRequest, capabilities: () => ModelCapabilities, options?: () => PlanOptions): SvelteGenerationPlan;
16
+ //# sourceMappingURL=plan.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/plan.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,iBAAiB,EAChC,YAAY,EAAE,MAAM,iBAAiB,EACrC,OAAO,GAAE,MAAM,WAAwB,GACtC,oBAAoB,CAmBtB"}
@@ -0,0 +1,26 @@
1
+ import { planGenerationRequest, } from "@pixerate/editor/generation";
2
+ /**
3
+ * Reactive `planGenerationRequest` (Svelte 5 runes). Pass getters so the plan
4
+ * follows `$state` request/capabilities/options:
5
+ * `createGenerationPlan(() => request, () => caps, () => ({ strategy }))`.
6
+ */
7
+ export function createGenerationPlan(request, capabilities, options = () => ({})) {
8
+ const plan = $derived(planGenerationRequest(request(), capabilities(), options()));
9
+ return {
10
+ get plan() {
11
+ return plan;
12
+ },
13
+ get ok() {
14
+ return plan.ok;
15
+ },
16
+ get request() {
17
+ return plan.request;
18
+ },
19
+ get adjustments() {
20
+ return plan.adjustments;
21
+ },
22
+ get errors() {
23
+ return plan.errors;
24
+ },
25
+ };
26
+ }
@@ -0,0 +1,25 @@
1
+ import { type JobProgressEstimate } from "@pixerate/editor/generation";
2
+ export interface JobProgressOptions {
3
+ startedAt: number | Date | string;
4
+ expectedMs?: number;
5
+ done?: boolean;
6
+ /** Fixed current time (disables ticking; useful for SSR and tests). */
7
+ now?: number | Date | string;
8
+ /** Update interval while running in ms (default 1000). */
9
+ intervalMs?: number;
10
+ }
11
+ export interface SvelteJobProgress {
12
+ readonly progress: JobProgressEstimate;
13
+ readonly percent: number;
14
+ readonly label: string;
15
+ /** Stops ticking. */
16
+ destroy(): void;
17
+ }
18
+ /**
19
+ * Ticking `estimateJobProgress` (Svelte 5 runes). Pass a getter so it follows
20
+ * `$state` options; it ticks every `intervalMs` while not `done` and no fixed
21
+ * `now` is given (browser only; nothing ticks during SSR). Call `destroy()`
22
+ * when done (e.g. in `onDestroy`).
23
+ */
24
+ export declare function createJobProgress(options: () => JobProgressOptions): SvelteJobProgress;
25
+ //# sourceMappingURL=progress.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/progress.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE5F,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IAC7B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,kBAAkB,GAAG,iBAAiB,CA2BtF"}
@@ -0,0 +1,36 @@
1
+ import { estimateJobProgress } from "@pixerate/editor/generation";
2
+ /**
3
+ * Ticking `estimateJobProgress` (Svelte 5 runes). Pass a getter so it follows
4
+ * `$state` options; it ticks every `intervalMs` while not `done` and no fixed
5
+ * `now` is given (browser only; nothing ticks during SSR). Call `destroy()`
6
+ * when done (e.g. in `onDestroy`).
7
+ */
8
+ export function createJobProgress(options) {
9
+ let tick = $state(Date.now());
10
+ const timer = typeof window !== "undefined"
11
+ ? setInterval(() => {
12
+ const current = options();
13
+ if (!current.done && current.now === undefined)
14
+ tick = Date.now();
15
+ }, Math.max(16, options().intervalMs ?? 1000))
16
+ : null;
17
+ const progress = $derived.by(() => {
18
+ const { startedAt, expectedMs, done, now } = options();
19
+ return estimateJobProgress({ startedAt, expectedMs, done, now: now ?? tick });
20
+ });
21
+ return {
22
+ get progress() {
23
+ return progress;
24
+ },
25
+ get percent() {
26
+ return progress.percent;
27
+ },
28
+ get label() {
29
+ return progress.label;
30
+ },
31
+ destroy() {
32
+ if (timer !== null)
33
+ clearInterval(timer);
34
+ },
35
+ };
36
+ }
@@ -0,0 +1,18 @@
1
+ import type { GenerationRecord, GenerationRecordFilter, GenerationRecordStore } from "@pixerate/editor/generation";
2
+ export interface SvelteGenerationRecords {
3
+ readonly records: GenerationRecord[];
4
+ readonly loading: boolean;
5
+ readonly error: unknown;
6
+ refresh(): Promise<void>;
7
+ /** Stops following the store. */
8
+ destroy(): void;
9
+ }
10
+ /**
11
+ * Reactive records of a `GenerationRecordStore` (Svelte 5 runes), newest
12
+ * first, reloaded whenever the store changes. Pass a getter for a reactive
13
+ * filter: `createGenerationRecords(store, () => ({ model }))`. Call
14
+ * `destroy()` (or create it inside a component, where it is cleaned up with
15
+ * the component's effects) to stop listening.
16
+ */
17
+ export declare function createGenerationRecords(store: GenerationRecordStore, filter?: () => GenerationRecordFilter | undefined): SvelteGenerationRecords;
18
+ //# sourceMappingURL=records.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.svelte.d.ts","sourceRoot":"","sources":["../../src/generation/records.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,iCAAiC;IACjC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,EAC5B,MAAM,GAAE,MAAM,sBAAsB,GAAG,SAA2B,GACjE,uBAAuB,CAuDzB"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Reactive records of a `GenerationRecordStore` (Svelte 5 runes), newest
3
+ * first, reloaded whenever the store changes. Pass a getter for a reactive
4
+ * filter: `createGenerationRecords(store, () => ({ model }))`. Call
5
+ * `destroy()` (or create it inside a component, where it is cleaned up with
6
+ * the component's effects) to stop listening.
7
+ */
8
+ export function createGenerationRecords(store, filter = () => undefined) {
9
+ let records = $state([]);
10
+ let loading = $state(true);
11
+ let error = $state(null);
12
+ let currentFilter = undefined;
13
+ let generation = 0;
14
+ const refresh = async () => {
15
+ const ticket = ++generation;
16
+ loading = true;
17
+ try {
18
+ const next = await store.list(currentFilter);
19
+ if (ticket !== generation)
20
+ return;
21
+ records = next;
22
+ error = null;
23
+ }
24
+ catch (err) {
25
+ if (ticket === generation)
26
+ error = err;
27
+ }
28
+ finally {
29
+ if (ticket === generation)
30
+ loading = false;
31
+ }
32
+ };
33
+ const unsubscribe = store.subscribe(() => void refresh());
34
+ let stopEffect = null;
35
+ if ($effect.tracking()) {
36
+ $effect(() => {
37
+ currentFilter = filter();
38
+ void refresh();
39
+ });
40
+ $effect(() => unsubscribe);
41
+ }
42
+ else {
43
+ stopEffect = $effect.root(() => {
44
+ $effect(() => {
45
+ currentFilter = filter();
46
+ void refresh();
47
+ });
48
+ });
49
+ }
50
+ return {
51
+ get records() {
52
+ return records;
53
+ },
54
+ get loading() {
55
+ return loading;
56
+ },
57
+ get error() {
58
+ return error;
59
+ },
60
+ refresh,
61
+ destroy() {
62
+ unsubscribe();
63
+ stopEffect?.();
64
+ },
65
+ };
66
+ }