@printwithsynergy/artwork-pdf-editor 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +62 -0
- package/dist/components/AccessibilityHintsPanel.d.ts +142 -0
- package/dist/components/AccessibilityHintsPanel.d.ts.map +1 -0
- package/dist/components/AccessibilityHintsPanel.js +158 -0
- package/dist/components/AccessibilityHintsPanel.js.map +1 -0
- package/dist/components/AnnotationOverlay.d.ts +142 -0
- package/dist/components/AnnotationOverlay.d.ts.map +1 -0
- package/dist/components/AnnotationOverlay.js +141 -0
- package/dist/components/AnnotationOverlay.js.map +1 -0
- package/dist/components/AnnotationsSidebar.d.ts +98 -0
- package/dist/components/AnnotationsSidebar.d.ts.map +1 -0
- package/dist/components/AnnotationsSidebar.js +100 -0
- package/dist/components/AnnotationsSidebar.js.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts +58 -0
- package/dist/components/BarcodeGeneratorPanel.d.ts.map +1 -0
- package/dist/components/BarcodeGeneratorPanel.js +91 -0
- package/dist/components/BarcodeGeneratorPanel.js.map +1 -0
- package/dist/components/BraillePanel.d.ts +99 -0
- package/dist/components/BraillePanel.d.ts.map +1 -0
- package/dist/components/BraillePanel.js +221 -0
- package/dist/components/BraillePanel.js.map +1 -0
- package/dist/components/BrandAssetsPanel.d.ts +130 -0
- package/dist/components/BrandAssetsPanel.d.ts.map +1 -0
- package/dist/components/BrandAssetsPanel.js +125 -0
- package/dist/components/BrandAssetsPanel.js.map +1 -0
- package/dist/components/BrandConsistencyPanel.d.ts +140 -0
- package/dist/components/BrandConsistencyPanel.d.ts.map +1 -0
- package/dist/components/BrandConsistencyPanel.js +158 -0
- package/dist/components/BrandConsistencyPanel.js.map +1 -0
- package/dist/components/ComplianceFindingsPanel.d.ts +62 -0
- package/dist/components/ComplianceFindingsPanel.d.ts.map +1 -0
- package/dist/components/ComplianceFindingsPanel.js +118 -0
- package/dist/components/ComplianceFindingsPanel.js.map +1 -0
- package/dist/components/DesignSuggestionsPanel.d.ts +148 -0
- package/dist/components/DesignSuggestionsPanel.d.ts.map +1 -0
- package/dist/components/DesignSuggestionsPanel.js +154 -0
- package/dist/components/DesignSuggestionsPanel.js.map +1 -0
- package/dist/components/DielineParametersPanel.d.ts +62 -0
- package/dist/components/DielineParametersPanel.d.ts.map +1 -0
- package/dist/components/DielineParametersPanel.js +170 -0
- package/dist/components/DielineParametersPanel.js.map +1 -0
- package/dist/components/DielinePreview.d.ts +150 -0
- package/dist/components/DielinePreview.d.ts.map +1 -0
- package/dist/components/DielinePreview.js +146 -0
- package/dist/components/DielinePreview.js.map +1 -0
- package/dist/components/EditorApp.d.ts +18 -3
- package/dist/components/EditorApp.d.ts.map +1 -1
- package/dist/components/EditorApp.js +42 -7
- package/dist/components/EditorApp.js.map +1 -1
- package/dist/components/EditorCanvas.d.ts +31 -2
- package/dist/components/EditorCanvas.d.ts.map +1 -1
- package/dist/components/EditorCanvas.js +97 -16
- package/dist/components/EditorCanvas.js.map +1 -1
- package/dist/components/EmailNotifyPanel.d.ts +165 -0
- package/dist/components/EmailNotifyPanel.d.ts.map +1 -0
- package/dist/components/EmailNotifyPanel.js +211 -0
- package/dist/components/EmailNotifyPanel.js.map +1 -0
- package/dist/components/FileDropZone.d.ts +9 -1
- package/dist/components/FileDropZone.d.ts.map +1 -1
- package/dist/components/FileDropZone.js +53 -5
- package/dist/components/FileDropZone.js.map +1 -1
- package/dist/components/FoldEditorPanel.d.ts +68 -0
- package/dist/components/FoldEditorPanel.d.ts.map +1 -0
- package/dist/components/FoldEditorPanel.js +65 -0
- package/dist/components/FoldEditorPanel.js.map +1 -0
- package/dist/components/FoldPreviewOverlay.d.ts +48 -0
- package/dist/components/FoldPreviewOverlay.d.ts.map +1 -0
- package/dist/components/FoldPreviewOverlay.js +182 -0
- package/dist/components/FoldPreviewOverlay.js.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts +103 -0
- package/dist/components/Gs1DigitalLinkPanel.d.ts.map +1 -0
- package/dist/components/Gs1DigitalLinkPanel.js +199 -0
- package/dist/components/Gs1DigitalLinkPanel.js.map +1 -0
- package/dist/components/HistoryPanel.d.ts +39 -0
- package/dist/components/HistoryPanel.d.ts.map +1 -0
- package/dist/components/HistoryPanel.js +72 -0
- package/dist/components/HistoryPanel.js.map +1 -0
- package/dist/components/IccSoftProofOverlay.d.ts +67 -0
- package/dist/components/IccSoftProofOverlay.d.ts.map +1 -0
- package/dist/components/IccSoftProofOverlay.js +119 -0
- package/dist/components/IccSoftProofOverlay.js.map +1 -0
- package/dist/components/ImposePanel.d.ts +71 -0
- package/dist/components/ImposePanel.d.ts.map +1 -0
- package/dist/components/ImposePanel.js +127 -0
- package/dist/components/ImposePanel.js.map +1 -0
- package/dist/components/InksPanel.d.ts +61 -0
- package/dist/components/InksPanel.d.ts.map +1 -0
- package/dist/components/InksPanel.js +84 -0
- package/dist/components/InksPanel.js.map +1 -0
- package/dist/components/JobSetupPanel.d.ts +118 -0
- package/dist/components/JobSetupPanel.d.ts.map +1 -0
- package/dist/components/JobSetupPanel.js +169 -0
- package/dist/components/JobSetupPanel.js.map +1 -0
- package/dist/components/LayersPanel.d.ts.map +1 -1
- package/dist/components/LayersPanel.js +1 -0
- package/dist/components/LayersPanel.js.map +1 -1
- package/dist/components/MarkLibraryPanel.d.ts +131 -0
- package/dist/components/MarkLibraryPanel.d.ts.map +1 -0
- package/dist/components/MarkLibraryPanel.js +184 -0
- package/dist/components/MarkLibraryPanel.js.map +1 -0
- package/dist/components/MisEstimateButton.d.ts +73 -0
- package/dist/components/MisEstimateButton.d.ts.map +1 -0
- package/dist/components/MisEstimateButton.js +57 -0
- package/dist/components/MisEstimateButton.js.map +1 -0
- package/dist/components/NutritionPanel.d.ts +118 -0
- package/dist/components/NutritionPanel.d.ts.map +1 -0
- package/dist/components/NutritionPanel.js +169 -0
- package/dist/components/NutritionPanel.js.map +1 -0
- package/dist/components/PageNavigator.d.ts.map +1 -1
- package/dist/components/PageNavigator.js +6 -1
- package/dist/components/PageNavigator.js.map +1 -1
- package/dist/components/PaletteManager.d.ts +32 -0
- package/dist/components/PaletteManager.d.ts.map +1 -0
- package/dist/components/PaletteManager.js +89 -0
- package/dist/components/PaletteManager.js.map +1 -0
- package/dist/components/PaletteToSpotPanel.d.ts +122 -0
- package/dist/components/PaletteToSpotPanel.d.ts.map +1 -0
- package/dist/components/PaletteToSpotPanel.js +160 -0
- package/dist/components/PaletteToSpotPanel.js.map +1 -0
- package/dist/components/PreflightAutoFixPanel.d.ts +110 -0
- package/dist/components/PreflightAutoFixPanel.d.ts.map +1 -0
- package/dist/components/PreflightAutoFixPanel.js +119 -0
- package/dist/components/PreflightAutoFixPanel.js.map +1 -0
- package/dist/components/PreflightDiffPanel.d.ts +127 -0
- package/dist/components/PreflightDiffPanel.d.ts.map +1 -0
- package/dist/components/PreflightDiffPanel.js +0 -0
- package/dist/components/PreflightDiffPanel.js.map +1 -0
- package/dist/components/ProcessRulesPanel.d.ts +81 -0
- package/dist/components/ProcessRulesPanel.d.ts.map +1 -0
- package/dist/components/ProcessRulesPanel.js +143 -0
- package/dist/components/ProcessRulesPanel.js.map +1 -0
- package/dist/components/SlackNotifyPanel.d.ts +139 -0
- package/dist/components/SlackNotifyPanel.d.ts.map +1 -0
- package/dist/components/SlackNotifyPanel.js +133 -0
- package/dist/components/SlackNotifyPanel.js.map +1 -0
- package/dist/components/SmartSpotMatchPanel.d.ts +143 -0
- package/dist/components/SmartSpotMatchPanel.d.ts.map +1 -0
- package/dist/components/SmartSpotMatchPanel.js +159 -0
- package/dist/components/SmartSpotMatchPanel.js.map +1 -0
- package/dist/components/StreamingRenderProgress.d.ts +60 -0
- package/dist/components/StreamingRenderProgress.d.ts.map +1 -0
- package/dist/components/StreamingRenderProgress.js +99 -0
- package/dist/components/StreamingRenderProgress.js.map +1 -0
- package/dist/components/SwatchesPicker.d.ts +83 -0
- package/dist/components/SwatchesPicker.d.ts.map +1 -0
- package/dist/components/SwatchesPicker.js +151 -0
- package/dist/components/SwatchesPicker.js.map +1 -0
- package/dist/components/TacOverlay.d.ts +47 -0
- package/dist/components/TacOverlay.d.ts.map +1 -0
- package/dist/components/TacOverlay.js +116 -0
- package/dist/components/TacOverlay.js.map +1 -0
- package/dist/components/TrapEditorPanel.d.ts +52 -0
- package/dist/components/TrapEditorPanel.d.ts.map +1 -0
- package/dist/components/TrapEditorPanel.js +64 -0
- package/dist/components/TrapEditorPanel.js.map +1 -0
- package/dist/components/TrapPreviewOverlay.d.ts +64 -0
- package/dist/components/TrapPreviewOverlay.d.ts.map +1 -0
- package/dist/components/TrapPreviewOverlay.js +120 -0
- package/dist/components/TrapPreviewOverlay.js.map +1 -0
- package/dist/components/VariantMatrixPanel.d.ts +61 -0
- package/dist/components/VariantMatrixPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixPanel.js +97 -0
- package/dist/components/VariantMatrixPanel.js.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts +122 -0
- package/dist/components/VariantMatrixVersionPanel.d.ts.map +1 -0
- package/dist/components/VariantMatrixVersionPanel.js +162 -0
- package/dist/components/VariantMatrixVersionPanel.js.map +1 -0
- package/dist/components/WebhookNotifyPanel.d.ts +160 -0
- package/dist/components/WebhookNotifyPanel.d.ts.map +1 -0
- package/dist/components/WebhookNotifyPanel.js +100 -0
- package/dist/components/WebhookNotifyPanel.js.map +1 -0
- package/dist/components/WhiteUnderbasePanel.d.ts +107 -0
- package/dist/components/WhiteUnderbasePanel.d.ts.map +1 -0
- package/dist/components/WhiteUnderbasePanel.js +104 -0
- package/dist/components/WhiteUnderbasePanel.js.map +1 -0
- package/dist/hooks/useEditorMode.d.ts +25 -5
- package/dist/hooks/useEditorMode.d.ts.map +1 -1
- package/dist/hooks/useEditorMode.js +18 -5
- package/dist/hooks/useEditorMode.js.map +1 -1
- package/dist/index.d.ts +51 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -2
- package/dist/index.js.map +1 -1
- package/dist/lens/preflight-findings.d.ts.map +1 -1
- package/dist/lens/preflight-findings.js.map +1 -1
- package/dist/lib/barcode-scan.d.ts +154 -0
- package/dist/lib/barcode-scan.d.ts.map +1 -0
- package/dist/lib/barcode-scan.js +152 -0
- package/dist/lib/barcode-scan.js.map +1 -0
- package/dist/lib/color-math.d.ts +76 -0
- package/dist/lib/color-math.d.ts.map +1 -0
- package/dist/lib/color-math.js +96 -0
- package/dist/lib/color-math.js.map +1 -0
- package/dist/lib/dieline-template.d.ts +87 -0
- package/dist/lib/dieline-template.d.ts.map +1 -1
- package/dist/lib/dieline-template.js +163 -0
- package/dist/lib/dieline-template.js.map +1 -1
- package/dist/lib/editor-config.d.ts +390 -0
- package/dist/lib/editor-config.d.ts.map +1 -1
- package/dist/lib/editor-config.js +90 -0
- package/dist/lib/editor-config.js.map +1 -1
- package/dist/lib/fold-geometry.d.ts +144 -0
- package/dist/lib/fold-geometry.d.ts.map +1 -0
- package/dist/lib/fold-geometry.js +138 -0
- package/dist/lib/fold-geometry.js.map +1 -0
- package/dist/lib/merge-tokens.d.ts +81 -0
- package/dist/lib/merge-tokens.d.ts.map +1 -0
- package/dist/lib/merge-tokens.js +88 -0
- package/dist/lib/merge-tokens.js.map +1 -0
- package/dist/lib/palette-registry.d.ts +40 -0
- package/dist/lib/palette-registry.d.ts.map +1 -0
- package/dist/lib/palette-registry.js +50 -0
- package/dist/lib/palette-registry.js.map +1 -0
- package/dist/lib/panel-anchor.d.ts +101 -0
- package/dist/lib/panel-anchor.d.ts.map +1 -0
- package/dist/lib/panel-anchor.js +68 -0
- package/dist/lib/panel-anchor.js.map +1 -0
- package/dist/lib/preflight/checks.d.ts.map +1 -1
- package/dist/lib/preflight/checks.js +71 -0
- package/dist/lib/preflight/checks.js.map +1 -1
- package/dist/lib/preflight/types.d.ts.map +1 -1
- package/dist/lib/preflight/types.js +11 -0
- package/dist/lib/preflight/types.js.map +1 -1
- package/dist/lib/rasterize.d.ts +93 -0
- package/dist/lib/rasterize.d.ts.map +1 -0
- package/dist/lib/rasterize.js +117 -0
- package/dist/lib/rasterize.js.map +1 -0
- package/dist/lib/separations-registry.d.ts +99 -0
- package/dist/lib/separations-registry.d.ts.map +1 -0
- package/dist/lib/separations-registry.js +59 -0
- package/dist/lib/separations-registry.js.map +1 -0
- package/dist/lib/streaming-render.d.ts +100 -0
- package/dist/lib/streaming-render.d.ts.map +1 -0
- package/dist/lib/streaming-render.js +132 -0
- package/dist/lib/streaming-render.js.map +1 -0
- package/dist/lib/unwired.d.ts +29 -0
- package/dist/lib/unwired.d.ts.map +1 -0
- package/dist/lib/unwired.js +58 -0
- package/dist/lib/unwired.js.map +1 -0
- package/package.json +20 -11
- package/dist/components/SeparationsPanel.d.ts +0 -9
- package/dist/components/SeparationsPanel.d.ts.map +0 -1
- package/dist/components/SeparationsPanel.js +0 -168
- package/dist/components/SeparationsPanel.js.map +0 -1
|
@@ -0,0 +1,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,
|
|
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: {
|
|
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":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AA2Bb,MAAM,EAAE,GAAG,SAAS,CAAC;AACrB,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,KAAK,GAAG,MAAM,CAAC;AAErB,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GAAG,OAAO,GACE;IACnB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,SAAS,CAAC;IAEjE,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"PageNavigator.js","sourceRoot":"","sources":["../../src/components/PageNavigator.tsx"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,YAAY,CAAC;;AA2Bb,MAAM,EAAE,GAAG,SAAS,CAAC;AACrB,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,MAAM,GAAG,SAAS,CAAC;AACzB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,KAAK,GAAG,MAAM,CAAC;AAErB,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,GAAG,OAAO,GACE;IACnB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,KAAK,SAAS,CAAC;IAEjE,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CACL,eACE,KAAK,EAAE;gBACL,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,GAAG,EAAE,QAAQ;gBACb,OAAO,EAAE,gBAAgB;aAC1B,aAED,cACE,IAAI,EAAC,SAAS,gBACH,OAAO,sBACD,UAAU,EAC3B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAEjE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBAClB,MAAM,MAAM,GAAG,CAAC,KAAK,gBAAgB,CAAC;wBACtC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,mBACK,MAAM,gBACT,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACzD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE;gCACL,OAAO,EAAE,MAAM;gCACf,UAAU,EAAE,QAAQ;gCACpB,GAAG,EAAE,SAAS;gCACd,OAAO,EAAE,gBAAgB;gCACzB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;gCAC9C,MAAM,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE;gCACrD,YAAY,EAAE,CAAC;gCACf,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;gCAC9B,MAAM,EAAE,SAAS;gCACjB,UAAU,EAAE,SAAS;gCACrB,QAAQ,EAAE,SAAS;gCACnB,SAAS,EAAE,MAAM;6BAClB,aAED,oCAEE,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAEnE,CAAC,GAAG,CAAC,GACD,EACP,eAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YAAG,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAQ,EAC3D,MAAM,IAAI,CACT,oCAAkB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAElC,CACR,KAhCI,CAAC,CAAC,EAAE,CAiCF,CACV,CAAC;oBACJ,CAAC,CAAC,GACE,EAEL,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,CAC3B,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,aAChE,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,gBAAgB,gBACZ,UAAU,2BAGd,CACV,EACA,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,EAAE,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,gBAC7D,qBAAqB,8BAGzB,CACV,IACG,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,OAAO,CACL,eACE,IAAI,EAAC,SAAS,gBACH,OAAO,sBACD,YAAY,EAC7B,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,QAAQ;YACb,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,aAAa,MAAM,EAAE;YACnC,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,MAAM;SACjB,aAED,oCAEE,KAAK,EAAE;oBACL,QAAQ,EAAE,QAAQ;oBAClB,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,QAAQ;oBACvB,aAAa,EAAE,WAAW;oBAC1B,UAAU,EAAE,GAAG;oBACf,WAAW,EAAE,QAAQ;iBACtB,sBAGI,EACN,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,MAAM,GAAG,CAAC,KAAK,gBAAgB,CAAC;gBACtC,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,KAAK,mBACK,MAAM,gBACT,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACzD,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,EAChC,KAAK,EAAE;wBACL,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;wBAC1C,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBAC/B,MAAM,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE;wBAC9C,YAAY,EAAE,CAAC;wBACf,OAAO,EAAE,iBAAiB;wBAC1B,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,SAAS;wBACjB,UAAU,EAAE,SAAS;qBACtB,aAEA,CAAC,GAAG,CAAC,EACL,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACR,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,YACnE,CAAC,CAAC,IAAI,GACF,CACR,CAAC,CAAC,CAAC,IAAI,KAvBH,CAAC,CAAC,EAAE,CAwBF,CACV,CAAC;YACJ,CAAC,CAAC,EAED,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE;oBACL,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,cAAc,MAAM,EAAE;oBAC9B,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,iBAAiB;oBAC1B,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,QAAQ;iBACrB,kBAGM,CACV,EACA,SAAS,IAAI,CACZ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,KAAK,EAAC,qBAAqB,EAC3B,KAAK,EAAE;oBACL,UAAU,EAAE,aAAa;oBACzB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,mBAAmB;oBAC3B,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,SAAS;oBACjB,UAAU,EAAE,SAAS;iBACtB,uBAGM,CACV,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAwB;IAC5C,IAAI,EAAE,CAAC;IACP,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,aAAa,MAAM,EAAE;IAC7B,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,gBAAgB;IACzB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;CACtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { EditorConfig, PaletteId } from "../lib/editor-config";
|
|
2
|
+
/**
|
|
3
|
+
* Props for the desktop palette overflow menu.
|
|
4
|
+
*
|
|
5
|
+
* `panelVisibility` is the current state (absent / `true` entries
|
|
6
|
+
* render as visible; `false` as hidden). `onChange` receives the
|
|
7
|
+
* full next visibility object whenever the user toggles a row.
|
|
8
|
+
*
|
|
9
|
+
* `enable_palettes: false` collapses the entire menu off — hosts that
|
|
10
|
+
* don't want the overflow toggle UI omit this component altogether
|
|
11
|
+
* via `cfg.enable_palettes`. The mobile equivalent lives inside
|
|
12
|
+
* `MobileToolDrawer` as a "Panels" section.
|
|
13
|
+
*
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export type PaletteManagerProps = {
|
|
17
|
+
config: EditorConfig;
|
|
18
|
+
panelVisibility: Partial<Record<PaletteId, boolean>>;
|
|
19
|
+
onChange: (next: Partial<Record<PaletteId, boolean>>) => void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Desktop-only overflow menu for toggling palette visibility.
|
|
23
|
+
*
|
|
24
|
+
* Renders nothing when `cfg.enable_palettes` is false. Closes on
|
|
25
|
+
* outside-click and Escape; the toggle state is owned by the host
|
|
26
|
+
* via `onChange` so visibility can be persisted (host's localStorage,
|
|
27
|
+
* user-prefs API, etc.) and round-tripped on reload.
|
|
28
|
+
*
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
export declare function PaletteManager({ config, panelVisibility, onChange }: PaletteManagerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
//# sourceMappingURL=PaletteManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaletteManager.d.ts","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGpE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAC/D,CAAC;AAQF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,mBAAmB,kDAsGxF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
"use client";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { useEffect, useRef, useState } from "react";
|
|
5
|
+
import { PALETTE_IDS, PALETTE_REGISTRY } from "../lib/palette-registry";
|
|
6
|
+
const PANEL_BG = "#1a0f08";
|
|
7
|
+
const BORDER = "#3d1a00";
|
|
8
|
+
const BRAND = "#fc5102";
|
|
9
|
+
const TEXT = "#f4ece6";
|
|
10
|
+
const MUTED = "#888";
|
|
11
|
+
/**
|
|
12
|
+
* Desktop-only overflow menu for toggling palette visibility.
|
|
13
|
+
*
|
|
14
|
+
* Renders nothing when `cfg.enable_palettes` is false. Closes on
|
|
15
|
+
* outside-click and Escape; the toggle state is owned by the host
|
|
16
|
+
* via `onChange` so visibility can be persisted (host's localStorage,
|
|
17
|
+
* user-prefs API, etc.) and round-tripped on reload.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export function PaletteManager({ config, panelVisibility, onChange }) {
|
|
22
|
+
const [open, setOpen] = useState(false);
|
|
23
|
+
const rootRef = useRef(null);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!open)
|
|
26
|
+
return;
|
|
27
|
+
function handleOutside(e) {
|
|
28
|
+
if (!rootRef.current?.contains(e.target))
|
|
29
|
+
setOpen(false);
|
|
30
|
+
}
|
|
31
|
+
function handleEscape(e) {
|
|
32
|
+
if (e.key === "Escape")
|
|
33
|
+
setOpen(false);
|
|
34
|
+
}
|
|
35
|
+
document.addEventListener("mousedown", handleOutside);
|
|
36
|
+
document.addEventListener("keydown", handleEscape);
|
|
37
|
+
return () => {
|
|
38
|
+
document.removeEventListener("mousedown", handleOutside);
|
|
39
|
+
document.removeEventListener("keydown", handleEscape);
|
|
40
|
+
};
|
|
41
|
+
}, [open]);
|
|
42
|
+
if (config.enable_palettes === false)
|
|
43
|
+
return null;
|
|
44
|
+
function toggle(id) {
|
|
45
|
+
const current = panelVisibility[id] !== false;
|
|
46
|
+
onChange({ ...panelVisibility, [id]: !current });
|
|
47
|
+
}
|
|
48
|
+
return (_jsxs("div", { ref: rootRef, style: { position: "relative" }, children: [_jsx("button", { type: "button", onClick: () => setOpen((v) => !v), "aria-label": "Toggle palettes", "aria-haspopup": "menu", "aria-expanded": open, style: {
|
|
49
|
+
background: "transparent",
|
|
50
|
+
color: TEXT,
|
|
51
|
+
border: `1px solid ${BORDER}`,
|
|
52
|
+
borderRadius: 4,
|
|
53
|
+
padding: "0.35rem 0.65rem",
|
|
54
|
+
fontSize: "0.78rem",
|
|
55
|
+
fontWeight: 600,
|
|
56
|
+
cursor: "pointer",
|
|
57
|
+
fontFamily: "inherit",
|
|
58
|
+
}, children: "Panels \u25BE" }), open && (_jsx("div", { role: "menu", style: {
|
|
59
|
+
position: "absolute",
|
|
60
|
+
right: 0,
|
|
61
|
+
top: "calc(100% + 4px)",
|
|
62
|
+
background: PANEL_BG,
|
|
63
|
+
border: `1px solid ${BORDER}`,
|
|
64
|
+
borderRadius: 6,
|
|
65
|
+
padding: "0.35rem 0",
|
|
66
|
+
minWidth: 200,
|
|
67
|
+
zIndex: 50,
|
|
68
|
+
boxShadow: "0 8px 24px rgba(0,0,0,0.4)",
|
|
69
|
+
}, children: PALETTE_IDS.map((id) => {
|
|
70
|
+
const visible = panelVisibility[id] !== false;
|
|
71
|
+
const { label } = PALETTE_REGISTRY[id];
|
|
72
|
+
return (_jsxs("button", { type: "button", role: "menuitemcheckbox", "aria-checked": visible, onClick: () => toggle(id), style: {
|
|
73
|
+
display: "flex",
|
|
74
|
+
alignItems: "center",
|
|
75
|
+
justifyContent: "space-between",
|
|
76
|
+
gap: "0.5rem",
|
|
77
|
+
width: "100%",
|
|
78
|
+
padding: "0.45rem 0.85rem",
|
|
79
|
+
background: "transparent",
|
|
80
|
+
border: "none",
|
|
81
|
+
cursor: "pointer",
|
|
82
|
+
color: visible ? TEXT : MUTED,
|
|
83
|
+
fontSize: "0.85rem",
|
|
84
|
+
fontFamily: "inherit",
|
|
85
|
+
textAlign: "left",
|
|
86
|
+
}, children: [_jsx("span", { children: label }), _jsx("span", { style: { color: visible ? BRAND : MUTED, fontSize: "0.85rem" }, children: visible ? "✓" : "" })] }, id));
|
|
87
|
+
}) }))] }));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=PaletteManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaletteManager.js","sourceRoot":"","sources":["../../src/components/PaletteManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave 1 AI4 — Palette → spot conversion panel.
|
|
3
|
+
*
|
|
4
|
+
* Closes the Wave 1 AI family. AI2 {@link SmartSpotMatchPanel}
|
|
5
|
+
* answers "what's the nearest PANTONE for one user-picked color?";
|
|
6
|
+
* AI4 takes the inverse direction — given the palette already in the
|
|
7
|
+
* document (every distinct fill / stroke color on the active page),
|
|
8
|
+
* route each entry through a host-supplied matcher and let the user
|
|
9
|
+
* commit the best match into the spot registry in one click per row.
|
|
10
|
+
*
|
|
11
|
+
* Reuses AI2's {@link SpotMatchLoaderFn} adapter on purpose: a host
|
|
12
|
+
* that wires a ΔE matcher for AI2 gets AI4 for free, and the cache /
|
|
13
|
+
* rate-limit behaviour stays under one adapter.
|
|
14
|
+
*
|
|
15
|
+
* Pure helpers ({@link summarizePaletteCoverage}) live alongside so
|
|
16
|
+
* downstream consumers can render coverage metrics (% of palette
|
|
17
|
+
* matched, average ΔE, count of unmatched) without the panel.
|
|
18
|
+
*
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
import type { ReactElement } from "react";
|
|
22
|
+
import type { SpotMatch, SpotMatchLoaderFn } from "./SmartSpotMatchPanel";
|
|
23
|
+
/**
|
|
24
|
+
* One color entry in the document's palette, as the host provides it
|
|
25
|
+
* (the editor's separations registry already carries this shape per
|
|
26
|
+
* page). `usageCount` is informational — UIs sort by it to surface
|
|
27
|
+
* the highest-impact colors first.
|
|
28
|
+
*
|
|
29
|
+
* @public
|
|
30
|
+
*/
|
|
31
|
+
export type PaletteColor = {
|
|
32
|
+
/** Stable identifier — the panel uses it as the React key. */
|
|
33
|
+
id: string;
|
|
34
|
+
/** Lower-cased hex string `#rrggbb` (canonical). */
|
|
35
|
+
hex: string;
|
|
36
|
+
/** Optional human-readable name (e.g., "Brand Blue"). */
|
|
37
|
+
name?: string;
|
|
38
|
+
/** Optional usage counter — number of canvas objects that touch
|
|
39
|
+
* this color. */
|
|
40
|
+
usageCount?: number;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* One row in the conversion table — pairs a palette color with the
|
|
44
|
+
* best match returned from the loader. `status` discriminates the
|
|
45
|
+
* lifecycle: hosts render a spinner on `loading`, the best match on
|
|
46
|
+
* `matched`, the error message on `error`, and a "Convert" button on
|
|
47
|
+
* `idle` / `matched`.
|
|
48
|
+
*
|
|
49
|
+
* @public
|
|
50
|
+
*/
|
|
51
|
+
export type PaletteToSpotRow = {
|
|
52
|
+
color: PaletteColor;
|
|
53
|
+
status: "idle" | "loading" | "matched" | "error";
|
|
54
|
+
bestMatch?: SpotMatch;
|
|
55
|
+
/** All loader-returned matches, sorted by ΔE. Hosts can surface
|
|
56
|
+
* alternates behind a disclosure. */
|
|
57
|
+
alternates?: readonly SpotMatch[];
|
|
58
|
+
errorMessage?: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Aggregate coverage summary returned by
|
|
62
|
+
* {@link summarizePaletteCoverage}.
|
|
63
|
+
*
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
export type PaletteCoverageSummary = {
|
|
67
|
+
totalColors: number;
|
|
68
|
+
matched: number;
|
|
69
|
+
unmatched: number;
|
|
70
|
+
/** Average ΔE across `matched` rows. `null` when none matched. */
|
|
71
|
+
averageDeltaE: number | null;
|
|
72
|
+
/** Worst ΔE across `matched` rows. `null` when none matched. */
|
|
73
|
+
worstDeltaE: number | null;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Pure helper — summarizes a list of conversion rows. Pure function;
|
|
77
|
+
* no I/O.
|
|
78
|
+
*
|
|
79
|
+
* @public
|
|
80
|
+
*/
|
|
81
|
+
export declare function summarizePaletteCoverage(rows: readonly PaletteToSpotRow[]): PaletteCoverageSummary;
|
|
82
|
+
/**
|
|
83
|
+
* Host adapter — commits a matched spot into the host's spot
|
|
84
|
+
* registry (the editor's per-page `separations-registry` for the
|
|
85
|
+
* canonical case). Resolves once the registry write completes; the
|
|
86
|
+
* panel surfaces errors inline.
|
|
87
|
+
*
|
|
88
|
+
* @public
|
|
89
|
+
*/
|
|
90
|
+
export type SpotCommitFn = (color: PaletteColor, match: SpotMatch) => Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Configuration for the {@link PaletteToSpotPanel}.
|
|
93
|
+
*
|
|
94
|
+
* @public
|
|
95
|
+
*/
|
|
96
|
+
export type PaletteToSpotPanelProps = {
|
|
97
|
+
/** The colors to convert. Typically `getSeparations(activePage)`
|
|
98
|
+
* mapped into {@link PaletteColor} shape. */
|
|
99
|
+
colors: readonly PaletteColor[];
|
|
100
|
+
/** Match adapter — same shape as {@link SmartSpotMatchPanel}'s
|
|
101
|
+
* loader, so one matcher wire serves both AI2 + AI4. Called once
|
|
102
|
+
* per palette color when the user clicks "Match all" or hits the
|
|
103
|
+
* per-row "Match" button. */
|
|
104
|
+
matchLoader: SpotMatchLoaderFn;
|
|
105
|
+
/** Optional commit adapter — when provided, each row gains a
|
|
106
|
+
* "Convert" button that fires `onCommit`. Absent → conversion is
|
|
107
|
+
* read-only (host wires its own commit flow). */
|
|
108
|
+
onCommit?: SpotCommitFn;
|
|
109
|
+
/** Optional mapper that turns a loader error into a user-facing
|
|
110
|
+
* message. The default avoids leaking internal `Error.message`. */
|
|
111
|
+
errorMessage?: (err: unknown) => string;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Stateful panel — renders the palette as a table, dispatches the
|
|
115
|
+
* host matcher per row (lazily on "Match" click or eagerly via the
|
|
116
|
+
* "Match all" affordance), and surfaces coverage metrics in the
|
|
117
|
+
* footer.
|
|
118
|
+
*
|
|
119
|
+
* @public
|
|
120
|
+
*/
|
|
121
|
+
export declare function PaletteToSpotPanel({ colors, matchLoader, onCommit, errorMessage, }: PaletteToSpotPanelProps): ReactElement;
|
|
122
|
+
//# sourceMappingURL=PaletteToSpotPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaletteToSpotPanel.d.ts","sourceRoot":"","sources":["../../src/components/PaletteToSpotPanel.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;sBACkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACjD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;0CACsC;IACtC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gEAAgE;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAChC,sBAAsB,CAkBxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;kDAC8C;IAC9C,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC;;;kCAG8B;IAC9B,WAAW,EAAE,iBAAiB,CAAC;IAC/B;;sDAEkD;IAClD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB;wEACoE;IACpE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,WAAW,EACX,QAAQ,EACR,YAAY,GACb,EAAE,uBAAuB,GAAG,YAAY,CA2KxC"}
|