@cellarnode/ui 0.209.1 → 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 (76) 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/composition-editor.d.ts.map +1 -1
  25. package/dist/components/composition-editor.js +13 -13
  26. package/dist/components/composition-editor.js.map +1 -1
  27. package/dist/components/importer-picker-modal.js +5 -5
  28. package/dist/components/importer-picker-modal.js.map +1 -1
  29. package/dist/components/source-composite.d.ts.map +1 -1
  30. package/dist/components/source-composite.js +4 -3
  31. package/dist/components/source-composite.js.map +1 -1
  32. package/dist/globe/svg-globe-geo.d.ts +16 -0
  33. package/dist/globe/svg-globe-geo.d.ts.map +1 -0
  34. package/dist/globe/svg-globe-geo.js +48 -0
  35. package/dist/globe/svg-globe-geo.js.map +1 -0
  36. package/dist/globe/svg-globe-map-layer.d.ts +18 -0
  37. package/dist/globe/svg-globe-map-layer.d.ts.map +1 -0
  38. package/dist/globe/svg-globe-map-layer.js +47 -0
  39. package/dist/globe/svg-globe-map-layer.js.map +1 -0
  40. package/dist/globe/svg-globe-pin-layer.d.ts +17 -0
  41. package/dist/globe/svg-globe-pin-layer.d.ts.map +1 -0
  42. package/dist/globe/svg-globe-pin-layer.js +111 -0
  43. package/dist/globe/svg-globe-pin-layer.js.map +1 -0
  44. package/dist/globe/svg-globe-renderer.d.ts +3 -0
  45. package/dist/globe/svg-globe-renderer.d.ts.map +1 -0
  46. package/dist/globe/svg-globe-renderer.js +57 -0
  47. package/dist/globe/svg-globe-renderer.js.map +1 -0
  48. package/dist/globe/svg-globe.css +247 -0
  49. package/dist/globe/svg-globe.d.ts +46 -0
  50. package/dist/globe/svg-globe.d.ts.map +1 -0
  51. package/dist/globe/svg-globe.js +45 -0
  52. package/dist/globe/svg-globe.js.map +1 -0
  53. package/dist/globe/svg.d.ts +9 -0
  54. package/dist/globe/svg.d.ts.map +1 -0
  55. package/dist/globe/svg.js +6 -0
  56. package/dist/globe/svg.js.map +1 -0
  57. package/dist/globe/use-svg-globe-gestures.d.ts +21 -0
  58. package/dist/globe/use-svg-globe-gestures.d.ts.map +1 -0
  59. package/dist/globe/use-svg-globe-gestures.js +190 -0
  60. package/dist/globe/use-svg-globe-gestures.js.map +1 -0
  61. package/dist/globe/use-svg-globe-item-interactions.d.ts +20 -0
  62. package/dist/globe/use-svg-globe-item-interactions.d.ts.map +1 -0
  63. package/dist/globe/use-svg-globe-item-interactions.js +66 -0
  64. package/dist/globe/use-svg-globe-item-interactions.js.map +1 -0
  65. package/dist/globe/use-svg-globe-navigation.d.ts +17 -0
  66. package/dist/globe/use-svg-globe-navigation.d.ts.map +1 -0
  67. package/dist/globe/use-svg-globe-navigation.js +107 -0
  68. package/dist/globe/use-svg-globe-navigation.js.map +1 -0
  69. package/dist/offer/negotiation-flow-timeline.d.ts.map +1 -1
  70. package/dist/offer/negotiation-flow-timeline.js +8 -5
  71. package/dist/offer/negotiation-flow-timeline.js.map +1 -1
  72. package/dist/product-editor/product-editor-surface.d.ts.map +1 -1
  73. package/dist/product-editor/product-editor-surface.js +5 -3
  74. package/dist/product-editor/product-editor-surface.js.map +1 -1
  75. package/dist/product-editor/tabs/product-status-tab.js +4 -4
  76. package/package.json +14 -1
@@ -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.1",
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",