@printwithsynergy/artwork-pdf-editor 0.1.6 → 0.3.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 (249) hide show
  1. package/LICENSE +62 -0
  2. package/README.md +63 -2
  3. package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
  4. package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
  5. package/dist/components/AccessibilityHintsPanel.js +158 -0
  6. package/dist/components/AccessibilityHintsPanel.js.map +1 -0
  7. package/dist/components/AnnotationOverlay.d.ts +142 -0
  8. package/dist/components/AnnotationOverlay.d.ts.map +1 -0
  9. package/dist/components/AnnotationOverlay.js +141 -0
  10. package/dist/components/AnnotationOverlay.js.map +1 -0
  11. package/dist/components/AnnotationsSidebar.d.ts +98 -0
  12. package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
  13. package/dist/components/AnnotationsSidebar.js +100 -0
  14. package/dist/components/AnnotationsSidebar.js.map +1 -0
  15. package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
  16. package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
  17. package/dist/components/BarcodeGeneratorPanel.js +91 -0
  18. package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
  19. package/dist/components/BraillePanel.d.ts +99 -0
  20. package/dist/components/BraillePanel.d.ts.map +1 -0
  21. package/dist/components/BraillePanel.js +221 -0
  22. package/dist/components/BraillePanel.js.map +1 -0
  23. package/dist/components/BrandAssetsPanel.d.ts +130 -0
  24. package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
  25. package/dist/components/BrandAssetsPanel.js +125 -0
  26. package/dist/components/BrandAssetsPanel.js.map +1 -0
  27. package/dist/components/BrandConsistencyPanel.d.ts +140 -0
  28. package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
  29. package/dist/components/BrandConsistencyPanel.js +158 -0
  30. package/dist/components/BrandConsistencyPanel.js.map +1 -0
  31. package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
  32. package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
  33. package/dist/components/ComplianceFindingsPanel.js +118 -0
  34. package/dist/components/ComplianceFindingsPanel.js.map +1 -0
  35. package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
  36. package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
  37. package/dist/components/DesignSuggestionsPanel.js +154 -0
  38. package/dist/components/DesignSuggestionsPanel.js.map +1 -0
  39. package/dist/components/DielineParametersPanel.d.ts +62 -0
  40. package/dist/components/DielineParametersPanel.d.ts.map +1 -0
  41. package/dist/components/DielineParametersPanel.js +170 -0
  42. package/dist/components/DielineParametersPanel.js.map +1 -0
  43. package/dist/components/DielinePreview.d.ts +150 -0
  44. package/dist/components/DielinePreview.d.ts.map +1 -0
  45. package/dist/components/DielinePreview.js +146 -0
  46. package/dist/components/DielinePreview.js.map +1 -0
  47. package/dist/components/EditorApp.d.ts +39 -5
  48. package/dist/components/EditorApp.d.ts.map +1 -1
  49. package/dist/components/EditorApp.js +110 -5
  50. package/dist/components/EditorApp.js.map +1 -1
  51. package/dist/components/EditorCanvas.d.ts +51 -2
  52. package/dist/components/EditorCanvas.d.ts.map +1 -1
  53. package/dist/components/EditorCanvas.js +117 -48
  54. package/dist/components/EditorCanvas.js.map +1 -1
  55. package/dist/components/EmailNotifyPanel.d.ts +165 -0
  56. package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
  57. package/dist/components/EmailNotifyPanel.js +211 -0
  58. package/dist/components/EmailNotifyPanel.js.map +1 -0
  59. package/dist/components/FileDropZone.d.ts +9 -1
  60. package/dist/components/FileDropZone.d.ts.map +1 -1
  61. package/dist/components/FileDropZone.js +53 -5
  62. package/dist/components/FileDropZone.js.map +1 -1
  63. package/dist/components/FoldEditorPanel.d.ts +68 -0
  64. package/dist/components/FoldEditorPanel.d.ts.map +1 -0
  65. package/dist/components/FoldEditorPanel.js +65 -0
  66. package/dist/components/FoldEditorPanel.js.map +1 -0
  67. package/dist/components/FoldPreviewOverlay.d.ts +48 -0
  68. package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
  69. package/dist/components/FoldPreviewOverlay.js +182 -0
  70. package/dist/components/FoldPreviewOverlay.js.map +1 -0
  71. package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
  72. package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
  73. package/dist/components/Gs1DigitalLinkPanel.js +199 -0
  74. package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
  75. package/dist/components/HistoryPanel.d.ts +39 -0
  76. package/dist/components/HistoryPanel.d.ts.map +1 -0
  77. package/dist/components/HistoryPanel.js +72 -0
  78. package/dist/components/HistoryPanel.js.map +1 -0
  79. package/dist/components/IccSoftProofOverlay.d.ts +67 -0
  80. package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
  81. package/dist/components/IccSoftProofOverlay.js +119 -0
  82. package/dist/components/IccSoftProofOverlay.js.map +1 -0
  83. package/dist/components/ImposePanel.d.ts +71 -0
  84. package/dist/components/ImposePanel.d.ts.map +1 -0
  85. package/dist/components/ImposePanel.js +127 -0
  86. package/dist/components/ImposePanel.js.map +1 -0
  87. package/dist/components/InksPanel.d.ts +61 -0
  88. package/dist/components/InksPanel.d.ts.map +1 -0
  89. package/dist/components/InksPanel.js +84 -0
  90. package/dist/components/InksPanel.js.map +1 -0
  91. package/dist/components/JobSetupPanel.d.ts +118 -0
  92. package/dist/components/JobSetupPanel.d.ts.map +1 -0
  93. package/dist/components/JobSetupPanel.js +169 -0
  94. package/dist/components/JobSetupPanel.js.map +1 -0
  95. package/dist/components/LayersPanel.d.ts.map +1 -1
  96. package/dist/components/LayersPanel.js +1 -0
  97. package/dist/components/LayersPanel.js.map +1 -1
  98. package/dist/components/MarkLibraryPanel.d.ts +131 -0
  99. package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
  100. package/dist/components/MarkLibraryPanel.js +184 -0
  101. package/dist/components/MarkLibraryPanel.js.map +1 -0
  102. package/dist/components/MisEstimateButton.d.ts +73 -0
  103. package/dist/components/MisEstimateButton.d.ts.map +1 -0
  104. package/dist/components/MisEstimateButton.js +57 -0
  105. package/dist/components/MisEstimateButton.js.map +1 -0
  106. package/dist/components/NutritionPanel.d.ts +118 -0
  107. package/dist/components/NutritionPanel.d.ts.map +1 -0
  108. package/dist/components/NutritionPanel.js +169 -0
  109. package/dist/components/NutritionPanel.js.map +1 -0
  110. package/dist/components/PageNavigator.d.ts +26 -0
  111. package/dist/components/PageNavigator.d.ts.map +1 -0
  112. package/dist/components/PageNavigator.js +96 -0
  113. package/dist/components/PageNavigator.js.map +1 -0
  114. package/dist/components/PaletteManager.d.ts +32 -0
  115. package/dist/components/PaletteManager.d.ts.map +1 -0
  116. package/dist/components/PaletteManager.js +89 -0
  117. package/dist/components/PaletteManager.js.map +1 -0
  118. package/dist/components/PaletteToSpotPanel.d.ts +122 -0
  119. package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
  120. package/dist/components/PaletteToSpotPanel.js +160 -0
  121. package/dist/components/PaletteToSpotPanel.js.map +1 -0
  122. package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
  123. package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
  124. package/dist/components/PreflightAutoFixPanel.js +119 -0
  125. package/dist/components/PreflightAutoFixPanel.js.map +1 -0
  126. package/dist/components/PreflightDiffPanel.d.ts +127 -0
  127. package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
  128. package/dist/components/PreflightDiffPanel.js +0 -0
  129. package/dist/components/PreflightDiffPanel.js.map +1 -0
  130. package/dist/components/ProcessRulesPanel.d.ts +81 -0
  131. package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
  132. package/dist/components/ProcessRulesPanel.js +143 -0
  133. package/dist/components/ProcessRulesPanel.js.map +1 -0
  134. package/dist/components/SlackNotifyPanel.d.ts +139 -0
  135. package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
  136. package/dist/components/SlackNotifyPanel.js +133 -0
  137. package/dist/components/SlackNotifyPanel.js.map +1 -0
  138. package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
  139. package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
  140. package/dist/components/SmartSpotMatchPanel.js +159 -0
  141. package/dist/components/SmartSpotMatchPanel.js.map +1 -0
  142. package/dist/components/SwatchesPicker.d.ts +83 -0
  143. package/dist/components/SwatchesPicker.d.ts.map +1 -0
  144. package/dist/components/SwatchesPicker.js +151 -0
  145. package/dist/components/SwatchesPicker.js.map +1 -0
  146. package/dist/components/TacOverlay.d.ts +47 -0
  147. package/dist/components/TacOverlay.d.ts.map +1 -0
  148. package/dist/components/TacOverlay.js +116 -0
  149. package/dist/components/TacOverlay.js.map +1 -0
  150. package/dist/components/TrapEditorPanel.d.ts +52 -0
  151. package/dist/components/TrapEditorPanel.d.ts.map +1 -0
  152. package/dist/components/TrapEditorPanel.js +64 -0
  153. package/dist/components/TrapEditorPanel.js.map +1 -0
  154. package/dist/components/TrapPreviewOverlay.d.ts +64 -0
  155. package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
  156. package/dist/components/TrapPreviewOverlay.js +120 -0
  157. package/dist/components/TrapPreviewOverlay.js.map +1 -0
  158. package/dist/components/VariantMatrixPanel.d.ts +61 -0
  159. package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
  160. package/dist/components/VariantMatrixPanel.js +97 -0
  161. package/dist/components/VariantMatrixPanel.js.map +1 -0
  162. package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
  163. package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
  164. package/dist/components/VariantMatrixVersionPanel.js +162 -0
  165. package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
  166. package/dist/components/WebhookNotifyPanel.d.ts +160 -0
  167. package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
  168. package/dist/components/WebhookNotifyPanel.js +100 -0
  169. package/dist/components/WebhookNotifyPanel.js.map +1 -0
  170. package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
  171. package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
  172. package/dist/components/WhiteUnderbasePanel.js +104 -0
  173. package/dist/components/WhiteUnderbasePanel.js.map +1 -0
  174. package/dist/data/dielines.json +35 -0
  175. package/dist/hooks/useEditorMode.d.ts +25 -5
  176. package/dist/hooks/useEditorMode.d.ts.map +1 -1
  177. package/dist/hooks/useEditorMode.js +18 -5
  178. package/dist/hooks/useEditorMode.js.map +1 -1
  179. package/dist/index.d.ts +49 -2
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +49 -2
  182. package/dist/index.js.map +1 -1
  183. package/dist/lens/dieline-overlay.d.ts +25 -0
  184. package/dist/lens/dieline-overlay.d.ts.map +1 -0
  185. package/dist/lens/dieline-overlay.js +50 -0
  186. package/dist/lens/dieline-overlay.js.map +1 -0
  187. package/dist/lens/index.d.ts +27 -0
  188. package/dist/lens/index.d.ts.map +1 -0
  189. package/dist/lens/index.js +28 -0
  190. package/dist/lens/index.js.map +1 -0
  191. package/dist/lens/preflight-findings.d.ts +21 -0
  192. package/dist/lens/preflight-findings.d.ts.map +1 -0
  193. package/dist/lens/preflight-findings.js +82 -0
  194. package/dist/lens/preflight-findings.js.map +1 -0
  195. package/dist/lib/barcode-scan.d.ts +154 -0
  196. package/dist/lib/barcode-scan.d.ts.map +1 -0
  197. package/dist/lib/barcode-scan.js +152 -0
  198. package/dist/lib/barcode-scan.js.map +1 -0
  199. package/dist/lib/color-math.d.ts +76 -0
  200. package/dist/lib/color-math.d.ts.map +1 -0
  201. package/dist/lib/color-math.js +96 -0
  202. package/dist/lib/color-math.js.map +1 -0
  203. package/dist/lib/dieline-template.d.ts +169 -0
  204. package/dist/lib/dieline-template.d.ts.map +1 -1
  205. package/dist/lib/dieline-template.js +229 -1
  206. package/dist/lib/dieline-template.js.map +1 -1
  207. package/dist/lib/editor-config.d.ts +384 -1
  208. package/dist/lib/editor-config.d.ts.map +1 -1
  209. package/dist/lib/editor-config.js +89 -2
  210. package/dist/lib/editor-config.js.map +1 -1
  211. package/dist/lib/fold-geometry.d.ts +144 -0
  212. package/dist/lib/fold-geometry.d.ts.map +1 -0
  213. package/dist/lib/fold-geometry.js +138 -0
  214. package/dist/lib/fold-geometry.js.map +1 -0
  215. package/dist/lib/merge-tokens.d.ts +81 -0
  216. package/dist/lib/merge-tokens.d.ts.map +1 -0
  217. package/dist/lib/merge-tokens.js +88 -0
  218. package/dist/lib/merge-tokens.js.map +1 -0
  219. package/dist/lib/palette-registry.d.ts +40 -0
  220. package/dist/lib/palette-registry.d.ts.map +1 -0
  221. package/dist/lib/palette-registry.js +49 -0
  222. package/dist/lib/palette-registry.js.map +1 -0
  223. package/dist/lib/panel-anchor.d.ts +101 -0
  224. package/dist/lib/panel-anchor.d.ts.map +1 -0
  225. package/dist/lib/panel-anchor.js +68 -0
  226. package/dist/lib/panel-anchor.js.map +1 -0
  227. package/dist/lib/preflight/checks.d.ts.map +1 -1
  228. package/dist/lib/preflight/checks.js +71 -0
  229. package/dist/lib/preflight/checks.js.map +1 -1
  230. package/dist/lib/preflight/types.d.ts.map +1 -1
  231. package/dist/lib/preflight/types.js +11 -0
  232. package/dist/lib/preflight/types.js.map +1 -1
  233. package/dist/lib/rasterize.d.ts +93 -0
  234. package/dist/lib/rasterize.d.ts.map +1 -0
  235. package/dist/lib/rasterize.js +117 -0
  236. package/dist/lib/rasterize.js.map +1 -0
  237. package/dist/lib/separations-registry.d.ts +99 -0
  238. package/dist/lib/separations-registry.d.ts.map +1 -0
  239. package/dist/lib/separations-registry.js +59 -0
  240. package/dist/lib/separations-registry.js.map +1 -0
  241. package/dist/lib/unwired.d.ts +29 -0
  242. package/dist/lib/unwired.d.ts.map +1 -0
  243. package/dist/lib/unwired.js +58 -0
  244. package/dist/lib/unwired.js.map +1 -0
  245. package/package.json +29 -11
  246. package/dist/components/SeparationsPanel.d.ts +0 -9
  247. package/dist/components/SeparationsPanel.d.ts.map +0 -1
  248. package/dist/components/SeparationsPanel.js +0 -168
  249. package/dist/components/SeparationsPanel.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ import type { Page } from "../lib/dieline-template";
