@cellarnode/ui 0.209.2 → 0.210.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 (67) hide show
  1. package/dist/agent/confirm-card.d.ts +9 -0
  2. package/dist/agent/confirm-card.d.ts.map +1 -1
  3. package/dist/agent/confirm-card.js +28 -2
  4. package/dist/agent/confirm-card.js.map +1 -1
  5. package/dist/agent/conversation.d.ts +10 -0
  6. package/dist/agent/conversation.d.ts.map +1 -1
  7. package/dist/agent/conversation.js +4 -4
  8. package/dist/agent/conversation.js.map +1 -1
  9. package/dist/agent/index.d.ts +1 -1
  10. package/dist/agent/index.d.ts.map +1 -1
  11. package/dist/agent/index.js.map +1 -1
  12. package/dist/agent/message.d.ts +4 -1
  13. package/dist/agent/message.d.ts.map +1 -1
  14. package/dist/agent/message.js +2 -2
  15. package/dist/agent/message.js.map +1 -1
  16. package/dist/agent/schema.d.ts +25 -0
  17. package/dist/agent/schema.d.ts.map +1 -1
  18. package/dist/agent/schema.js +7 -0
  19. package/dist/agent/schema.js.map +1 -1
  20. package/dist/agent/states.d.ts +24 -1
  21. package/dist/agent/states.d.ts.map +1 -1
  22. package/dist/agent/states.js +35 -6
  23. package/dist/agent/states.js.map +1 -1
  24. package/dist/components/importer-picker-modal.js +5 -5
  25. package/dist/components/importer-picker-modal.js.map +1 -1
  26. package/dist/globe/svg-globe-geo.d.ts +16 -0
  27. package/dist/globe/svg-globe-geo.d.ts.map +1 -0
  28. package/dist/globe/svg-globe-geo.js +48 -0
  29. package/dist/globe/svg-globe-geo.js.map +1 -0
  30. package/dist/globe/svg-globe-map-layer.d.ts +18 -0
  31. package/dist/globe/svg-globe-map-layer.d.ts.map +1 -0
  32. package/dist/globe/svg-globe-map-layer.js +47 -0
  33. package/dist/globe/svg-globe-map-layer.js.map +1 -0
  34. package/dist/globe/svg-globe-pin-layer.d.ts +17 -0
  35. package/dist/globe/svg-globe-pin-layer.d.ts.map +1 -0
  36. package/dist/globe/svg-globe-pin-layer.js +111 -0
  37. package/dist/globe/svg-globe-pin-layer.js.map +1 -0
  38. package/dist/globe/svg-globe-renderer.d.ts +3 -0
  39. package/dist/globe/svg-globe-renderer.d.ts.map +1 -0
  40. package/dist/globe/svg-globe-renderer.js +57 -0
  41. package/dist/globe/svg-globe-renderer.js.map +1 -0
  42. package/dist/globe/svg-globe.css +247 -0
  43. package/dist/globe/svg-globe.d.ts +46 -0
  44. package/dist/globe/svg-globe.d.ts.map +1 -0
  45. package/dist/globe/svg-globe.js +45 -0
  46. package/dist/globe/svg-globe.js.map +1 -0
  47. package/dist/globe/svg.d.ts +9 -0
  48. package/dist/globe/svg.d.ts.map +1 -0
  49. package/dist/globe/svg.js +6 -0
  50. package/dist/globe/svg.js.map +1 -0
  51. package/dist/globe/use-svg-globe-gestures.d.ts +21 -0
  52. package/dist/globe/use-svg-globe-gestures.d.ts.map +1 -0
  53. package/dist/globe/use-svg-globe-gestures.js +190 -0
  54. package/dist/globe/use-svg-globe-gestures.js.map +1 -0
  55. package/dist/globe/use-svg-globe-item-interactions.d.ts +20 -0
  56. package/dist/globe/use-svg-globe-item-interactions.d.ts.map +1 -0
  57. package/dist/globe/use-svg-globe-item-interactions.js +66 -0
  58. package/dist/globe/use-svg-globe-item-interactions.js.map +1 -0
  59. package/dist/globe/use-svg-globe-navigation.d.ts +17 -0
  60. package/dist/globe/use-svg-globe-navigation.d.ts.map +1 -0
  61. package/dist/globe/use-svg-globe-navigation.js +107 -0
  62. package/dist/globe/use-svg-globe-navigation.js.map +1 -0
  63. package/dist/product-editor/product-editor-surface.d.ts.map +1 -1
  64. package/dist/product-editor/product-editor-surface.js +5 -3
  65. package/dist/product-editor/product-editor-surface.js.map +1 -1
  66. package/dist/product-editor/tabs/product-status-tab.js +4 -4
  67. package/package.json +14 -1
