@cellarnode/ui 0.191.0 → 0.192.1

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.
@@ -0,0 +1,267 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Loader2, Lock } from "lucide-react";
4
+ import { Button } from "../components/button.js";
5
+ import { Eyebrow } from "../components/eyebrow.js";
6
+ import { cn } from "../lib/utils.js";
7
+ const FOCUSABLE = 'input:not([disabled]):not([type="hidden"]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),[tabindex]:not([tabindex="-1"])';
8
+ function firstFocusable(root) {
9
+ if (!root)
10
+ return null;
11
+ if (root instanceof HTMLElement && root.matches(FOCUSABLE))
12
+ return root;
13
+ return root.querySelector(FOCUSABLE);
14
+ }
15
+ function errorMessage(error, fallback) {
16
+ if (error instanceof Error && error.message.trim())
17
+ return error.message;
18
+ if (typeof error === "string" && error.trim())
19
+ return error;
20
+ return fallback;
21
+ }
22
+ export function useEditSession({ config, labels, isEditing, onClose, }) {
23
+ const mountedRef = React.useRef(true);
24
+ const focusDoneRef = React.useRef(false);
25
+ const pendingLeaveRef = React.useRef(null);
26
+ const hasFocused = React.useCallback(() => focusDoneRef.current, []);
27
+ const markFocused = React.useCallback(() => {
28
+ focusDoneRef.current = true;
29
+ }, []);
30
+ const [saving, setSaving] = React.useState(false);
31
+ const [saveError, setSaveError] = React.useState(null);
32
+ const [failTick, setFailTick] = React.useState(0);
33
+ const [guardOpen, setGuardOpen] = React.useState(false);
34
+ const [justSaved, setJustSaved] = React.useState(false);
35
+ const [touchedTabs, setTouchedTabs] = React.useState([]);
36
+ const touch = React.useCallback((tabId) => {
37
+ setTouchedTabs((prev) => (prev.includes(tabId) ? prev : [...prev, tabId]));
38
+ }, []);
39
+ React.useEffect(() => {
40
+ mountedRef.current = true;
41
+ return () => {
42
+ mountedRef.current = false;
43
+ };
44
+ }, []);
45
+ React.useEffect(() => {
46
+ /* eslint-disable @eslint-react/set-state-in-effect -- edit mode is controlled from outside; the transient state resets when it flips */
47
+ if (isEditing) {
48
+ setJustSaved(false);
49
+ return;
50
+ }
51
+ focusDoneRef.current = false;
52
+ pendingLeaveRef.current = null;
53
+ setSaveError(null);
54
+ setGuardOpen(false);
55
+ setSaving(false);
56
+ setTouchedTabs([]);
57
+ /* eslint-enable @eslint-react/set-state-in-effect */
58
+ }, [isEditing]);
59
+ const dirty = config?.isDirty === true;
60
+ const saveBlocked = saving || config?.isDirty === false || config?.canSave === false;
61
+ const discard = React.useCallback(() => {
62
+ const proceed = pendingLeaveRef.current;
63
+ pendingLeaveRef.current = null;
64
+ config?.onCancel?.();
65
+ onClose();
66
+ proceed?.();
67
+ }, [config, onClose]);
68
+ const requestCancel = React.useCallback(() => {
69
+ if (saving)
70
+ return;
71
+ if (dirty)
72
+ setGuardOpen(true);
73
+ else
74
+ discard();
75
+ }, [dirty, discard, saving]);
76
+ const requestLeave = React.useCallback((proceed) => {
77
+ if (saving)
78
+ return;
79
+ pendingLeaveRef.current = proceed;
80
+ setGuardOpen(true);
81
+ }, [saving]);
82
+ const keepEditing = React.useCallback(() => {
83
+ pendingLeaveRef.current = null;
84
+ setGuardOpen(false);
85
+ }, []);
86
+ const save = React.useCallback(async () => {
87
+ if (!config || saveBlocked)
88
+ return;
89
+ setSaving(true);
90
+ setSaveError(null);
91
+ try {
92
+ await config.onSave();
93
+ }
94
+ catch (error) {
95
+ if (!mountedRef.current)
96
+ return;
97
+ setSaving(false);
98
+ setSaveError(errorMessage(error, labels.saveFailed));
99
+ setFailTick((n) => n + 1);
100
+ return;
101
+ }
102
+ if (!mountedRef.current)
103
+ return;
104
+ setSaving(false);
105
+ setJustSaved(true);
106
+ onClose();
107
+ }, [config, labels.saveFailed, onClose, saveBlocked]);
108
+ return {
109
+ config,
110
+ saving,
111
+ error: config?.error ?? saveError,
112
+ guardOpen,
113
+ justSaved,
114
+ touchedTabs,
115
+ touch,
116
+ dirty,
117
+ saveBlocked,
118
+ hasFocused,
119
+ markFocused,
120
+ failTick,
121
+ save,
122
+ requestCancel,
123
+ keepEditing,
124
+ discard,
125
+ requestLeave,
126
+ };
127
+ }
128
+ export function EditableSection({ id, session, heading, headingAs, labels, isEditing, active, tabId, tabLabels, secondary = false, canEdit = false, editBlocked = false, focusKey, onEdit, lockedPanel, focusLockedPanel, children, }) {
129
+ const rootRef = React.useRef(null);
130
+ const editButtonRef = React.useRef(null);
131
+ const alertRef = React.useRef(null);
132
+ const keepEditingRef = React.useRef(null);
133
+ const guardOriginRef = React.useRef(null);
134
+ const wasEditingRef = React.useRef(false);
135
+ const [notice, setNotice] = React.useState(null);
136
+ const { saving, guardOpen, failTick, hasFocused, markFocused } = session;
137
+ // Leaving edit mode returns focus to the Edit button; when there is none
138
+ // (the lock arrived mid-edit) focus moves to the locked panel and the
139
+ // arrival is announced.
140
+ React.useEffect(() => {
141
+ if (secondary)
142
+ return;
143
+ if (isEditing) {
144
+ wasEditingRef.current = true;
145
+ return;
146
+ }
147
+ if (!wasEditingRef.current)
148
+ return;
149
+ wasEditingRef.current = false;
150
+ if (editButtonRef.current) {
151
+ editButtonRef.current.focus();
152
+ }
153
+ else if (focusLockedPanel?.()) {
154
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- announce the externally triggered lock
155
+ setNotice(labels.locked.arrivedWhileEditing);
156
+ }
157
+ }, [isEditing, secondary, focusLockedPanel, labels.locked.arrivedWhileEditing]);
158
+ // The lock announcement is only true while the panel is shown and nothing
159
+ // newer has been announced: reopening edit mode or leaving the locked state
160
+ // retires it, so it can never mask a later "Changes saved".
161
+ const lockedShown = lockedPanel != null;
162
+ React.useEffect(() => {
163
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- retire a stale announcement when the state it described ends
164
+ if (isEditing || !lockedShown)
165
+ setNotice(null);
166
+ }, [isEditing, lockedShown]);
167
+ // Entering edit mode moves focus (once, on whichever tab hosts the target):
168
+ // the requested field, else the first control of the primary section. Waits
169
+ // for the tab to be visible and for lazily rendered controls (a few frames).
170
+ React.useEffect(() => {
171
+ if (!isEditing || !active || hasFocused())
172
+ return;
173
+ let frame = 0;
174
+ let attempts = 0;
175
+ const attempt = () => {
176
+ const root = rootRef.current;
177
+ if (!root || hasFocused())
178
+ return;
179
+ const byKey = focusKey
180
+ ? firstFocusable(root.querySelector(`[data-fact-key="${focusKey}"]`))
181
+ : null;
182
+ let target = byKey;
183
+ // Only the primary section falls back to its first control, and only
184
+ // when no field was asked for or the asked-for one never appeared.
185
+ if (!target && !secondary && (!focusKey || attempts >= 19)) {
186
+ target = firstFocusable(root.querySelector('[data-slot="fact-edit-body"]'));
187
+ }
188
+ if (target) {
189
+ target.focus();
190
+ markFocused();
191
+ return;
192
+ }
193
+ attempts += 1;
194
+ if (attempts < 20)
195
+ frame = requestAnimationFrame(attempt);
196
+ };
197
+ attempt();
198
+ return () => cancelAnimationFrame(frame);
199
+ }, [isEditing, active, focusKey, secondary, hasFocused, markFocused]);
200
+ // A failed save puts focus on the first invalid field, else on the alert.
201
+ React.useEffect(() => {
202
+ if (failTick === 0 || !active)
203
+ return;
204
+ const root = rootRef.current;
205
+ const invalid = root?.querySelector('[aria-invalid="true"]');
206
+ (invalid ?? alertRef.current)?.focus();
207
+ }, [failTick, active]);
208
+ const showGuard = guardOpen && active;
209
+ React.useEffect(() => {
210
+ if (showGuard) {
211
+ guardOriginRef.current ??=
212
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
213
+ keepEditingRef.current?.focus();
214
+ }
215
+ }, [showGuard]);
216
+ const keepEditing = () => {
217
+ session.keepEditing();
218
+ guardOriginRef.current?.focus();
219
+ guardOriginRef.current = null;
220
+ };
221
+ const onKeyDown = (event) => {
222
+ if (event.key !== "Escape" || !isEditing || event.defaultPrevented)
223
+ return;
224
+ const target = event.target;
225
+ // Escape inside an open popup (select, combobox, popover) closes that popup only.
226
+ if (target instanceof Element &&
227
+ target.closest('[aria-expanded="true"],[role="listbox"],[role="dialog"],[role="menu"]')) {
228
+ return;
229
+ }
230
+ event.preventDefault();
231
+ if (saving)
232
+ return;
233
+ if (guardOpen)
234
+ keepEditing();
235
+ else {
236
+ guardOriginRef.current =
237
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
238
+ session.requestCancel();
239
+ }
240
+ };
241
+ const shownError = session.error;
242
+ const otherTabs = session.touchedTabs
243
+ .filter((touched) => touched !== tabId)
244
+ .map((touched) => tabLabels[touched] ?? touched);
245
+ const alsoSaves = otherTabs.length > 0 ? labels.saveAlsoOn(otherTabs.join(", ")) : null;
246
+ const showEdit = !secondary && canEdit && !isEditing;
247
+ const legend = labels.editSection(labels.section[id]);
248
+ return (_jsxs("div", { ref: rootRef, "data-slot": "opportunity-fact-edit-section", "data-section": id, "data-editing": isEditing ? "true" : undefined, onKeyDown: onKeyDown, onInput: () => {
249
+ if (isEditing)
250
+ session.touch(tabId);
251
+ }, className: cn("flex flex-col gap-2", isEditing && "rounded-lg border border-border p-4"), children: [!secondary ? (_jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: session.justSaved && !isEditing ? labels.saved : (notice ?? "") })) : null, _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx(Eyebrow, { as: headingAs, size: "xs", children: heading }), showEdit ? (_jsx(Button, { ref: editButtonRef, type: "button", outline: true, "aria-label": legend, "aria-disabled": editBlocked || undefined, onClick: () => {
252
+ if (!editBlocked)
253
+ onEdit?.();
254
+ }, "data-slot": "opportunity-fact-edit-button", children: labels.edit })) : null] }), lockedPanel ?? null, _jsxs("fieldset", { disabled: saving, "data-slot": "fact-edit-body", className: "m-0 flex min-w-0 flex-col gap-2 border-0 p-0", children: [_jsx("legend", { className: "sr-only", children: legend }), children] }), isEditing && active && session.config ? (_jsxs("div", { className: "flex flex-col gap-3 pt-2", children: [_jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: saving ? labels.saving : "" }), shownError ? (_jsx("div", { ref: alertRef, role: "alert", tabIndex: -1, "data-slot": "opportunity-fact-edit-error", className: "rounded-md border border-[var(--tone-danger-border)] bg-[var(--tone-danger-soft)] px-3 py-2 text-sm/6 text-[var(--tone-danger-fg)]", children: shownError })) : null, showGuard ? (_jsxs("div", { role: "alert", "data-slot": "opportunity-fact-edit-guard", className: "flex flex-col gap-3 rounded-md border border-border bg-muted px-3 py-3", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("p", { className: "text-sm/6 font-medium text-foreground", children: labels.unsaved.title }), _jsx("p", { className: "text-sm/6 text-muted-foreground", children: labels.unsaved.body })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { ref: keepEditingRef, type: "button", onClick: keepEditing, children: labels.unsaved.keepEditing }), _jsx(Button, { type: "button", outline: true, onClick: session.discard, children: labels.unsaved.discard })] })] })) : (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Button, { type: "button", "aria-disabled": session.saveBlocked || undefined, "aria-busy": saving || undefined, onClick: () => void session.save(), "data-slot": "opportunity-fact-edit-save", children: [saving ? (_jsx(Loader2, { "aria-hidden": true, className: "size-4 animate-spin motion-reduce:animate-none" })) : null, saving ? labels.saving : labels.saveSection(labels.section[id])] }), _jsx(Button, { type: "button", outline: true, "aria-disabled": saving || undefined, onClick: () => {
255
+ guardOriginRef.current =
256
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
257
+ session.requestCancel();
258
+ }, "data-slot": "opportunity-fact-edit-cancel", children: labels.cancel })] })), alsoSaves ? (_jsx("p", { "data-slot": "opportunity-fact-edit-also-saves", className: "text-xs/5 text-muted-foreground", children: alsoSaves })) : null] })) : null] }));
259
+ }
260
+ /** CEL-2167 locked state: explains the lock, never offers a workaround. */
261
+ export function LockedTermsPanel({ labels, reason, onReviewOffers, onMount, }) {
262
+ // An unknown code (the union is closed at compile time, not at runtime)
263
+ // falls back to the generic copy; a raw code never renders.
264
+ const reasonCopy = (reason && labels.locked.reasons[reason]) || labels.locked.reason;
265
+ return (_jsxs("div", { ref: onMount, role: "status", tabIndex: -1, "data-slot": "opportunity-fact-terms-locked", className: "flex items-start gap-3 rounded-md border border-border bg-muted px-3 py-3 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring/70", children: [_jsx(Lock, { "aria-hidden": true, className: "mt-0.5 size-4 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "flex min-w-0 flex-col gap-2", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("p", { className: "text-sm/6 font-medium text-foreground", children: labels.locked.title }), _jsx("p", { className: "text-sm/6 text-muted-foreground", children: reasonCopy }), _jsx("p", { className: "text-sm/6 text-muted-foreground", children: labels.locked.sentOffersNote })] }), onReviewOffers ? (_jsx("div", { children: _jsx(Button, { type: "button", outline: true, onClick: onReviewOffers, children: labels.locked.reviewOffers }) })) : null] })] }));
266
+ }
267
+ //# sourceMappingURL=editable-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editable-section.js","sourceRoot":"","sources":["../../src/opportunity-facts/editable-section.tsx"],"names":[],"mappings":"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"}
@@ -4,4 +4,6 @@ export { defaultOpportunityFactLabels, type OpportunityFactLabels } from "./labe
4
4
  export { OpportunityFactSheet, type OpportunityFactSheetProps } from "./opportunity-fact-sheet.js";
5
5
  export { useOpportunityFactLabels } from "./use-opportunity-fact-labels.js";
6
6
  export type { BuildContext, CommercialTermsData, Fact, FactKey, FactProvenance, FactSection, FactSectionId, FactSheet, FactState, FitCriterionRow, FitFactSheet, FitSummaryCounts, OpportunityMatchFacts, Perspective, PublicOpportunity, PublicOpportunityBeverageType, PublicOpportunityCertifications, PublicOpportunityDeliveryTermsProvenance, PublicOpportunityEmbeddedMarket, PublicOpportunityEmbeddedTender, PublicOpportunityGrapeBlendEntry, PublicOpportunityPriceRange, TranslateFn, } from "./types.js";
7
+ export { defaultOpportunityFactEditLabels, type OpportunityEditableSectionId, type OpportunityFactEditLabels, } from "./edit-labels.js";
8
+ export type { FactFieldContext, FactFieldNode, OpportunityFactSectionEditing, } from "./editable-section.js";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/opportunity-facts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,IAAI,EACJ,OAAO,EACP,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,6BAA6B,EAC7B,+BAA+B,EAC/B,wCAAwC,EACxC,+BAA+B,EAC/B,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,WAAW,GACZ,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/opportunity-facts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,IAAI,EACJ,OAAO,EACP,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,6BAA6B,EAC7B,+BAA+B,EAC/B,wCAAwC,EACxC,+BAA+B,EAC/B,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gCAAgC,EAChC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,GAC/B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC"}
@@ -3,4 +3,5 @@ export { opportunityFactGlossaryEn } from "./glossary.en.js";
3
3
  export { defaultOpportunityFactLabels } from "./labels.js";
4
4
  export { OpportunityFactSheet } from "./opportunity-fact-sheet.js";
5
5
  export { useOpportunityFactLabels } from "./use-opportunity-fact-labels.js";
6
+ export { defaultOpportunityFactEditLabels, } from "./edit-labels.js";
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/opportunity-facts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAA8B,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAkC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/opportunity-facts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAA8B,MAAM,UAAU,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAkC,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AA0BzE,OAAO,EACL,gCAAgC,GAGjC,MAAM,eAAe,CAAC"}
@@ -2,6 +2,8 @@ import * as React from "react";
2
2
  import { type CommercialTermsLabels } from "../commercial-price/index.js";
3
3
  import { type OpportunityHeadingLevel } from "../opportunities/heading-level-context.js";
4
4
  import type { OpportunityTab, OpportunityTabId } from "../opportunities/types.js";
5
+ import { type OpportunityEditableSectionId, type OpportunityFactEditLabels, type OpportunityTermsLockedReason } from "./edit-labels.js";
6
+ import { type OpportunityFactSectionEditing } from "./editable-section.js";
5
7
  import { type OpportunityFactLabels } from "./labels.js";
6
8
  import type { FactKey, FactSectionId, FactSheet, Perspective } from "./types.js";
7
9
  export interface OpportunityFactSheetProps {
@@ -59,6 +61,37 @@ export interface OpportunityFactSheetProps {
59
61
  * "importer-owner"` and `facts.missing.length > 0`).
60
62
  */
61
63
  readonly ownerMissingAction?: React.ReactNode;
64
+ /**
65
+ * CEL-2129 — in-place edit mode for the importer-owner's sections. Each
66
+ * entry opts one section in and carries the consumer's controls and save
67
+ * handler (see `OpportunityFactSectionEditing`). Omit it (the default) and
68
+ * the sheet is read-only exactly as before; it is ignored for every
69
+ * perspective except `importer-owner`.
70
+ */
71
+ readonly editing?: Partial<Record<OpportunityEditableSectionId, OpportunityFactSectionEditing>>;
72
+ /**
73
+ * Controlled edit mode: the section being edited, or `null`. Pair it with
74
+ * `onEditingSectionChange` so a deep link (`?edit=delivery-terms`) can drive
75
+ * it; the sheet switches to the section's tab. Leave `undefined` for an
76
+ * uncontrolled sheet that tracks edit mode itself.
77
+ */
78
+ readonly editingSection?: OpportunityEditableSectionId | null;
79
+ /** Fires when the user opens or closes a section's edit mode. */
80
+ readonly onEditingSectionChange?: (section: OpportunityEditableSectionId | null) => void;
81
+ /** The field that gets focus when edit mode opens from outside (a deep link). Defaults to the first control. */
82
+ readonly initialFocusField?: FactKey;
83
+ /**
84
+ * CEL-2167 — delivery terms are locked because live offers exist. The
85
+ * delivery-terms section turns read-only and shows an explanation panel
86
+ * instead of an Edit button. Product requirements are not affected.
87
+ */
88
+ readonly termsLocked?: boolean;
89
+ /** Why the terms are locked; `editLabels.locked.reasons` maps it to copy, an unknown code falls back to generic copy. */
90
+ readonly termsLockedReason?: OpportunityTermsLockedReason;
91
+ /** "Review offers" action of the locked panel; the button only renders when this is set. */
92
+ readonly onReviewOffers?: () => void;
93
+ /** Copy for edit mode. Defaults to English; merged over the defaults. */
94
+ readonly editLabels?: Partial<OpportunityFactEditLabels>;
62
95
  readonly className?: string;
63
96
  }
64
97
  /**
@@ -66,6 +99,11 @@ export interface OpportunityFactSheetProps {
66
99
  * tabs (Overview, Commercial, Timeline, Compliance, Buyer). Consumers slot
67
100
  * extra tabs (Fit, Offers), header actions, and per-fact actions through
68
101
  * props — they never re-render facts themselves (spec §1/§5).
102
+ *
103
+ * CEL-2129: for `perspective="importer-owner"` the product-requirements and
104
+ * delivery-terms sections can switch to an in-place edit mode (`editing`),
105
+ * driven by the sheet or, for deep links, by the consumer
106
+ * (`editingSection` / `onEditingSectionChange`).
69
107
  */
70
- export declare function OpportunityFactSheet({ facts, perspective, locale, priceTypeLabel, deliveryTermLabel, tabs, actions, defaultTabId, labels: labelsProp, headingLevel: headingLevelProp, commercialTermsLabels: commercialTermsLabelsProp, factActions, sectionSlots, ownerMissingAction, className, }: OpportunityFactSheetProps): import("react/jsx-runtime").JSX.Element;
108
+ export declare function OpportunityFactSheet({ facts, perspective, locale, priceTypeLabel, deliveryTermLabel, tabs, actions, defaultTabId, labels: labelsProp, headingLevel: headingLevelProp, commercialTermsLabels: commercialTermsLabelsProp, factActions, sectionSlots, ownerMissingAction, editing, editingSection: editingSectionProp, onEditingSectionChange, initialFocusField, termsLocked: termsLockedProp, termsLockedReason, onReviewOffers, editLabels: editLabelsProp, className, }: OpportunityFactSheetProps): import("react/jsx-runtime").JSX.Element;
71
109
  //# sourceMappingURL=opportunity-fact-sheet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opportunity-fact-sheet.d.ts","sourceRoot":"","sources":["../../src/opportunity-facts/opportunity-fact-sheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAUlF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAgC,KAAK,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAQ,OAAO,EAAe,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,4FAA4F;IAC5F,QAAQ,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtE,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACzC,kHAAkH;IAClH,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC;IAChD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACxE;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA2ID;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,WAAW,EACX,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,IAAS,EACT,OAAO,EACP,YAAY,EACZ,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAgB,EAC9B,qBAAqB,EAAE,yBAAyB,EAChD,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,SAAS,GACV,EAAE,yBAAyB,2CAyJ3B"}
1
+ {"version":3,"file":"opportunity-fact-sheet.d.ts","sourceRoot":"","sources":["../../src/opportunity-facts/opportunity-fact-sheet.tsx"],"names":[],"mappings":"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"}