@printwithsynergy/artwork-pdf-editor 0.2.0 → 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 (236) hide show
  1. package/LICENSE +62 -0
  2. package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
  3. package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
  4. package/dist/components/AccessibilityHintsPanel.js +158 -0
  5. package/dist/components/AccessibilityHintsPanel.js.map +1 -0
  6. package/dist/components/AnnotationOverlay.d.ts +142 -0
  7. package/dist/components/AnnotationOverlay.d.ts.map +1 -0
  8. package/dist/components/AnnotationOverlay.js +141 -0
  9. package/dist/components/AnnotationOverlay.js.map +1 -0
  10. package/dist/components/AnnotationsSidebar.d.ts +98 -0
  11. package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
  12. package/dist/components/AnnotationsSidebar.js +100 -0
  13. package/dist/components/AnnotationsSidebar.js.map +1 -0
  14. package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
  15. package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
  16. package/dist/components/BarcodeGeneratorPanel.js +91 -0
  17. package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
  18. package/dist/components/BraillePanel.d.ts +99 -0
  19. package/dist/components/BraillePanel.d.ts.map +1 -0
  20. package/dist/components/BraillePanel.js +221 -0
  21. package/dist/components/BraillePanel.js.map +1 -0
  22. package/dist/components/BrandAssetsPanel.d.ts +130 -0
  23. package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
  24. package/dist/components/BrandAssetsPanel.js +125 -0
  25. package/dist/components/BrandAssetsPanel.js.map +1 -0
  26. package/dist/components/BrandConsistencyPanel.d.ts +140 -0
  27. package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
  28. package/dist/components/BrandConsistencyPanel.js +158 -0
  29. package/dist/components/BrandConsistencyPanel.js.map +1 -0
  30. package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
  31. package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
  32. package/dist/components/ComplianceFindingsPanel.js +118 -0
  33. package/dist/components/ComplianceFindingsPanel.js.map +1 -0
  34. package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
  35. package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
  36. package/dist/components/DesignSuggestionsPanel.js +154 -0
  37. package/dist/components/DesignSuggestionsPanel.js.map +1 -0
  38. package/dist/components/DielineParametersPanel.d.ts +62 -0
  39. package/dist/components/DielineParametersPanel.d.ts.map +1 -0
  40. package/dist/components/DielineParametersPanel.js +170 -0
  41. package/dist/components/DielineParametersPanel.js.map +1 -0
  42. package/dist/components/DielinePreview.d.ts +150 -0
  43. package/dist/components/DielinePreview.d.ts.map +1 -0
  44. package/dist/components/DielinePreview.js +146 -0
  45. package/dist/components/DielinePreview.js.map +1 -0
  46. package/dist/components/EditorApp.d.ts +18 -3
  47. package/dist/components/EditorApp.d.ts.map +1 -1
  48. package/dist/components/EditorApp.js +42 -7
  49. package/dist/components/EditorApp.js.map +1 -1
  50. package/dist/components/EditorCanvas.d.ts +31 -2
  51. package/dist/components/EditorCanvas.d.ts.map +1 -1
  52. package/dist/components/EditorCanvas.js +97 -16
  53. package/dist/components/EditorCanvas.js.map +1 -1
  54. package/dist/components/EmailNotifyPanel.d.ts +165 -0
  55. package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
  56. package/dist/components/EmailNotifyPanel.js +211 -0
  57. package/dist/components/EmailNotifyPanel.js.map +1 -0
  58. package/dist/components/FileDropZone.d.ts +9 -1
  59. package/dist/components/FileDropZone.d.ts.map +1 -1
  60. package/dist/components/FileDropZone.js +53 -5
  61. package/dist/components/FileDropZone.js.map +1 -1
  62. package/dist/components/FoldEditorPanel.d.ts +68 -0
  63. package/dist/components/FoldEditorPanel.d.ts.map +1 -0
  64. package/dist/components/FoldEditorPanel.js +65 -0
  65. package/dist/components/FoldEditorPanel.js.map +1 -0
  66. package/dist/components/FoldPreviewOverlay.d.ts +48 -0
  67. package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
  68. package/dist/components/FoldPreviewOverlay.js +182 -0
  69. package/dist/components/FoldPreviewOverlay.js.map +1 -0
  70. package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
  71. package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
  72. package/dist/components/Gs1DigitalLinkPanel.js +199 -0
  73. package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
  74. package/dist/components/HistoryPanel.d.ts +39 -0
  75. package/dist/components/HistoryPanel.d.ts.map +1 -0
  76. package/dist/components/HistoryPanel.js +72 -0
  77. package/dist/components/HistoryPanel.js.map +1 -0
  78. package/dist/components/IccSoftProofOverlay.d.ts +67 -0
  79. package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
  80. package/dist/components/IccSoftProofOverlay.js +119 -0
  81. package/dist/components/IccSoftProofOverlay.js.map +1 -0
  82. package/dist/components/ImposePanel.d.ts +71 -0
  83. package/dist/components/ImposePanel.d.ts.map +1 -0
  84. package/dist/components/ImposePanel.js +127 -0
  85. package/dist/components/ImposePanel.js.map +1 -0
  86. package/dist/components/InksPanel.d.ts +61 -0
  87. package/dist/components/InksPanel.d.ts.map +1 -0
  88. package/dist/components/InksPanel.js +84 -0
  89. package/dist/components/InksPanel.js.map +1 -0
  90. package/dist/components/JobSetupPanel.d.ts +118 -0
  91. package/dist/components/JobSetupPanel.d.ts.map +1 -0
  92. package/dist/components/JobSetupPanel.js +169 -0
  93. package/dist/components/JobSetupPanel.js.map +1 -0
  94. package/dist/components/LayersPanel.d.ts.map +1 -1
  95. package/dist/components/LayersPanel.js +1 -0
  96. package/dist/components/LayersPanel.js.map +1 -1
  97. package/dist/components/MarkLibraryPanel.d.ts +131 -0
  98. package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
  99. package/dist/components/MarkLibraryPanel.js +184 -0
  100. package/dist/components/MarkLibraryPanel.js.map +1 -0
  101. package/dist/components/MisEstimateButton.d.ts +73 -0
  102. package/dist/components/MisEstimateButton.d.ts.map +1 -0
  103. package/dist/components/MisEstimateButton.js +57 -0
  104. package/dist/components/MisEstimateButton.js.map +1 -0
  105. package/dist/components/NutritionPanel.d.ts +118 -0
  106. package/dist/components/NutritionPanel.d.ts.map +1 -0
  107. package/dist/components/NutritionPanel.js +169 -0
  108. package/dist/components/NutritionPanel.js.map +1 -0
  109. package/dist/components/PageNavigator.d.ts.map +1 -1
  110. package/dist/components/PageNavigator.js +6 -1
  111. package/dist/components/PageNavigator.js.map +1 -1
  112. package/dist/components/PaletteManager.d.ts +32 -0
  113. package/dist/components/PaletteManager.d.ts.map +1 -0
  114. package/dist/components/PaletteManager.js +89 -0
  115. package/dist/components/PaletteManager.js.map +1 -0
  116. package/dist/components/PaletteToSpotPanel.d.ts +122 -0
  117. package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
  118. package/dist/components/PaletteToSpotPanel.js +160 -0
  119. package/dist/components/PaletteToSpotPanel.js.map +1 -0
  120. package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
  121. package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
  122. package/dist/components/PreflightAutoFixPanel.js +119 -0
  123. package/dist/components/PreflightAutoFixPanel.js.map +1 -0
  124. package/dist/components/PreflightDiffPanel.d.ts +127 -0
  125. package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
  126. package/dist/components/PreflightDiffPanel.js +0 -0
  127. package/dist/components/PreflightDiffPanel.js.map +1 -0
  128. package/dist/components/ProcessRulesPanel.d.ts +81 -0
  129. package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
  130. package/dist/components/ProcessRulesPanel.js +143 -0
  131. package/dist/components/ProcessRulesPanel.js.map +1 -0
  132. package/dist/components/SlackNotifyPanel.d.ts +139 -0
  133. package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
  134. package/dist/components/SlackNotifyPanel.js +133 -0
  135. package/dist/components/SlackNotifyPanel.js.map +1 -0
  136. package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
  137. package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
  138. package/dist/components/SmartSpotMatchPanel.js +159 -0
  139. package/dist/components/SmartSpotMatchPanel.js.map +1 -0
  140. package/dist/components/SwatchesPicker.d.ts +83 -0
  141. package/dist/components/SwatchesPicker.d.ts.map +1 -0
  142. package/dist/components/SwatchesPicker.js +151 -0
  143. package/dist/components/SwatchesPicker.js.map +1 -0
  144. package/dist/components/TacOverlay.d.ts +47 -0
  145. package/dist/components/TacOverlay.d.ts.map +1 -0
  146. package/dist/components/TacOverlay.js +116 -0
  147. package/dist/components/TacOverlay.js.map +1 -0
  148. package/dist/components/TrapEditorPanel.d.ts +52 -0
  149. package/dist/components/TrapEditorPanel.d.ts.map +1 -0
  150. package/dist/components/TrapEditorPanel.js +64 -0
  151. package/dist/components/TrapEditorPanel.js.map +1 -0
  152. package/dist/components/TrapPreviewOverlay.d.ts +64 -0
  153. package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
  154. package/dist/components/TrapPreviewOverlay.js +120 -0
  155. package/dist/components/TrapPreviewOverlay.js.map +1 -0
  156. package/dist/components/VariantMatrixPanel.d.ts +61 -0
  157. package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
  158. package/dist/components/VariantMatrixPanel.js +97 -0
  159. package/dist/components/VariantMatrixPanel.js.map +1 -0
  160. package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
  161. package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
  162. package/dist/components/VariantMatrixVersionPanel.js +162 -0
  163. package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
  164. package/dist/components/WebhookNotifyPanel.d.ts +160 -0
  165. package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
  166. package/dist/components/WebhookNotifyPanel.js +100 -0
  167. package/dist/components/WebhookNotifyPanel.js.map +1 -0
  168. package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
  169. package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
  170. package/dist/components/WhiteUnderbasePanel.js +104 -0
  171. package/dist/components/WhiteUnderbasePanel.js.map +1 -0
  172. package/dist/hooks/useEditorMode.d.ts +25 -5
  173. package/dist/hooks/useEditorMode.d.ts.map +1 -1
  174. package/dist/hooks/useEditorMode.js +18 -5
  175. package/dist/hooks/useEditorMode.js.map +1 -1
  176. package/dist/index.d.ts +49 -2
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +49 -2
  179. package/dist/index.js.map +1 -1
  180. package/dist/lens/preflight-findings.d.ts.map +1 -1
  181. package/dist/lens/preflight-findings.js.map +1 -1
  182. package/dist/lib/barcode-scan.d.ts +154 -0
  183. package/dist/lib/barcode-scan.d.ts.map +1 -0
  184. package/dist/lib/barcode-scan.js +152 -0
  185. package/dist/lib/barcode-scan.js.map +1 -0
  186. package/dist/lib/color-math.d.ts +76 -0
  187. package/dist/lib/color-math.d.ts.map +1 -0
  188. package/dist/lib/color-math.js +96 -0
  189. package/dist/lib/color-math.js.map +1 -0
  190. package/dist/lib/dieline-template.d.ts +87 -0
  191. package/dist/lib/dieline-template.d.ts.map +1 -1
  192. package/dist/lib/dieline-template.js +163 -0
  193. package/dist/lib/dieline-template.js.map +1 -1
  194. package/dist/lib/editor-config.d.ts +384 -0
  195. package/dist/lib/editor-config.d.ts.map +1 -1
  196. package/dist/lib/editor-config.js +89 -0
  197. package/dist/lib/editor-config.js.map +1 -1
  198. package/dist/lib/fold-geometry.d.ts +144 -0
  199. package/dist/lib/fold-geometry.d.ts.map +1 -0
  200. package/dist/lib/fold-geometry.js +138 -0
  201. package/dist/lib/fold-geometry.js.map +1 -0
  202. package/dist/lib/merge-tokens.d.ts +81 -0
  203. package/dist/lib/merge-tokens.d.ts.map +1 -0
  204. package/dist/lib/merge-tokens.js +88 -0
  205. package/dist/lib/merge-tokens.js.map +1 -0
  206. package/dist/lib/palette-registry.d.ts +40 -0
  207. package/dist/lib/palette-registry.d.ts.map +1 -0
  208. package/dist/lib/palette-registry.js +49 -0
  209. package/dist/lib/palette-registry.js.map +1 -0
  210. package/dist/lib/panel-anchor.d.ts +101 -0
  211. package/dist/lib/panel-anchor.d.ts.map +1 -0
  212. package/dist/lib/panel-anchor.js +68 -0
  213. package/dist/lib/panel-anchor.js.map +1 -0
  214. package/dist/lib/preflight/checks.d.ts.map +1 -1
  215. package/dist/lib/preflight/checks.js +71 -0
  216. package/dist/lib/preflight/checks.js.map +1 -1
  217. package/dist/lib/preflight/types.d.ts.map +1 -1
  218. package/dist/lib/preflight/types.js +11 -0
  219. package/dist/lib/preflight/types.js.map +1 -1
  220. package/dist/lib/rasterize.d.ts +93 -0
  221. package/dist/lib/rasterize.d.ts.map +1 -0
  222. package/dist/lib/rasterize.js +117 -0
  223. package/dist/lib/rasterize.js.map +1 -0
  224. package/dist/lib/separations-registry.d.ts +99 -0
  225. package/dist/lib/separations-registry.d.ts.map +1 -0
  226. package/dist/lib/separations-registry.js +59 -0
  227. package/dist/lib/separations-registry.js.map +1 -0
  228. package/dist/lib/unwired.d.ts +29 -0
  229. package/dist/lib/unwired.d.ts.map +1 -0
  230. package/dist/lib/unwired.js +58 -0
  231. package/dist/lib/unwired.js.map +1 -0
  232. package/package.json +20 -11
  233. package/dist/components/SeparationsPanel.d.ts +0 -9
  234. package/dist/components/SeparationsPanel.d.ts.map +0 -1
  235. package/dist/components/SeparationsPanel.js +0 -168
  236. package/dist/components/SeparationsPanel.js.map +0 -1