@@ -0,0 +1,66 @@
1
+ import { useRef, useState } from "react";
2
+ function itemCode(target) {
3
+ return target instanceof SVGElement
4
+ ? target.closest("[data-country-code]")?.dataset.countryCode
5
+ : undefined;
6
+ }
7
+ export function useSvgGlobeItemInteractions({ reset, onCountryClick, }) {
8
+ const [hoveredCountry, setHoveredCountry] = useState(null);
9
+ const suppressClickRef = useRef(false);
10
+ const handleKeyDown = (event) => {
11
+ if (event.key === "Escape") {
12
+ reset();
13
+ return;
14
+ }
15
+ if (event.key !== "Enter" && event.key !== " ")
16
+ return;
17
+ const code = itemCode(event.target);
18
+ if (!code)
19
+ return;
20
+ event.preventDefault();
21
+ onCountryClick?.(code.toUpperCase());
22
+ };
23
+ const handleClick = (event) => {
24
+ if (suppressClickRef.current) {
25
+ suppressClickRef.current = false;
26
+ event.preventDefault();
27
+ return;
28
+ }
29
+ const code = itemCode(event.target);
30
+ if (code)
31
+ onCountryClick?.(code.toUpperCase());
32
+ };
33
+ const setPointerClickSuppressed = (suppressed) => {
34
+ suppressClickRef.current = suppressed;
35
+ if (suppressed)
36
+ window.setTimeout(() => (suppressClickRef.current = false), 100);
37
+ };
38
+ const updatePointerOver = (event) => {
39
+ setHoveredCountry(itemCode(event.target) ?? null);
40
+ };
41
+ const updatePointerOut = (event) => {
42
+ if (itemCode(event.target) !== itemCode(event.relatedTarget))
43
+ setHoveredCountry(itemCode(event.relatedTarget) ?? null);
44
+ };
45
+ const updateFocus = (event) => {
46
+ setHoveredCountry(itemCode(event.target) ?? null);
47
+ };
48
+ const updateBlur = (event) => {
49
+ if (itemCode(event.target) !== itemCode(event.relatedTarget))
50
+ setHoveredCountry(itemCode(event.relatedTarget) ?? null);
51
+ };
52
+ return {
53
+ hoveredCountry,
54
+ setHoveredCountry,
55
+ setPointerClickSuppressed,
56
+ handlers: {
57
+ onKeyDown: handleKeyDown,
58
+ onClick: handleClick,
59
+ onPointerOver: updatePointerOver,
60
+ onPointerOut: updatePointerOut,
61
+ onFocus: updateFocus,
62
+ onBlur: updateBlur,
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=use-svg-globe-item-interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-svg-globe-item-interactions.js","sourceRoot":"","sources":["../../src/globe/use-svg-globe-item-interactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type ZoomBehavior, type ZoomTransform } from "d3-zoom";
2
+ interface UseSvgGlobeNavigationOptions {
3
+ svgRef: React.RefObject<SVGSVGElement | null>;
4
+ selectedCountryCode: string | null;
5
+ }
6
+ export declare function useSvgGlobeNavigation({ svgRef, selectedCountryCode, }: UseSvgGlobeNavigationOptions): {
7
+ transform: ZoomTransform;
8
+ rotation: [number, number];
9
+ setRotation: import("react").Dispatch<import("react").SetStateAction<[number, number]>>;
10
+ rotationRef: import("react").RefObject<[number, number]>;
11
+ zoomRef: import("react").RefObject<ZoomBehavior<SVGSVGElement, unknown> | null>;
12
+ cancelRotation: () => void;
13
+ reset: () => void;
14
+ zoomBy: (factor: number) => void;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=use-svg-globe-navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-svg-globe-navigation.d.ts","sourceRoot":"","sources":["../../src/globe/use-svg-globe-navigation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAwBpF,UAAU,4BAA4B;IACpC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC9C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,mBAAmB,GACpB,EAAE,4BAA4B;;;;;;;;qBAsFlB,MAAM;EASlB"}
@@ -0,0 +1,107 @@
1
+ import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from "react";
2
+ import { select } from "d3-selection";
3
+ import { zoom, zoomIdentity } from "d3-zoom";
4
+ import { countryLocation } from "./svg-globe-geo.js";
5
+ const SIZE = 520;
6
+ const INITIAL_ROTATION = [-15, -45];
7
+ const ZOOM_MIN = 1;
8
+ const ZOOM_MAX = 4;
9
+ const REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
10
+ function subscribeReducedMotion(onChange) {
11
+ if (typeof window.matchMedia !== "function")
12
+ return () => { };
13
+ const media = window.matchMedia(REDUCED_MOTION_QUERY);
14
+ media.addEventListener("change", onChange);
15
+ return () => media.removeEventListener("change", onChange);
16
+ }
17
+ function getReducedMotion() {
18
+ return typeof window.matchMedia === "function" && window.matchMedia(REDUCED_MOTION_QUERY).matches;
19
+ }
20
+ function getServerReducedMotion() {
21
+ return false;
22
+ }
23
+ export function useSvgGlobeNavigation({ svgRef, selectedCountryCode, }) {
24
+ const zoomRef = useRef(null);
25
+ const rotationRef = useRef(INITIAL_ROTATION);
26
+ const animationRef = useRef(0);
27
+ const [transform, setTransform] = useState(zoomIdentity);
28
+ const [rotation, setRotation] = useState(INITIAL_ROTATION);
29
+ const reducedMotion = useSyncExternalStore(subscribeReducedMotion, getReducedMotion, getServerReducedMotion);
30
+ useEffect(() => {
31
+ const svg = svgRef.current;
32
+ if (!svg)
33
+ return;
34
+ const behavior = zoom()
35
+ .scaleExtent([ZOOM_MIN, ZOOM_MAX])
36
+ .extent([
37
+ [0, 0],
38
+ [SIZE, SIZE],
39
+ ])
40
+ .translateExtent([
41
+ [-SIZE, -SIZE],
42
+ [SIZE * 2, SIZE * 2],
43
+ ])
44
+ .filter((event) => event.type === "wheel")
45
+ .on("zoom", (event) => setTransform(event.transform));
46
+ zoomRef.current = behavior;
47
+ select(svg).call(behavior).on("dblclick.zoom", null);
48
+ return () => {
49
+ select(svg).on(".zoom", null);
50
+ zoomRef.current = null;
51
+ };
52
+ }, [svgRef]);
53
+ useEffect(() => {
54
+ rotationRef.current = rotation;
55
+ }, [rotation]);
56
+ useEffect(() => {
57
+ cancelAnimationFrame(animationRef.current);
58
+ const svg = svgRef.current;
59
+ const behavior = zoomRef.current;
60
+ if (svg && behavior)
61
+ select(svg).call(behavior.transform, zoomIdentity);
62
+ const location = selectedCountryCode ? countryLocation(selectedCountryCode) : null;
63
+ const to = location ? [-location[0], -location[1]] : INITIAL_ROTATION;
64
+ const from = rotationRef.current;
65
+ const dx = ((to[0] - from[0] + 540) % 360) - 180;
66
+ if (reducedMotion || (Math.abs(dx) < 0.001 && Math.abs(to[1] - from[1]) < 0.001)) {
67
+ rotationRef.current = to;
68
+ // eslint-disable-next-line @eslint-react/set-state-in-effect, react-hooks/set-state-in-effect -- controlled selection changes must align the camera immediately for reduced-motion users
69
+ setRotation(to);
70
+ return undefined;
71
+ }
72
+ const start = performance.now();
73
+ const step = (time) => {
74
+ const progress = Math.min(1, (time - start) / 550);
75
+ const eased = 1 - (1 - progress) ** 3;
76
+ const next = [from[0] + dx * eased, from[1] + (to[1] - from[1]) * eased];
77
+ rotationRef.current = next;
78
+ setRotation(next);
79
+ if (progress < 1)
80
+ animationRef.current = requestAnimationFrame(step);
81
+ };
82
+ animationRef.current = requestAnimationFrame(step);
83
+ return () => cancelAnimationFrame(animationRef.current);
84
+ }, [reducedMotion, selectedCountryCode, svgRef]);
85
+ useEffect(() => () => cancelAnimationFrame(animationRef.current), []);
86
+ const cancelRotation = useCallback(() => {
87
+ cancelAnimationFrame(animationRef.current);
88
+ animationRef.current = 0;
89
+ }, []);
90
+ const reset = useCallback(() => {
91
+ cancelRotation();
92
+ const svg = svgRef.current;
93
+ const behavior = zoomRef.current;
94
+ if (svg && behavior)
95
+ select(svg).call(behavior.transform, zoomIdentity);
96
+ rotationRef.current = INITIAL_ROTATION;
97
+ setRotation(INITIAL_ROTATION);
98
+ }, [cancelRotation, svgRef]);
99
+ const zoomBy = useCallback((factor) => {
100
+ const svg = svgRef.current;
101
+ const behavior = zoomRef.current;
102
+ if (svg && behavior)
103
+ select(svg).call(behavior.scaleBy, factor, [SIZE / 2, SIZE / 2]);
104
+ }, [svgRef]);
105
+ return { transform, rotation, setRotation, rotationRef, zoomRef, cancelRotation, reset, zoomBy };
106
+ }
107
+ //# sourceMappingURL=use-svg-globe-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-svg-globe-navigation.js","sourceRoot":"","sources":["../../src/globe/use-svg-globe-navigation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"product-editor-surface.d.ts","sourceRoot":"","sources":["../../src/product-editor/product-editor-surface.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,IAAI,eAAe,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAOlD,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,wBAAwB,EAAE,SAAS,gBAAgB,EAO/D,CAAC;AAoBF,UAAU,yBAAyB;IACjC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,2CA4K3B"}
1
+ {"version":3,"file":"product-editor-surface.d.ts","sourceRoot":"","sources":["../../src/product-editor/product-editor-surface.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,IAAI,eAAe,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAOlD,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,wBAAwB,EAAE,SAAS,gBAAgB,EAO/D,CAAC;AAoBF,UAAU,yBAAyB;IACjC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,2CAsL3B"}
@@ -60,8 +60,10 @@ const TAB_I18N_KEYS = {
60
60
  export function ProductEditorSurface({ editorProps, form, orderedTabs, renderedTab, fieldIdPrefix, isDirty, isEditorBusy, saveFailureErrors, saveFailureAlertRef, editorRootRef, tabsListRef, elabelTabRef, onFocusCapture, onTabChange, onNavigateToChemistry, onFocusInvalidField, onSave, onDiscard, }) {
61
61
  const { mode, locale, variantId, beverageId, showBeverageFields, requireVintage = false, autoFocusVintage = false, referenceData, classifications, showComposition = false, showProductionVolume = false, imageController, attachments, certificates, awards, certificateRecords, chemistrySection, labelData, onLabelSaveStateChange, qrSection, sensorySchema, sensorySchemaLoading, status, serverError, features, t, className, } = editorProps;
62
62
  const tr = t ?? ((_key, fallback) => fallback ?? _key);
63
- return (_jsxs("div", { ref: editorRootRef, tabIndex: -1, onFocusCapture: onFocusCapture, className: cn("flex min-w-0 flex-col gap-6 outline-hidden", className), children: [_jsx(ProductEditorValidationSummary, { form: form, sensorySchema: sensorySchema, fieldIdPrefix: fieldIdPrefix, onFocusInvalidField: onFocusInvalidField, t: t }), _jsx("fieldset", { disabled: isEditorBusy, className: "contents", children: _jsx("div", { className: "min-w-0", children: _jsxs(Tabs, { value: renderedTab, onValueChange: onTabChange, children: [_jsx(TabsList, { ref: tabsListRef, className: "max-w-full snap-x justify-start overflow-x-auto overscroll-x-contain", children: orderedTabs.map((tab) => (_jsx(TabsTrigger, { value: tab, className: "snap-start", children: tr(TAB_I18N_KEYS[tab], TAB_LABELS[tab]) }, tab))) }), orderedTabs.length > 3 && (_jsxs("p", { className: "mt-2 flex items-center gap-1.5 text-xs text-muted-foreground sm:hidden", children: [_jsx(MoveHorizontal, { "aria-hidden": "true", className: "size-4 shrink-0" }), tr("productEditor.tabs.scrollHint", "Swipe to view more sections")] })), orderedTabs.includes("essentials") && (_jsx(TabsContent, { value: "essentials", className: "mt-6", children: _jsx(ProductEssentialsTab, { form: form, locale: locale, beverageId: beverageId, showBeverageFields: showBeverageFields, requireVintage: requireVintage, autoFocusVintage: autoFocusVintage && renderedTab === "essentials", referenceData: referenceData, classifications: classifications, compositionSchema: showComposition ? sensorySchema?.sections?.composition : undefined, showProductionVolume: showProductionVolume, fieldIdPrefix: fieldIdPrefix, t: t }) })), orderedTabs.includes("gallery") && (_jsx(TabsContent, { value: "gallery", className: "mt-6", children: _jsx(ProductGalleryTab, { variantId: variantId, mode: mode, imageController: imageController, t: t }) })), orderedTabs.includes("sensory") && (_jsx(TabsContent, { value: "sensory", className: "mt-6", children: _jsx(ProductSensoryTab, { form: form, sensorySchema: sensorySchema, sensorySchemaLoading: sensorySchemaLoading, fieldIdPrefix: fieldIdPrefix, t: t }) })), orderedTabs.includes("resources") && (_jsx(TabsContent, { value: "resources", className: "mt-6", children: _jsx(ProductResourcesTab, { form: form, variantId: variantId, mode: mode, attachments: attachments, certificates: certificates, awards: awards, certificateRecords: certificateRecords, chemistrySection: chemistrySection, features: features, t: t }) })), orderedTabs.includes("e-label") && (_jsx(TabsContent, { value: "e-label", forceMount: true, className: "mt-6 data-[state=inactive]:hidden", children: _jsx(ProductElabelTab, { ref: elabelTabRef, variantId: variantId, mode: mode, labelData: labelData, onSaveStateChange: onLabelSaveStateChange, qrSection: qrSection, onNavigateToChemistry: orderedTabs.includes("resources") && chemistrySection !== undefined
64
- ? onNavigateToChemistry
65
- : undefined, t: t }) })), orderedTabs.includes("status") && (_jsx(TabsContent, { value: "status", className: "mt-6", children: _jsx(ProductStatusTab, { status: status, features: features, isDirty: isDirty, t: t }) }))] }) }) }), _jsx(ProductEditorSaveBar, { isDirty: isDirty, isSaving: isEditorBusy, serverError: serverError ? [serverError, ...saveFailureErrors] : saveFailureErrors, serverErrorRef: saveFailureAlertRef, dismissFocusRef: editorRootRef, onSave: onSave, onDiscard: onDiscard, t: t })] }));
63
+ return (_jsxs("div", { ref: editorRootRef, tabIndex: -1, onFocusCapture: onFocusCapture, className: cn("flex min-w-0 flex-col gap-6 outline-hidden", className), children: [_jsx(ProductEditorValidationSummary, { form: form, sensorySchema: sensorySchema, fieldIdPrefix: fieldIdPrefix, onFocusInvalidField: onFocusInvalidField, t: t }), _jsx("fieldset", { disabled: isEditorBusy, className: "contents", children: _jsx("div", { className: "min-w-0", children: _jsxs(Tabs, { value: renderedTab, onValueChange: onTabChange, children: [_jsx(TabsList, { ref: tabsListRef, className: "max-w-full snap-x justify-start overflow-x-auto overscroll-x-contain", children: orderedTabs.map((tab) => (_jsx(TabsTrigger, { value: tab, className: "snap-start", children: tr(TAB_I18N_KEYS[tab], TAB_LABELS[tab]) }, tab))) }), orderedTabs.length > 3 && (_jsxs("p", { className: "mt-2 flex items-center gap-1.5 text-xs text-muted-foreground sm:hidden", children: [_jsx(MoveHorizontal, { "aria-hidden": "true", className: "size-4 shrink-0" }), tr("productEditor.tabs.scrollHint", "Swipe to view more sections")] })), orderedTabs.includes("essentials") && (_jsxs(TabsContent, { value: "essentials", className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS.essentials, TAB_LABELS.essentials) }), _jsx(ProductEssentialsTab, { form: form, locale: locale, beverageId: beverageId, showBeverageFields: showBeverageFields, requireVintage: requireVintage, autoFocusVintage: autoFocusVintage && renderedTab === "essentials", referenceData: referenceData, classifications: classifications, compositionSchema: showComposition ? sensorySchema?.sections?.composition : undefined, showProductionVolume: showProductionVolume, fieldIdPrefix: fieldIdPrefix, t: t })] })), orderedTabs.includes("gallery") && (_jsxs(TabsContent, { value: "gallery", className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS.gallery, TAB_LABELS.gallery) }), _jsx(ProductGalleryTab, { variantId: variantId, mode: mode, imageController: imageController, t: t })] })), orderedTabs.includes("sensory") && (_jsxs(TabsContent, { value: "sensory", className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS.sensory, TAB_LABELS.sensory) }), _jsx(ProductSensoryTab, { form: form, sensorySchema: sensorySchema, sensorySchemaLoading: sensorySchemaLoading, fieldIdPrefix: fieldIdPrefix, t: t })] })), orderedTabs.includes("resources") && (_jsxs(TabsContent, { value: "resources", className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS.resources, TAB_LABELS.resources) }), _jsx(ProductResourcesTab, { form: form, variantId: variantId, mode: mode, attachments: attachments, certificates: certificates, awards: awards, certificateRecords: certificateRecords, chemistrySection: chemistrySection, features: features, t: t })] })), orderedTabs.includes("e-label") && (_jsxs(TabsContent, { value: "e-label", forceMount: true, className: "mt-6 data-[state=inactive]:hidden", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS["e-label"], TAB_LABELS["e-label"]) }), _jsx(ProductElabelTab, { ref: elabelTabRef, variantId: variantId, mode: mode, labelData: labelData, onSaveStateChange: onLabelSaveStateChange, qrSection: qrSection, onNavigateToChemistry: orderedTabs.includes("resources") && chemistrySection !== undefined
64
+ ? onNavigateToChemistry
65
+ : undefined, t: t })] })), orderedTabs.includes("status") && (_jsxs(TabsContent, { value: "status", className: "mt-6", children: [_jsx("h2", { className: "sr-only", children: tr(TAB_I18N_KEYS.status, TAB_LABELS.status) }), _jsx(ProductStatusTab, { status: status, features: features, isDirty: isDirty, t: t })] }))] }) }) }), _jsx(ProductEditorSaveBar, { isDirty: isDirty, isSaving: isEditorBusy, serverError: serverError && !saveFailureErrors.includes(serverError)
66
+ ? [serverError, ...saveFailureErrors]
67
+ : saveFailureErrors, serverErrorRef: saveFailureAlertRef, dismissFocusRef: editorRootRef, onSave: onSave, onDiscard: onDiscard, t: t })] }));
66
68
  }
