@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.
- package/dist/agent/confirm-card.d.ts +9 -0
- package/dist/agent/confirm-card.d.ts.map +1 -1
- package/dist/agent/confirm-card.js +28 -2
- package/dist/agent/confirm-card.js.map +1 -1
- package/dist/agent/conversation.d.ts +10 -0
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +4 -4
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/message.d.ts +4 -1
- package/dist/agent/message.d.ts.map +1 -1
- package/dist/agent/message.js +2 -2
- package/dist/agent/message.js.map +1 -1
- package/dist/agent/schema.d.ts +25 -0
- package/dist/agent/schema.d.ts.map +1 -1
- package/dist/agent/schema.js +7 -0
- package/dist/agent/schema.js.map +1 -1
- package/dist/agent/states.d.ts +24 -1
- package/dist/agent/states.d.ts.map +1 -1
- package/dist/agent/states.js +35 -6
- package/dist/agent/states.js.map +1 -1
- package/dist/components/composition-editor.d.ts.map +1 -1
- package/dist/components/composition-editor.js +13 -13
- package/dist/components/composition-editor.js.map +1 -1
- package/dist/components/importer-picker-modal.js +5 -5
- package/dist/components/importer-picker-modal.js.map +1 -1
- package/dist/components/source-composite.d.ts.map +1 -1
- package/dist/components/source-composite.js +4 -3
- package/dist/components/source-composite.js.map +1 -1
- package/dist/globe/svg-globe-geo.d.ts +16 -0
- package/dist/globe/svg-globe-geo.d.ts.map +1 -0
- package/dist/globe/svg-globe-geo.js +48 -0
- package/dist/globe/svg-globe-geo.js.map +1 -0
- package/dist/globe/svg-globe-map-layer.d.ts +18 -0
- package/dist/globe/svg-globe-map-layer.d.ts.map +1 -0
- package/dist/globe/svg-globe-map-layer.js +47 -0
- package/dist/globe/svg-globe-map-layer.js.map +1 -0
- package/dist/globe/svg-globe-pin-layer.d.ts +17 -0
- package/dist/globe/svg-globe-pin-layer.d.ts.map +1 -0
- package/dist/globe/svg-globe-pin-layer.js +111 -0
- package/dist/globe/svg-globe-pin-layer.js.map +1 -0
- package/dist/globe/svg-globe-renderer.d.ts +3 -0
- package/dist/globe/svg-globe-renderer.d.ts.map +1 -0
- package/dist/globe/svg-globe-renderer.js +57 -0
- package/dist/globe/svg-globe-renderer.js.map +1 -0
- package/dist/globe/svg-globe.css +247 -0
- package/dist/globe/svg-globe.d.ts +46 -0
- package/dist/globe/svg-globe.d.ts.map +1 -0
- package/dist/globe/svg-globe.js +45 -0
- package/dist/globe/svg-globe.js.map +1 -0
- package/dist/globe/svg.d.ts +9 -0
- package/dist/globe/svg.d.ts.map +1 -0
- package/dist/globe/svg.js +6 -0
- package/dist/globe/svg.js.map +1 -0
- package/dist/globe/use-svg-globe-gestures.d.ts +21 -0
- package/dist/globe/use-svg-globe-gestures.d.ts.map +1 -0
- package/dist/globe/use-svg-globe-gestures.js +190 -0
- package/dist/globe/use-svg-globe-gestures.js.map +1 -0
- package/dist/globe/use-svg-globe-item-interactions.d.ts +20 -0
- package/dist/globe/use-svg-globe-item-interactions.d.ts.map +1 -0
- package/dist/globe/use-svg-globe-item-interactions.js +66 -0
- package/dist/globe/use-svg-globe-item-interactions.js.map +1 -0
- package/dist/globe/use-svg-globe-navigation.d.ts +17 -0
- package/dist/globe/use-svg-globe-navigation.d.ts.map +1 -0
- package/dist/globe/use-svg-globe-navigation.js +107 -0
- package/dist/globe/use-svg-globe-navigation.js.map +1 -0
- package/dist/offer/negotiation-flow-timeline.d.ts.map +1 -1
- package/dist/offer/negotiation-flow-timeline.js +8 -5
- package/dist/offer/negotiation-flow-timeline.js.map +1 -1
- package/dist/product-editor/product-editor-surface.d.ts.map +1 -1
- package/dist/product-editor/product-editor-surface.js +5 -3
- package/dist/product-editor/product-editor-surface.js.map +1 -1
- package/dist/product-editor/tabs/product-status-tab.js +4 -4
- 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("
|
|
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("
|
|
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("
|
|
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("
|
|
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.
|
|
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",
|