@pixerate/editor-svelte 0.23.0 → 0.25.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 (147) hide show
  1. package/README.md +4 -2
  2. package/dist/ExportDocxButton.svelte +48 -0
  3. package/dist/ExportDocxButton.svelte.d.ts +13 -0
  4. package/dist/ExportDocxButton.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/canvas/AnimationTimeline.svelte +217 -0
  9. package/dist/canvas/AnimationTimeline.svelte.d.ts +20 -0
  10. package/dist/canvas/AnimationTimeline.svelte.d.ts.map +1 -0
  11. package/dist/canvas/CanvasComponentsPanel.svelte +73 -0
  12. package/dist/canvas/CanvasComponentsPanel.svelte.d.ts +13 -0
  13. package/dist/canvas/CanvasComponentsPanel.svelte.d.ts.map +1 -0
  14. package/dist/canvas/CanvasInstanceInspector.svelte +136 -0
  15. package/dist/canvas/CanvasInstanceInspector.svelte.d.ts +16 -0
  16. package/dist/canvas/CanvasInstanceInspector.svelte.d.ts.map +1 -0
  17. package/dist/canvas/TokenBindingPicker.svelte +93 -0
  18. package/dist/canvas/TokenBindingPicker.svelte.d.ts +20 -0
  19. package/dist/canvas/TokenBindingPicker.svelte.d.ts.map +1 -0
  20. package/dist/canvas/TokenModeSwitcher.svelte +55 -0
  21. package/dist/canvas/TokenModeSwitcher.svelte.d.ts +18 -0
  22. package/dist/canvas/TokenModeSwitcher.svelte.d.ts.map +1 -0
  23. package/dist/canvas/createCanvasAnimation.svelte.d.ts +98 -0
  24. package/dist/canvas/createCanvasAnimation.svelte.d.ts.map +1 -0
  25. package/dist/canvas/createCanvasAnimation.svelte.js +79 -0
  26. package/dist/canvas/createCanvasArrange.svelte.d.ts +4 -0
  27. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  28. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -1
  29. package/dist/canvas/createCanvasComponents.svelte.d.ts +68 -0
  30. package/dist/canvas/createCanvasComponents.svelte.d.ts.map +1 -0
  31. package/dist/canvas/createCanvasComponents.svelte.js +31 -0
  32. package/dist/canvas/createCanvasTokens.svelte.d.ts +31 -0
  33. package/dist/canvas/createCanvasTokens.svelte.d.ts.map +1 -0
  34. package/dist/canvas/createCanvasTokens.svelte.js +50 -0
  35. package/dist/canvas/index.d.ts +12 -0
  36. package/dist/canvas/index.d.ts.map +1 -1
  37. package/dist/canvas/index.js +16 -0
  38. package/dist/docxExport.svelte.d.ts +26 -0
  39. package/dist/docxExport.svelte.d.ts.map +1 -0
  40. package/dist/docxExport.svelte.js +36 -0
  41. package/dist/fileImport.svelte.d.ts +8 -1
  42. package/dist/fileImport.svelte.d.ts.map +1 -1
  43. package/dist/fileImport.svelte.js +11 -1
  44. package/dist/generation/AssetMentionChips.svelte +130 -0
  45. package/dist/generation/AssetMentionChips.svelte.d.ts +21 -0
  46. package/dist/generation/AssetMentionChips.svelte.d.ts.map +1 -0
  47. package/dist/generation/GenerationHistory.svelte +161 -0
  48. package/dist/generation/GenerationHistory.svelte.d.ts +28 -0
  49. package/dist/generation/GenerationHistory.svelte.d.ts.map +1 -0
  50. package/dist/generation/index.d.ts +7 -0
  51. package/dist/generation/index.d.ts.map +1 -1
  52. package/dist/generation/index.js +3 -0
  53. package/dist/generation/records.svelte.d.ts +18 -0
  54. package/dist/generation/records.svelte.d.ts.map +1 -0
  55. package/dist/generation/records.svelte.js +66 -0
  56. package/dist/image-editor/ImageEditor.svelte +72 -1
  57. package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -1
  58. package/dist/image-editor/RefineEdgePanel.svelte +180 -0
  59. package/dist/image-editor/RefineEdgePanel.svelte.d.ts +13 -0
  60. package/dist/image-editor/RefineEdgePanel.svelte.d.ts.map +1 -0
  61. package/dist/image-editor/SelectionOptionsBar.svelte +135 -0
  62. package/dist/image-editor/SelectionOptionsBar.svelte.d.ts +15 -0
  63. package/dist/image-editor/SelectionOptionsBar.svelte.d.ts.map +1 -0
  64. package/dist/image-editor/index.d.ts +6 -0
  65. package/dist/image-editor/index.d.ts.map +1 -1
  66. package/dist/image-editor/index.js +2 -0
  67. package/dist/index.d.ts +9 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -0
  70. package/dist/paragraphStyles.svelte.d.ts +30 -0
  71. package/dist/paragraphStyles.svelte.d.ts.map +1 -0
  72. package/dist/paragraphStyles.svelte.js +44 -0
  73. package/dist/review/TrackedChangesList.svelte +67 -0
  74. package/dist/review/TrackedChangesList.svelte.d.ts +13 -0
  75. package/dist/review/TrackedChangesList.svelte.d.ts.map +1 -0
  76. package/dist/review/index.d.ts +3 -0
  77. package/dist/review/index.d.ts.map +1 -1
  78. package/dist/review/index.js +1 -0
  79. package/dist/review/review.svelte.d.ts +6 -0
  80. package/dist/review/review.svelte.d.ts.map +1 -1
  81. package/dist/review/review.svelte.js +3 -0
  82. package/dist/spreadsheet/FormulaBar.svelte +13 -4
  83. package/dist/spreadsheet/FormulaBar.svelte.d.ts.map +1 -1
  84. package/dist/spreadsheet/FormulaHints.svelte +7 -5
  85. package/dist/spreadsheet/FormulaHints.svelte.d.ts +3 -0
  86. package/dist/spreadsheet/FormulaHints.svelte.d.ts.map +1 -1
  87. package/dist/spreadsheet/NameManager.svelte +165 -0
  88. package/dist/spreadsheet/NameManager.svelte.d.ts +11 -0
  89. package/dist/spreadsheet/NameManager.svelte.d.ts.map +1 -0
  90. package/dist/spreadsheet/SheetTabs.svelte +161 -0
  91. package/dist/spreadsheet/SheetTabs.svelte.d.ts +10 -0
  92. package/dist/spreadsheet/SheetTabs.svelte.d.ts.map +1 -0
  93. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte +184 -0
  94. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte.d.ts +9 -0
  95. package/dist/spreadsheet/SpreadsheetConditionalFormatPanel.svelte.d.ts.map +1 -0
  96. package/dist/spreadsheet/SpreadsheetContextMenu.svelte +9 -4
  97. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts +5 -1
  98. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts.map +1 -1
  99. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte +141 -0
  100. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte.d.ts +9 -0
  101. package/dist/spreadsheet/SpreadsheetDataValidationPanel.svelte.d.ts.map +1 -0
  102. package/dist/spreadsheet/SpreadsheetEditor.svelte +273 -19
  103. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts +8 -0
  104. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -1
  105. package/dist/spreadsheet/SpreadsheetGroupRow.svelte +31 -3
  106. package/dist/spreadsheet/SpreadsheetGroupRow.svelte.d.ts +6 -0
  107. package/dist/spreadsheet/SpreadsheetGroupRow.svelte.d.ts.map +1 -1
  108. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte +92 -0
  109. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte.d.ts +9 -0
  110. package/dist/spreadsheet/SpreadsheetValidationDialog.svelte.d.ts.map +1 -0
  111. package/dist/spreadsheet/index.d.ts +10 -0
  112. package/dist/spreadsheet/index.d.ts.map +1 -1
  113. package/dist/spreadsheet/index.js +6 -0
  114. package/dist/spreadsheet/spreadsheet.svelte.d.ts +56 -3
  115. package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -1
  116. package/dist/spreadsheet/spreadsheet.svelte.js +105 -6
  117. package/dist/spreadsheet/viewport.svelte.d.ts +26 -0
  118. package/dist/spreadsheet/viewport.svelte.d.ts.map +1 -0
  119. package/dist/spreadsheet/viewport.svelte.js +93 -0
  120. package/dist/tables/InsertTableGrid.svelte +85 -0
  121. package/dist/tables/InsertTableGrid.svelte.d.ts +21 -0
  122. package/dist/tables/InsertTableGrid.svelte.d.ts.map +1 -0
  123. package/dist/tables/TableBubbleMenu.svelte +43 -0
  124. package/dist/tables/TableBubbleMenu.svelte.d.ts +18 -0
  125. package/dist/tables/TableBubbleMenu.svelte.d.ts.map +1 -0
  126. package/dist/tables/TableToolbar.svelte +81 -0
  127. package/dist/tables/TableToolbar.svelte.d.ts +19 -0
  128. package/dist/tables/TableToolbar.svelte.d.ts.map +1 -0
  129. package/dist/tables/index.d.ts +12 -0
  130. package/dist/tables/index.d.ts.map +1 -0
  131. package/dist/tables/index.js +4 -0
  132. package/dist/tables/tableMenu.svelte.d.ts +21 -0
  133. package/dist/tables/tableMenu.svelte.d.ts.map +1 -0
  134. package/dist/tables/tableMenu.svelte.js +27 -0
  135. package/dist/tokens/TokenSwatch.svelte +14 -0
  136. package/dist/tokens/TokenSwatch.svelte.d.ts +8 -0
  137. package/dist/tokens/TokenSwatch.svelte.d.ts.map +1 -0
  138. package/dist/tokens/TokensPanel.svelte +323 -0
  139. package/dist/tokens/TokensPanel.svelte.d.ts +14 -0
  140. package/dist/tokens/TokensPanel.svelte.d.ts.map +1 -0
  141. package/dist/tokens/createTokens.svelte.d.ts +31 -0
  142. package/dist/tokens/createTokens.svelte.d.ts.map +1 -0
  143. package/dist/tokens/createTokens.svelte.js +43 -0
  144. package/dist/tokens/index.d.ts +7 -0
  145. package/dist/tokens/index.d.ts.map +1 -0
  146. package/dist/tokens/index.js +3 -0
  147. package/package.json +10 -2