67
69
  //# sourceMappingURL=product-editor-surface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-editor-surface.js","sourceRoot":"","sources":["../../src/product-editor/product-editor-surface.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-editor-surface.js","sourceRoot":"","sources":["../../src/product-editor/product-editor-surface.tsx"],"names":[],"mappings":"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"}
@@ -191,7 +191,7 @@ export function ProductStatusTab({ status, features, isDirty = false, t }) {
191
191
  included: tr("variantEdit.status.matching.included", "This product is matched with opportunities."),
192
192
  excluded: tr("variantEdit.status.matching.excluded", "Excluded products are not matched with opportunities; existing matches are hidden."),
193
193
  error: tr("variantEdit.status.matching.error", "Could not update matching. Your change was undone."),
194
- } })), matchReadiness && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-5", children: [_jsxs("div", { className: "mb-4 flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h4", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.heading", "Match Readiness") }), _jsxs("span", { className: "text-sm font-medium text-foreground", children: [matchReadiness.completed, " / ", matchReadiness.total] })] }), _jsx("div", { role: "progressbar", "aria-label": tr("matchReadiness.heading", "Match Readiness"), "aria-valuenow": Math.round(matchReadiness.percent), "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuetext": tr("matchReadiness.progressValueText", `${matchReadiness.completed} of ${matchReadiness.total} fields complete`), className: "h-2 w-full overflow-hidden rounded-full bg-muted", children: _jsx("div", { className: `h-full ${matchReadiness.percent === 100 ? "bg-[var(--tone-success-solid)]" : "bg-[var(--tone-warning-fg)]"} transition-[width,background-color] duration-500`, style: { width: `${Math.round(matchReadiness.percent)}%` } }) })] }), _jsxs("div", { className: "flex flex-col gap-5", children: [matchReadiness.blockers.length > 0 && (_jsxs("div", { children: [_jsx("h5", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-[var(--tone-warning-fg)]", children: tr("matchReadiness.blockersHeading", "Required before approval") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.blockers.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-[var(--tone-warning-border)]/40 bg-[var(--tone-warning-soft)] px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-[var(--tone-warning-fg)]", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-fg)]/10 px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: readinessReasonLabel(entry.reason, tr) })] }, `blocker-${entry.path}`))) })] })), matchReadiness.recommendations.length > 0 && (_jsxs("div", { children: [_jsx("h5", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.recommendationsHeading", "Recommended before matching") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.recommendations.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-muted/60 px-2.5 py-0.5 text-xs font-medium text-muted-foreground", children: readinessReasonLabel(entry.reason, tr) })] }, `rec-${entry.path}`))) })] })), matchReadiness.acknowledgementsRequired.length > 0 && (_jsxs("div", { children: [_jsx("h5", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.acknowledgementsHeading", "Please confirm") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.acknowledgementsRequired.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-soft)] px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: readinessReasonLabel(entry.reason, tr) })] }, `ack-${entry.path}`))) })] })), matchReadiness.blockers.length === 0 &&
194
+ } })), matchReadiness && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-5", children: [_jsxs("div", { className: "mb-4 flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h3", { className: "text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.heading", "Match Readiness") }), _jsxs("span", { className: "text-sm font-medium text-foreground", children: [matchReadiness.completed, " / ", matchReadiness.total] })] }), _jsx("div", { role: "progressbar", "aria-label": tr("matchReadiness.heading", "Match Readiness"), "aria-valuenow": Math.round(matchReadiness.percent), "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuetext": tr("matchReadiness.progressValueText", `${matchReadiness.completed} of ${matchReadiness.total} fields complete`), className: "h-2 w-full overflow-hidden rounded-full bg-muted", children: _jsx("div", { className: `h-full ${matchReadiness.percent === 100 ? "bg-[var(--tone-success-solid)]" : "bg-[var(--tone-warning-fg)]"} transition-[width,background-color] duration-500`, style: { width: `${Math.round(matchReadiness.percent)}%` } }) })] }), _jsxs("div", { className: "flex flex-col gap-5", children: [matchReadiness.blockers.length > 0 && (_jsxs("div", { children: [_jsx("h4", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-[var(--tone-warning-fg)]", children: tr("matchReadiness.blockersHeading", "Required before approval") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.blockers.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-[var(--tone-warning-border)]/40 bg-[var(--tone-warning-soft)] px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-[var(--tone-warning-fg)]", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-fg)]/10 px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: readinessReasonLabel(entry.reason, tr) })] }, `blocker-${entry.path}`))) })] })), matchReadiness.recommendations.length > 0 && (_jsxs("div", { children: [_jsx("h4", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.recommendationsHeading", "Recommended before matching") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.recommendations.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-muted/60 px-2.5 py-0.5 text-xs font-medium text-muted-foreground", children: readinessReasonLabel(entry.reason, tr) })] }, `rec-${entry.path}`))) })] })), matchReadiness.acknowledgementsRequired.length > 0 && (_jsxs("div", { children: [_jsx("h4", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("matchReadiness.acknowledgementsHeading", "Please confirm") }), _jsx("ul", { className: "flex flex-col gap-2", children: matchReadiness.acknowledgementsRequired.map((entry) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: tr(entry.labelKey, fieldLabel(entry.path, tr)) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-soft)] px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: readinessReasonLabel(entry.reason, tr) })] }, `ack-${entry.path}`))) })] })), matchReadiness.blockers.length === 0 &&
195
195
  matchReadiness.canApprove &&