@@ -0,0 +1,162 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
+ import { useMemo } from "react";
5
+ /**
6
+ * Resolve which snapshot the panel should pull from `history`.
7
+ *
8
+ * Behaviour matches `PreflightDiffPanel.resolveBaselineSnapshot`:
9
+ * an explicit version wins when found, else falls back to the
10
+ * most-recent snapshot. Returns `undefined` only when `history` is
11
+ * empty. Falling back keeps the panel useful after a host trims
12
+ * history below the user's saved selection.
13
+ *
14
+ * Pure function; exposed for hosts that mirror the panel's
15
+ * selection in their own chrome.
16
+ *
17
+ * @public
18
+ */
19
+ export function resolveSnapshot(history, version) {
20
+ if (history.length === 0)
21
+ return undefined;
22
+ if (version !== undefined) {
23
+ const explicit = history.find((s) => s.version === version);
24
+ if (explicit)
25
+ return explicit;
26
+ }
27
+ return history[history.length - 1];
28
+ }
29
+ /**
30
+ * Compute the variant-row + token-column diff between two matrices.
31
+ *
32
+ * Variants are matched by `id`; the human-readable `name` and token
33
+ * `overrides` are compared per-id. Token keys are diffed as sets
34
+ * (order-insensitive). Pure function — no React, no DOM.
35
+ *
36
+ * @public
37
+ */
38
+ export function diffVariantMatrices(baseline, current) {
39
+ const baselineById = new Map(baseline.variants.map((v) => [v.id, v]));
40
+ const currentById = new Map(current.variants.map((v) => [v.id, v]));
41
+ const addedVariants = [];
42
+ const removedVariants = [];
43
+ const modifiedVariants = [];
44
+ for (const v of current.variants) {
45
+ const prior = baselineById.get(v.id);
46
+ if (!prior) {
47
+ addedVariants.push(v);
48
+ continue;
49
+ }
50
+ const changedTokens = diffOverrideKeys(prior.overrides, v.overrides);
51
+ const nameChanged = prior.name !== v.name;
52
+ if (changedTokens.length > 0 || nameChanged) {
53
+ modifiedVariants.push({
54
+ id: v.id,
55
+ name: v.name,
56
+ changedTokens,
57
+ nameChanged,
58
+ });
59
+ }
60
+ }
61
+ for (const v of baseline.variants) {
62
+ if (!currentById.has(v.id))
63
+ removedVariants.push(v);
64
+ }
65
+ const baselineTokens = new Set(baseline.tokenKeys);
66
+ const currentTokens = new Set(current.tokenKeys);
67
+ const addedTokenKeys = current.tokenKeys.filter((k) => !baselineTokens.has(k));
68
+ const removedTokenKeys = baseline.tokenKeys.filter((k) => !currentTokens.has(k));
69
+ return { addedVariants, removedVariants, modifiedVariants, addedTokenKeys, removedTokenKeys };
70
+ }
71
+ /**
72
+ * Diff two override maps and return the set of keys whose value
73
+ * differs. Keys present in only one side count as changed (the
74
+ * other side resolves to undefined). Uses `Object.hasOwn` so
75
+ * inherited properties don't sneak in.
76
+ */
77
+ function diffOverrideKeys(prior, next) {
78
+ const keys = new Set();
79
+ for (const k of Object.keys(prior))
80
+ keys.add(k);
81
+ for (const k of Object.keys(next))
82
+ keys.add(k);
83
+ const changed = [];
84
+ for (const k of keys) {
85
+ const a = Object.hasOwn(prior, k) ? prior[k] : undefined;
86
+ const b = Object.hasOwn(next, k) ? next[k] : undefined;
87
+ if (a !== b)
88
+ changed.push(k);
89
+ }
90
+ return changed.sort();
91
+ }
92
+ const COLORS = {
93
+ added: "#070",
94
+ removed: "#a00",
95
+ modified: "#a60",
96
+ tokenChange: "#06a",
97
+ };
98
+ /**
99
+ * Read-only viewer for a versioned variant matrix history. Picks
100
+ * a baseline + current version (dropdowns) and renders a per-row
101
+ * diff plus a token-column diff.
102
+ *
103
+ * @public
104
+ */
105
+ export function VariantMatrixVersionPanel({ history, baselineVersion, currentVersion, onBaselineChange, onCurrentChange, }) {
106
+ // All hooks must run before any conditional return — toggling
107
+ // `history` between empty and non-empty across renders would
108
+ // otherwise change the hook count and trip
109
+ // "Rendered fewer hooks than expected". The helpers tolerate
110
+ // empty input (`resolveSnapshot` returns undefined,
111
+ // `history[0]?.version` is undefined) so the work is cheap on
112
+ // the empty path.
113
+ const resolvedCurrent = resolveSnapshot(history, currentVersion);
114
+ // Default baseline = the version *before* current; lets the panel
115
+ // open with the most useful comparison ("what changed in the last
116
+ // edit?") without the host wiring two selectors.
117
+ const defaultBaselineVersion = history.length >= 2 ? history[history.length - 2]?.version : history[0]?.version;
118
+ const resolvedBaseline = resolveSnapshot(history, baselineVersion ?? defaultBaselineVersion);
119
+ const diff = useMemo(() => resolvedBaseline && resolvedCurrent
120
+ ? diffVariantMatrices(resolvedBaseline.matrix, resolvedCurrent.matrix)
121
+ : null, [resolvedBaseline, resolvedCurrent]);
122
+ if (history.length === 0) {
123
+ return (_jsx("div", { "data-testid": "variant-matrix-version-panel", style: { padding: "0.5rem", opacity: 0.6 }, children: "No matrix history yet \u2014 save the matrix to capture the first version." }));
124
+ }
125
+ return (_jsxs("div", { "data-testid": "variant-matrix-version-panel", style: { padding: "0.5rem" }, children: [_jsxs("header", { style: {
126
+ display: "flex",
127
+ alignItems: "baseline",
128
+ gap: "0.5rem",
129
+ marginBottom: "0.5rem",
130
+ }, children: [_jsx("h3", { style: { margin: 0, fontSize: "0.875rem" }, children: "Variant matrix diff" }), _jsx(VersionPicker, { dataTestId: "variant-matrix-baseline", label: "vs.", value: resolvedBaseline?.version ?? "", history: history, onChange: onBaselineChange }), _jsx(VersionPicker, { dataTestId: "variant-matrix-current", label: "\u2192", value: resolvedCurrent?.version ?? "", history: history, onChange: onCurrentChange })] }), diff && (_jsxs(_Fragment, { children: [_jsx(DiffSection, { label: "Added variants", color: COLORS.added, entries: diff.addedVariants.map((v) => v.name) }), _jsx(DiffSection, { label: "Removed variants", color: COLORS.removed, entries: diff.removedVariants.map((v) => v.name) }), _jsx(DiffSection, { label: "Modified variants", color: COLORS.modified, entries: diff.modifiedVariants.map((v) => v.changedTokens.length > 0
131
+ ? `${v.name} (${v.changedTokens.join(", ")}${v.nameChanged ? "; renamed" : ""})`
132
+ : `${v.name} (renamed)`) }), _jsx(DiffSection, { label: "Added token columns", color: COLORS.tokenChange, entries: [...diff.addedTokenKeys] }), _jsx(DiffSection, { label: "Removed token columns", color: COLORS.tokenChange, entries: [...diff.removedTokenKeys] })] }))] }));
133
+ }
134
+ /**
135
+ * One-row section of the diff viewer. Renders only when `entries`
136
+ * is non-empty, so an unchanged comparison shows nothing — keeps
137
+ * the panel quiet when there's nothing to say.
138
+ *
139
+ * Intra-package helper.
140
+ */
141
+ function DiffSection({ label, color, entries, }) {
142
+ if (entries.length === 0)
143
+ return null;
144
+ return (_jsxs("section", { style: { marginBottom: "0.5rem" }, children: [_jsxs("h4", { style: { margin: "0 0 0.25rem 0", fontSize: "0.75rem", color }, children: [label, " (", entries.length, ")"] }), _jsx("ul", { style: { listStyle: "none", padding: 0, margin: 0 }, children: entries.map((entry, i) => (
145
+ // Composite key — two variants can legitimately share a
146
+ // name (the id is what disambiguates), and a token-column
147
+ // name can repeat across kind buckets. Including the index
148
+ // keeps React's reconciliation correct without exposing
149
+ // the internal ids in the rendered output.
150
+ _jsx("li", { style: { padding: "0.125rem 0.5rem", fontSize: "0.8125rem" }, children: entry }, `${label}-${i}-${entry}`))) })] }));
151
+ }
152
+ /**
153
+ * Version dropdown used twice in the header (baseline + current).
154
+ * Disabled state covers the read-only case where the host hasn't
155
+ * wired a setter.
156
+ *
157
+ * Intra-package helper.
158
+ */
159
+ function VersionPicker({ dataTestId, label, value, history, onChange, }) {
160
+ return (_jsxs("label", { style: { fontSize: "0.75rem", color: "#666" }, children: [`${label} `, _jsx("select", { "data-testid": dataTestId, value: value, onChange: (e) => onChange?.(e.target.value), disabled: onChange === undefined, style: { fontFamily: "monospace", fontSize: "0.75rem" }, children: history.map((s) => (_jsxs("option", { value: s.version, children: ["v", s.version] }, s.version))) })] }));
161
+ }
162
+ //# sourceMappingURL=VariantMatrixVersionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariantMatrixVersionPanel.js","sourceRoot":"","sources":["../../src/components/VariantMatrixVersionPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Wave 4 I1 — Generic webhook notify panel.
3
+ *
4
+ * Companion to the I3 {@link SlackNotifyPanel} (Wave 4 PR-11). Where
5
+ * I3 targets a single integration (Slack incoming webhooks) with a
6
+ * canned message template per event, I1 is the generic catch-all —
7
+ * the host wires any outbound HTTP integration (Zapier, n8n, GitHub
8
+ * Actions repository_dispatch, internal worker queues, custom tenant
9
+ * endpoints) by supplying a {@link WebhookNotifyFn} adapter and the
10
+ * panel emits a typed {@link WebhookNotificationEvent} payload.
11
+ *
12
+ * The wire shape is intentionally structured rather than free-form
13
+ * text: downstream consumers can pattern-match on `kind` and read
14
+ * typed fields off `context`, rather than parsing English. Hosts that
15
+ * want a human-readable rendering on top of the structured payload
16
+ * wrap their own adapter.
17
+ *
18
+ * Pairs with the synergy `webhook.notify` workflow node when one is
19
+ * deployed; hosts running purely client-side `fetch()` calls wire a
20
+ * local adapter in the meantime.
21
+ *
22
+ * @public
23
+ */
24
+ import type { ReactElement } from "react";
25
+ /**
26
+ * The set of editor events the panel can emit. Mirrors
27
+ * {@link SlackNotificationEventKind} for cross-integration parity —
28
+ * the two panels respond to the same event vocabulary so a host can
29
+ * wire I1 + I3 against the same trigger list.
30
+ *
31
+ * @public
32
+ */
33
+ export type WebhookNotificationEventKind = "preflight-blocked" | "preflight-cleared" | "job-submitted" | "variant-approved" | "approval-requested" | "custom";
34
+ /**
35
+ * Context the host passes in alongside the chosen event. Mirrors
36
+ * {@link SlackNotificationContext} so a single host-side state object
37
+ * can feed both panels; the webhook payload preserves the structured
38
+ * fields rather than rendering them into a single text line.
39
+ *
40
+ * @public
41
+ */
42
+ export type WebhookNotificationContext = {
43
+ /** Human-readable document name. */
44
+ documentName?: string;
45
+ /** Stable identifier the host uses to link back to the document. */
46
+ documentId?: string;
47
+ /** Optional clickable URL the downstream consumer can use to jump
48
+ * straight into the editor. */
49
+ documentUrl?: string;
50
+ /** Preflight finding count (errors only for `"preflight-blocked"`,
51
+ * total resolved for `"preflight-cleared"`). */
52
+ findingCount?: number;
53
+ /** Variant id for `"variant-approved"`. */
54
+ variantId?: string;
55
+ /** Reviewer / submitter display name. */
56
+ actor?: string;
57
+ /** Free-form additional text — the panel surfaces an optional note
58
+ * input that populates this; downstream consumers may render it as
59
+ * a description / commit message / etc. */
60
+ text?: string;
61
+ };
62
+ /**
63
+ * Canonical structured payload the panel POSTs to the host adapter.
64
+ * The `kind` + `context` split keeps the wire shape pattern-matchable
65
+ * (no English-parsing required on the receiver) while leaving the
66
+ * envelope (`integration`, `sentAt`) free for routing.
67
+ *
68
+ * @public
69
+ */
70
+ export type WebhookNotificationEvent = {
71
+ /** Schema version — bump on breaking shape changes. */
72
+ schemaVersion: 1;
73
+ /** Event kind from {@link WebhookNotificationEventKind}. */
74
+ kind: WebhookNotificationEventKind;
75
+ /** Structured context — see {@link WebhookNotificationContext}. */
76
+ context: WebhookNotificationContext;
77
+ /** Optional integration identifier the host can use to route the
78
+ * event to one of many wired endpoints (e.g. `"zapier-main"`,
79
+ * `"github-actions-staging"`). When absent, the host adapter
80
+ * decides the default destination. */
81
+ integration?: string;
82
+ /** ISO 8601 timestamp the panel stamps at send time. */
83
+ sentAt: string;
84
+ };
85
+ /**
86
+ * Pure helper — composes a {@link WebhookNotificationEvent} from a
87
+ * kind + context + optional integration. Stamps `sentAt` to the
88
+ * passed-in `now()` so tests can pin the timestamp. Pure function;
89
+ * no I/O.
90
+ *
91
+ * @public
92
+ */
93
+ export declare function composeWebhookEvent(kind: WebhookNotificationEventKind, context: WebhookNotificationContext, options?: {
94
+ integration?: string;
95
+ now?: () => Date;
96
+ }): WebhookNotificationEvent;
97
+ /**
98
+ * Host adapter — POSTs the composed payload to the wired endpoint
99
+ * (typically via a server-side proxy or the synergy `webhook.notify`
100
+ * node). Resolves on accept; rejects on transport / validation
101
+ * errors and the panel surfaces the message inline.
102
+ *
103
+ * @public
104
+ */
105
+ export type WebhookNotifyFn = (event: WebhookNotificationEvent) => Promise<void>;
106
+ /**
107
+ * Human-readable labels for each event kind, in the order they appear
108
+ * in the dropdown. Mirrors {@link SlackNotifyPanel}'s label map so the
109
+ * two panels stay in lockstep.
110
+ *
111
+ * @public
112
+ */
113
+ export declare const WEBHOOK_NOTIFICATION_EVENT_LABELS: Readonly<Record<WebhookNotificationEventKind, string>>;
114
+ /**
115
+ * Configuration for the {@link WebhookNotifyPanel}.
116
+ *
117
+ * The host supplies the {@link WebhookNotifyFn} adapter, the typed
118
+ * {@link WebhookNotificationContext}, and (optionally) a list of
119
+ * integration ids that populate the panel's "Integration" dropdown.
120
+ * The panel handles event-kind selection, the optional free-form
121
+ * note, the send button state machine, and surfaces success / error
122
+ * inline.
123
+ *
124
+ * @public
125
+ */
126
+ export type WebhookNotifyPanelProps = {
127
+ /** Host adapter — see {@link WebhookNotifyFn}. */
128
+ notify: WebhookNotifyFn;
129
+ /** Typed context to bundle into the outgoing event. The host
130
+ * typically wires this from the active document. */
131
+ context: WebhookNotificationContext;
132
+ /** Optional initial event selection. Defaults to
133
+ * `"job-submitted"` — the most common webhook trigger across
134
+ * CI / queue / chat integrations. */
135
+ defaultEvent?: WebhookNotificationEventKind;
136
+ /** Optional list of integration ids the host has wired. Surfaces as
137
+ * a dropdown; when absent the panel omits the picker and the
138
+ * outgoing event has no `integration` field set. */
139
+ integrations?: readonly string[];
140
+ /** Optional initial integration selection. Must match one of
141
+ * `integrations`; when absent the first entry is selected. */
142
+ defaultIntegration?: string;
143
+ /** Optional mapper that turns a notify error into a user-facing
144
+ * message. The default avoids leaking internal `Error.message`
145
+ * strings; hosts that want richer surfaces pass their own mapper.
146
+ * The original error is still passed in so hosts can log it. */
147
+ errorMessage?: (err: unknown) => string;
148
+ /** Optional callback fired on successful notify so the host can
149
+ * show a confirmation toast / log analytics. */
150
+ onSuccess?: (event: WebhookNotificationEvent) => void;
151
+ };
152
+ /**
153
+ * Stateful panel — picks an event template + integration, lets the
154
+ * user append a custom note, composes the typed event via
155
+ * {@link composeWebhookEvent}, and POSTs through the host adapter.
156
+ *
157
+ * @public
158
+ */
159
+ export declare function WebhookNotifyPanel({ notify, context, defaultEvent, integrations, defaultIntegration, errorMessage, onSuccess, }: WebhookNotifyPanelProps): ReactElement;
160
+ //# sourceMappingURL=WebhookNotifyPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookNotifyPanel.d.ts","sourceRoot":"","sources":["../../src/components/WebhookNotifyPanel.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GACpC,mBAAmB,GACnB,mBAAmB,GACnB,eAAe,GACf,kBAAkB,GAClB,oBAAoB,GACpB,QAAQ,CAAC;AAEb;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;oCACgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;qDACiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;gDAE4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,uDAAuD;IACvD,aAAa,EAAE,CAAC,CAAC;IACjB,4DAA4D;IAC5D,IAAI,EAAE,4BAA4B,CAAC;IACnC,mEAAmE;IACnE,OAAO,EAAE,0BAA0B,CAAC;IACpC;;;2CAGuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,4BAA4B,EAClC,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GACnD,wBAAwB,CAS1B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CACtD,MAAM,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAQ7C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,kDAAkD;IAClD,MAAM,EAAE,eAAe,CAAC;IACxB;yDACqD;IACrD,OAAO,EAAE,0BAA0B,CAAC;IACpC;;0CAEsC;IACtC,YAAY,CAAC,EAAE,4BAA4B,CAAC;IAC5C;;yDAEqD;IACrD,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;mEAC+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;qEAGiE;IACjE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IACxC;qDACiD;IACjD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACvD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,GAAG,YAAY,CAgIxC"}
@@ -0,0 +1,100 @@
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 { useState } from "react";
5
+ /**
6
+ * Pure helper — composes a {@link WebhookNotificationEvent} from a
7
+ * kind + context + optional integration. Stamps `sentAt` to the
8
+ * passed-in `now()` so tests can pin the timestamp. Pure function;
9
+ * no I/O.
10
+ *
11
+ * @public
12
+ */
13
+ export function composeWebhookEvent(kind, context, options) {
14
+ const now = options?.now ?? (() => new Date());
15
+ return {
16
+ schemaVersion: 1,
17
+ kind,
18
+ context,
19
+ ...(options?.integration && { integration: options.integration }),
20
+ sentAt: now().toISOString(),
21
+ };
22
+ }
23
+ /**
24
+ * Human-readable labels for each event kind, in the order they appear
25
+ * in the dropdown. Mirrors {@link SlackNotifyPanel}'s label map so the
26
+ * two panels stay in lockstep.
27
+ *
28
+ * @public
29
+ */
30
+ export const WEBHOOK_NOTIFICATION_EVENT_LABELS = {
31
+ "preflight-blocked": "Preflight blocked",
32
+ "preflight-cleared": "Preflight cleared",
33
+ "job-submitted": "Job submitted",
34
+ "variant-approved": "Variant approved",
35
+ "approval-requested": "Approval requested",
36
+ custom: "Custom event",
37
+ };
38
+ /**
39
+ * Stateful panel — picks an event template + integration, lets the
40
+ * user append a custom note, composes the typed event via
41
+ * {@link composeWebhookEvent}, and POSTs through the host adapter.
42
+ *
43
+ * @public
44
+ */
45
+ export function WebhookNotifyPanel({ notify, context, defaultEvent, integrations, defaultIntegration, errorMessage, onSuccess, }) {
46
+ const [event, setEvent] = useState(defaultEvent ?? "job-submitted");
47
+ // Validate `defaultIntegration` against the wired list — a host-supplied
48
+ // default that isn't in `integrations` would otherwise quietly ship as
49
+ // the outgoing event's `integration` field even though the user can't
50
+ // see / change it in the dropdown.
51
+ const [integration, setIntegration] = useState(() => {
52
+ if (defaultIntegration && integrations?.includes(defaultIntegration)) {
53
+ return defaultIntegration;
54
+ }
55
+ return integrations?.[0] ?? "";
56
+ });
57
+ const [note, setNote] = useState("");
58
+ const [state, setState] = useState({ kind: "idle" });
59
+ // Clear the success / error chip when the user edits any input —
60
+ // a "Sent" indicator next to an unsent payload reads as a lie.
61
+ const resetOutcome = () => {
62
+ setState((prev) => (prev.kind === "ok" || prev.kind === "error" ? { kind: "idle" } : prev));
63
+ };
64
+ const onClick = async () => {
65
+ setState({ kind: "sending" });
66
+ const payload = composeWebhookEvent(event, {
67
+ ...context,
68
+ ...(note.trim() && { text: note }),
69
+ }, integration ? { integration } : undefined);
70
+ try {
71
+ await notify(payload);
72
+ setState({ kind: "ok" });
73
+ onSuccess?.(payload);
74
+ }
75
+ catch (err) {
76
+ // Guard against a host-supplied errorMessage that throws.
77
+ let message = "Couldn't send webhook notification.";
78
+ if (errorMessage) {
79
+ try {
80
+ message = errorMessage(err);
81
+ }
82
+ catch {
83
+ // fall back to the default
84
+ }
85
+ }
86
+ setState({ kind: "error", message });
87
+ }
88
+ };
89
+ return (_jsxs("div", { "data-testid": "webhook-notify-panel", style: { padding: "0.5rem" }, children: [_jsx("header", { style: { marginBottom: "0.5rem" }, children: _jsx("h3", { style: { margin: 0, fontSize: "0.875rem" }, children: "Webhook notify" }) }), _jsxs("label", { style: { display: "block", fontSize: "0.75rem", marginBottom: "0.5rem" }, children: ["Event", _jsx("select", { "aria-label": "Event", value: event, onChange: (e) => {
90
+ setEvent(e.target.value);
91
+ resetOutcome();
92
+ }, style: { display: "block", marginTop: "0.125rem", width: "100%" }, children: Object.entries(WEBHOOK_NOTIFICATION_EVENT_LABELS).map(([k, label]) => (_jsx("option", { value: k, children: label }, k))) })] }), integrations && integrations.length > 0 && (_jsxs("label", { style: { display: "block", fontSize: "0.75rem", marginBottom: "0.5rem" }, children: ["Integration", _jsx("select", { "aria-label": "Integration", value: integration, onChange: (e) => {
93
+ setIntegration(e.target.value);
94
+ resetOutcome();
95
+ }, style: { display: "block", marginTop: "0.125rem", width: "100%" }, children: integrations.map((id) => (_jsx("option", { value: id, children: id }, id))) })] })), _jsxs("label", { style: { display: "block", fontSize: "0.75rem", marginBottom: "0.5rem" }, children: ["Note", _jsx("textarea", { "aria-label": "Note", placeholder: "Optional \u2014 included as context.text", value: note, onChange: (e) => {
96
+ setNote(e.target.value);
97
+ resetOutcome();
98
+ }, rows: 2, style: { display: "block", marginTop: "0.125rem", width: "100%" } })] }), _jsxs("div", { style: { display: "flex", gap: "0.5rem", alignItems: "center" }, children: [_jsx("button", { type: "button", onClick: onClick, disabled: state.kind === "sending", "aria-busy": state.kind === "sending", children: state.kind === "sending" ? "Sending…" : "Send webhook" }), state.kind === "ok" && (_jsx("output", { style: { color: "#080", fontSize: "0.75rem" }, children: "Sent" })), state.kind === "error" && (_jsx("span", { role: "alert", style: { color: "#a00", fontSize: "0.75rem" }, children: state.message }))] })] }));
99
+ }
100
+ //# sourceMappingURL=WebhookNotifyPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookNotifyPanel.js","sourceRoot":"","sources":["../../src/components/WebhookNotifyPanel.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AA2Bb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAuEjC;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAkC,EAClC,OAAmC,EACnC,OAAoD;IAEpD,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;KAC5B,CAAC;AACJ,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAE1C;IACF,mBAAmB,EAAE,mBAAmB;IACxC,mBAAmB,EAAE,mBAAmB;IACxC,eAAe,EAAE,eAAe;IAChC,kBAAkB,EAAE,kBAAkB;IACtC,oBAAoB,EAAE,oBAAoB;IAC1C,MAAM,EAAE,cAAc;CACvB,CAAC;AAyCF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,SAAS,GACe;IACxB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA+B,YAAY,IAAI,eAAe,CAAC,CAAC;IAClG,yEAAyE;IACzE,uEAAuE;IACvE,sEAAsE;IACtE,mCAAmC;IACnC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,GAAG,EAAE;QAC1D,IAAI,kBAAkB,IAAI,YAAY,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACrE,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAEhC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEpB,iEAAiE;IACjE,+DAA+D;IAC/D,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,mBAAmB,CACjC,KAAK,EACL;YACE,GAAG,OAAO;YACV,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACnC,EACD,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAC1C,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzB,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0DAA0D;YAC1D,IAAI,OAAO,GAAG,qCAAqC,CAAC;YACpD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC9B,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,8BAAiB,sBAAsB,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,aAClE,iBAAQ,KAAK,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,YACvC,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,+BAAqB,GAC5D,EACT,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,sBAE7E,+BACa,OAAO,EAClB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAqC,CAAC,CAAC;4BACzD,YAAY,EAAE,CAAC;wBACjB,CAAC,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAEhE,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACrE,iBAAgB,KAAK,EAAE,CAAC,YACrB,KAAK,IADK,CAAC,CAEL,CACV,CAAC,GACK,IACH,EACP,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1C,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,4BAE7E,+BACa,aAAa,EACxB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BAC/B,YAAY,EAAE,CAAC;wBACjB,CAAC,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAEhE,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACxB,iBAAiB,KAAK,EAAE,EAAE,YACvB,EAAE,IADQ,EAAE,CAEN,CACV,CAAC,GACK,IACH,CACT,EACD,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,qBAE7E,iCACa,MAAM,EACjB,WAAW,EAAC,0CAAqC,EACjD,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BACxB,YAAY,EAAE,CAAC;wBACjB,CAAC,EACD,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GACjE,IACI,EACR,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAClE,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS,eACvB,KAAK,CAAC,IAAI,KAAK,SAAS,YAElC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,GAChD,EACR,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CACtB,iBAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAe,CACrE,EACA,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,CACzB,eAAM,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAC7D,KAAK,CAAC,OAAO,GACT,CACR,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Wave 3 C2 — White / underbase auto-generation panel.
3
+ *
4
+ * Many packaging substrates (foils, dark plastics, kraft) require an
5
+ * opaque white layer printed *under* the CMYK / spots so the
6
+ * subsequent ink lays down with the colour the designer specified
7
+ * rather than being tinted by the substrate. Manually authoring this
8
+ * separation is tedious and error-prone — C2 asks compile-pdf's
9
+ * `white_underbase` producer to compute the union of CMYK fill
10
+ * coverage on the page and emit a new `White` separation matching
11
+ * that union, optionally choked inward by a small amount so the
12
+ * white doesn't peek out from underneath the chromatic ink.
13
+ *
14
+ * Pure-adapter design (same shape as the rest of the AI / I family
15
+ * panels): the host wires a {@link WhiteUnderbaseGeneratorFn} that
16
+ * fronts the producer; the panel owns config inputs and lifecycle
17
+ * state.
18
+ *
19
+ * @public
20
+ */
21
+ import type { ReactElement } from "react";
22
+ /**
23
+ * Spec for one underbase-generation request. Mirrors the
24
+ * `WhiteUnderbaseOptions` shape on compile-pdf's
25
+ * `/v1/white-underbase/apply` endpoint so a host can pass the value
26
+ * straight through.
27
+ *
28
+ * @public
29
+ */
30
+ export type WhiteUnderbaseSpec = {
31
+ /** Name to assign the new separation. Default `"White"`. */
32
+ separationName: string;
33
+ /** Opacity of the underbase (0..1). 1 = solid white. */
34
+ opacity: number;
35
+ /** Distance (in mm) to choke the white inward from the chromatic
36
+ * ink edges. Prevents the white from peeking out around the
37
+ * printed colour. 0 = no choke. */
38
+ chokeMm: number;
39
+ /** How the underbase relates to overlapping chromatic ink:
40
+ * - `solid` — white covers the entire chromatic region (default)
41
+ * - `subtract-cmyk` — white opacity is scaled down where CMYK
42
+ * coverage approaches 100% (lighter inks need less underbase) */
43
+ knockoutMode: "solid" | "subtract-cmyk";
44
+ };
45
+ /**
46
+ * Default spec values — sensible for the most common case
47
+ * (white-ink underbase on dark substrate, no choke).
48
+ *
49
+ * @public
50
+ */
51
+ export declare const DEFAULT_WHITE_UNDERBASE_SPEC: WhiteUnderbaseSpec;
52
+ /**
53
+ * Result returned by the host generator. The host typically wires
54
+ * this to `CompilePdfClient.whiteUnderbase()` which calls
55
+ * `/v1/white-underbase/apply` and returns the producer's
56
+ * `separation_name` + `coverage_pct` fields.
57
+ *
58
+ * @public
59
+ */
60
+ export type WhiteUnderbaseResult = {
61
+ separationName: string;
62
+ /** Percentage of the page area covered by the new underbase
63
+ * separation. Useful as a sanity check (e.g. > 95 % suggests the
64
+ * page is mostly chromatic — review the choke). */
65
+ coveragePct: number;
66
+ };
67
+ /**
68
+ * Host adapter — generates the white underbase for the active
69
+ * document. Rejects on transport / validation errors and the panel
70
+ * surfaces the message inline.
71
+ *
72
+ * @public
73
+ */
74
+ export type WhiteUnderbaseGeneratorFn = (spec: WhiteUnderbaseSpec) => Promise<WhiteUnderbaseResult>;
75
+ /**
76
+ * Pure helper — validates a spec. Returns the first error message
77
+ * encountered or `null` when the spec is valid. Hosts can call this
78
+ * to disable the "Generate" button preemptively. Pure function.
79
+ *
80
+ * @public
81
+ */
82
+ export declare function validateWhiteUnderbaseSpec(spec: WhiteUnderbaseSpec): string | null;
83
+ /**
84
+ * Configuration for the {@link WhiteUnderbasePanel}.
85
+ *
86
+ * @public
87
+ */
88
+ export type WhiteUnderbasePanelProps = {
89
+ /** Initial spec values — `DEFAULT_WHITE_UNDERBASE_SPEC` if absent. */
90
+ initialSpec?: Partial<WhiteUnderbaseSpec>;
91
+ /** Generator adapter — when absent, the panel renders in
92
+ * read-only mode (config inputs disabled). Useful when the host
93
+ * wants to surface the controls but defer the network wire. */
94
+ generator?: WhiteUnderbaseGeneratorFn;
95
+ /** Fired after a successful generation — typically used to refresh
96
+ * the editor's separations registry / inks panel. */
97
+ onGenerated?: (result: WhiteUnderbaseResult) => void;
98
+ };
99
+ /**
100
+ * Stateful panel — exposes inputs for every {@link WhiteUnderbaseSpec}
101
+ * field, dispatches the generator, and surfaces the result chip /
102
+ * inline error. Handles loading, validation, and success states.
103
+ *
104
+ * @public
105
+ */
106
+ export declare function WhiteUnderbasePanel({ initialSpec, generator, onGenerated, }: WhiteUnderbasePanelProps): ReactElement;
107
+ //# sourceMappingURL=WhiteUnderbasePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WhiteUnderbasePanel.d.ts","sourceRoot":"","sources":["../../src/components/WhiteUnderbasePanel.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4DAA4D;IAC5D,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB;;wCAEoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB;;;wEAGoE;IACpE,YAAY,EAAE,OAAO,GAAG,eAAe,CAAC;CACzC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,EAAE,kBAK1C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;;wDAEoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,IAAI,EAAE,kBAAkB,KACrB,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAalF;AAED;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1C;;oEAEgE;IAChE,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC;0DACsD;IACtD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,YAAY,CAyIzC"}