2
+ /**
3
+ * Multi-page navigation strip. Lives:
4
+ * • in the desktop toolbar (thin horizontal row)
5
+ * • in the mobile drawer's "Pages" section (full-width buttons)
6
+ *
7
+ * Stays purely presentational — receives the current pages array +
8
+ * active index + change callbacks from `EditorApp`. No state of its
9
+ * own.
10
+ *
11
+ * @public
12
+ */
13
+ export type PageNavigatorProps = {
14
+ pages: Page[];
15
+ currentPageIndex: number;
16
+ onSelect: (index: number) => void;
17
+ /** Append a duplicate of the current page. */
18
+ onAddPage?: () => void;
19
+ /** Remove the active page (disabled when only one remains). */
20
+ onDeletePage?: () => void;
21
+ /** Layout variant. `"strip"` is the thin desktop row; `"stack"` is the
22
+ * full-width vertical list in the mobile drawer. */
23
+ variant?: "strip" | "stack";
24
+ };
25
+ export declare function PageNavigator({ pages, currentPageIndex, onSelect, onAddPage, onDeletePage, variant, }: PageNavigatorProps): import("react/jsx-runtime").JSX.Element;
26
+ //# sourceMappingURL=PageNavigator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNavigator.d.ts","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;yDACqD;IACrD,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B,CAAC;AAQF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAiB,GAClB,EAAE,kBAAkB,2CAgMpB"}
@@ -0,0 +1,96 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ const BG = "#120a04";
5
+ const PANEL_BG = "#1a0f08";
6
+ const BORDER = "#3d1a00";
7
+ const BRAND = "#fc5102";
8
+ const MUTED = "#888";
9
+ export function PageNavigator({ pages, currentPageIndex, onSelect, onAddPage, onDeletePage, variant = "strip", }) {
10
+ const canDelete = pages.length > 1 && onDeletePage !== undefined;
11
+ if (variant === "stack") {
12
+ return (_jsxs("div", { style: {
13
+ display: "flex",
14
+ flexDirection: "column",
15
+ gap: "0.2rem",
16
+ padding: "0.4rem 0.65rem",
17
+ }, children: [_jsx("div", { role: "tablist", "aria-label": "Pages", "aria-orientation": "vertical", style: { display: "flex", flexDirection: "column", gap: "0.2rem" }, children: pages.map((p, i) => {
18
+ const active = i === currentPageIndex;
19
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": `Page ${i + 1}${p.name ? `: ${p.name}` : ""}`, onClick: () => onSelect(i), style: {
20
+ display: "flex",
21
+ alignItems: "center",
22
+ gap: "0.55rem",
23
+ padding: "0.45rem 0.6rem",
24
+ background: active ? "#241308" : "transparent",
25
+ border: `1px solid ${active ? BRAND : "transparent"}`,
26
+ borderRadius: 4,
27
+ color: active ? BRAND : "#ddd",
28
+ cursor: "pointer",
29
+ fontFamily: "inherit",
30
+ fontSize: "0.82rem",
31
+ textAlign: "left",
32
+ }, children: [_jsx("span", { "aria-hidden": true, style: { fontFamily: "monospace", color: MUTED, fontSize: "0.7rem" }, children: i + 1 }), _jsx("span", { style: { flex: 1 }, children: p.name ?? `Page ${i + 1}` }), active && (_jsx("span", { "aria-hidden": true, style: { color: BRAND }, children: "\u25CF" }))] }, p.id));
33
+ }) }), (onAddPage || canDelete) && (_jsxs("div", { style: { display: "flex", gap: "0.4rem", marginTop: "0.4rem" }, children: [onAddPage && (_jsx("button", { type: "button", onClick: onAddPage, style: stackActionStyle, "aria-label": "Add page", children: "+ Add page" })), canDelete && (_jsx("button", { type: "button", onClick: onDeletePage, style: { ...stackActionStyle, color: "#e57373", borderColor: "#5a1a1a" }, "aria-label": "Delete current page", children: "\u2715 Delete" }))] }))] }));
34
+ }
35
+ // strip — thin desktop row
36
+ return (_jsxs("div", { role: "tablist", "aria-label": "Pages", "aria-orientation": "horizontal", style: {
37
+ display: "flex",
38
+ alignItems: "center",
39
+ gap: "0.3rem",
40
+ padding: "0.25rem 0.6rem",
41
+ background: PANEL_BG,
42
+ borderBottom: `1px solid ${BORDER}`,
43
+ flexShrink: 0,
44
+ flexWrap: "wrap",
45
+ }, children: [_jsx("span", { "aria-hidden": true, style: {
46
+ fontSize: "0.7rem",
47
+ color: MUTED,
48
+ letterSpacing: "0.08em",
49
+ textTransform: "uppercase",
50
+ fontWeight: 600,
51
+ marginRight: "0.4rem",
52
+ }, children: "Pages" }), pages.map((p, i) => {
53
+ const active = i === currentPageIndex;
54
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": `Page ${i + 1}${p.name ? `: ${p.name}` : ""}`, onClick: () => onSelect(i), title: p.name ?? `Page ${i + 1}`, style: {
55
+ background: active ? BRAND : "transparent",
56
+ color: active ? "#fff" : "#ccc",
57
+ border: `1px solid ${active ? BRAND : BORDER}`,
58
+ borderRadius: 4,
59
+ padding: "0.18rem 0.55rem",
60
+ fontSize: "0.75rem",
61
+ cursor: "pointer",
62
+ fontFamily: "inherit",
63
+ }, children: [i + 1, p.name ? (_jsx("span", { style: { marginLeft: "0.35rem", color: active ? "#fff" : MUTED }, children: p.name })) : null] }, p.id));
64
+ }), onAddPage && (_jsx("button", { type: "button", onClick: onAddPage, title: "Add page", style: {
65
+ background: "transparent",
66
+ color: MUTED,
67
+ border: `1px dashed ${BORDER}`,
68
+ borderRadius: 4,
69
+ padding: "0.18rem 0.55rem",
70
+ fontSize: "0.75rem",
71
+ cursor: "pointer",
72
+ fontFamily: "inherit",
73
+ marginLeft: "0.2rem",
74
+ }, children: "+" })), canDelete && (_jsx("button", { type: "button", onClick: onDeletePage, title: "Delete current page", style: {
75
+ background: "transparent",
76
+ color: "#e57373",
77
+ border: "1px solid #5a1a1a",
78
+ borderRadius: 4,
79
+ padding: "0.18rem 0.5rem",
80
+ fontSize: "0.7rem",
81
+ cursor: "pointer",
82
+ fontFamily: "inherit",
83
+ }, children: "\u2715" }))] }));
84
+ }
85
+ const stackActionStyle = {
86
+ flex: 1,
87
+ background: BG,
88
+ color: MUTED,
89
+ border: `1px solid ${BORDER}`,
90
+ borderRadius: 4,
91
+ padding: "0.35rem 0.5rem",
92
+ fontSize: "0.75rem",
93
+ cursor: "pointer",
94
+ fontFamily: "inherit",
95
+ };
96
+ //# sourceMappingURL=PageNavigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNavigator.js","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { EditorConfig, PaletteId } from "../lib/editor-config";
2
+ /**
3
+ * Props for the desktop palette overflow menu.
4
+ *
5
+ * `panelVisibility` is the current state (absent / `true` entries
6
+ * render as visible; `false` as hidden). `onChange` receives the
7
+ * full next visibility object whenever the user toggles a row.
8
+ *
9
+ * `enable_palettes: false` collapses the entire menu off — hosts that
10
+ * don't want the overflow toggle UI omit this component altogether
11
+ * via `cfg.enable_palettes`. The mobile equivalent lives inside
12
+ * `MobileToolDrawer` as a "Panels" section.
13
+ *
14
+ * @public
15
+ */
16
+ export type PaletteManagerProps = {
17
+ config: EditorConfig;
18
+ panelVisibility: Partial<Record<PaletteId, boolean>>;
19
+ onChange: (next: Partial<Record<PaletteId, boolean>>) => void;
20
+ };
21
+ /**
22
+ * Desktop-only overflow menu for toggling palette visibility.
23
+ *
24
+ * Renders nothing when `cfg.enable_palettes` is false. Closes on
25
+ * outside-click and Escape; the toggle state is owned by the host
26
+ * via `onChange` so visibility can be persisted (host's localStorage,
27
+ * user-prefs API, etc.) and round-tripped on reload.
28
+ *
29
+ * @public
30
+ */
31
+ export declare function PaletteManager({ config, panelVisibility, onChange }: PaletteManagerProps): import("react/jsx-runtime").JSX.Element | null;
32
+ //# sourceMappingURL=PaletteManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteManager.d.ts","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGpE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAC/D,CAAC;AAQF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,mBAAmB,kDAsGxF"}
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { PALETTE_IDS, PALETTE_REGISTRY } from "../lib/palette-registry";
6
+ const PANEL_BG = "#1a0f08";
7
+ const BORDER = "#3d1a00";
8
+ const BRAND = "#fc5102";
9
+ const TEXT = "#f4ece6";
10
+ const MUTED = "#888";
11
+ /**
12
+ * Desktop-only overflow menu for toggling palette visibility.
13
+ *
14
+ * Renders nothing when `cfg.enable_palettes` is false. Closes on
15
+ * outside-click and Escape; the toggle state is owned by the host
16
+ * via `onChange` so visibility can be persisted (host's localStorage,
17
+ * user-prefs API, etc.) and round-tripped on reload.
18
+ *
19
+ * @public
20
+ */
21
+ export function PaletteManager({ config, panelVisibility, onChange }) {
22
+ const [open, setOpen] = useState(false);
23
+ const rootRef = useRef(null);
24
+ useEffect(() => {
25
+ if (!open)
26
+ return;
27
+ function handleOutside(e) {
28
+ if (!rootRef.current?.contains(e.target))
29
+ setOpen(false);
30
+ }
31
+ function handleEscape(e) {
32
+ if (e.key === "Escape")
33
+ setOpen(false);
34
+ }
35
+ document.addEventListener("mousedown", handleOutside);
36
+ document.addEventListener("keydown", handleEscape);
37
+ return () => {
38
+ document.removeEventListener("mousedown", handleOutside);
39
+ document.removeEventListener("keydown", handleEscape);
40
+ };
41
+ }, [open]);
42
+ if (config.enable_palettes === false)
43
+ return null;
44
+ function toggle(id) {
45
+ const current = panelVisibility[id] !== false;
46
+ onChange({ ...panelVisibility, [id]: !current });
47
+ }
48
+ return (_jsxs("div", { ref: rootRef, style: { position: "relative" }, children: [_jsx("button", { type: "button", onClick: () => setOpen((v) => !v), "aria-label": "Toggle palettes", "aria-haspopup": "menu", "aria-expanded": open, style: {
49
+ background: "transparent",
50
+ color: TEXT,
51
+ border: `1px solid ${BORDER}`,
52
+ borderRadius: 4,
53
+ padding: "0.35rem 0.65rem",
54
+ fontSize: "0.78rem",
55
+ fontWeight: 600,
56
+ cursor: "pointer",
57
+ fontFamily: "inherit",
58
+ }, children: "Panels \u25BE" }), open && (_jsx("div", { role: "menu", style: {
59
+ position: "absolute",
60
+ right: 0,
61
+ top: "calc(100% + 4px)",
62
+ background: PANEL_BG,
63
+ border: `1px solid ${BORDER}`,
64
+ borderRadius: 6,
65
+ padding: "0.35rem 0",
66
+ minWidth: 200,
67
+ zIndex: 50,
68
+ boxShadow: "0 8px 24px rgba(0,0,0,0.4)",
69
+ }, children: PALETTE_IDS.map((id) => {
70
+ const visible = panelVisibility[id] !== false;
71
+ const { label } = PALETTE_REGISTRY[id];
72
+ return (_jsxs("button", { type: "button", role: "menuitemcheckbox", "aria-checked": visible, onClick: () => toggle(id), style: {
73
+ display: "flex",
74
+ alignItems: "center",
75
+ justifyContent: "space-between",
76
+ gap: "0.5rem",
77
+ width: "100%",
78
+ padding: "0.45rem 0.85rem",
79
+ background: "transparent",
80
+ border: "none",
81
+ cursor: "pointer",
82
+ color: visible ? TEXT : MUTED,
83
+ fontSize: "0.85rem",
84
+ fontFamily: "inherit",
85
+ textAlign: "left",
86
+ }, children: [_jsx("span", { children: label }), _jsx("span", { style: { color: visible ? BRAND : MUTED, fontSize: "0.85rem" }, children: visible ? "✓" : "" })] }, id));
87
+ }) }))] }));
88
+ }
89
+ //# sourceMappingURL=PaletteManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteManager.js","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Wave 1 AI4 — Palette → spot conversion panel.
3
+ *
4
+ * Closes the Wave 1 AI family. AI2 {@link SmartSpotMatchPanel}
5
+ * answers "what's the nearest PANTONE for one user-picked color?";
6
+ * AI4 takes the inverse direction — given the palette already in the
7
+ * document (every distinct fill / stroke color on the active page),
8
+ * route each entry through a host-supplied matcher and let the user
9
+ * commit the best match into the spot registry in one click per row.
10
+ *
11
+ * Reuses AI2's {@link SpotMatchLoaderFn} adapter on purpose: a host
12
+ * that wires a ΔE matcher for AI2 gets AI4 for free, and the cache /
13
+ * rate-limit behaviour stays under one adapter.
14
+ *
15
+ * Pure helpers ({@link summarizePaletteCoverage}) live alongside so
16
+ * downstream consumers can render coverage metrics (% of palette
17
+ * matched, average ΔE, count of unmatched) without the panel.
18
+ *
19
+ * @public
20
+ */
21
+ import type { ReactElement } from "react";
22
+ import type { SpotMatch, SpotMatchLoaderFn } from "./SmartSpotMatchPanel";
23
+ /**
24
+ * One color entry in the document's palette, as the host provides it
25
+ * (the editor's separations registry already carries this shape per
26
+ * page). `usageCount` is informational — UIs sort by it to surface
27
+ * the highest-impact colors first.
28
+ *
29
+ * @public
30
+ */
31
+ export type PaletteColor = {
32
+ /** Stable identifier — the panel uses it as the React key. */
33
+ id: string;
34
+ /** Lower-cased hex string `#rrggbb` (canonical). */
35
+ hex: string;
36
+ /** Optional human-readable name (e.g., "Brand Blue"). */
37
+ name?: string;
38
+ /** Optional usage counter — number of canvas objects that touch
39
+ * this color. */
40
+ usageCount?: number;
41
+ };
42
+ /**
43
+ * One row in the conversion table — pairs a palette color with the
44
+ * best match returned from the loader. `status` discriminates the
45
+ * lifecycle: hosts render a spinner on `loading`, the best match on
46
+ * `matched`, the error message on `error`, and a "Convert" button on
47
+ * `idle` / `matched`.
48
+ *
49
+ * @public
50
+ */
51
+ export type PaletteToSpotRow = {
52
+ color: PaletteColor;
53
+ status: "idle" | "loading" | "matched" | "error";
54
+ bestMatch?: SpotMatch;
55
+ /** All loader-returned matches, sorted by ΔE. Hosts can surface
56
+ * alternates behind a disclosure. */
57
+ alternates?: readonly SpotMatch[];
58
+ errorMessage?: string;
59
+ };
60
+ /**
61
+ * Aggregate coverage summary returned by
62
+ * {@link summarizePaletteCoverage}.
63
+ *
64
+ * @public
65
+ */
66
+ export type PaletteCoverageSummary = {
67
+ totalColors: number;
68
+ matched: number;
69
+ unmatched: number;
70
+ /** Average ΔE across `matched` rows. `null` when none matched. */
71
+ averageDeltaE: number | null;
72
+ /** Worst ΔE across `matched` rows. `null` when none matched. */
73
+ worstDeltaE: number | null;
74
+ };
75
+ /**
76
+ * Pure helper — summarizes a list of conversion rows. Pure function;
77
+ * no I/O.
78
+ *
79
+ * @public
80
+ */
81
+ export declare function summarizePaletteCoverage(rows: readonly PaletteToSpotRow[]): PaletteCoverageSummary;
82
+ /**
83
+ * Host adapter — commits a matched spot into the host's spot
84
+ * registry (the editor's per-page `separations-registry` for the
85
+ * canonical case). Resolves once the registry write completes; the
86
+ * panel surfaces errors inline.
87
+ *
88
+ * @public
89
+ */
90
+ export type SpotCommitFn = (color: PaletteColor, match: SpotMatch) => Promise<void>;
91
+ /**
92
+ * Configuration for the {@link PaletteToSpotPanel}.
93
+ *
94
+ * @public
95
+ */
96
+ export type PaletteToSpotPanelProps = {
97
+ /** The colors to convert. Typically `getSeparations(activePage)`
98
+ * mapped into {@link PaletteColor} shape. */
99
+ colors: readonly PaletteColor[];
100
+ /** Match adapter — same shape as {@link SmartSpotMatchPanel}'s
101
+ * loader, so one matcher wire serves both AI2 + AI4. Called once
102
+ * per palette color when the user clicks "Match all" or hits the
103
+ * per-row "Match" button. */
104
+ matchLoader: SpotMatchLoaderFn;
105
+ /** Optional commit adapter — when provided, each row gains a
106
+ * "Convert" button that fires `onCommit`. Absent → conversion is
107
+ * read-only (host wires its own commit flow). */
108
+ onCommit?: SpotCommitFn;
109
+ /** Optional mapper that turns a loader error into a user-facing
110
+ * message. The default avoids leaking internal `Error.message`. */
111
+ errorMessage?: (err: unknown) => string;
112
+ };
113
+ /**
114
+ * Stateful panel — renders the palette as a table, dispatches the
115
+ * host matcher per row (lazily on "Match" click or eagerly via the
116
+ * "Match all" affordance), and surfaces coverage metrics in the
117
+ * footer.
118
+ *
119
+ * @public
120
+ */
121
+ export declare function PaletteToSpotPanel({ colors, matchLoader, onCommit, errorMessage, }: PaletteToSpotPanelProps): ReactElement;
122
+ //# sourceMappingURL=PaletteToSpotPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteToSpotPanel.d.ts","sourceRoot":"","sources":["../../src/components/PaletteToSpotPanel.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;sBACkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;0CACsC;IACtC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gEAAgE;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAChC,sBAAsB,CAkBxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;kDAC8C;IAC9C,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC;;;kCAG8B;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B;;sDAEkD;IAClD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;wEACoE;IACpE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,WAAW,EACX,QAAQ,EACR,YAAY,GACb,EAAE,uBAAuB,GAAG,YAAY,CA2KxC"}
@@ -0,0 +1,160 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
4
+ import { useCallback, useEffect, useMemo, useState } from "react";
5
+ import { sortMatchesByDeltaE } from "./SmartSpotMatchPanel";
6
+ /**
7
+ * Pure helper — summarizes a list of conversion rows. Pure function;
8
+ * no I/O.
9
+ *
10
+ * @public
11
+ */
12
+ export function summarizePaletteCoverage(rows) {
13
+ let matched = 0;
14
+ let sum = 0;
15
+ let worst = 0;
16
+ for (const row of rows) {
17
+ if (row.status === "matched" && row.bestMatch) {
18
+ matched++;
19
+ sum += row.bestMatch.deltaE;
20
+ if (row.bestMatch.deltaE > worst)
21
+ worst = row.bestMatch.deltaE;
22
+ }
23
+ }
24
+ return {
25
+ totalColors: rows.length,
26
+ matched,
27
+ unmatched: rows.length - matched,
28
+ averageDeltaE: matched > 0 ? sum / matched : null,
29
+ worstDeltaE: matched > 0 ? worst : null,
30
+ };
31
+ }
32
+ /**
33
+ * Stateful panel — renders the palette as a table, dispatches the
34
+ * host matcher per row (lazily on "Match" click or eagerly via the
35
+ * "Match all" affordance), and surfaces coverage metrics in the
36
+ * footer.
37
+ *
38
+ * @public
39
+ */
40
+ export function PaletteToSpotPanel({ colors, matchLoader, onCommit, errorMessage, }) {
41
+ const initialRows = useMemo(() => colors.map((color) => ({ color, status: "idle" })), [colors]);
42
+ const [rows, setRows] = useState(initialRows);
43
+ // Re-seed the row state when the input palette changes.
44
+ useEffect(() => {
45
+ setRows(initialRows);
46
+ }, [initialRows]);
47
+ const matchOne = useCallback(async (color) => {
48
+ setRows((prev) => prev.map((r) => (r.color.id === color.id ? { ...r, status: "loading" } : r)));
49
+ try {
50
+ const matches = await matchLoader({ hex: color.hex });
51
+ const sorted = sortMatchesByDeltaE(matches);
52
+ const best = sorted[0];
53
+ if (!best) {
54
+ // Loader returned zero matches — surface as a distinct
55
+ // "no match found" error row rather than a confusing
56
+ // matched-but-empty state (which would render no match
57
+ // line, hide Convert, and still flip the button to
58
+ // "Re-match" as if a match landed).
59
+ setRows((prev) => prev.map((r) => r.color.id === color.id
60
+ ? { color, status: "error", errorMessage: "No match found." }
61
+ : r));
62
+ return;
63
+ }
64
+ setRows((prev) => prev.map((r) => r.color.id === color.id
65
+ ? {
66
+ color,
67
+ status: "matched",
68
+ bestMatch: best,
69
+ alternates: sorted,
70
+ }
71
+ : r));
72
+ }
73
+ catch (err) {
74
+ let message = "Couldn't fetch matches.";
75
+ if (errorMessage) {
76
+ try {
77
+ const candidate = errorMessage(err);
78
+ if (candidate)
79
+ message = candidate;
80
+ }
81
+ catch {
82
+ // fall back to default
83
+ }
84
+ }
85
+ setRows((prev) => prev.map((r) => r.color.id === color.id ? { color, status: "error", errorMessage: message } : r));
86
+ }
87
+ }, [matchLoader, errorMessage]);
88
+ const matchAll = useCallback(async () => {
89
+ // Skip rows that are already loading (in-flight) or already matched
90
+ // (no point re-paying the matcher cost — host can use the per-row
91
+ // "Re-match" button if they want to refresh a single entry).
92
+ await Promise.all(rows
93
+ .filter((r) => r.status !== "loading" && r.status !== "matched")
94
+ .map((r) => matchOne(r.color)));
95
+ }, [rows, matchOne]);
96
+ const commit = useCallback(async (row) => {
97
+ if (!onCommit || !row.bestMatch)
98
+ return;
99
+ try {
100
+ await onCommit(row.color, row.bestMatch);
101
+ }
102
+ catch (err) {
103
+ // Surface commit failures the same way match failures land
104
+ // (per-row error state). Without this branch a failed write
105
+ // would leave the row showing the matched state, suggesting
106
+ // the spot was committed when it wasn't.
107
+ let message = "Couldn't commit spot to registry.";
108
+ if (errorMessage) {
109
+ try {
110
+ const candidate = errorMessage(err);
111
+ if (candidate)
112
+ message = candidate;
113
+ }
114
+ catch {
115
+ // fall back to default
116
+ }
117
+ }
118
+ setRows((prev) => prev.map((r) => r.color.id === row.color.id
119
+ ? { color: row.color, status: "error", errorMessage: message }
120
+ : r));
121
+ }
122
+ }, [onCommit, errorMessage]);
123
+ const summary = useMemo(() => summarizePaletteCoverage(rows), [rows]);
124
+ return (_jsxs("div", { "data-testid": "palette-to-spot-panel", style: { padding: "0.5rem" }, children: [_jsxs("header", { style: {
125
+ display: "flex",
126
+ alignItems: "center",
127
+ justifyContent: "space-between",
128
+ marginBottom: "0.5rem",
129
+ }, children: [_jsxs("h3", { style: { margin: 0, fontSize: "0.875rem" }, children: ["Palette \u2192 spot (", rows.length, ")"] }), _jsx("button", { type: "button", onClick: matchAll, disabled: rows.length === 0 || rows.every((r) => r.status === "loading"), style: { fontSize: "0.75rem", padding: "0.125rem 0.5rem" }, children: "Match all" })] }), rows.length === 0 ? (_jsx("div", { "data-testid": "palette-to-spot-panel-empty", style: { opacity: 0.6, fontSize: "0.875rem" }, children: "The active page has no palette colors yet." })) : (_jsx("ul", { style: { listStyle: "none", padding: 0, margin: 0 }, children: rows.map((row) => (_jsx(PaletteRow, { row: row, onMatch: () => matchOne(row.color), onCommit: onCommit ? () => commit(row) : undefined }, row.color.id))) })), _jsxs("footer", { style: {
130
+ marginTop: "0.5rem",
131
+ fontSize: "0.75rem",
132
+ color: "#595959",
133
+ borderTop: "1px solid #eee",
134
+ paddingTop: "0.375rem",
135
+ }, children: ["Matched ", summary.matched, "/", summary.totalColors, summary.averageDeltaE !== null && (_jsxs(_Fragment, { children: [" ", "\u00B7 avg \u0394E ", summary.averageDeltaE.toFixed(2), " \u00B7 worst \u0394E", " ", (summary.worstDeltaE ?? 0).toFixed(2)] }))] })] }));
136
+ }
137
+ /**
138
+ * Renders one palette row. Intra-package helper — surface
139
+ * (color swatch + hex + status + match controls) is intentionally
140
+ * minimal so {@link PaletteToSpotPanel} can swap it without
141
+ * downstream consumers depending on the shape.
142
+ */
143
+ function PaletteRow({ row, onMatch, onCommit, }) {
144
+ return (_jsxs("li", { "data-testid": `palette-to-spot-row-${row.color.id}`, style: {
145
+ display: "flex",
146
+ alignItems: "center",
147
+ gap: "0.5rem",
148
+ padding: "0.375rem 0.5rem",
149
+ borderBottom: "1px solid #eee",
150
+ }, children: [_jsx("span", { "aria-hidden": "true", style: {
151
+ display: "inline-block",
152
+ width: 18,
153
+ height: 18,
154
+ borderRadius: 3,
155
+ border: "1px solid #ccc",
156
+ background: row.color.hex,
157
+ flexShrink: 0,
158
+ } }), _jsxs("div", { style: { flex: 1, fontSize: "0.8125rem" }, children: [_jsxs("div", { style: { fontWeight: 500 }, children: [row.color.name ?? row.color.hex, row.color.usageCount !== undefined && (_jsxs("span", { style: { color: "#595959", fontWeight: 400 }, children: [" \u00B7 ", row.color.usageCount, "\u00D7"] }))] }), row.status === "matched" && row.bestMatch && (_jsxs("div", { style: { fontSize: "0.75rem", color: "#595959" }, children: [row.bestMatch.spot.name, " \u00B7 \u0394E ", row.bestMatch.deltaE.toFixed(2)] })), row.status === "error" && (_jsx("div", { role: "alert", style: { fontSize: "0.75rem", color: "#a00" }, children: row.errorMessage }))] }), row.status === "loading" ? (_jsx("output", { style: { fontSize: "0.75rem", color: "#595959" }, children: "\u2026" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onMatch, style: { fontSize: "0.6875rem", padding: "0.0625rem 0.375rem" }, children: row.status === "matched" ? "Re-match" : "Match" }), onCommit && row.status === "matched" && row.bestMatch && (_jsx("button", { type: "button", onClick: onCommit, style: { fontSize: "0.6875rem", padding: "0.0625rem 0.375rem" }, children: "Convert" }))] }))] }));
159
+ }
160
+ //# sourceMappingURL=PaletteToSpotPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteToSpotPanel.js","sourceRoot":"","sources":["../../src/components/PaletteToSpotPanel.tsx"],"names":[],"mappings":"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"}