@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,169 @@
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
+ /**
5
+ * Wave 3 G1 — Nutrition Facts label generator.
6
+ *
7
+ * The FDA Nutrition Facts label (21 CFR §101.9, 2016 revision) has a
8
+ * highly-regulated layout: serving size + servings per container at
9
+ * the top, Calories in 22-pt bold, then a fixed-order list of
10
+ * nutrients with their amounts + % Daily Value. The panel handles
11
+ * data entry; the {@link composeNutritionFacts} helper turns the
12
+ * typed data into an ordered list of rows the host renders into the
13
+ * canvas (text + bold flags + indentation level) — keeping the
14
+ * editor free of any specific PDF text-layout backend and letting
15
+ * server renderers (compile-pdf, codex-pdf) own the canonical typesetting.
16
+ *
17
+ * Daily Value % is computed from the 2016 FDA Reference Daily Intake
18
+ * (RDI) / Daily Reference Value (DRV) tables; values are widely
19
+ * published and trademark-free.
20
+ *
21
+ * @public
22
+ */
23
+ import { useState } from "react";
24
+ /**
25
+ * 2016 FDA Daily Reference Values (DRV) and Reference Daily Intakes
26
+ * (RDI) used to compute the % Daily Value column. Public-domain
27
+ * regulatory data — re-exported so server renderers can use the
28
+ * same constants and stay in sync.
29
+ *
30
+ * @public
31
+ */
32
+ export const FDA_DAILY_VALUES = {
33
+ totalFatG: 78,
34
+ saturatedFatG: 20,
35
+ cholesterolMg: 300,
36
+ sodiumMg: 2300,
37
+ totalCarbohydrateG: 275,
38
+ dietaryFiberG: 28,
39
+ addedSugarsG: 50,
40
+ vitaminDMcg: 20,
41
+ calciumMg: 1300,
42
+ ironMg: 18,
43
+ potassiumMg: 4700,
44
+ };
45
+ function dvPct(amount, dv) {
46
+ if (dv === undefined || dv <= 0)
47
+ return undefined;
48
+ return Math.round((amount / dv) * 100);
49
+ }
50
+ /**
51
+ * Build a {@link NutritionRow}, omitting the `dvPct` key entirely
52
+ * when no DV is defined. Required because `dvPct` is declared as an
53
+ * optional property under `exactOptionalPropertyTypes`; assigning
54
+ * `dvPct: undefined` does not satisfy the type, so the helper
55
+ * branches the object shape.
56
+ */
57
+ function row(label, amount, pct, indent, bold) {
58
+ return pct !== undefined
59
+ ? { label, amount, dvPct: pct, indent, bold }
60
+ : { label, amount, indent, bold };
61
+ }
62
+ /**
63
+ * Compose the ordered row list for an FDA-style Nutrition Facts
64
+ * panel from a {@link NutritionFacts} record. Pure function —
65
+ * exported so RSC / Astro-frontmatter callers can pre-compute the
66
+ * spec without bundling the panel.
67
+ *
68
+ * Row order matches §101.9(c) exactly: Total Fat, Saturated Fat,
69
+ * Trans Fat, Cholesterol, Sodium, Total Carbohydrate, Dietary
70
+ * Fiber, Total Sugars, Added Sugars, Protein, then the
71
+ * micronutrient block (Vitamin D, Calcium, Iron, Potassium).
72
+ *
73
+ * @public
74
+ */
75
+ export function composeNutritionFacts(facts) {
76
+ const rows = [
77
+ row("Total Fat", `${facts.totalFatG}g`, dvPct(facts.totalFatG, FDA_DAILY_VALUES.totalFatG), 0, true),
78
+ row("Saturated Fat", `${facts.saturatedFatG}g`, dvPct(facts.saturatedFatG, FDA_DAILY_VALUES.saturatedFatG), 1, false),
79
+ row("Trans Fat", `${facts.transFatG}g`, undefined, 1, false),
80
+ row("Cholesterol", `${facts.cholesterolMg}mg`, dvPct(facts.cholesterolMg, FDA_DAILY_VALUES.cholesterolMg), 0, true),
81
+ row("Sodium", `${facts.sodiumMg}mg`, dvPct(facts.sodiumMg, FDA_DAILY_VALUES.sodiumMg), 0, true),
82
+ row("Total Carbohydrate", `${facts.totalCarbohydrateG}g`, dvPct(facts.totalCarbohydrateG, FDA_DAILY_VALUES.totalCarbohydrateG), 0, true),
83
+ row("Dietary Fiber", `${facts.dietaryFiberG}g`, dvPct(facts.dietaryFiberG, FDA_DAILY_VALUES.dietaryFiberG), 1, false),
84
+ row("Total Sugars", `${facts.totalSugarsG}g`, undefined, 1, false),
85
+ ];
86
+ if (facts.addedSugarsG !== undefined) {
87
+ rows.push(row("Includes Added Sugars", `${facts.addedSugarsG}g`, dvPct(facts.addedSugarsG, FDA_DAILY_VALUES.addedSugarsG), 1, false));
88
+ }
89
+ rows.push(row("Protein", `${facts.proteinG}g`, undefined, 0, true));
90
+ if (facts.vitaminDMcg !== undefined) {
91
+ rows.push(row("Vitamin D", `${facts.vitaminDMcg}mcg`, dvPct(facts.vitaminDMcg, FDA_DAILY_VALUES.vitaminDMcg), 0, false));
92
+ }
93
+ if (facts.calciumMg !== undefined) {
94
+ rows.push(row("Calcium", `${facts.calciumMg}mg`, dvPct(facts.calciumMg, FDA_DAILY_VALUES.calciumMg), 0, false));
95
+ }
96
+ if (facts.ironMg !== undefined) {
97
+ rows.push(row("Iron", `${facts.ironMg}mg`, dvPct(facts.ironMg, FDA_DAILY_VALUES.ironMg), 0, false));
98
+ }
99
+ if (facts.potassiumMg !== undefined) {
100
+ rows.push(row("Potassium", `${facts.potassiumMg}mg`, dvPct(facts.potassiumMg, FDA_DAILY_VALUES.potassiumMg), 0, false));
101
+ }
102
+ return {
103
+ servingSize: facts.servingSize,
104
+ servingsLine: `${facts.servingsPerContainer} servings per container`,
105
+ caloriesLine: `Calories ${facts.calories}`,
106
+ rows,
107
+ };
108
+ }
109
+ // Required-field defaults only. Optional nutrients (Added Sugars,
110
+ // Vitamin D, Calcium, Iron, Potassium) are intentionally left absent
111
+ // so hosts that don't want those rows aren't forced to pass
112
+ // `undefined` overrides — `composeNutritionFacts` already omits any
113
+ // optional field that's not set.
114
+ const DEFAULT_FACTS = {
115
+ servingSize: "1 cup (240g)",
116
+ servingsPerContainer: 4,
117
+ calories: 230,
118
+ totalFatG: 8,
119
+ saturatedFatG: 1,
120
+ transFatG: 0,
121
+ cholesterolMg: 0,
122
+ sodiumMg: 160,
123
+ totalCarbohydrateG: 37,
124
+ dietaryFiberG: 4,
125
+ totalSugarsG: 12,
126
+ proteinG: 3,
127
+ };
128
+ const OPTIONAL_NUTRITION_KEYS = new Set([
129
+ "addedSugarsG",
130
+ "vitaminDMcg",
131
+ "calciumMg",
132
+ "ironMg",
133
+ "potassiumMg",
134
+ ]);
135
+ /**
136
+ * Nutrition Facts data-entry panel. Surfaces the FDA panel's
137
+ * mandatory fields (serving size, servings, calories, macros) plus
138
+ * the optional micronutrient block. Click **Compose** and the host
139
+ * receives the resolved {@link NutritionPanelSpec} via `onCompose`.
140
+ *
141
+ * @public
142
+ */
143
+ export function NutritionPanel({ initialFacts, onCompose }) {
144
+ const [facts, setFacts] = useState({ ...DEFAULT_FACTS, ...initialFacts });
145
+ function setNum(key, value) {
146
+ setFacts((f) => ({ ...f, [key]: value }));
147
+ }
148
+ function clearOptional(key) {
149
+ setFacts((f) => {
150
+ const { [key]: _dropped, ...rest } = f;
151
+ return rest;
152
+ });
153
+ }
154
+ function numInput(label, key, unit) {
155
+ const isOptional = OPTIONAL_NUTRITION_KEYS.has(key);
156
+ const current = facts[key];
157
+ return (_jsxs("label", { style: { display: "block", marginBottom: "0.25rem" }, children: [label, _jsx("input", { type: "number", value: current ?? "", onChange: (e) => {
158
+ const raw = e.target.value;
159
+ if (isOptional && raw === "") {
160
+ clearOptional(key);
161
+ return;
162
+ }
163
+ const v = Number(raw);
164
+ setNum(key, (Number.isNaN(v) ? 0 : v));
165
+ }, "aria-label": label, style: { marginLeft: "0.5rem", width: "5em" } }), " ", unit] }));
166
+ }
167
+ return (_jsxs("div", { "data-testid": "nutrition-panel", style: { padding: "0.5rem", maxWidth: "24em" }, children: [_jsx("h3", { style: { margin: "0 0 0.5rem 0" }, children: "Nutrition Facts" }), _jsxs("label", { style: { display: "block", marginBottom: "0.5rem" }, children: ["Serving size", _jsx("input", { type: "text", value: facts.servingSize, onChange: (e) => setFacts((f) => ({ ...f, servingSize: e.target.value })), "aria-label": "Serving size", style: { marginLeft: "0.5rem", width: "14em" } })] }), numInput("Servings per container", "servingsPerContainer", ""), numInput("Calories", "calories", "kcal"), numInput("Total Fat", "totalFatG", "g"), numInput("Saturated Fat", "saturatedFatG", "g"), numInput("Trans Fat", "transFatG", "g"), numInput("Cholesterol", "cholesterolMg", "mg"), numInput("Sodium", "sodiumMg", "mg"), numInput("Total Carbohydrate", "totalCarbohydrateG", "g"), numInput("Dietary Fiber", "dietaryFiberG", "g"), numInput("Total Sugars", "totalSugarsG", "g"), numInput("Added Sugars (optional, leave blank to omit)", "addedSugarsG", "g"), numInput("Protein", "proteinG", "g"), numInput("Vitamin D (optional)", "vitaminDMcg", "mcg"), numInput("Calcium (optional)", "calciumMg", "mg"), numInput("Iron (optional)", "ironMg", "mg"), numInput("Potassium (optional)", "potassiumMg", "mg"), _jsx("button", { type: "button", onClick: () => onCompose(composeNutritionFacts(facts)), style: { padding: "0.4rem 0.8rem", marginTop: "0.5rem" }, children: "Compose" })] }));
168
+ }
169
+ //# sourceMappingURL=NutritionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NutritionPanel.js","sourceRoot":"","sources":["../../src/components/NutritionPanel.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AAEb;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAkCjC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,GAAG;IAClB,QAAQ,EAAE,IAAI;IACd,kBAAkB,EAAE,GAAG;IACvB,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,IAAI;CACT,CAAC;AAkCX,SAAS,KAAK,CAAC,MAAc,EAAE,EAAsB;IACnD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,GAAG,CACV,KAAa,EACb,MAAc,EACd,GAAuB,EACvB,MAAa,EACb,IAAa;IAEb,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAC7C,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAqB;IACzD,MAAM,IAAI,GAAmB;QAC3B,GAAG,CACD,WAAW,EACX,GAAG,KAAK,CAAC,SAAS,GAAG,EACrB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAClD,CAAC,EACD,IAAI,CACL;QACD,GAAG,CACD,eAAe,EACf,GAAG,KAAK,CAAC,aAAa,GAAG,EACzB,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAC1D,CAAC,EACD,KAAK,CACN;QACD,GAAG,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC;QAC5D,GAAG,CACD,aAAa,EACb,GAAG,KAAK,CAAC,aAAa,IAAI,EAC1B,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAC1D,CAAC,EACD,IAAI,CACL;QACD,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC/F,GAAG,CACD,oBAAoB,EACpB,GAAG,KAAK,CAAC,kBAAkB,GAAG,EAC9B,KAAK,CAAC,KAAK,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,EACpE,CAAC,EACD,IAAI,CACL;QACD,GAAG,CACD,eAAe,EACf,GAAG,KAAK,CAAC,aAAa,GAAG,EACzB,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,gBAAgB,CAAC,aAAa,CAAC,EAC1D,CAAC,EACD,KAAK,CACN;QACD,GAAG,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,YAAY,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC;KACnE,CAAC;IACF,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CACP,GAAG,CACD,uBAAuB,EACvB,GAAG,KAAK,CAAC,YAAY,GAAG,EACxB,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,gBAAgB,CAAC,YAAY,CAAC,EACxD,CAAC,EACD,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CACP,GAAG,CACD,WAAW,EACX,GAAG,KAAK,CAAC,WAAW,KAAK,EACzB,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,EACtD,CAAC,EACD,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CACP,GAAG,CACD,SAAS,EACT,GAAG,KAAK,CAAC,SAAS,IAAI,EACtB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAClD,CAAC,EACD,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CACP,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CACzF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CACP,GAAG,CACD,WAAW,EACX,GAAG,KAAK,CAAC,WAAW,IAAI,EACxB,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC,EACtD,CAAC,EACD,KAAK,CACN,CACF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,GAAG,KAAK,CAAC,oBAAoB,yBAAyB;QACpE,YAAY,EAAE,YAAY,KAAK,CAAC,QAAQ,EAAE;QAC1C,IAAI;KACL,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,qEAAqE;AACrE,4DAA4D;AAC5D,oEAAoE;AACpE,iCAAiC;AACjC,MAAM,aAAa,GAAmB;IACpC,WAAW,EAAE,cAAc;IAC3B,oBAAoB,EAAE,CAAC;IACvB,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,CAAC;IAChB,QAAQ,EAAE,GAAG;IACb,kBAAkB,EAAE,EAAE;IACtB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAuB;IAC5D,cAAc;IACd,aAAa;IACb,WAAW;IACX,QAAQ;IACR,aAAa;CACd,CAAC,CAAC;AAeH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,YAAY,EAAE,SAAS,EAAuB;IAC7E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAiB,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;IAE1F,SAAS,MAAM,CAAiC,GAAM,EAAE,KAAwB;QAC9E,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS,aAAa,CAAiC,GAAM;QAC3D,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;YACb,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO,IAAsB,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,QAAQ,CAAiC,KAAa,EAAE,GAAM,EAAE,IAAY;QACnF,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAuB,CAAC;QACjD,OAAO,CACL,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aACxD,KAAK,EACN,gBACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,OAAO,IAAI,EAAE,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wBACd,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC3B,IAAI,UAAU,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;4BAC7B,aAAa,CAAC,GAAG,CAAC,CAAC;4BACnB,OAAO;wBACT,CAAC;wBACD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;wBACtB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAsB,CAAC,CAAC;oBAC9D,CAAC,gBACW,KAAK,EACjB,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,GAC7C,EAAC,GAAG,EACL,IAAI,IACC,CACT,CAAC;IACJ,CAAC;IAED,OAAO,CACL,8BAAiB,iBAAiB,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAC/E,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,gCAAsB,EAC3D,iBAAO,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,6BAExD,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,CAAC,WAAW,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,gBAC9D,cAAc,EACzB,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAC9C,IACI,EACP,QAAQ,CAAC,wBAAwB,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAC9D,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EACxC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,EACvC,QAAQ,CAAC,eAAe,EAAE,eAAe,EAAE,GAAG,CAAC,EAC/C,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,CAAC,EACvC,QAAQ,CAAC,aAAa,EAAE,eAAe,EAAE,IAAI,CAAC,EAC9C,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,EACpC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,GAAG,CAAC,EACzD,QAAQ,CAAC,eAAe,EAAE,eAAe,EAAE,GAAG,CAAC,EAC/C,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,GAAG,CAAC,EAC7C,QAAQ,CAAC,8CAA8C,EAAE,cAAc,EAAE,GAAG,CAAC,EAC7E,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,EACpC,QAAQ,CAAC,sBAAsB,EAAE,aAAa,EAAE,KAAK,CAAC,EACtD,QAAQ,CAAC,oBAAoB,EAAE,WAAW,EAAE,IAAI,CAAC,EACjD,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,EAAE,IAAI,CAAC,EAC3C,QAAQ,CAAC,sBAAsB,EAAE,aAAa,EAAE,IAAI,CAAC,EACtD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,EACtD,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAGjD,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -1 +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,2CAsLpB"}
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"}
@@ -9,7 +9,12 @@ const MUTED = "#888";
9
9
  export function PageNavigator({ pages, currentPageIndex, onSelect, onAddPage, onDeletePage, variant = "strip", }) {
10
10
  const canDelete = pages.length > 1 && onDeletePage !== undefined;
11
11
  if (variant === "stack") {
12
- return (_jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.2rem", padding: "0.4rem 0.65rem" }, children: [_jsx("div", { role: "tablist", "aria-label": "Pages", "aria-orientation": "vertical", style: { display: "flex", flexDirection: "column", gap: "0.2rem" }, children: pages.map((p, i) => {
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) => {
13
18
  const active = i === currentPageIndex;
14
19
  return (_jsxs("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": `Page ${i + 1}${p.name ? `: ${p.name}` : ""}`, onClick: () => onSelect(i), style: {
15
20
  display: "flex",
@@ -1 +1 @@
1
- {"version":3,"file":"PageNavigator.js","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PageNavigator.js","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { EditorConfig, PaletteId } from "../lib/editor-config";
2
+ /**
3
+ * Props for the desktop palette overflow menu.
4
+ *
5
+ * `panelVisibility` is the current state (absent / `true` entries
6
+ * render as visible; `false` as hidden). `onChange` receives the
7
+ * full next visibility object whenever the user toggles a row.
8
+ *
9
+ * `enable_palettes: false` collapses the entire menu off — hosts that
10
+ * don't want the overflow toggle UI omit this component altogether
11
+ * via `cfg.enable_palettes`. The mobile equivalent lives inside
12
+ * `MobileToolDrawer` as a "Panels" section.
13
+ *
14
+ * @public
15
+ */
16
+ export type PaletteManagerProps = {
17
+ config: EditorConfig;
18
+ panelVisibility: Partial<Record<PaletteId, boolean>>;
19
+ onChange: (next: Partial<Record<PaletteId, boolean>>) => void;
20
+ };
21
+ /**
22
+ * Desktop-only overflow menu for toggling palette visibility.
23
+ *
24
+ * Renders nothing when `cfg.enable_palettes` is false. Closes on
25
+ * outside-click and Escape; the toggle state is owned by the host
26
+ * via `onChange` so visibility can be persisted (host's localStorage,
27
+ * user-prefs API, etc.) and round-tripped on reload.
28
+ *
29
+ * @public
30
+ */
31
+ export declare function PaletteManager({ config, panelVisibility, onChange }: PaletteManagerProps): import("react/jsx-runtime").JSX.Element | null;
32
+ //# sourceMappingURL=PaletteManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteManager.d.ts","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGpE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAC/D,CAAC;AAQF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,mBAAmB,kDAsGxF"}
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-or-later
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { PALETTE_IDS, PALETTE_REGISTRY } from "../lib/palette-registry";
6
+ const PANEL_BG = "#1a0f08";
7
+ const BORDER = "#3d1a00";
8
+ const BRAND = "#fc5102";
9
+ const TEXT = "#f4ece6";
10
+ const MUTED = "#888";
11
+ /**
12
+ * Desktop-only overflow menu for toggling palette visibility.
13
+ *
14
+ * Renders nothing when `cfg.enable_palettes` is false. Closes on
15
+ * outside-click and Escape; the toggle state is owned by the host
16
+ * via `onChange` so visibility can be persisted (host's localStorage,
17
+ * user-prefs API, etc.) and round-tripped on reload.
18
+ *
19
+ * @public
20
+ */
21
+ export function PaletteManager({ config, panelVisibility, onChange }) {
22
+ const [open, setOpen] = useState(false);
23
+ const rootRef = useRef(null);
24
+ useEffect(() => {
25
+ if (!open)
26
+ return;
27
+ function handleOutside(e) {
28
+ if (!rootRef.current?.contains(e.target))
29
+ setOpen(false);
30
+ }
31
+ function handleEscape(e) {
32
+ if (e.key === "Escape")
33
+ setOpen(false);
34
+ }
35
+ document.addEventListener("mousedown", handleOutside);
36
+ document.addEventListener("keydown", handleEscape);
37
+ return () => {
38
+ document.removeEventListener("mousedown", handleOutside);
39
+ document.removeEventListener("keydown", handleEscape);
40
+ };
41
+ }, [open]);
42
+ if (config.enable_palettes === false)
43
+ return null;
44
+ function toggle(id) {
45
+ const current = panelVisibility[id] !== false;
46
+ onChange({ ...panelVisibility, [id]: !current });
47
+ }
48
+ return (_jsxs("div", { ref: rootRef, style: { position: "relative" }, children: [_jsx("button", { type: "button", onClick: () => setOpen((v) => !v), "aria-label": "Toggle palettes", "aria-haspopup": "menu", "aria-expanded": open, style: {
49
+ background: "transparent",
50
+ color: TEXT,
51
+ border: `1px solid ${BORDER}`,
52
+ borderRadius: 4,
53
+ padding: "0.35rem 0.65rem",
54
+ fontSize: "0.78rem",
55
+ fontWeight: 600,
56
+ cursor: "pointer",
57
+ fontFamily: "inherit",
58
+ }, children: "Panels \u25BE" }), open && (_jsx("div", { role: "menu", style: {
59
+ position: "absolute",
60
+ right: 0,
61
+ top: "calc(100% + 4px)",
62
+ background: PANEL_BG,
63
+ border: `1px solid ${BORDER}`,
64
+ borderRadius: 6,
65
+ padding: "0.35rem 0",
66
+ minWidth: 200,
67
+ zIndex: 50,
68
+ boxShadow: "0 8px 24px rgba(0,0,0,0.4)",
69
+ }, children: PALETTE_IDS.map((id) => {
70
+ const visible = panelVisibility[id] !== false;
71
+ const { label } = PALETTE_REGISTRY[id];
72
+ return (_jsxs("button", { type: "button", role: "menuitemcheckbox", "aria-checked": visible, onClick: () => toggle(id), style: {
73
+ display: "flex",
74
+ alignItems: "center",
75
+ justifyContent: "space-between",
76
+ gap: "0.5rem",
77
+ width: "100%",
78
+ padding: "0.45rem 0.85rem",
79
+ background: "transparent",
80
+ border: "none",
81
+ cursor: "pointer",
82
+ color: visible ? TEXT : MUTED,
83
+ fontSize: "0.85rem",
84
+ fontFamily: "inherit",
85
+ textAlign: "left",
86
+ }, children: [_jsx("span", { children: label }), _jsx("span", { style: { color: visible ? BRAND : MUTED, fontSize: "0.85rem" }, children: visible ? "✓" : "" })] }, id));
87
+ }) }))] }));
88
+ }
89
+ //# sourceMappingURL=PaletteManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteManager.js","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Wave 1 AI4 — Palette → spot conversion panel.
3
+ *
4
+ * Closes the Wave 1 AI family. AI2 {@link SmartSpotMatchPanel}
5
+ * answers "what's the nearest PANTONE for one user-picked color?";
6
+ * AI4 takes the inverse direction — given the palette already in the
7
+ * document (every distinct fill / stroke color on the active page),
8
+ * route each entry through a host-supplied matcher and let the user
9
+ * commit the best match into the spot registry in one click per row.
10
+ *
11
+ * Reuses AI2's {@link SpotMatchLoaderFn} adapter on purpose: a host
12
+ * that wires a ΔE matcher for AI2 gets AI4 for free, and the cache /
13
+ * rate-limit behaviour stays under one adapter.
14
+ *
15
+ * Pure helpers ({@link summarizePaletteCoverage}) live alongside so
16
+ * downstream consumers can render coverage metrics (% of palette
17
+ * matched, average ΔE, count of unmatched) without the panel.
18
+ *
19
+ * @public
20
+ */
21
+ import type { ReactElement } from "react";
22
+ import type { SpotMatch, SpotMatchLoaderFn } from "./SmartSpotMatchPanel";
23
+ /**
24
+ * One color entry in the document's palette, as the host provides it
25
+ * (the editor's separations registry already carries this shape per
26
+ * page). `usageCount` is informational — UIs sort by it to surface
27
+ * the highest-impact colors first.
28
+ *
29
+ * @public
30
+ */
31
+ export type PaletteColor = {
32
+ /** Stable identifier — the panel uses it as the React key. */
33
+ id: string;
34
+ /** Lower-cased hex string `#rrggbb` (canonical). */
35
+ hex: string;
36
+ /** Optional human-readable name (e.g., "Brand Blue"). */
37
+ name?: string;
38
+ /** Optional usage counter — number of canvas objects that touch
39
+ * this color. */
40
+ usageCount?: number;
41
+ };
42
+ /**
43
+ * One row in the conversion table — pairs a palette color with the
44
+ * best match returned from the loader. `status` discriminates the
45
+ * lifecycle: hosts render a spinner on `loading`, the best match on
46
+ * `matched`, the error message on `error`, and a "Convert" button on
47
+ * `idle` / `matched`.
48
+ *
49
+ * @public
50
+ */
51
+ export type PaletteToSpotRow = {
52
+ color: PaletteColor;
53
+ status: "idle" | "loading" | "matched" | "error";
54
+ bestMatch?: SpotMatch;
55
+ /** All loader-returned matches, sorted by ΔE. Hosts can surface
56
+ * alternates behind a disclosure. */
57
+ alternates?: readonly SpotMatch[];
58
+ errorMessage?: string;
59
+ };
60
+ /**
61
+ * Aggregate coverage summary returned by
62
+ * {@link summarizePaletteCoverage}.
63
+ *
64
+ * @public
65
+ */
66
+ export type PaletteCoverageSummary = {
67
+ totalColors: number;
68
+ matched: number;
69
+ unmatched: number;
70
+ /** Average ΔE across `matched` rows. `null` when none matched. */
71
+ averageDeltaE: number | null;
72
+ /** Worst ΔE across `matched` rows. `null` when none matched. */
73
+ worstDeltaE: number | null;
74
+ };
75
+ /**
76
+ * Pure helper — summarizes a list of conversion rows. Pure function;
77
+ * no I/O.
78
+ *
79
+ * @public
80
+ */
81
+ export declare function summarizePaletteCoverage(rows: readonly PaletteToSpotRow[]): PaletteCoverageSummary;
82
+ /**
83
+ * Host adapter — commits a matched spot into the host's spot
84
+ * registry (the editor's per-page `separations-registry` for the
85
+ * canonical case). Resolves once the registry write completes; the
86
+ * panel surfaces errors inline.
87
+ *
88
+ * @public
89
+ */
90
+ export type SpotCommitFn = (color: PaletteColor, match: SpotMatch) => Promise<void>;
91
+ /**
92
+ * Configuration for the {@link PaletteToSpotPanel}.
93
+ *
94
+ * @public
95
+ */
96
+ export type PaletteToSpotPanelProps = {
97
+ /** The colors to convert. Typically `getSeparations(activePage)`
98
+ * mapped into {@link PaletteColor} shape. */
99
+ colors: readonly PaletteColor[];
100
+ /** Match adapter — same shape as {@link SmartSpotMatchPanel}'s
101
+ * loader, so one matcher wire serves both AI2 + AI4. Called once
102
+ * per palette color when the user clicks "Match all" or hits the
103
+ * per-row "Match" button. */
104
+ matchLoader: SpotMatchLoaderFn;
105
+ /** Optional commit adapter — when provided, each row gains a
106
+ * "Convert" button that fires `onCommit`. Absent → conversion is
107
+ * read-only (host wires its own commit flow). */
108
+ onCommit?: SpotCommitFn;
109
+ /** Optional mapper that turns a loader error into a user-facing
110
+ * message. The default avoids leaking internal `Error.message`. */
111
+ errorMessage?: (err: unknown) => string;
112
+ };
113
+ /**
114
+ * Stateful panel — renders the palette as a table, dispatches the
115
+ * host matcher per row (lazily on "Match" click or eagerly via the
116
+ * "Match all" affordance), and surfaces coverage metrics in the
117
+ * footer.
118
+ *
119
+ * @public
120
+ */
121
+ export declare function PaletteToSpotPanel({ colors, matchLoader, onCommit, errorMessage, }: PaletteToSpotPanelProps): ReactElement;
122
+ //# sourceMappingURL=PaletteToSpotPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteToSpotPanel.d.ts","sourceRoot":"","sources":["../../src/components/PaletteToSpotPanel.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;sBACkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;0CACsC;IACtC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gEAAgE;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAChC,sBAAsB,CAkBxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;kDAC8C;IAC9C,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC;;;kCAG8B;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B;;sDAEkD;IAClD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;wEACoE;IACpE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,WAAW,EACX,QAAQ,EACR,YAAY,GACb,EAAE,uBAAuB,GAAG,YAAY,CA2KxC"}