@@ -0,0 +1,323 @@
1
+ <script lang="ts">
2
+ import {
3
+ TOKEN_TYPES,
4
+ TokenError,
5
+ getCollectionVariables,
6
+ getTokenVariable,
7
+ isTokenAlias,
8
+ resolveTokenInMode,
9
+ type TokenMode,
10
+ type TokenState,
11
+ type TokenStore,
12
+ type TokenType,
13
+ type TokenVariable
14
+ } from '@pixerate/editor/tokens';
15
+ import { untrack } from 'svelte';
16
+ import TokenSwatch from './TokenSwatch.svelte';
17
+
18
+ interface Props {
19
+ store: TokenStore;
20
+ /** Selected collection (controlled); defaults to the first. */
21
+ collectionId?: string;
22
+ oncollectionchange?: (collectionId: string) => void;
23
+ /** Called with refused edits (also shown in the panel). */
24
+ onerror?: (error: Error) => void;
25
+ class?: string;
26
+ }
27
+
28
+ let { store, collectionId, oncollectionchange, onerror, class: className = '' }: Props = $props();
29
+
30
+ // Re-read the store on every change; follows a replaced `store` prop too.
31
+ let version = $state(0);
32
+ const tokenState: TokenState = $derived((void version, store.getState()));
33
+ $effect(() => {
34
+ const current = store;
35
+ return untrack(() =>
36
+ current.subscribe(() => {
37
+ version += 1;
38
+ })
39
+ );
40
+ });
41
+
42
+ let ownSelection = $state<string | undefined>(undefined);
43
+ let error = $state<string | null>(null);
44
+ let newCollection = $state('');
45
+ let newMode = $state('');
46
+ let newName = $state('');
47
+ let newType = $state<TokenType>('color');
48
+
49
+ const collection = $derived(
50
+ tokenState.collections.find((c) => c.id === (collectionId ?? ownSelection)) ?? tokenState.collections[0]
51
+ );
52
+ const variables = $derived(collection ? getCollectionVariables(tokenState, collection.id) : []);
53
+ const canUndo = $derived((void version, store.canUndo()));
54
+ const canRedo = $derived((void version, store.canRedo()));
55
+
56
+ const input =
57
+ 'w-full min-w-0 rounded border border-border bg-background px-1.5 py-0.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary';
58
+ const button = 'rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-40';
59
+
60
+ function select(id: string) {
61
+ ownSelection = id;
62
+ oncollectionchange?.(id);
63
+ }
64
+
65
+ function run(fn: () => void): boolean {
66
+ try {
67
+ fn();
68
+ error = null;
69
+ return true;
70
+ } catch (e) {
71
+ const err = e as Error;
72
+ error = err instanceof TokenError ? err.message : String(err);
73
+ onerror?.(err);
74
+ return false;
75
+ }
76
+ }
77
+
78
+ /** Commit-on-blur handlers for an input showing `value`; refused edits reset the input. */
79
+ function committer(value: string, apply: (next: string) => void) {
80
+ return {
81
+ onblur: (e: FocusEvent) => {
82
+ const el = e.currentTarget as HTMLInputElement;
83
+ if (el.value === value) return;
84
+ if (!run(() => apply(el.value))) el.value = value;
85
+ },
86
+ onkeydown: (e: KeyboardEvent) => {
87
+ const el = e.currentTarget as HTMLInputElement;
88
+ if (e.key === 'Enter') el.blur();
89
+ if (e.key === 'Escape') {
90
+ el.value = value;
91
+ el.blur();
92
+ }
93
+ }
94
+ };
95
+ }
96
+
97
+ function aliasCandidates(variable: TokenVariable) {
98
+ return tokenState.variables.filter((v) => v.type === variable.type && v.id !== variable.id);
99
+ }
100
+
101
+ function setAlias(variable: TokenVariable, mode: TokenMode, target: string) {
102
+ const resolved = resolveTokenInMode(tokenState, variable.id, mode.id);
103
+ run(() => store.setValue(variable.id, target ? { alias: target } : resolved, mode.id));
104
+ }
105
+
106
+ function typeIcon(type: TokenType) {
107
+ return type === 'color' ? '◐' : type === 'number' ? '#' : type === 'string' ? 'T' : '⊘';
108
+ }
109
+ </script>
110
+
111
+ <div data-tokens-panel="" class="flex flex-col gap-2 text-xs text-foreground {className}">
112
+ <div class="flex flex-wrap items-center gap-2">
113
+ {#if tokenState.collections.length > 0}
114
+ <select
115
+ aria-label="Collection"
116
+ class="rounded border border-border bg-background px-1.5 py-0.5 text-xs"
117
+ value={collection?.id ?? ''}
118
+ onchange={(e) => select(e.currentTarget.value)}
119
+ >
120
+ {#each tokenState.collections as c (c.id)}
121
+ <option value={c.id}>{c.name}</option>
122
+ {/each}
123
+ </select>
124
+ {/if}
125
+ <form
126
+ class="flex items-center gap-1"
127
+ onsubmit={(e) => {
128
+ e.preventDefault();
129
+ run(() => {
130
+ const created = store.createCollection(newCollection, ['Light', 'Dark']);
131
+ newCollection = '';
132
+ select(created.id);
133
+ });
134
+ }}
135
+ >
136
+ <input class={input} placeholder="New collection" aria-label="New collection name" bind:value={newCollection} />
137
+ <button type="submit" class={button} disabled={!newCollection.trim()}>Add</button>
138
+ </form>
139
+ <span class="ml-auto flex gap-1">
140
+ <button type="button" class={button} disabled={!canUndo} onclick={() => store.undo()} aria-label="Undo token edit">Undo</button>
141
+ <button type="button" class={button} disabled={!canRedo} onclick={() => store.redo()} aria-label="Redo token edit">Redo</button>
142
+ </span>
143
+ </div>
144
+
145
+ {#if error}
146
+ <div role="alert" class="rounded border border-red-500/40 bg-red-500/10 px-2 py-1 text-red-500">{error}</div>
147
+ {/if}
148
+
149
+ {#if collection}
150
+ {@const c = collection}
151
+ <div class="flex items-center gap-1">
152
+ <input class={input} value={c.name} aria-label="Collection name" {...committer(c.name, (name) => store.renameCollection(c.id, name))} />
153
+ <button type="button" class={button} onclick={() => run(() => store.deleteCollection(c.id))} aria-label="Delete collection {c.name}">
154
+ Delete
155
+ </button>
156
+ </div>
157
+ <div class="overflow-x-auto">
158
+ <table class="w-full border-collapse">
159
+ <thead>
160
+ <tr class="border-b border-border text-left text-muted-foreground">
161
+ <th class="px-1 py-1 font-medium">Name</th>
162
+ {#each c.modes as mode, index (mode.id)}
163
+ <th class="px-1 py-1 font-medium" data-mode-id={mode.id}>
164
+ <div class="flex items-center gap-1">
165
+ <input
166
+ class={input}
167
+ value={mode.name}
168
+ aria-label="Mode {mode.name} name"
169
+ {...committer(mode.name, (name) => store.renameMode(c.id, mode.id, name))}
170
+ />
171
+ {#if index === 0}
172
+ <span title="Default mode" class="text-[10px] uppercase">default</span>
173
+ {:else}
174
+ <button
175
+ type="button"
176
+ class="px-1 hover:text-foreground"
177
+ title="Make default"
178
+ aria-label="Make {mode.name} the default mode"
179
+ onclick={() => run(() => store.setDefaultMode(c.id, mode.id))}>★</button
180
+ >
181
+ {/if}
182
+ {#if c.modes.length > 1}
183
+ <button
184
+ type="button"
185
+ class="px-1 hover:text-foreground"
186
+ aria-label="Remove mode {mode.name}"
187
+ onclick={() => run(() => store.removeMode(c.id, mode.id))}>×</button
188
+ >
189
+ {/if}
190
+ </div>
191
+ </th>
192
+ {/each}
193
+ <th class="px-1 py-1">
194
+ <form
195
+ class="flex items-center gap-1"
196
+ onsubmit={(e) => {
197
+ e.preventDefault();
198
+ run(() => {
199
+ store.addMode(c.id, newMode);
200
+ newMode = '';
201
+ });
202
+ }}
203
+ >
204
+ <input class={input} placeholder="Mode" aria-label="New mode name" bind:value={newMode} />
205
+ <button type="submit" class={button} disabled={!newMode.trim()} aria-label="Add mode">+</button>
206
+ </form>
207
+ </th>
208
+ </tr>
209
+ </thead>
210
+ <tbody>
211
+ {#each variables as variable (variable.id)}
212
+ <tr class="border-b border-border/50" data-token-row={variable.id}>
213
+ <td class="px-1 py-1">
214
+ <div class="flex items-center gap-1">
215
+ <span class="w-4 text-center text-muted-foreground" title={variable.type}>{typeIcon(variable.type)}</span>
216
+ <input
217
+ class={input}
218
+ value={variable.name}
219
+ aria-label="Variable {variable.name} name"
220
+ {...committer(variable.name, (name) => store.renameVariable(variable.id, name))}
221
+ />
222
+ </div>
223
+ </td>
224
+ {#each c.modes as mode (mode.id)}
225
+ {@const value = variable.valuesByMode[mode.id]}
226
+ {@const alias = isTokenAlias(value) ? value.alias : ''}
227
+ {@const resolved = resolveTokenInMode(tokenState, variable.id, mode.id)}
228
+ <td class="px-1 py-1 align-middle" data-variable-id={variable.id} data-mode-id={mode.id}>
229
+ <div class="flex items-center gap-1">
230
+ {#if alias}
231
+ <span class="flex min-w-0 flex-1 items-center gap-1 text-xs" data-token-alias={alias}>
232
+ {#if variable.type === 'color' && resolved !== undefined}<TokenSwatch color={String(resolved)} />{/if}
233
+ <span class="truncate">→ {getTokenVariable(tokenState, alias)?.name ?? alias}</span>
234
+ </span>
235
+ {:else}
236
+ <span class="min-w-0 flex-1">
237
+ {#if variable.type === 'color'}
238
+ <span class="flex items-center gap-1">
239
+ <label class="relative">
240
+ <TokenSwatch color={String(value)} />
241
+ <input
242
+ type="color"
243
+ aria-label="{variable.name} colour"
244
+ class="absolute inset-0 h-full w-full cursor-pointer opacity-0"
245
+ value={String(value).slice(0, 7)}
246
+ onchange={(e) => run(() => store.setValue(variable.id, e.currentTarget.value + String(value).slice(7), mode.id))}
247
+ />
248
+ </label>
249
+ <input
250
+ class={input}
251
+ value={String(value)}
252
+ aria-label="{variable.name} value"
253
+ {...committer(String(value), (next) => store.setValue(variable.id, next, mode.id))}
254
+ />
255
+ </span>
256
+ {:else if variable.type === 'boolean'}
257
+ <input
258
+ type="checkbox"
259
+ aria-label="{variable.name} value"
260
+ checked={value === true}
261
+ onchange={(e) => run(() => store.setValue(variable.id, e.currentTarget.checked, mode.id))}
262
+ />
263
+ {:else}
264
+ <input
265
+ class={input}
266
+ value={String(value)}
267
+ inputmode={variable.type === 'number' ? 'decimal' : undefined}
268
+ aria-label="{variable.name} value"
269
+ {...committer(String(value), (next) => store.setValue(variable.id, next, mode.id))}
270
+ />
271
+ {/if}
272
+ </span>
273
+ {/if}
274
+ <select
275
+ aria-label="{variable.name} alias in {mode.name}"
276
+ class="w-5 shrink-0 rounded border border-border bg-background text-xs"
277
+ title="Alias"
278
+ value={alias}
279
+ onchange={(e) => setAlias(variable, mode, e.currentTarget.value)}
280
+ >
281
+ <option value="">Value</option>
282
+ {#each aliasCandidates(variable) as candidate (candidate.id)}
283
+ <option value={candidate.id}>→ {candidate.name}</option>
284
+ {/each}
285
+ </select>
286
+ </div>
287
+ </td>
288
+ {/each}
289
+ <td class="px-1 py-1 text-right">
290
+ <button
291
+ type="button"
292
+ class="px-1 text-muted-foreground hover:text-foreground"
293
+ aria-label="Delete variable {variable.name}"
294
+ onclick={() => run(() => store.deleteVariables(variable.id))}>×</button
295
+ >
296
+ </td>
297
+ </tr>
298
+ {/each}
299
+ </tbody>
300
+ </table>
301
+ </div>
302
+ <form
303
+ class="flex items-center gap-1"
304
+ onsubmit={(e) => {
305
+ e.preventDefault();
306
+ run(() => {
307
+ store.createVariable({ collectionId: c.id, name: newName, type: newType });
308
+ newName = '';
309
+ });
310
+ }}
311
+ >
312
+ <input class={input} placeholder="color/bg" aria-label="New variable name" bind:value={newName} />
313
+ <select aria-label="New variable type" class="rounded border border-border bg-background px-1 py-0.5 text-xs" bind:value={newType}>
314
+ {#each TOKEN_TYPES as t (t)}
315
+ <option value={t}>{t}</option>
316
+ {/each}
317
+ </select>
318
+ <button type="submit" class={button} disabled={!newName.trim()}>Add variable</button>
319
+ </form>
320
+ {:else}
321
+ <p class="text-muted-foreground">No collections yet.</p>
322
+ {/if}
323
+ </div>
@@ -0,0 +1,14 @@
1
+ import { type TokenStore } from '@pixerate/editor/tokens';
2
+ interface Props {
3
+ store: TokenStore;
4
+ /** Selected collection (controlled); defaults to the first. */
5
+ collectionId?: string;
6
+ oncollectionchange?: (collectionId: string) => void;
7
+ /** Called with refused edits (also shown in the panel). */
8
+ onerror?: (error: Error) => void;
9
+ class?: string;
10
+ }
11
+ declare const TokensPanel: import("svelte").Component<Props, {}, "">;
12
+ type TokensPanel = ReturnType<typeof TokensPanel>;
13
+ export default TokensPanel;
14
+ //# sourceMappingURL=TokensPanel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokensPanel.svelte.d.ts","sourceRoot":"","sources":["../../src/tokens/TokensPanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EASH,KAAK,UAAU,EAGhB,MAAM,yBAAyB,CAAC;AAKjC,UAAU,KAAK;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8OH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type TokenCssOptions, type TokenModeContext, type TokenState, type TokenStore } from "@pixerate/editor/tokens";
2
+ export interface CreateTokensOptions {
3
+ /** Modes for `cssVariables` (collection id → mode id), or a getter for reactive modes. */
4
+ modes?: TokenModeContext | (() => TokenModeContext | undefined);
5
+ /** Options for `css` and `cssVariables` (prefix, attribute, …). */
6
+ css?: TokenCssOptions;
7
+ }
8
+ export interface SvelteTokens {
9
+ readonly store: TokenStore;
10
+ /** The store's state (reactive). */
11
+ readonly state: TokenState;
12
+ /** Resolved custom properties for `modes` (reactive), e.g. for `style:` directives. */
13
+ readonly cssVariables: Record<string, string>;
14
+ /** `cssVariables` as a `style` attribute string (reactive). */
15
+ readonly style: string;
16
+ /** A stylesheet with every mode (reactive). */
17
+ readonly css: string;
18
+ readonly canUndo: boolean;
19
+ readonly canRedo: boolean;
20
+ undo(): void;
21
+ redo(): void;
22
+ /** Stops listening to the store. */
23
+ destroy(): void;
24
+ }
25
+ /**
26
+ * Svelte 5 rune: subscribes to a `TokenStore` and exposes its state plus CSS custom properties
27
+ * for app theming (`<div style={tokens.style}>`, or inject `tokens.css` and switch the
28
+ * `data-mode` attribute).
29
+ */
30
+ export declare function createTokens(store: TokenStore, options?: CreateTokensOptions): SvelteTokens;
31
+ //# sourceMappingURL=createTokens.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTokens.svelte.d.ts","sourceRoot":"","sources":["../../src/tokens/createTokens.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAChE,mEAAmE;IACnE,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,oCAAoC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAoC/F"}
@@ -0,0 +1,43 @@
1
+ import { exportTokensCss, getTokenCssVariables, } from "@pixerate/editor/tokens";
2
+ /**
3
+ * Svelte 5 rune: subscribes to a `TokenStore` and exposes its state plus CSS custom properties
4
+ * for app theming (`<div style={tokens.style}>`, or inject `tokens.css` and switch the
5
+ * `data-mode` attribute).
6
+ */
7
+ export function createTokens(store, options = {}) {
8
+ let state = $state.raw(store.getState());
9
+ const unsubscribe = store.subscribe((event) => {
10
+ state = event.state;
11
+ });
12
+ const modes = () => (typeof options.modes === "function" ? options.modes() : options.modes);
13
+ const cssVariables = $derived(getTokenCssVariables(state, modes(), options.css));
14
+ const css = $derived(exportTokensCss(state, options.css));
15
+ return {
16
+ store,
17
+ get state() {
18
+ return state;
19
+ },
20
+ get cssVariables() {
21
+ return cssVariables;
22
+ },
23
+ get style() {
24
+ return Object.entries(cssVariables)
25
+ .map(([name, value]) => `${name}: ${value}`)
26
+ .join("; ");
27
+ },
28
+ get css() {
29
+ return css;
30
+ },
31
+ get canUndo() {
32
+ void state;
33
+ return store.canUndo();
34
+ },
35
+ get canRedo() {
36
+ void state;
37
+ return store.canRedo();
38
+ },
39
+ undo: () => void store.undo(),
40
+ redo: () => void store.redo(),
41
+ destroy: unsubscribe,
42
+ };
43
+ }
@@ -0,0 +1,7 @@
1
+ import type { ComponentProps } from "svelte";
2
+ import type TokensPanelComponent from "./TokensPanel.svelte";
3
+ export { default as TokensPanel } from "./TokensPanel.svelte";
4
+ export { default as TokenSwatch } from "./TokenSwatch.svelte";
5
+ export * from "./createTokens.svelte.js";
6
+ export type TokensPanelProps = ComponentProps<typeof TokensPanelComponent>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tokens/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,cAAc,0BAA0B,CAAC;AAEzC,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as TokensPanel } from "./TokensPanel.svelte";
2
+ export { default as TokenSwatch } from "./TokenSwatch.svelte";
3
+ export * from "./createTokens.svelte.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -48,6 +48,11 @@
48
48
  "svelte": "./dist/generation/index.js",
49
49
  "default": "./dist/generation/index.js"
50
50
  },
51
+ "./tokens": {
52
+ "types": "./dist/tokens/index.d.ts",
53
+ "svelte": "./dist/tokens/index.js",
54
+ "default": "./dist/tokens/index.js"
55
+ },
51
56
  "./package.json": "./package.json"
52
57
  },
53
58
  "typesVersions": {
@@ -69,6 +74,9 @@
69
74
  ],
70
75
  "generation": [
71
76
  "./dist/generation/index.d.ts"
77
+ ],
78
+ "tokens": [
79
+ "./dist/tokens/index.d.ts"
72
80
  ]
73
81
  }
74
82
  },
@@ -83,7 +91,7 @@
83
91
  "@tiptap/extension-bubble-menu": "^2.11.5",
84
92
  "@tiptap/extension-placeholder": "^2.11.5",
85
93
  "@tiptap/starter-kit": "^2.11.5",
86
- "@pixerate/editor": "0.24.0"
94
+ "@pixerate/editor": "0.26.0"
87
95
  },
88
96
  "peerDependencies": {
89
97
  "@dagrejs/dagre": "^1.1.4",