@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.
- package/LICENSE +62 -0
- package/README.md +63 -2
- package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
- package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
- package/dist/components/AccessibilityHintsPanel.js +158 -0
- package/dist/components/AccessibilityHintsPanel.js.map +1 -0
- package/dist/components/AnnotationOverlay.d.ts +142 -0
- package/dist/components/AnnotationOverlay.d.ts.map +1 -0
- package/dist/components/AnnotationOverlay.js +141 -0
- package/dist/components/AnnotationOverlay.js.map +1 -0
- package/dist/components/AnnotationsSidebar.d.ts +98 -0
- package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
- package/dist/components/AnnotationsSidebar.js +100 -0
- package/dist/components/AnnotationsSidebar.js.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.js +91 -0
- package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
- package/dist/components/BraillePanel.d.ts +99 -0
- package/dist/components/BraillePanel.d.ts.map +1 -0
- package/dist/components/BraillePanel.js +221 -0
- package/dist/components/BraillePanel.js.map +1 -0
- package/dist/components/BrandAssetsPanel.d.ts +130 -0
- package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
- package/dist/components/BrandAssetsPanel.js +125 -0
- package/dist/components/BrandAssetsPanel.js.map +1 -0
- package/dist/components/BrandConsistencyPanel.d.ts +140 -0
- package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
- package/dist/components/BrandConsistencyPanel.js +158 -0
- package/dist/components/BrandConsistencyPanel.js.map +1 -0
- package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
- package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
- package/dist/components/ComplianceFindingsPanel.js +118 -0
- package/dist/components/ComplianceFindingsPanel.js.map +1 -0
- package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
- package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
- package/dist/components/DesignSuggestionsPanel.js +154 -0
- package/dist/components/DesignSuggestionsPanel.js.map +1 -0
- package/dist/components/DielineParametersPanel.d.ts +62 -0
- package/dist/components/DielineParametersPanel.d.ts.map +1 -0
- package/dist/components/DielineParametersPanel.js +170 -0
- package/dist/components/DielineParametersPanel.js.map +1 -0
- package/dist/components/DielinePreview.d.ts +150 -0
- package/dist/components/DielinePreview.d.ts.map +1 -0
- package/dist/components/DielinePreview.js +146 -0
- package/dist/components/DielinePreview.js.map +1 -0
- package/dist/components/EditorApp.d.ts +39 -5
- package/dist/components/EditorApp.d.ts.map +1 -1
- package/dist/components/EditorApp.js +110 -5
- package/dist/components/EditorApp.js.map +1 -1
- package/dist/components/EditorCanvas.d.ts +51 -2
- package/dist/components/EditorCanvas.d.ts.map +1 -1
- package/dist/components/EditorCanvas.js +117 -48
- package/dist/components/EditorCanvas.js.map +1 -1
- package/dist/components/EmailNotifyPanel.d.ts +165 -0
- package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
- package/dist/components/EmailNotifyPanel.js +211 -0
- package/dist/components/EmailNotifyPanel.js.map +1 -0
- package/dist/components/FileDropZone.d.ts +9 -1
- package/dist/components/FileDropZone.d.ts.map +1 -1
- package/dist/components/FileDropZone.js +53 -5
- package/dist/components/FileDropZone.js.map +1 -1
- package/dist/components/FoldEditorPanel.d.ts +68 -0
- package/dist/components/FoldEditorPanel.d.ts.map +1 -0
- package/dist/components/FoldEditorPanel.js +65 -0
- package/dist/components/FoldEditorPanel.js.map +1 -0
- package/dist/components/FoldPreviewOverlay.d.ts +48 -0
- package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
- package/dist/components/FoldPreviewOverlay.js +182 -0
- package/dist/components/FoldPreviewOverlay.js.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.js +199 -0
- package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
- package/dist/components/HistoryPanel.d.ts +39 -0
- package/dist/components/HistoryPanel.d.ts.map +1 -0
- package/dist/components/HistoryPanel.js +72 -0
- package/dist/components/HistoryPanel.js.map +1 -0
- package/dist/components/IccSoftProofOverlay.d.ts +67 -0
- package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
- package/dist/components/IccSoftProofOverlay.js +119 -0
- package/dist/components/IccSoftProofOverlay.js.map +1 -0
- package/dist/components/ImposePanel.d.ts +71 -0
- package/dist/components/ImposePanel.d.ts.map +1 -0
- package/dist/components/ImposePanel.js +127 -0
- package/dist/components/ImposePanel.js.map +1 -0
- package/dist/components/InksPanel.d.ts +61 -0
- package/dist/components/InksPanel.d.ts.map +1 -0
- package/dist/components/InksPanel.js +84 -0
- package/dist/components/InksPanel.js.map +1 -0
- package/dist/components/JobSetupPanel.d.ts +118 -0
- package/dist/components/JobSetupPanel.d.ts.map +1 -0
- package/dist/components/JobSetupPanel.js +169 -0
- package/dist/components/JobSetupPanel.js.map +1 -0
- package/dist/components/LayersPanel.d.ts.map +1 -1
- package/dist/components/LayersPanel.js +1 -0
- package/dist/components/LayersPanel.js.map +1 -1
- package/dist/components/MarkLibraryPanel.d.ts +131 -0
- package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
- package/dist/components/MarkLibraryPanel.js +184 -0
- package/dist/components/MarkLibraryPanel.js.map +1 -0
- package/dist/components/MisEstimateButton.d.ts +73 -0
- package/dist/components/MisEstimateButton.d.ts.map +1 -0
- package/dist/components/MisEstimateButton.js +57 -0
- package/dist/components/MisEstimateButton.js.map +1 -0
- package/dist/components/NutritionPanel.d.ts +118 -0
- package/dist/components/NutritionPanel.d.ts.map +1 -0
- package/dist/components/NutritionPanel.js +169 -0
- package/dist/components/NutritionPanel.js.map +1 -0
- package/dist/components/PageNavigator.d.ts +26 -0
- package/dist/components/PageNavigator.d.ts.map +1 -0
- package/dist/components/PageNavigator.js +96 -0
- package/dist/components/PageNavigator.js.map +1 -0
- package/dist/components/PaletteManager.d.ts +32 -0
- package/dist/components/PaletteManager.d.ts.map +1 -0
- package/dist/components/PaletteManager.js +89 -0
- package/dist/components/PaletteManager.js.map +1 -0
- package/dist/components/PaletteToSpotPanel.d.ts +122 -0
- package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
- package/dist/components/PaletteToSpotPanel.js +160 -0
- package/dist/components/PaletteToSpotPanel.js.map +1 -0
- package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
- package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
- package/dist/components/PreflightAutoFixPanel.js +119 -0
- package/dist/components/PreflightAutoFixPanel.js.map +1 -0
- package/dist/components/PreflightDiffPanel.d.ts +127 -0
- package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
- package/dist/components/PreflightDiffPanel.js +0 -0
- package/dist/components/PreflightDiffPanel.js.map +1 -0
- package/dist/components/ProcessRulesPanel.d.ts +81 -0
- package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
- package/dist/components/ProcessRulesPanel.js +143 -0
- package/dist/components/ProcessRulesPanel.js.map +1 -0
- package/dist/components/SlackNotifyPanel.d.ts +139 -0
- package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
- package/dist/components/SlackNotifyPanel.js +133 -0
- package/dist/components/SlackNotifyPanel.js.map +1 -0
- package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
- package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
- package/dist/components/SmartSpotMatchPanel.js +159 -0
- package/dist/components/SmartSpotMatchPanel.js.map +1 -0
- package/dist/components/SwatchesPicker.d.ts +83 -0
- package/dist/components/SwatchesPicker.d.ts.map +1 -0
- package/dist/components/SwatchesPicker.js +151 -0
- package/dist/components/SwatchesPicker.js.map +1 -0
- package/dist/components/TacOverlay.d.ts +47 -0
- package/dist/components/TacOverlay.d.ts.map +1 -0
- package/dist/components/TacOverlay.js +116 -0
- package/dist/components/TacOverlay.js.map +1 -0
- package/dist/components/TrapEditorPanel.d.ts +52 -0
- package/dist/components/TrapEditorPanel.d.ts.map +1 -0
- package/dist/components/TrapEditorPanel.js +64 -0
- package/dist/components/TrapEditorPanel.js.map +1 -0
- package/dist/components/TrapPreviewOverlay.d.ts +64 -0
- package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
- package/dist/components/TrapPreviewOverlay.js +120 -0
- package/dist/components/TrapPreviewOverlay.js.map +1 -0
- package/dist/components/VariantMatrixPanel.d.ts +61 -0
- package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixPanel.js +97 -0
- package/dist/components/VariantMatrixPanel.js.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.js +162 -0
- package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
- package/dist/components/WebhookNotifyPanel.d.ts +160 -0
- package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
- package/dist/components/WebhookNotifyPanel.js +100 -0
- package/dist/components/WebhookNotifyPanel.js.map +1 -0
- package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
- package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
- package/dist/components/WhiteUnderbasePanel.js +104 -0
- package/dist/components/WhiteUnderbasePanel.js.map +1 -0
- package/dist/data/dielines.json +35 -0
- package/dist/hooks/useEditorMode.d.ts +25 -5
- package/dist/hooks/useEditorMode.d.ts.map +1 -1
- package/dist/hooks/useEditorMode.js +18 -5
- package/dist/hooks/useEditorMode.js.map +1 -1
- package/dist/index.d.ts +49 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -2
- package/dist/index.js.map +1 -1
- package/dist/lens/dieline-overlay.d.ts +25 -0
- package/dist/lens/dieline-overlay.d.ts.map +1 -0
- package/dist/lens/dieline-overlay.js +50 -0
- package/dist/lens/dieline-overlay.js.map +1 -0
- package/dist/lens/index.d.ts +27 -0
- package/dist/lens/index.d.ts.map +1 -0
- package/dist/lens/index.js +28 -0
- package/dist/lens/index.js.map +1 -0
- package/dist/lens/preflight-findings.d.ts +21 -0
- package/dist/lens/preflight-findings.d.ts.map +1 -0
- package/dist/lens/preflight-findings.js +82 -0
- package/dist/lens/preflight-findings.js.map +1 -0
- package/dist/lib/barcode-scan.d.ts +154 -0
- package/dist/lib/barcode-scan.d.ts.map +1 -0
- package/dist/lib/barcode-scan.js +152 -0
- package/dist/lib/barcode-scan.js.map +1 -0
- package/dist/lib/color-math.d.ts +76 -0
- package/dist/lib/color-math.d.ts.map +1 -0
- package/dist/lib/color-math.js +96 -0
- package/dist/lib/color-math.js.map +1 -0
- package/dist/lib/dieline-template.d.ts +169 -0
- package/dist/lib/dieline-template.d.ts.map +1 -1
- package/dist/lib/dieline-template.js +229 -1
- package/dist/lib/dieline-template.js.map +1 -1
- package/dist/lib/editor-config.d.ts +384 -1
- package/dist/lib/editor-config.d.ts.map +1 -1
- package/dist/lib/editor-config.js +89 -2
- package/dist/lib/editor-config.js.map +1 -1
- package/dist/lib/fold-geometry.d.ts +144 -0
- package/dist/lib/fold-geometry.d.ts.map +1 -0
- package/dist/lib/fold-geometry.js +138 -0
- package/dist/lib/fold-geometry.js.map +1 -0
- package/dist/lib/merge-tokens.d.ts +81 -0
- package/dist/lib/merge-tokens.d.ts.map +1 -0
- package/dist/lib/merge-tokens.js +88 -0
- package/dist/lib/merge-tokens.js.map +1 -0
- package/dist/lib/palette-registry.d.ts +40 -0
- package/dist/lib/palette-registry.d.ts.map +1 -0
- package/dist/lib/palette-registry.js +49 -0
- package/dist/lib/palette-registry.js.map +1 -0
- package/dist/lib/panel-anchor.d.ts +101 -0
- package/dist/lib/panel-anchor.d.ts.map +1 -0
- package/dist/lib/panel-anchor.js +68 -0
- package/dist/lib/panel-anchor.js.map +1 -0
- package/dist/lib/preflight/checks.d.ts.map +1 -1
- package/dist/lib/preflight/checks.js +71 -0
- package/dist/lib/preflight/checks.js.map +1 -1
- package/dist/lib/preflight/types.d.ts.map +1 -1
- package/dist/lib/preflight/types.js +11 -0
- package/dist/lib/preflight/types.js.map +1 -1
- package/dist/lib/rasterize.d.ts +93 -0
- package/dist/lib/rasterize.d.ts.map +1 -0
- package/dist/lib/rasterize.js +117 -0
- package/dist/lib/rasterize.js.map +1 -0
- package/dist/lib/separations-registry.d.ts +99 -0
- package/dist/lib/separations-registry.d.ts.map +1 -0
- package/dist/lib/separations-registry.js +59 -0
- package/dist/lib/separations-registry.js.map +1 -0
- package/dist/lib/unwired.d.ts +29 -0
- package/dist/lib/unwired.d.ts.map +1 -0
- package/dist/lib/unwired.js +58 -0
- package/dist/lib/unwired.js.map +1 -0
- package/package.json +29 -11
- package/dist/components/SeparationsPanel.d.ts +0 -9
- package/dist/components/SeparationsPanel.d.ts.map +0 -1
- package/dist/components/SeparationsPanel.js +0 -168
- 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":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AA2Bb,MAAM,EAAE,GAAG,SAAS,CAAC;AACrB,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,KAAK,GAAG,MAAM,CAAC;AAErB,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GAAG,OAAO,GACE;IACnB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,SAAS,CAAC;IAEjE,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CACL,eACE,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE,gBAAgB;aAC1B,aAED,cACE,IAAI,EAAC,SAAS,gBACH,OAAO,sBACD,UAAU,EAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAEjE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBAClB,MAAM,MAAM,GAAG,CAAC,KAAK,gBAAgB,CAAC;wBACtC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,mBACK,MAAM,gBACT,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACzD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE;gCACL,OAAO,EAAE,MAAM;gCACf,UAAU,EAAE,QAAQ;gCACpB,GAAG,EAAE,SAAS;gCACd,OAAO,EAAE,gBAAgB;gCACzB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;gCAC9C,MAAM,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE;gCACrD,YAAY,EAAE,CAAC;gCACf,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gCAC9B,MAAM,EAAE,SAAS;gCACjB,UAAU,EAAE,SAAS;gCACrB,QAAQ,EAAE,SAAS;gCACnB,SAAS,EAAE,MAAM;6BAClB,aAED,oCAEE,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAEnE,CAAC,GAAG,CAAC,GACD,EACP,eAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAQ,EAC3D,MAAM,IAAI,CACT,oCAAkB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAElC,CACR,KAhCI,CAAC,CAAC,EAAE,CAiCF,CACV,CAAC;oBACJ,CAAC,CAAC,GACE,EAEL,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,CAC3B,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,aAChE,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,gBAAgB,gBACZ,UAAU,2BAGd,CACV,EACA,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,EAAE,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,gBAC7D,qBAAqB,8BAGzB,CACV,IACG,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,OAAO,CACL,eACE,IAAI,EAAC,SAAS,gBACH,OAAO,sBACD,YAAY,EAC7B,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,aAAa,MAAM,EAAE;YACnC,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,MAAM;SACjB,aAED,oCAEE,KAAK,EAAE;oBACL,QAAQ,EAAE,QAAQ;oBAClB,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,QAAQ;oBACvB,aAAa,EAAE,WAAW;oBAC1B,UAAU,EAAE,GAAG;oBACf,WAAW,EAAE,QAAQ;iBACtB,sBAGI,EACN,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,MAAM,GAAG,CAAC,KAAK,gBAAgB,CAAC;gBACtC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,mBACK,MAAM,gBACT,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACzD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,EAChC,KAAK,EAAE;wBACL,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;wBAC1C,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC/B,MAAM,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;wBAC9C,YAAY,EAAE,CAAC;wBACf,OAAO,EAAE,iBAAiB;wBAC1B,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,SAAS;wBACjB,UAAU,EAAE,SAAS;qBACtB,aAEA,CAAC,GAAG,CAAC,EACL,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACR,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,YACnE,CAAC,CAAC,IAAI,GACF,CACR,CAAC,CAAC,CAAC,IAAI,KAvBH,CAAC,CAAC,EAAE,CAwBF,CACV,CAAC;YACJ,CAAC,CAAC,EAED,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE;oBACL,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,cAAc,MAAM,EAAE;oBAC9B,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,iBAAiB;oBAC1B,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,QAAQ;iBACrB,kBAGM,CACV,EACA,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,KAAK,EAAC,qBAAqB,EAC3B,KAAK,EAAE;oBACL,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,mBAAmB;oBAC3B,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,SAAS;iBACtB,uBAGM,CACV,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAwB;IAC5C,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,aAAa,MAAM,EAAE;IAC7B,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,gBAAgB;IACzB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;CACtB,CAAC"}
|
|
@@ -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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"}
|