196
196
  matchReadiness.recommendations.length === 0 &&
197
197
  matchReadiness.acknowledgementsRequired.length === 0 && (_jsxs("div", { className: "flex items-center gap-2 rounded-xl border border-[var(--tone-success-border)]/30 bg-[var(--tone-success-soft)]/30 px-4 py-3 text-sm text-[var(--tone-success-fg)]", children: [_jsx(CheckCircle2, { className: "size-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: tr("matchReadiness.allComplete", "All required fields are complete.") })] }))] })] })), features?.approvalWorkflow && isPendingReview && onApprove && (_jsx(ApprovePanel, { hasUnsavedEdits: isDirty, isApproving: isApproving ?? false, readinessBlocked: readinessBlocked, needsAcknowledgement: needsAcknowledgement, onApprove: handleApprove, flaggedFields: flaggedFields ?? null, fieldLabelOf: (p) => fieldLabel(p, tr), reasonLabelOf: (r) => reasonLabel(r, tr), confidenceLabelOf: (c) => confidenceLabel(c, tr), tr: tr })), (extractedBy || reviewedBy || reviewedAt) && (_jsx(StatusCard, { label: tr("variantEdit.status.provenance", "Provenance"), value: extractedBy
@@ -200,7 +200,7 @@ export function ProductStatusTab({ status, features, isDirty = false, t }) {
200
200
  ? tr("variantEdit.status.reviewedOn", reviewedAt
201
201
  ? `Approved on ${formatReviewDate(reviewedAt)}${reviewedBy ? ` by ${reviewedBy}` : ""}`
202
202
  : `Approved by ${reviewedBy}`)
203
- : undefined })), professionalSummary && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-4", children: [_jsx("h4", { className: "mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.professionalSummary", "Professional summary") }), _jsx("p", { className: "text-sm text-foreground", children: professionalSummary })] })), hasCitations && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-4", children: [_jsx("h4", { className: "mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.citations", "Citations") }), _jsx("ul", { className: "flex flex-col gap-2 text-sm", children: (citations ?? []).map((c, i) => (
203
+ : undefined })), professionalSummary && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-4", children: [_jsx("h3", { className: "mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.professionalSummary", "Professional summary") }), _jsx("p", { className: "text-sm text-foreground", children: professionalSummary })] })), hasCitations && (_jsxs("div", { className: "rounded-xl border border-border/60 bg-card p-4", children: [_jsx("h3", { className: "mb-2 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.citations", "Citations") }), _jsx("ul", { className: "flex flex-col gap-2 text-sm", children: (citations ?? []).map((c, i) => (
204
204
  // Citations have no stable id — composite key on url+index is the best we can do for a read-only ordered list.
205
205
  // eslint-disable-next-line @eslint-react/no-array-index-key
206
206
  _jsx("li", { children: c.url ? (_jsx("a", { href: c.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", children: c.label || c.url })) : (_jsx("span", { className: "text-foreground", children: c.label })) }, `${c.url ?? ""}-${i}`))) })] }))] }));
@@ -221,7 +221,7 @@ function ApprovePanel({ hasUnsavedEdits, isApproving, readinessBlocked, needsAck
221
221
  // Double-bezel: outer tray + inner core. Tray is neutral — carries both
222
222
  // warning ("Needs review") and success action (green CTA + clean empty
223
223
  // state). Tinting the tray one tone would clash two semantic hues.
224
- _jsx("div", { className: "rounded-[1.5rem] bg-muted/40 p-1.5 ring-1 ring-border/50", children: _jsxs("div", { className: "rounded-[calc(1.5rem-0.375rem)] bg-card p-5", children: [_jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "mb-1 text-xs font-semibold uppercase tracking-[0.14em] text-[var(--tone-warning-fg)]", children: tr("variantEdit.status.approveEyebrow", "Needs review") }), _jsx("h4", { className: "text-base font-semibold text-foreground", children: tr("variantEdit.status.approveHeading", "Ready to publish?") }), _jsx("p", { className: "mt-1 max-w-prose text-sm/6 text-muted-foreground", children: tr("variantEdit.status.approveBody", "This product was auto-extracted and is awaiting your review. Approving makes it discoverable to importers.") })] }), _jsxs("div", { className: "flex shrink-0 flex-col items-stretch gap-1.5 sm:items-end", children: [_jsxs("button", { type: "button", onClick: onApprove, disabled: disabled, "aria-describedby": hasHint ? hintId : undefined, className: `group inline-flex items-center justify-center gap-3 rounded-full bg-[var(--tone-success-solid)] px-6 py-3 font-semibold text-[var(--tone-success-solid-fg)] shadow-sm hover:brightness-110 active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:brightness-100 ${CTA_TRANSITION}`, children: [_jsx("span", { children: isApproving
224
+ _jsx("div", { className: "rounded-[1.5rem] bg-muted/40 p-1.5 ring-1 ring-border/50", children: _jsxs("div", { className: "rounded-[calc(1.5rem-0.375rem)] bg-card p-5", children: [_jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "mb-1 text-xs font-semibold uppercase tracking-[0.14em] text-[var(--tone-warning-fg)]", children: tr("variantEdit.status.approveEyebrow", "Needs review") }), _jsx("h3", { className: "text-base font-semibold text-foreground", children: tr("variantEdit.status.approveHeading", "Ready to publish?") }), _jsx("p", { className: "mt-1 max-w-prose text-sm/6 text-muted-foreground", children: tr("variantEdit.status.approveBody", "This product was auto-extracted and is awaiting your review. Approving makes it discoverable to importers.") })] }), _jsxs("div", { className: "flex shrink-0 flex-col items-stretch gap-1.5 sm:items-end", children: [_jsxs("button", { type: "button", onClick: onApprove, disabled: disabled, "aria-describedby": hasHint ? hintId : undefined, className: `group inline-flex items-center justify-center gap-3 rounded-full bg-[var(--tone-success-solid)] px-6 py-3 font-semibold text-[var(--tone-success-solid-fg)] shadow-sm hover:brightness-110 active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:brightness-100 ${CTA_TRANSITION}`, children: [_jsx("span", { children: isApproving
225
225
  ? tr("variantEdit.status.approving", "Publishing…")
226
226
  : needsAcknowledgement
227
227
  ? tr("variantEdit.status.reviewFlaggedAction", "Review flagged fields")
@@ -229,7 +229,7 @@ function ApprovePanel({ hasUnsavedEdits, isApproving, readinessBlocked, needsAck
229
229
  ? tr("matchReadiness.approveBlockedHint", "Complete the required fields above first.")
230
230
  : showDirtyHint
231
231
  ? tr("variantEdit.status.approveDirtyHint", "Save your changes first")
232
- : tr("matchReadiness.reviewFlaggedHint", "Review the flagged fields below, then confirm to publish.") }))] })] }), _jsxs("div", { className: "mt-5 border-t border-border/50 pt-4", children: [_jsx("h5", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.flaggedHeading", "Flagged during extraction") }), !flaggedFields || flaggedFields.length === 0 ? (_jsxs("div", { className: "flex items-center gap-2 rounded-xl border border-[var(--tone-success-border)]/30 bg-[var(--tone-success-soft)]/30 px-4 py-3 text-sm text-[var(--tone-success-fg)]", children: [_jsx(CheckCircle2, { className: "size-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: tr("variantEdit.status.flaggedEmpty", "No issues flagged during extraction.") })] })) : (_jsx("ul", { className: "flex flex-col gap-2.5", children: flaggedFields.map((field, i) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: fieldLabelOf(field.path) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-soft)] px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: reasonLabelOf(field.reason) }), field.confidence && (_jsx(ConfidenceChip, { confidence: field.confidence, label: confidenceLabelOf(field.confidence) }))] }, `${field.path}-${i}`))) }))] })] }) }));
232
+ : tr("matchReadiness.reviewFlaggedHint", "Review the flagged fields below, then confirm to publish.") }))] })] }), _jsxs("div", { className: "mt-5 border-t border-border/50 pt-4", children: [_jsx("h4", { className: "mb-3 text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground", children: tr("variantEdit.status.flaggedHeading", "Flagged during extraction") }), !flaggedFields || flaggedFields.length === 0 ? (_jsxs("div", { className: "flex items-center gap-2 rounded-xl border border-[var(--tone-success-border)]/30 bg-[var(--tone-success-soft)]/30 px-4 py-3 text-sm text-[var(--tone-success-fg)]", children: [_jsx(CheckCircle2, { className: "size-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: tr("variantEdit.status.flaggedEmpty", "No issues flagged during extraction.") })] })) : (_jsx("ul", { className: "flex flex-col gap-2.5", children: flaggedFields.map((field, i) => (_jsxs("li", { className: "flex flex-wrap items-center gap-x-3 gap-y-1.5 rounded-xl border border-border/60 bg-muted/30 px-4 py-3", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: fieldLabelOf(field.path) }), _jsx("span", { className: "inline-flex items-center rounded-full bg-[var(--tone-warning-soft)] px-2.5 py-0.5 text-xs font-medium text-[var(--tone-warning-fg)]", children: reasonLabelOf(field.reason) }), field.confidence && (_jsx(ConfidenceChip, { confidence: field.confidence, label: confidenceLabelOf(field.confidence) }))] }, `${field.path}-${i}`))) }))] })] }) }));
233
233
  }
234
234
  // ─── ConfidenceChip ───────────────────────────────────────────────────────────
235
235
  function ConfidenceChip({ confidence, label }) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cellarnode/ui",
3
- "version": "0.209.2",
3
+ "version": "0.210.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "packageManager": "pnpm@10.28.2+sha512.41872f037ad22f7348e3b1debbaf7e867cfd448f2726d9cf74c08f19507c31d2c8e7a11525b983febc2df640b5438dee6023ebb1f84ed43cc2d654d2bc326264",
@@ -18,6 +18,8 @@
18
18
  "types": "./dist/index.d.ts",
19
19
  "sideEffects": [
20
20
  "./src/theme/tokens.css",
21
+ "./src/globe/svg-globe.css",
22
+ "./dist/globe/svg-globe.css",
21
23
  "./dist/offer/offer-document.print.css"
22
24
  ],
23
25
  "exports": {
@@ -87,6 +89,11 @@
87
89
  "types": "./dist/globe/index.d.ts",
88
90
  "default": "./dist/globe/index.js"
89
91
  },
92
+ "./globe/svg": {
93
+ "types": "./dist/globe/svg.d.ts",
94
+ "default": "./dist/globe/svg.js"
95
+ },
96
+ "./globe/svg.css": "./dist/globe/svg-globe.css",
90
97
  "./animated-list": {
91
98
  "types": "./dist/components/animated-list.d.ts",
92
99
  "default": "./dist/components/animated-list.js"
@@ -364,6 +371,9 @@
364
371
  "cmdk": "^1.1.1",
365
372
  "country-flag-icons": "^1.6.20",
366
373
  "country-state-city": "^3.2.1",
374
+ "d3-geo": "^3.1.1",
375
+ "d3-selection": "^3.0.0",
376
+ "d3-zoom": "^3.0.0",
367
377
  "date-fns": "^4.1.0",
368
378
  "lucide-react": "^1.7.0",
369
379
  "qr-code-styling": "^1.9.2",
@@ -420,6 +430,9 @@
420
430
  "@testing-library/jest-dom": "^6.9.1",
421
431
  "@testing-library/react": "^16.3.2",
422
432
  "@testing-library/user-event": "^14.6.1",
433
+ "@types/d3-geo": "^3.1.1",
434
+ "@types/d3-selection": "^3.0.12",
435
+ "@types/d3-zoom": "^3.0.9",
423
436
  "@types/geojson": "^7946.0.16",
424
437
  "@types/react": "^19.2.14",
425
438
  "@types/react-dom": "^19.2.3",