@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,161 @@
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
+ DRIFT_TYPE_LABELS,
9
+ recreateRequest,
10
+ referenceRoleLabel,
11
+ variationRequest,
12
+ type AssetLookup,
13
+ type GenerationRecord,
14
+ type ModelCapabilities,
15
+ type RecreateMode,
16
+ type RecreateOptions,
17
+ type RecreateResult
18
+ } from '@pixerate/editor/generation';
19
+ // Not `@pixerate/editor/grammar`: svelte-package keeps type imports in
20
+ // `.svelte` output, which would pull another core entry into this one.
21
+ type Template = NonNullable<RecreateOptions['templates']>[number];
22
+
23
+ interface Props {
24
+ records: readonly GenerationRecord[];
25
+ /** Current templates (drift detection, and resolution in `latest` mode). */
26
+ templates?: readonly Template[];
27
+ /** Current models (capability drift and re-planning). */
28
+ capabilities?: ModelCapabilities | readonly ModelCapabilities[];
29
+ /** Current assets (missing / changed asset drift). */
30
+ assets?: AssetLookup;
31
+ /** Recreate mode (bindable); starts at `exact`. */
32
+ mode?: RecreateMode;
33
+ onmodechange?: (mode: RecreateMode) => void;
34
+ /** "Recreate": receives the rebuilt request and drift report. */
35
+ onrecreate?: (result: RecreateResult, record: GenerationRecord) => void;
36
+ /** "Variation": same request with a new seed. */
37
+ onvariation?: (result: RecreateResult, record: GenerationRecord) => void;
38
+ onremove?: (record: GenerationRecord) => void;
39
+ /** Extra content per record (e.g. output thumbnails). */
40
+ preview?: Snippet<[GenerationRecord]>;
41
+ emptyText?: string;
42
+ class?: string;
43
+ }
44
+
45
+ let {
46
+ records,
47
+ templates,
48
+ capabilities,
49
+ assets,
50
+ mode = $bindable('exact'),
51
+ onmodechange,
52
+ onrecreate,
53
+ onvariation,
54
+ onremove,
55
+ preview,
56
+ emptyText = 'No generations yet.',
57
+ class: className = ''
58
+ }: Props = $props();
59
+
60
+ const groupName = `generation-history-mode-${++nextId}`;
61
+ const options = $derived({ templates, capabilities, assets, mode });
62
+ const results = $derived(records.map((record) => recreateRequest(record, options)));
63
+ const models = $derived(
64
+ capabilities ? (Array.isArray(capabilities) ? capabilities : [capabilities as ModelCapabilities]) : []
65
+ );
66
+ const severityClass = {
67
+ info: 'text-sky-600 dark:text-sky-300',
68
+ warning: 'text-amber-600 dark:text-amber-300',
69
+ error: 'text-red-600 dark:text-red-400'
70
+ } as const;
71
+
72
+ const setMode = (next: RecreateMode) => {
73
+ mode = next;
74
+ onmodechange?.(next);
75
+ };
76
+ </script>
77
+
78
+ <!-- Generation history with drift reports and Recreate / Variation actions. -->
79
+ <div class="flex flex-col gap-2 text-sm {className}" data-generation-history="">
80
+ <div class="flex items-center gap-2 text-xs" role="radiogroup" aria-label="Recreate mode">
81
+ {#each ['exact', 'latest'] as const as value (value)}
82
+ <label class="inline-flex items-center gap-1">
83
+ <input
84
+ type="radio"
85
+ name={groupName}
86
+ {value}
87
+ checked={mode === value}
88
+ onchange={() => setMode(value)}
89
+ data-mode={value}
90
+ />
91
+ {value === 'exact' ? 'Exact (recorded versions)' : 'Latest templates & settings'}
92
+ </label>
93
+ {/each}
94
+ </div>
95
+ {#if records.length === 0}<p class="text-xs text-muted-foreground">{emptyText}</p>{/if}
96
+ <ul class="flex flex-col gap-2">
97
+ {#each records as record, i (record.id)}
98
+ {@const result = results[i]}
99
+ {@const model = models.find((m) => m.id === record.provenance.modelId)}
100
+ <li class="rounded-md border border-border p-2" data-record={record.id} data-drift={result.drift.length}>
101
+ <div class="flex flex-wrap items-center justify-between gap-2 text-xs">
102
+ <span class="font-medium">{model?.name ?? record.provenance.modelId}</span>
103
+ <span class="text-muted-foreground">
104
+ {#if record.kind !== 'generate'}<span data-kind="">{record.kind} · </span>{/if}<time datetime={record.createdAt}
105
+ >{record.createdAt.replace('T', ' ').slice(0, 16)}</time
106
+ >{#if record.seed !== undefined}&nbsp;· seed {record.seed}{/if}
107
+ </span>
108
+ </div>
109
+ <p class="mt-1 line-clamp-3 break-words text-xs" data-record-prompt="">{record.provenance.resolvedPrompt}</p>
110
+ {#if record.assets.length > 0}
111
+ <div class="mt-1 flex flex-wrap gap-1">
112
+ {#each record.assets as item (`${item.role}:${item.id}`)}
113
+ <span class="rounded-full bg-muted px-2 py-0.5 text-[10px]" data-asset-role={item.role}
114
+ >{item.id} · {referenceRoleLabel(item.role, model)}</span
115
+ >
116
+ {/each}
117
+ </div>
118
+ {/if}
119
+ {#if preview}{@render preview(record)}{/if}
120
+ {#if result.drift.length > 0}
121
+ <ul class="mt-1 flex flex-col gap-0.5 text-[11px]" data-drift-report="">
122
+ {#each result.drift as item, j (j)}
123
+ <li class={severityClass[item.severity]} data-drift-type={item.type}>
124
+ <strong>{DRIFT_TYPE_LABELS[item.type]}:</strong>
125
+ {item.message}
126
+ </li>
127
+ {/each}
128
+ </ul>
129
+ {/if}
130
+ <div class="mt-2 flex gap-2">
131
+ {#if onrecreate}
132
+ <button
133
+ type="button"
134
+ disabled={!result.ok}
135
+ title={!result.ok ? 'This generation cannot be recreated as recorded.' : undefined}
136
+ onclick={() => onrecreate(result, record)}
137
+ class="rounded border border-border px-2 py-0.5 text-xs hover:bg-muted disabled:opacity-50"
138
+ data-action="recreate">Recreate</button
139
+ >
140
+ {/if}
141
+ {#if onvariation}
142
+ <button
143
+ type="button"
144
+ onclick={() => onvariation(variationRequest(record, {}, options), record)}
145
+ class="rounded border border-border px-2 py-0.5 text-xs hover:bg-muted"
146
+ data-action="variation">Variation</button
147
+ >
148
+ {/if}
149
+ {#if onremove}
150
+ <button
151
+ type="button"
152
+ onclick={() => onremove(record)}
153
+ class="ml-auto rounded px-2 py-0.5 text-xs text-muted-foreground hover:bg-muted"
154
+ data-action="remove">Remove</button
155
+ >
156
+ {/if}
157
+ </div>
158
+ </li>
159
+ {/each}
160
+ </ul>
161
+ </div>
@@ -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"}
@@ -1,10 +1,17 @@
1
1
  import type { ComponentProps } from "svelte";
2
2
  import type GenerationSettingsComponent from "./GenerationSettings.svelte";
3
3
  import type JobProgressComponent from "./JobProgress.svelte";
4
+ import type AssetMentionChipsComponent from "./AssetMentionChips.svelte";
5
+ import type GenerationHistoryComponent from "./GenerationHistory.svelte";
4
6
  export { default as GenerationSettings } from "./GenerationSettings.svelte";
5
7
  export { default as JobProgress } from "./JobProgress.svelte";
8
+ export { default as AssetMentionChips } from "./AssetMentionChips.svelte";
9
+ export { default as GenerationHistory } from "./GenerationHistory.svelte";
6
10
  export * from "./plan.svelte.js";
7
11
  export * from "./progress.svelte.js";
12
+ export * from "./records.svelte.js";
8
13
  export type GenerationSettingsProps = ComponentProps<typeof GenerationSettingsComponent>;
9
14
  export type JobProgressProps = ComponentProps<typeof JobProgressComponent>;
15
+ export type AssetMentionChipsProps = ComponentProps<typeof AssetMentionChipsComponent>;
16
+ export type GenerationHistoryProps = ComponentProps<typeof GenerationHistoryComponent>;
10
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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;AAE7D,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AAErC,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACzF,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
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"}
@@ -1,4 +1,7 @@
1
1
  export { default as GenerationSettings } from "./GenerationSettings.svelte";
2
2
  export { default as JobProgress } from "./JobProgress.svelte";
3
+ export { default as AssetMentionChips } from "./AssetMentionChips.svelte";
4
+ export { default as GenerationHistory } from "./GenerationHistory.svelte";
3
5
  export * from "./plan.svelte.js";
4
6
  export * from "./progress.svelte.js";
7
+ export * from "./records.svelte.js";
@@ -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
+ }
@@ -20,10 +20,15 @@
20
20
  LATEST_PROCESS_VERSION,
21
21
  IMAGE_ADJUSTMENT_CONTROLS,
22
22
  readAdjustmentControls,
23
+ DEFAULT_SELECTION_TOOL_OPTIONS,
24
+ SelectionGesture,
25
+ type SelectionToolOptions,
23
26
  } from '@pixerate/editor/image-editor';
24
27
  import ControlSlider from './ControlSlider.svelte';
25
28
  import Histogram from './Histogram.svelte';
26
29
  import AdjustmentLayersPanel from './AdjustmentLayersPanel.svelte';
30
+ import SelectionOptionsBar from './SelectionOptionsBar.svelte';
31
+ import RefineEdgePanel from './RefineEdgePanel.svelte';
27
32
  import { onDestroy, untrack } from 'svelte';
28
33
  import { createReactiveImageEditor, type ReactiveImageEditor } from './imageEditorState.svelte.js';
29
34
 
@@ -60,7 +65,13 @@
60
65
 
61
66
  let canvasEl = $state<HTMLCanvasElement | null>(null);
62
67
  let containerEl = $state<HTMLDivElement | null>(null);
63
- let activeTab = $state<'crop' | 'adjust' | 'annotate' | 'depth' | 'ai'>('crop');
68
+ let activeTab = $state<'crop' | 'adjust' | 'select' | 'annotate' | 'depth' | 'ai'>('crop');
69
+
70
+ // Selection tools (magic wand, marquees, lasso): options bar state and the pointer gesture.
71
+ let selectionOptions = $state<SelectionToolOptions>({ ...DEFAULT_SELECTION_TOOL_OPTIONS });
72
+ const selectionGesture = $derived(new SelectionGesture(editor.controller, () => selectionOptions));
73
+ let selectionDraft = $state.raw<ImagePoint[] | null>(null);
74
+ let selectionError = $state<string | null>(null);
64
75
  let activeCropRatio = $state<number | null>(null);
65
76
 
66
77
  // AI state
@@ -187,6 +198,7 @@
187
198
  interactive: true,
188
199
  draftAnnotation: overrideAnnotation !== undefined ? overrideAnnotation : draftAnnotation,
189
200
  draftCrop: overrideCrop !== undefined ? overrideCrop : draftCrop,
201
+ draftSelectionPath: selectionDraft,
190
202
  });
191
203
  }
192
204
 
@@ -244,6 +256,13 @@
244
256
  if (!canvasEl) return;
245
257
  const canvasPt = getCanvasEventPoint(e);
246
258
 
259
+ if (activeTab === 'select') {
260
+ const gesture = selectionGesture;
261
+ const imgPt = canvasToImagePoint(canvasPt, editor.state, canvasEl.width, canvasEl.height, false);
262
+ void gesture.begin(imgPt, e).then(() => (selectionError = gesture.error));
263
+ return;
264
+ }
265
+
247
266
  if (activeTab === 'crop') {
248
267
  const activeCrop = draftCrop || editor.state.crop || {
249
268
  x: 0,
@@ -316,6 +335,15 @@
316
335
  if (!canvasEl) return;
317
336
  const canvasPt = getCanvasEventPoint(e);
318
337
 
338
+ if (activeTab === 'select') {
339
+ const gesture = selectionGesture;
340
+ if (gesture.active && gesture.move(canvasToImagePoint(canvasPt, editor.state, canvasEl.width, canvasEl.height, false))) {
341
+ selectionDraft = gesture.draftPath;
342
+ renderCanvas();
343
+ }
344
+ return;
345
+ }
346
+
319
347
  if (activeTab === 'crop') {
320
348
  if (cropDragInfo) {
321
349
  const currentImgPt = canvasToImagePoint(canvasPt, editor.state, canvasEl.width, canvasEl.height, true);
@@ -468,6 +496,16 @@
468
496
  if (!canvasEl) return;
469
497
  const canvasPt = getCanvasEventPoint(e);
470
498
 
499
+ if (activeTab === 'select') {
500
+ const gesture = selectionGesture;
501
+ if (gesture.active) {
502
+ gesture.end(canvasToImagePoint(canvasPt, editor.state, canvasEl.width, canvasEl.height, false), e);
503
+ selectionDraft = null;
504
+ renderCanvas();
505
+ }
506
+ return;
507
+ }
508
+
471
509
  if (activeTab === 'crop') {
472
510
  if (cropDragInfo) {
473
511
  if (draftCrop && draftCrop.width >= 20 && draftCrop.height >= 20) {
@@ -621,6 +659,18 @@
621
659
  >
622
660
  Adjustments
623
661
  </button>
662
+ <button
663
+ type="button"
664
+ onclick={() => {
665
+ activeTab = 'select';
666
+ editor.setTool('select');
667
+ }}
668
+ class="px-3 py-1.5 rounded-md font-medium transition-colors {activeTab === 'select'
669
+ ? 'bg-indigo-600 text-white shadow'
670
+ : 'text-slate-400 hover:text-slate-200'}"
671
+ >
672
+ Select & Mask
673
+ </button>
624
674
  <button
625
675
  type="button"
626
676
  onclick={() => {
@@ -1153,6 +1203,27 @@
1153
1203
  </div>
1154
1204
  {/if}
1155
1205
 
1206
+ <!-- SELECT & MASK: selection tools, refine edge, layer masks -->
1207
+ {#if activeTab === 'select'}
1208
+ <div class="flex flex-col gap-4 text-xs">
1209
+ <SelectionOptionsBar
1210
+ controller={editor.controller}
1211
+ options={selectionOptions}
1212
+ onOptionsChange={(next) => (selectionOptions = next)}
1213
+ selection={editor.state.selection ?? null}
1214
+ quickMask={Boolean(editor.state.quickMask)}
1215
+ />
1216
+ {#if selectionError}
1217
+ <p role="alert" class="text-rose-400">{selectionError}</p>
1218
+ {/if}
1219
+ <RefineEdgePanel
1220
+ controller={editor.controller}
1221
+ selection={editor.state.selection ?? null}
1222
+ layers={editor.state.adjustments.layers}
1223
+ />
1224
+ </div>
1225
+ {/if}
1226
+
1156
1227
  <!-- TAB 5: AI TOOLS / INPAINTING & BACKGROUND REMOVAL -->
1157
1228
  {#if activeTab === 'ai'}
1158
1229
  <div class="flex flex-col gap-4 text-xs">
@@ -1 +1 @@
1
- {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ImageEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,aAAa,EAGb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAgBzC,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjG,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAw/BH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ImageEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,aAAa,EAGb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAqBzC,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjG,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AA8iCH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,180 @@
1
+ <script lang="ts">
2
+ import type {
3
+ AdjustmentKind,
4
+ AdjustmentLayer,
5
+ ImageEditorController,
6
+ RefineEdgeParams,
7
+ SelectionMask,
8
+ } from '@pixerate/editor/image-editor';
9
+ import {
10
+ ADJUSTMENT_KINDS,
11
+ REFINE_EDGE_CONTROLS,
12
+ adjustmentKindLabel,
13
+ layerMaskFromSelection,
14
+ } from '@pixerate/editor/image-editor';
15
+ import { untrack } from 'svelte';
16
+
17
+ interface Props {
18
+ controller: ImageEditorController;
19
+ /** The current selection (`state.selection`). Omit to follow the controller. */
20
+ selection?: SelectionMask | null;
21
+ /** The adjustment layers (`state.adjustments.layers`). Omit to follow the controller. */
22
+ layers?: AdjustmentLayer[];
23
+ class?: string;
24
+ }
25
+
26
+ let { controller, selection, layers: layersProp, class: className = '' }: Props = $props();
27
+
28
+ let tick = $state(0);
29
+ $effect(() => {
30
+ const c = controller;
31
+ return untrack(() => c.subscribe(() => tick++));
32
+ });
33
+ const sel = $derived.by(() => {
34
+ void tick;
35
+ return selection === undefined ? controller.getSelection() : selection;
36
+ });
37
+ const list = $derived.by(() => {
38
+ void tick;
39
+ return layersProp ?? controller.getAdjustmentLayers();
40
+ });
41
+
42
+ const DEFAULT_PARAMS: Required<RefineEdgeParams> = { radius: 8, smartRadius: false, smooth: 0, feather: 0, contrast: 0, shiftEdge: 0 };
43
+ let params = $state<Required<RefineEdgeParams>>({ ...DEFAULT_PARAMS });
44
+ let busy = $state(false);
45
+ let error = $state<string | null>(null);
46
+ let layerId = $state('');
47
+ let newKind = $state<AdjustmentKind>('hueSaturation');
48
+ const target = $derived(list.find((l) => l.id === layerId) ?? list[list.length - 1]);
49
+
50
+ async function refine() {
51
+ busy = true;
52
+ error = null;
53
+ try {
54
+ await controller.refineSelection({ ...params });
55
+ } catch (err) {
56
+ error = err instanceof Error ? err.message : String(err);
57
+ } finally {
58
+ busy = false;
59
+ }
60
+ }
61
+
62
+ function newMaskedLayer() {
63
+ const s = controller.getSelection();
64
+ if (s) layerId = controller.addAdjustmentLayer({ kind: newKind, mask: layerMaskFromSelection(s) });
65
+ }
66
+
67
+ const button =
68
+ 'px-2 py-1 rounded-md border border-slate-800 bg-slate-950 text-[11px] text-slate-200 hover:text-white disabled:opacity-40';
69
+ </script>
70
+
71
+ <div data-testid="refine-edge-panel" class="flex flex-col gap-3 text-xs {className}">
72
+ <span class="font-semibold text-slate-200 uppercase tracking-wider text-[11px]">Refine Edge</span>
73
+ {#each REFINE_EDGE_CONTROLS as c (c.id)}
74
+ <label class="flex flex-col gap-1">
75
+ <span class="flex justify-between text-slate-400">
76
+ <span>{c.label}</span>
77
+ <span class="font-mono">{params[c.id]}{c.unit}</span>
78
+ </span>
79
+ <input
80
+ type="range"
81
+ min={c.min}
82
+ max={c.max}
83
+ step={c.step}
84
+ aria-label={c.label}
85
+ value={params[c.id]}
86
+ oninput={(e) => (params = { ...params, [c.id]: Number((e.currentTarget as HTMLInputElement).value) })}
87
+ class="w-full accent-indigo-500"
88
+ />
89
+ </label>
90
+ {/each}
91
+ <label class="flex items-center gap-2 text-slate-300">
92
+ <input
93
+ type="checkbox"
94
+ checked={params.smartRadius}
95
+ onchange={(e) => (params = { ...params, smartRadius: (e.currentTarget as HTMLInputElement).checked })}
96
+ />
97
+ Smart Radius
98
+ </label>
99
+ <div class="flex gap-1">
100
+ <button type="button" class={button} disabled={!sel || busy} onclick={refine}>Refine Edge</button>
101
+ <button type="button" class={button} onclick={() => (params = { ...DEFAULT_PARAMS })}>Reset</button>
102
+ </div>
103
+ {#if error}
104
+ <p role="alert" class="text-rose-400">{error}</p>
105
+ {/if}
106
+
107
+ <span class="font-semibold text-slate-200 uppercase tracking-wider text-[11px] mt-2">Layer Mask</span>
108
+ <div class="flex gap-1 items-center">
109
+ <select
110
+ aria-label="New masked layer kind"
111
+ value={newKind}
112
+ onchange={(e) => (newKind = (e.currentTarget as HTMLSelectElement).value as AdjustmentKind)}
113
+ class="flex-1 bg-slate-950 border border-slate-800 rounded px-1 py-1 text-slate-200"
114
+ >
115
+ {#each ADJUSTMENT_KINDS as k (k.kind)}
116
+ <option value={k.kind}>{k.label}</option>
117
+ {/each}
118
+ </select>
119
+ <button type="button" class={button} disabled={!sel} onclick={newMaskedLayer}>New Masked Layer</button>
120
+ </div>
121
+ {#if list.length > 0 && target}
122
+ <div class="flex flex-col gap-2">
123
+ <select
124
+ aria-label="Mask layer"
125
+ value={target.id}
126
+ onchange={(e) => (layerId = (e.currentTarget as HTMLSelectElement).value)}
127
+ class="bg-slate-950 border border-slate-800 rounded px-1 py-1 text-slate-200"
128
+ >
129
+ {#each list as l (l.id)}
130
+ <option value={l.id}>{l.name || adjustmentKindLabel(l.kind)}{l.mask ? ' (masked)' : ''}</option>
131
+ {/each}
132
+ </select>
133
+ <div class="flex flex-wrap gap-1">
134
+ <button type="button" class={button} disabled={!sel} onclick={() => controller.applySelectionAsLayerMask(target.id)}>
135
+ Mask with Selection
136
+ </button>
137
+ <button type="button" class={button} disabled={!target.mask} onclick={() => controller.selectionFromLayerMask(target.id)}>
138
+ Load as Selection
139
+ </button>
140
+ <button type="button" class={button} disabled={!target.mask} onclick={() => controller.setAdjustmentLayerMask(target.id, null)}>
141
+ Remove Mask
142
+ </button>
143
+ </div>
144
+ {#if target.mask}
145
+ <label class="flex flex-col gap-1">
146
+ <span class="flex justify-between text-slate-400">
147
+ <span>Density</span>
148
+ <span class="font-mono">{Math.round((target.mask.density ?? 1) * 100)}%</span>
149
+ </span>
150
+ <input
151
+ type="range"
152
+ min="0"
153
+ max="100"
154
+ step="1"
155
+ aria-label="Mask density"
156
+ value={Math.round((target.mask.density ?? 1) * 100)}
157
+ oninput={(e) => controller.setAdjustmentLayerMaskProps(target.id, { density: Number((e.currentTarget as HTMLInputElement).value) / 100 })}
158
+ class="w-full accent-indigo-500"
159
+ />
160
+ </label>
161
+ <label class="flex flex-col gap-1">
162
+ <span class="flex justify-between text-slate-400">
163
+ <span>Mask Feather</span>
164
+ <span class="font-mono">{target.mask.feather ?? 0}px</span>
165
+ </span>
166
+ <input
167
+ type="range"
168
+ min="0"
169
+ max="50"
170
+ step="0.5"
171
+ aria-label="Mask feather"
172
+ value={target.mask.feather ?? 0}
173
+ oninput={(e) => controller.setAdjustmentLayerMaskProps(target.id, { feather: Number((e.currentTarget as HTMLInputElement).value) })}
174
+ class="w-full accent-indigo-500"
175
+ />
176
+ </label>
177
+ {/if}
178
+ </div>
179
+ {/if}
180
+ </div>
@@ -0,0 +1,13 @@
1
+ import type { AdjustmentLayer, ImageEditorController, SelectionMask } from '@pixerate/editor/image-editor';
2
+ interface Props {
3
+ controller: ImageEditorController;
4
+ /** The current selection (`state.selection`). Omit to follow the controller. */
5
+ selection?: SelectionMask | null;
6
+ /** The adjustment layers (`state.adjustments.layers`). Omit to follow the controller. */
7
+ layers?: AdjustmentLayer[];
8
+ class?: string;
9
+ }
10
+ declare const RefineEdgePanel: import("svelte").Component<Props, {}, "">;
11
+ type RefineEdgePanel = ReturnType<typeof RefineEdgePanel>;
12
+ export default RefineEdgePanel;
13
+ //# sourceMappingURL=RefineEdgePanel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefineEdgePanel.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/RefineEdgePanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAER,eAAe,EACf,qBAAqB,EAErB,aAAa,EACd,MAAM,+BAA+B,CAAC;AAUvC,UAAU,KAAK;IACb,UAAU,EAAE,qBAAqB,CAAC;IAClC,gFAAgF;IAChF,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,yFAAyF;IACzF,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4HH,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}