@mt-gloss/ui 0.1.139 → 0.2.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 (107) hide show
  1. package/{BaseAsyncButton-CJlY7Uik.js → BaseAsyncButton-Cq_l7clO.js} +29 -30
  2. package/COMMITS-Dm8qIHaq.js +444 -0
  3. package/Expandable-BcmIxWR8.js +13807 -0
  4. package/UIContext-DP6JGCto.js +1731 -0
  5. package/catalog.js +120 -122
  6. package/composites-panels.js +581 -1404
  7. package/index.d.ts +4 -2
  8. package/index.js +2368 -2029
  9. package/internals.js +80 -81
  10. package/lib/base/BaseAccordion/BaseAccordion.d.ts +4 -24
  11. package/lib/base/BaseCard/BaseCard.d.ts +8 -48
  12. package/lib/base/BaseCheckbox/BaseCheckbox.d.ts +1 -6
  13. package/lib/base/BaseInput/BaseInput.d.ts +1 -6
  14. package/lib/base/BaseMaskedInput/BaseMaskedInput.d.ts +1 -6
  15. package/lib/base/BaseMenu/BaseMenu.d.ts +2 -12
  16. package/lib/base/BaseRadio/BaseRadio.d.ts +1 -6
  17. package/lib/base/BaseRating/BaseRating.d.ts +1 -6
  18. package/lib/base/BaseSegmentedControl/BaseSegmentedControl.d.ts +1 -6
  19. package/lib/base/BaseSelect/BaseSelect.d.ts +2 -12
  20. package/lib/base/BaseTextarea/BaseTextarea.d.ts +1 -6
  21. package/lib/base/BaseToggle/BaseToggle.d.ts +1 -6
  22. package/lib/base/BaseTooltip/BaseTooltip.d.ts +1 -6
  23. package/lib/composites/dashboard/BellPopover/BellPopover.d.ts +0 -12
  24. package/lib/composites/forms/PasswordInput.d.ts +1 -6
  25. package/lib/composites/forms/PhoneInput.d.ts +1 -6
  26. package/lib/composites/forms/SearchInput.d.ts +1 -6
  27. package/lib/composites/forms/TagInput.d.ts +1 -6
  28. package/lib/composites/inputs/FilterChip.d.ts +1 -6
  29. package/lib/composites/overlay/SplitButton/SplitButton.d.ts +1 -6
  30. package/lib/composites/panels/PanelChrome.d.ts +1 -23
  31. package/lib/composites/panels/PanelSlot.d.ts +3 -14
  32. package/lib/composites/panels/coordinator/types.d.ts +1 -12
  33. package/lib/composites/panels/index.d.ts +4 -7
  34. package/lib/composites/panels/shells/CatalogAddShell.d.ts +8 -21
  35. package/lib/composites/panels/shells/CatalogReplaceShell.d.ts +4 -9
  36. package/lib/composites/panels/shells/PageMgmtShell.d.ts +3 -28
  37. package/lib/composites/panels/shells/SettingsShell.d.ts +3 -57
  38. package/lib/composites/panels/shells/index.d.ts +2 -4
  39. package/lib/composites/panels/shells/internals/CatalogLensPicker.d.ts +1 -14
  40. package/lib/composites/panels/shells/internals/CatalogTileGrid.d.ts +1 -18
  41. package/lib/composites/panels/shells/internals/PageMgmtFooter.d.ts +0 -11
  42. package/lib/composites/panels/shells/internals/PageMgmtRow.d.ts +1 -6
  43. package/lib/composites/panels/shells/internals/catalog-mocks.d.ts +8 -145
  44. package/lib/composites/panels/stage3d/CloneStage.d.ts +1 -11
  45. package/lib/containers/ContainerDialog/ContainerDialog.d.ts +3 -18
  46. package/lib/containers/ContainerFormSection/ContainerFormSection.d.ts +1 -6
  47. package/lib/containers/ContainerPanel/ContainerPanel.d.ts +1 -6
  48. package/lib/containers/ContainerTable/ContainerTable.d.ts +1 -6
  49. package/lib/containers/ContainerToolbar/ContainerToolbar.d.ts +1 -6
  50. package/lib/presets/PresetAccordion/PresetAccordion.d.ts +4 -24
  51. package/lib/presets/PresetBadge/PresetBadge.d.ts +1 -6
  52. package/lib/presets/PresetCard/PresetCard.d.ts +8 -48
  53. package/lib/presets/PresetCheckbox/PresetCheckbox.d.ts +1 -6
  54. package/lib/presets/PresetChip/PresetChip.d.ts +1 -6
  55. package/lib/presets/PresetColorPicker/PresetColorPicker.d.ts +1 -6
  56. package/lib/presets/PresetDatePicker/PresetDatePicker.d.ts +1 -6
  57. package/lib/presets/PresetDateRangePicker/PresetDateRangePicker.d.ts +1 -6
  58. package/lib/presets/PresetFileUpload/PresetFileUpload.d.ts +1 -6
  59. package/lib/presets/PresetInput/PresetInput.d.ts +1 -6
  60. package/lib/presets/PresetLink/PresetLink.d.ts +1 -6
  61. package/lib/presets/PresetMaskedInput/PresetMaskedInput.d.ts +1 -6
  62. package/lib/presets/PresetMenu/PresetMenu.d.ts +2 -12
  63. package/lib/presets/PresetNumberInput/PresetNumberInput.d.ts +1 -6
  64. package/lib/presets/PresetRadio/PresetRadio.d.ts +1 -6
  65. package/lib/presets/PresetRangeSlider/PresetRangeSlider.d.ts +1 -6
  66. package/lib/presets/PresetRating/PresetRating.d.ts +1 -6
  67. package/lib/presets/PresetTextarea/PresetTextarea.d.ts +1 -6
  68. package/lib/presets/PresetTimePicker/PresetTimePicker.d.ts +1 -6
  69. package/lib/presets/PresetToggle/PresetToggle.d.ts +1 -6
  70. package/lib/primitives/dashboard/ResizePill/ResizePill.d.ts +1 -7
  71. package/lib/primitives/dashboard/index.d.ts +0 -1
  72. package/lib/wrappers/Actionable/Actionable.d.ts +1 -6
  73. package/lib/wrappers/AsyncLoader/AsyncLoader.d.ts +1 -6
  74. package/lib/wrappers/ButtonGroup/ButtonGroup.d.ts +1 -6
  75. package/lib/wrappers/CheckboxGroup/CheckboxGroup.d.ts +1 -6
  76. package/lib/wrappers/Dismissible/Dismissible.d.ts +1 -6
  77. package/lib/wrappers/Expandable/Expandable.d.ts +1 -6
  78. package/lib/wrappers/InputGroup/InputGroup.d.ts +2 -12
  79. package/lib/wrappers/RadioGroup/RadioGroup.d.ts +1 -6
  80. package/lib/wrappers/Selectable/Selectable.d.ts +1 -6
  81. package/lib/wrappers/Sortable/Sortable.d.ts +1 -6
  82. package/package.json +1 -1
  83. package/ui.css +1 -1
  84. package/BaseText-Dxbk1JJa.js +0 -66
  85. package/COMMITS-DEdHYT0E.js +0 -963
  86. package/Expandable-DA4NFzCR.js +0 -13243
  87. package/MetricCard-DOPtBpek.js +0 -698
  88. package/UIContext-CGQI_KJk.js +0 -1808
  89. package/lib/composites/panels/chrome-v2/PanelBody.d.ts +0 -5
  90. package/lib/composites/panels/chrome-v2/PanelChromeV2.d.ts +0 -18
  91. package/lib/composites/panels/chrome-v2/PanelFooter.d.ts +0 -6
  92. package/lib/composites/panels/chrome-v2/PanelFooterMessage.d.ts +0 -6
  93. package/lib/composites/panels/chrome-v2/PanelHeader.d.ts +0 -10
  94. package/lib/composites/panels/chrome-v2/PanelNavigation.d.ts +0 -5
  95. package/lib/composites/panels/chrome-v2/PanelStage.d.ts +0 -5
  96. package/lib/composites/panels/chrome-v2/index.d.ts +0 -23
  97. package/lib/composites/panels/coordinator/settingsBufferSchemas.d.ts +0 -13
  98. package/lib/composites/panels/hooks/useEditingCardId.d.ts +0 -16
  99. package/lib/composites/panels/shells/MetricInfoShell.d.ts +0 -29
  100. package/lib/composites/panels/shells/NotificationCenterShell.d.ts +0 -2
  101. package/lib/composites/panels/shells/settings/GhostSlotPill.d.ts +0 -7
  102. package/lib/composites/panels/shells/settings/SlotsControls.d.ts +0 -11
  103. package/lib/composites/panels/shells/settings/TimeframeControls.d.ts +0 -6
  104. package/lib/composites/panels/shells/settings/index.d.ts +0 -14
  105. package/lib/primitives/dashboard/SettingsTabStrip/SettingsTabStrip.d.ts +0 -17
  106. package/lib/primitives/dashboard/SettingsTabStrip/index.d.ts +0 -6
  107. package/lib/primitives/dashboard/SettingsTabStrip/types.d.ts +0 -12
@@ -1,710 +1,80 @@
1
- import { u as M, g as xe, m as ae, n as z, l as Ae, S as De, e as Me, o as Le } from "./COMMITS-DEdHYT0E.js";
2
- import { C as Wt, N as jt, w as Zt, x as Xt, q as Jt, f as en, v as tn, P as nn, t as an, k as sn, j as on, i as rn, h as ln } from "./COMMITS-DEdHYT0E.js";
3
- import { jsx as a, jsxs as b, Fragment as ge } from "react/jsx-runtime";
4
- import * as U from "react";
5
- import I, { useState as E, useRef as K, createContext as ye, useContext as be, useMemo as ie, useEffect as F, useCallback as k, useLayoutEffect as ke } from "react";
6
- import { SPIN_COMMIT_REDUCED as Oe, SPIN_COMMIT_FULL as Ie } from "@mt-gloss/motion";
7
- import { useMotionValue as ce, animate as B, motion as Re } from "framer-motion";
8
- import { useSensors as $e, useSensor as de, PointerSensor as Fe, KeyboardSensor as ze, DndContext as He, closestCenter as Ue } from "@dnd-kit/core";
9
- import { sortableKeyboardCoordinates as Be, SortableContext as Ye, horizontalListSortingStrategy as Ve, arrayMove as Ke, useSortable as qe } from "@dnd-kit/sortable";
10
- import { CSS as Ge } from "@dnd-kit/utilities";
11
- import { M as ue } from "./MetricCard-DOPtBpek.js";
12
- function Rt() {
13
- const e = M();
14
- if (e?.state.activePanelId !== "settings") return null;
15
- const t = e.state.activeTrigger;
16
- return t?.kind === "card-overflow" ? t.cardId : null;
17
- }
18
- function ve({ span: e, rotating: t = !0, children: s }) {
19
- const r = ["clone-card", `span-${e}`, t ? "rotating" : ""].filter(Boolean).join(" "), n = s != null ? "full" : "fallback";
20
- return /* @__PURE__ */ a("div", { className: r, "data-clone-fidelity": n, children: s });
21
- }
22
- const Qe = 500, We = 1, je = "var(--gloss-color-primary, #6366f1)";
23
- function Ze({
24
- children: e,
25
- spinTrigger: t,
26
- onSpinComplete: s,
27
- spinDuration: r,
28
- spinRotations: n,
29
- accentColor: c
30
- }) {
31
- const p = ce(0), o = ce(1), i = U.useRef(null), l = U.useMemo(() => xe() === "reduced", []), d = U.useRef(t);
32
- return U.useEffect(() => {
33
- if (t === void 0 || t === d.current) return;
34
- d.current = t;
35
- const h = (r ?? Qe) / 1e3, y = n ?? We, m = i.current;
36
- if (l) {
37
- const g = [];
38
- if (m) {
39
- const x = B(
40
- m,
41
- { opacity: [0, 0.4, 0] },
42
- Oe
43
- );
44
- g.push(x), x.then(() => {
45
- s?.();
46
- });
47
- } else
48
- Promise.resolve().then(() => {
49
- s?.();
50
- });
51
- return () => {
52
- g.forEach((x) => x.stop());
53
- };
54
- }
55
- const v = { ...Ie, duration: h }, _ = B(p, [0, 360 * y], v), N = B(o, [1, 1.03, 1], v), w = [_, N];
56
- if (m) {
57
- const g = B(
58
- m,
59
- { opacity: [0, 0.6, 0, 0] },
60
- { ...v, times: [0, 0.3, 0.8, 1] }
61
- );
62
- w.push(g);
63
- }
64
- return _.then(() => {
65
- s?.();
66
- }), () => {
67
- w.forEach((g) => g.stop());
68
- };
69
- }, [t, r, n, l, s, p, o]), /* @__PURE__ */ b(
70
- Re.div,
71
- {
72
- className: "clone-stage",
73
- style: { rotateY: p, scale: o },
74
- children: [
75
- e,
76
- /* @__PURE__ */ a(
77
- "div",
78
- {
79
- ref: i,
80
- className: "clone-stage__accent",
81
- style: {
82
- "--spin-accent-color": c ?? je
83
- }
84
- }
85
- )
86
- ]
87
- }
88
- );
89
- }
90
- function $t({ primary: e, secondary: t }) {
91
- return /* @__PURE__ */ b("div", { className: "gloss-panel-chrome-v2__footer-msg", children: [
92
- /* @__PURE__ */ a("span", { className: "gloss-panel-chrome-v2__footer-msg-primary", children: e }),
93
- t != null && /* @__PURE__ */ a("span", { className: "gloss-panel-chrome-v2__footer-msg-secondary", children: t })
94
- ] });
95
- }
96
- function Xe({ value: e, onChange: t }) {
97
- return /* @__PURE__ */ b("div", { className: "settings-shell__field settings-shell__field--timeframe", children: [
98
- /* @__PURE__ */ a("span", { className: "settings-shell__label", "aria-hidden": "true", children: "Rolling period (days)" }),
99
- /* @__PURE__ */ b("div", { className: "settings-shell__slider-row", children: [
100
- /* @__PURE__ */ a(
101
- "input",
102
- {
103
- id: "settings-timeframe-input",
104
- type: "range",
105
- min: 7,
106
- max: 90,
107
- value: e,
108
- onChange: t,
109
- "aria-label": "Timeframe",
110
- "aria-valuenow": e,
111
- "aria-valuemin": 7,
112
- "aria-valuemax": 90,
113
- className: "settings-shell__slider"
114
- }
115
- ),
116
- /* @__PURE__ */ b("span", { className: "settings-shell__slider-value", "aria-live": "polite", children: [
117
- e,
118
- " days"
119
- ] })
120
- ] })
121
- ] });
122
- }
123
- function Je({
124
- id: e,
125
- onActivate: t,
126
- disabled: s
127
- }) {
128
- const r = "settings-shell__slot-pill settings-shell__slot-pill--ghost" + (s ? " settings-shell__slot-pill--ghost-disabled" : "");
129
- return /* @__PURE__ */ a("li", { className: r, "data-ghost": "true", children: /* @__PURE__ */ a(
130
- "button",
131
- {
132
- type: "button",
133
- className: "settings-shell__slot-pill__ghost-activate",
134
- "aria-label": `Restore ${e}`,
135
- "aria-disabled": s ? "true" : void 0,
136
- onClick: s ? void 0 : t,
137
- children: /* @__PURE__ */ a("span", { className: "settings-shell__slot-pill__label", children: e })
138
- }
139
- ) });
140
- }
141
- function et({
142
- id: e,
143
- onRemove: t,
144
- removeDisabled: s
145
- }) {
146
- const { attributes: r, listeners: n, setNodeRef: c, transform: p, transition: o, isDragging: i } = qe({ id: e }), l = {
147
- transform: Ge.Transform.toString(p),
148
- transition: o,
149
- opacity: i ? 0.6 : 1
150
- };
151
- return /* @__PURE__ */ b(
152
- "li",
153
- {
154
- ref: c,
155
- style: l,
156
- className: `settings-shell__slot-pill${i ? " settings-shell__slot-pill--dragging" : ""}`,
157
- children: [
158
- /* @__PURE__ */ a(
159
- "button",
160
- {
161
- type: "button",
162
- className: "settings-shell__slot-pill__handle",
163
- "aria-label": `Reorder ${e}`,
164
- ...r,
165
- ...n,
166
- children: /* @__PURE__ */ a("span", { "aria-hidden": "true", className: "settings-shell__slot-pill__grip", children: "⋮⋮" })
167
- }
168
- ),
169
- /* @__PURE__ */ a("span", { className: "settings-shell__slot-pill__label", children: e }),
170
- /* @__PURE__ */ a(
171
- "button",
172
- {
173
- type: "button",
174
- className: "settings-shell__slot-pill__remove" + (s ? " settings-shell__slot-pill__remove--disabled" : ""),
175
- "aria-label": `Remove ${e}`,
176
- "aria-disabled": s ? "true" : void 0,
177
- onClick: s ? void 0 : t,
178
- children: "×"
179
- }
180
- )
181
- ]
182
- }
183
- );
184
- }
185
- function tt({
186
- value: e,
187
- onChange: t,
188
- naturalSlots: s
189
- }) {
190
- const r = $e(
191
- de(Fe, { activationConstraint: { distance: 4 } }),
192
- de(ze, { coordinateGetter: Be })
193
- ), n = (u) => {
194
- const { active: h, over: y } = u;
195
- if (!y || h.id === y.id) return;
196
- const m = e.findIndex((_) => _ === h.id), v = e.findIndex((_) => _ === y.id);
197
- m === -1 || v === -1 || t(Ke([...e], m, v));
198
- }, c = e.length === 1, p = (u) => {
199
- c || t(e.filter((h) => h !== u));
200
- }, o = I.useMemo(() => new Set(e), [e]), i = I.useMemo(
201
- () => (s ?? []).filter((u) => !o.has(u)),
202
- [s, o]
203
- ), l = !1, d = (u) => {
204
- t([...e, u]);
205
- };
206
- return /* @__PURE__ */ b("div", { className: "settings-shell__field settings-shell__field--slots", "aria-label": "Stack slots", children: [
207
- /* @__PURE__ */ a(He, { sensors: r, collisionDetection: Ue, onDragEnd: n, children: /* @__PURE__ */ a(Ye, { items: [...e], strategy: Ve, children: /* @__PURE__ */ b("ul", { className: "settings-shell__slots-list", role: "list", children: [
208
- e.map((u) => /* @__PURE__ */ a(
209
- et,
210
- {
211
- id: u,
212
- onRemove: () => p(u),
213
- removeDisabled: c
214
- },
215
- u
216
- )),
217
- i.map((u) => /* @__PURE__ */ a(
218
- Je,
219
- {
220
- id: u,
221
- onActivate: () => d(u),
222
- disabled: l
223
- },
224
- `ghost:${u}`
225
- ))
226
- ] }) }) }),
227
- /* @__PURE__ */ a("p", { className: "settings-shell__help settings-shell__help--small", children: "Drag to reorder · click × to remove" })
228
- ] });
229
- }
230
- const nt = ["Orders", "Quota", "Unassigned"], at = ["timeframe"];
231
- function Ft({
1
+ import { u as I, f as q, a as Z, g as N, c as w } from "./COMMITS-Dm8qIHaq.js";
2
+ import { C as Ve, b as qe, P as Be, e as He, i as Ue, r as Ye, d as Ke } from "./COMMITS-Dm8qIHaq.js";
3
+ import { jsx as s, jsxs as h, Fragment as ee } from "react/jsx-runtime";
4
+ import { useState as y, useRef as B, createContext as H, useContext as U, useEffect as F, useLayoutEffect as te, useCallback as Y } from "react";
5
+ function ne({ children: e }) {
6
+ return /* @__PURE__ */ s("div", { className: "clone-stage", children: e });
7
+ }
8
+ function oe({ span: e, rotating: t = !0, children: o }) {
9
+ const n = ["clone-card", `span-${e}`, t ? "rotating" : ""].filter(Boolean).join(" ");
10
+ return /* @__PURE__ */ s("div", { className: n, children: o });
11
+ }
12
+ const se = ["#1d6fd8", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"];
13
+ function Le({
232
14
  isOpen: e,
233
15
  cardSpan: t,
234
- cardLabel: s = "Metric",
235
- cardValue: r = "—",
236
- previewSlot: n,
237
- dimensions: c = at,
238
- initialTab: p,
239
- initialValues: o,
240
- naturalSlots: i
16
+ cardLabel: o = "Metric",
17
+ cardValue: n = "—"
241
18
  }) {
242
- const l = M(), d = l?.state.activeTrigger, u = d?.kind === "card-overflow" ? d.cardId : null, h = ae(), y = d?.span, m = t ?? y ?? 1, v = c[0] ?? "timeframe", [_, N] = I.useState(p ?? v);
243
- I.useEffect(() => {
244
- c.includes(_) || N(v);
245
- }, [c, _, v]);
246
- const g = u != null ? l?.state?.bufferByCard?.[u]?.changes ?? {} : {}, x = typeof g.timeframe == "number" ? g.timeframe : typeof o?.timeframe == "number" ? o.timeframe : 30, R = Array.isArray(g.slots) ? g.slots : Array.isArray(o?.slots) ? o.slots : nt, $ = (S) => {
247
- u == null || l == null || l.dispatch({ type: "SET_BUFFER_VALUE", cardId: u, key: "timeframe", value: Number(S.target.value) });
248
- }, P = (S) => {
249
- u == null || l == null || l.dispatch({ type: "SET_BUFFER_VALUE", cardId: u, key: "slots", value: S });
250
- }, A = l?.state.isDirty ?? !1, H = u, q = () => {
251
- H != null && l?.dispatch({ type: "CLEAR_BUFFER", cardId: H });
252
- }, [le, G] = I.useState(0), Q = () => {
253
- G((S) => S + 1), l?.dispatch({ type: "CLOSE_PANEL", reason: "apply-button" });
254
- }, f = I.useCallback(() => {
255
- }, []);
256
- return /* @__PURE__ */ a(
257
- z,
258
- {
259
- variant: "with-stage",
260
- onClose: () => l?.dispatch({ type: "CLOSE_PANEL", reason: "header-x" }),
261
- stage: (
262
- // M003-S004-MOT-02 — CloneStage wraps CloneCard so the spin-commit
263
- // gesture has a transform host that does NOT disturb the inner
264
- // CloneCard's existing sway / span-N geometry. Counter is owned here
265
- // (Option 3); reptime sees no spinTrigger plumbing.
266
- /* @__PURE__ */ a(Ze, { spinTrigger: le, onSpinComplete: f, children: /* @__PURE__ */ a(ve, { span: m, rotating: !h, children: n ?? /* @__PURE__ */ b(ge, { children: [
267
- /* @__PURE__ */ a("div", { style: { fontSize: 9, textTransform: "uppercase", letterSpacing: "0.06em", color: "#9ca3af", marginBottom: 6 }, children: s }),
268
- /* @__PURE__ */ a("div", { style: { fontSize: 22, fontWeight: 700, color: "#111827", lineHeight: 1 }, children: r })
269
- ] }) }) })
270
- ),
271
- navigation: /* @__PURE__ */ a(
272
- Ae,
273
- {
274
- dimensions: c,
275
- activeTab: _,
276
- onSelect: N,
277
- reduced: h
278
- }
279
- ),
280
- footer: {
281
- left: /* @__PURE__ */ a(
282
- "button",
19
+ const a = I(), r = a?.state.activeTrigger, d = r?.kind === "card-overflow" ? r.cardId : null, l = q(), i = r?.span, c = t ?? i ?? 1, u = d != null ? a?.state?.bufferByCard?.[d]?.changes ?? {} : {}, m = typeof u.threshold == "number" ? u.threshold : 50, f = typeof u.accent == "string" ? u.accent : null, v = (g) => {
20
+ d == null || a == null || a.dispatch({ type: "SET_BUFFER_VALUE", cardId: d, key: "threshold", value: Number(g.target.value) });
21
+ }, b = (g) => {
22
+ d == null || a == null || a.dispatch({ type: "SET_BUFFER_VALUE", cardId: d, key: "accent", value: g });
23
+ };
24
+ return /* @__PURE__ */ h("div", { "data-shell": "settings", "aria-hidden": !e, children: [
25
+ /* @__PURE__ */ s(ne, { children: /* @__PURE__ */ h(oe, { span: c, rotating: !l, children: [
26
+ /* @__PURE__ */ s("div", { style: { fontSize: 9, textTransform: "uppercase", letterSpacing: "0.06em", color: "#9ca3af", marginBottom: 6 }, children: o }),
27
+ /* @__PURE__ */ s("div", { style: { fontSize: 22, fontWeight: 700, color: "#111827", lineHeight: 1 }, children: n })
28
+ ] }) }),
29
+ /* @__PURE__ */ h("div", { className: "settings-shell__controls", children: [
30
+ /* @__PURE__ */ s("h3", { className: "settings-shell__heading", children: "Settings" }),
31
+ /* @__PURE__ */ h("label", { className: "settings-shell__field", children: [
32
+ /* @__PURE__ */ s("span", { className: "settings-shell__label", children: "Threshold" }),
33
+ /* @__PURE__ */ s(
34
+ "input",
283
35
  {
284
- id: "btn-reset",
285
- type: "button",
286
- className: "gloss-panel-chrome-v2__footer-btn",
287
- disabled: !A,
288
- onClick: q,
289
- children: "Reset"
36
+ type: "range",
37
+ min: 0,
38
+ max: 100,
39
+ step: 1,
40
+ value: m,
41
+ onChange: v,
42
+ className: "settings-shell__slider",
43
+ "aria-label": "Threshold",
44
+ "data-testid": "settings-threshold-slider"
290
45
  }
291
46
  ),
292
- right: /* @__PURE__ */ a(
47
+ /* @__PURE__ */ s("span", { className: "settings-shell__value", "aria-live": "polite", children: m })
48
+ ] }),
49
+ /* @__PURE__ */ h("div", { className: "settings-shell__field", children: [
50
+ /* @__PURE__ */ s("span", { className: "settings-shell__label", children: "Accent" }),
51
+ /* @__PURE__ */ s("div", { className: "settings-shell__swatches", role: "radiogroup", "aria-label": "Accent color", children: se.map((g) => /* @__PURE__ */ s(
293
52
  "button",
294
53
  {
295
- id: "settings-apply",
296
54
  type: "button",
297
- className: "gloss-panel-chrome-v2__footer-btn gloss-panel-chrome-v2__footer-btn--primary",
298
- disabled: !A,
299
- onClick: Q,
300
- children: "Apply"
301
- }
302
- )
303
- },
304
- children: /* @__PURE__ */ a("div", { className: "settings-shell", "data-shell": "settings", "aria-hidden": !e, children: /* @__PURE__ */ b(
305
- "div",
306
- {
307
- role: "tabpanel",
308
- id: `settings-tabpanel-${_}`,
309
- "aria-label": "Settings dimension controls",
310
- tabIndex: 0,
311
- className: "settings-shell__tabpanel",
312
- children: [
313
- _ === "timeframe" && /* @__PURE__ */ a(Xe, { value: x, onChange: $ }),
314
- _ === "slots" && /* @__PURE__ */ a(tt, { value: R, onChange: P, naturalSlots: i })
315
- ]
316
- }
317
- ) })
318
- }
319
- );
320
- }
321
- function st({
322
- isOpen: e,
323
- cardSpan: t,
324
- previewSlot: s,
325
- metricInfo: r
326
- }) {
327
- const n = M(), c = n?.state.activeTrigger, p = ae(), o = c?.span;
328
- return /* @__PURE__ */ a(
329
- z,
330
- {
331
- variant: "with-stage",
332
- onClose: () => n?.dispatch({ type: "CLOSE_PANEL", reason: "header-x" }),
333
- stage: /* @__PURE__ */ a(ve, { span: t ?? o ?? 1, rotating: !p, children: s }),
334
- children: /* @__PURE__ */ b(
335
- "div",
336
- {
337
- className: "metric-info-shell",
338
- "data-shell": "metric-info",
339
- "aria-hidden": !e,
340
- children: [
341
- /* @__PURE__ */ a("h2", { className: "metric-info-shell__title", children: r.title }),
342
- /* @__PURE__ */ a("p", { className: "metric-info-shell__description", children: r.description })
343
- ]
344
- }
345
- )
346
- }
347
- );
348
- }
349
- st.displayName = "MetricInfoShell";
350
- const _e = [
351
- "Revenue",
352
- "Order flow",
353
- "Rep performance",
354
- "Brand portfolio",
355
- "Account coverage",
356
- "Commission"
357
- ], Ce = "Revenue", Ne = {
358
- Revenue: {
359
- headline: "Are we hitting our number?",
360
- helper: "Top-line sales, growth, average order value, and pace-to-plan signals."
361
- },
362
- "Order flow": {
363
- headline: "Are orders flowing through?",
364
- helper: "Daily activity, pipeline, unassigned work, and cancel-rate health."
365
- },
366
- "Rep performance": {
367
- headline: "How are my reps performing?",
368
- helper: "Quota attainment, leaderboards, and activity flags across the rep team."
369
- },
370
- "Brand portfolio": {
371
- headline: "Which brands matter?",
372
- helper: "Manufacturer mix, top performers, and emerging line health."
373
- },
374
- "Account coverage": {
375
- headline: "Where are the gaps?",
376
- helper: "New, active, inactive, and at-risk customer accounts."
377
- },
378
- Commission: {
379
- headline: "What's our commission rate?",
380
- helper: "Outstanding balances, aging buckets, and effective commission yield."
381
- }
382
- }, Se = {
383
- Revenue: {
384
- primary: [
385
- {
386
- id: "agency-sales",
387
- label: "Sales",
388
- value: "$892,450",
389
- desc: "Agency total sales with trend sparkline",
390
- cardType: "sparkline",
391
- sparklineData: [620, 640, 680, 700, 740, 760, 790, 820, 850, 892],
392
- prefix: "$",
393
- startHere: !0
394
- },
395
- {
396
- id: "agency-sales-stacked",
397
- label: "Sales",
398
- value: "$892,450",
399
- desc: "Agency sales across three timeframes at a glance (MTD shown)",
400
- variants: ["1×3"],
401
- subStats: [
402
- { label: "MTD", value: "$892K" },
403
- { label: "QTD", value: "$2.4M" },
404
- { label: "YTD", value: "$8.6M" }
405
- ],
406
- cardType: "stacked-group",
407
- stackedTimeframes: ["MTD", "QTD", "YTD"]
408
- },
409
- {
410
- id: "agency-growth",
411
- label: "Sales Growth",
412
- value: "+18%",
413
- desc: "Year-over-year agency sales growth rate",
414
- cardType: "standard",
415
- suffix: "%",
416
- trend: { value: 18, direction: "up" }
417
- },
418
- {
419
- id: "agency-aov",
420
- label: "Avg Order",
421
- value: "$2,340",
422
- desc: "Average order value with trend sparkline",
423
- cardType: "sparkline",
424
- sparklineData: [2100, 2150, 2200, 2180, 2250, 2280, 2300, 2320, 2335, 2340],
425
- prefix: "$"
426
- },
427
- {
428
- id: "agency-aov-stacked",
429
- label: "Avg Order",
430
- value: "$2,340",
431
- desc: "Average order value across three timeframes",
432
- variants: ["1×3"],
433
- subStats: [
434
- { label: "MTD", value: "$2,340" },
435
- { label: "QTD", value: "$2,280" },
436
- { label: "YTD", value: "$2,210" }
437
- ],
438
- cardType: "stacked-group",
439
- stackedTimeframes: ["MTD", "QTD", "YTD"]
440
- },
441
- {
442
- id: "agency-conversion",
443
- label: "Conversion",
444
- value: "68%",
445
- desc: "Order completion rate vs cancellations",
446
- cardType: "donut",
447
- donutValue: 0.68,
448
- accentColor: "#10b981",
449
- suffix: "%"
450
- }
451
- ],
452
- secondary: [
453
- {
454
- id: "agency-revenue-compact",
455
- label: "Total Revenue",
456
- value: "$892,450",
457
- desc: "Agency revenue with sparkline trend",
458
- cardType: "sparkline",
459
- sparklineData: [620, 660, 700, 740, 780, 820, 860, 892],
460
- prefix: "$"
461
- },
462
- {
463
- id: "agency-yoy-versus",
464
- label: "YoY Comparison",
465
- value: "$892K",
466
- desc: "TY vs LY sales side-by-side",
467
- cardType: "versus",
468
- comparison: {
469
- current: { value: "$892K", label: "This year" },
470
- prior: { value: "$724K", label: "Last year" }
471
- }
472
- },
473
- {
474
- id: "agency-revenue-by-mfr",
475
- label: "Mfr Revenue",
476
- value: "$892K",
477
- desc: "Revenue mix across top manufacturers",
478
- cardType: "segmented",
479
- segments: [
480
- { label: "A", value: 35, color: "#7c3aed" },
481
- { label: "B", value: 28, color: "#1d6fd8" },
482
- { label: "C", value: 22, color: "#10b981" },
483
- { label: "D", value: 15, color: "#f59e0b" }
484
- ]
485
- }
486
- ]
487
- },
488
- "Order flow": {
489
- primary: [
490
- {
491
- id: "agency-activity",
492
- label: "Orders",
493
- value: "47 Orders",
494
- desc: "Daily team order count with bar chart",
495
- cardType: "bars",
496
- barData: [12, 18, 15, 22, 19, 25, 28],
497
- startHere: !0
498
- },
499
- {
500
- id: "agency-orders-compact",
501
- label: "Order Count",
502
- value: "156",
503
- desc: "Total order count with bar chart trend",
504
- cardType: "bars",
505
- barData: [18, 22, 19, 24, 26, 23, 28]
506
- },
507
- {
508
- id: "agency-orders-stacked",
509
- label: "Orders",
510
- value: "156",
511
- desc: "Order count across three timeframes",
512
- variants: ["1×3"],
513
- subStats: [
514
- { label: "MTD", value: "156" },
515
- { label: "QTD", value: "482" },
516
- { label: "YTD", value: "1,847" }
517
- ],
518
- cardType: "stacked-group",
519
- stackedTimeframes: ["MTD", "QTD", "YTD"]
520
- },
521
- {
522
- id: "agency-order-pipeline-value",
523
- label: "Pipeline Value",
524
- value: "$284,500",
525
- desc: "Open + transmitted order $ pipeline",
526
- cardType: "standard",
527
- prefix: "$"
528
- },
529
- {
530
- id: "agency-unassigned-orders",
531
- label: "Unassigned",
532
- value: "0",
533
- desc: "Orders awaiting salesperson assignment",
534
- cardType: "standard"
535
- },
536
- {
537
- id: "agency-cancel-rate",
538
- label: "Cancel Rate",
539
- value: "4.2%",
540
- desc: "Order cancel-rate percentage (warn-tinted highlight)",
541
- cardType: "highlight",
542
- highlightColor: "#f59e0b",
543
- suffix: "%"
544
- }
545
- ]
546
- },
547
- "Rep performance": {
548
- primary: [
549
- {
550
- id: "agency-top-rep",
551
- label: "#1 Rep",
552
- value: "Sarah Mitchell",
553
- desc: "Top-performing rep on the team this period",
554
- cardType: "name",
555
- startHere: !0
556
- },
557
- {
558
- id: "agency-quota",
559
- label: "Below Quota",
560
- value: "3 of 12",
561
- desc: "Reps currently tracking under their quota",
562
- cardType: "ratio",
563
- numerator: 3,
564
- denominator: 12
565
- },
566
- {
567
- id: "agency-rep-leaderboard-sales",
568
- label: "Rep Sales",
569
- value: "Top 5",
570
- desc: "Sales leaderboard across the rep team",
571
- cardType: "leaderboard",
572
- catalogValue: "Top 5"
573
- }
574
- ]
575
- },
576
- "Brand portfolio": {
577
- primary: [
578
- {
579
- id: "agency-mfr-mix",
580
- label: "Mfr Mix",
581
- value: "$892K",
582
- desc: "Revenue mix by manufacturer (segmented bar)",
583
- cardType: "segmented",
584
- segments: [
585
- { label: "A", value: 35, color: "#7c3aed" },
586
- { label: "B", value: 28, color: "#1d6fd8" },
587
- { label: "C", value: 22, color: "#10b981" },
588
- { label: "D", value: 15, color: "#f59e0b" }
589
- ],
590
- startHere: !0
591
- },
592
- {
593
- id: "agency-mfr-new-line",
594
- label: "New Mfrs",
595
- value: "3",
596
- desc: "New manufacturer count for the period",
597
- cardType: "standard"
598
- }
599
- ]
600
- },
601
- "Account coverage": {
602
- primary: [
603
- {
604
- id: "agency-new-accounts",
605
- label: "New Accounts",
606
- value: "12",
607
- desc: "New customer accounts opened this period",
608
- cardType: "standard",
609
- startHere: !0
610
- },
611
- {
612
- id: "agency-customers-compact",
613
- label: "Customers",
614
- value: "287",
615
- desc: "Active customer count with bar chart trend",
616
- cardType: "bars",
617
- barData: [240, 250, 260, 270, 275, 280, 287]
618
- },
619
- {
620
- id: "agency-inactive-accounts",
621
- label: "Inactive Act",
622
- value: "5",
623
- desc: "Inactive customer-account count (warn-tinted)",
624
- cardType: "highlight",
625
- highlightColor: "#f59e0b"
626
- },
627
- {
628
- id: "agency-account-churn",
629
- label: "Account Churn",
630
- value: "8%",
631
- desc: "Customer churn rate (LY-active not TY-active)",
632
- cardType: "standard",
633
- suffix: "%"
634
- }
635
- ]
636
- },
637
- Commission: {
638
- primary: [
639
- {
640
- id: "agency-outstanding",
641
- label: "Outstanding",
642
- value: "$24,500",
643
- desc: "Unpaid order balance across all accounts",
644
- cardType: "standard",
645
- prefix: "$",
646
- startHere: !0
647
- },
648
- {
649
- id: "agency-commission-rate",
650
- label: "Commission",
651
- value: "8.4%",
652
- desc: "Effective commission rate %",
653
- cardType: "standard",
654
- suffix: "%"
655
- },
656
- {
657
- id: "agency-commission-aging",
658
- label: "Commission Aging",
659
- value: "$24K",
660
- desc: "Unpaid commission aging by buckets",
661
- cardType: "bars",
662
- barData: [4, 8, 7, 5]
663
- }
664
- ]
665
- }
666
- };
667
- function Pe({
668
- lenses: e,
669
- activeLens: t,
670
- onLensChange: s,
671
- variant: r = "pills",
672
- lensMeta: n = Ne
673
- }) {
674
- return r === "pills" ? /* @__PURE__ */ a("div", { className: "cat-pills-wrap", children: /* @__PURE__ */ a("div", { className: "cat-pills", role: "tablist", "aria-label": "Metric lenses", children: e.map((c) => {
675
- const p = c === t, o = n[c], i = ["cat-pill"];
676
- return p && i.push("active"), /* @__PURE__ */ b(
677
- "button",
678
- {
679
- type: "button",
680
- role: "tab",
681
- "aria-selected": p,
682
- className: i.join(" "),
683
- "data-lens": c,
684
- onClick: () => {
685
- p || s(c);
686
- },
687
- children: [
688
- c,
689
- o?.beta && /* @__PURE__ */ a("span", { className: "cat-pill-beta", "aria-label": "Beta", children: "BETA" })
690
- ]
691
- },
692
- c
693
- );
694
- }) }) }) : /* @__PURE__ */ a(ot, { lenses: e, activeLens: t, onLensChange: s });
55
+ role: "radio",
56
+ "aria-pressed": f === g,
57
+ "aria-checked": f === g,
58
+ "aria-label": `Accent ${g}`,
59
+ className: "settings-shell__swatch",
60
+ style: { backgroundColor: g },
61
+ onClick: () => b(g),
62
+ "data-testid": `settings-swatch-${g}`
63
+ },
64
+ g
65
+ )) })
66
+ ] })
67
+ ] })
68
+ ] });
695
69
  }
696
- function ot({
697
- lenses: e,
698
- activeLens: t,
699
- onLensChange: s
700
- }) {
701
- const [r, n] = E(!1), c = K(null), p = () => {
702
- c.current != null && (window.clearTimeout(c.current), c.current = null);
703
- }, o = () => {
704
- p(), c.current = window.setTimeout(() => n(!1), 100);
705
- }, i = e.filter((l) => l !== t);
706
- return /* @__PURE__ */ a("div", { className: "cat-segmented-wrap", children: /* @__PURE__ */ b("div", { className: "cat-segmented", children: [
707
- /* @__PURE__ */ a(
70
+ function K({ lenses: e, activeLens: t, onLensChange: o }) {
71
+ const [n, a] = y(!1), r = B(null), d = () => {
72
+ r.current != null && (window.clearTimeout(r.current), r.current = null);
73
+ }, l = () => {
74
+ d(), r.current = window.setTimeout(() => a(!1), 100);
75
+ }, i = e.filter((c) => c !== t);
76
+ return /* @__PURE__ */ s("div", { className: "cat-segmented-wrap", children: /* @__PURE__ */ h("div", { className: "cat-segmented", children: [
77
+ /* @__PURE__ */ s(
708
78
  "button",
709
79
  {
710
80
  type: "button",
@@ -714,35 +84,35 @@ function ot({
714
84
  children: t
715
85
  }
716
86
  ),
717
- /* @__PURE__ */ b(
87
+ /* @__PURE__ */ h(
718
88
  "div",
719
89
  {
720
90
  className: "cat-seg-more",
721
91
  onMouseEnter: () => {
722
- p(), n(!0);
92
+ d(), a(!0);
723
93
  },
724
- onMouseLeave: o,
94
+ onMouseLeave: l,
725
95
  children: [
726
- /* @__PURE__ */ a("button", { type: "button", className: "cat-seg cat-seg-more-btn", "aria-haspopup": "menu", "aria-expanded": r, children: "More ▾" }),
727
- r && /* @__PURE__ */ a(
96
+ /* @__PURE__ */ s("button", { type: "button", className: "cat-seg cat-seg-more-btn", "aria-haspopup": "menu", "aria-expanded": n, children: "More ▾" }),
97
+ n && /* @__PURE__ */ s(
728
98
  "div",
729
99
  {
730
100
  className: "cat-seg-overflow",
731
101
  role: "menu",
732
- onMouseEnter: p,
733
- onMouseLeave: o,
734
- children: i.map((l) => /* @__PURE__ */ a(
102
+ onMouseEnter: d,
103
+ onMouseLeave: l,
104
+ children: i.map((c) => /* @__PURE__ */ s(
735
105
  "button",
736
106
  {
737
107
  type: "button",
738
- "data-lens": l,
108
+ "data-lens": c,
739
109
  role: "menuitem",
740
110
  onClick: () => {
741
- s(l), n(!1);
111
+ o(c), a(!1);
742
112
  },
743
- children: l
113
+ children: c
744
114
  },
745
- l
115
+ c
746
116
  ))
747
117
  }
748
118
  )
@@ -751,87 +121,50 @@ function ot({
751
121
  )
752
122
  ] }) });
753
123
  }
754
- function te({ tiles: e, selectedTileId: t, onSelectTile: s, renderTile: r }) {
755
- return /* @__PURE__ */ a("div", { className: "cat-tiles", children: e.map((n) => {
756
- const c = n.id === t, p = n.subStats != null && n.subStats.length > 0;
757
- let o = null;
758
- p ? n.subStats.length === 5 ? o = "span-5" : n.subStats.length === 3 ? o = "span-3" : o = "span-2" : n.stack === !0 && (o = "span-2");
759
- const i = ["cat-tile"];
760
- o && i.push(o), c && i.push("selected"), n.isNew && i.push("is-new"), n.startHere && i.push("start-here"), n.donut && i.push("has-donut");
761
- const l = 1;
762
- let d = 0.7;
763
- if (n.donut) {
764
- const u = /([\d.]+)\s*%/.exec(n.value);
765
- if (u) {
766
- const h = parseFloat(u[1]);
767
- Number.isFinite(h) && (d = Math.max(0, Math.min(1, h / 100)));
768
- }
769
- }
770
- return /* @__PURE__ */ b(
124
+ function ae(e) {
125
+ return e.split("·").map((t, o) => {
126
+ const n = t.trim(), a = n.match(/^([$+\-]?[\d,]+(?:\.\d+)?[%+]?)\s*(.*)$/), r = a ? a[1] : "", d = a ? a[2] : n;
127
+ return /* @__PURE__ */ h("span", { children: [
128
+ /* @__PURE__ */ s("strong", { children: r }),
129
+ /* @__PURE__ */ s("small", { children: d })
130
+ ] }, o);
131
+ });
132
+ }
133
+ function j({ tiles: e, selectedTileId: t, onSelectTile: o }) {
134
+ return /* @__PURE__ */ s("div", { className: "cat-tiles", children: e.map((n) => {
135
+ const a = n.id === t, r = n.stack === !0, d = ["cat-tile"];
136
+ return r && d.push("span-2"), a && d.push("selected"), /* @__PURE__ */ h(
771
137
  "button",
772
138
  {
773
139
  type: "button",
774
- className: i.join(" "),
140
+ className: d.join(" "),
775
141
  "data-metric": n.id,
776
142
  "data-desc": n.desc,
777
- "data-col-span": String(l),
778
- "data-donut": n.donut ? "true" : void 0,
779
- "data-accent": n.accent,
780
- "aria-pressed": c,
781
- onClick: () => s(n.id, n.desc),
782
- style: n.accent ? { "--cat-tile-accent": n.accent } : void 0,
143
+ "aria-pressed": a,
144
+ onClick: () => o(n.id, n.desc),
783
145
  children: [
784
- n.startHere && /* @__PURE__ */ a("span", { className: "cat-tile-start-here", "aria-hidden": "true", children: "START HERE" }),
785
- r ? r(n) : /* @__PURE__ */ a(
786
- "div",
787
- {
788
- className: "cat-tile-primitive-wrapper gloss-metric-card",
789
- "data-col-span": "1",
790
- style: { pointerEvents: "none", width: "100%", height: "100%" },
791
- "aria-hidden": "true",
792
- children: n.donut ? /* @__PURE__ */ a(
793
- ue,
794
- {
795
- variant: "donut",
796
- label: n.label,
797
- value: n.value,
798
- donutValue: d,
799
- donutMax: 1,
800
- accentColor: n.accent,
801
- colSpan: l
802
- }
803
- ) : /* @__PURE__ */ a(
804
- ue,
805
- {
806
- variant: "standard",
807
- label: n.label,
808
- value: n.value,
809
- colSpan: l
810
- }
811
- )
812
- }
813
- ),
814
- n.variants && n.variants.length > 0 && /* @__PURE__ */ a("span", { className: "cat-tile-variants", "aria-hidden": "true", children: n.variants.map((u) => /* @__PURE__ */ a("span", { children: u }, u)) }),
815
- n.isNew && /* @__PURE__ */ a("span", { className: "cat-tile-new-dot", "aria-hidden": "true" })
146
+ /* @__PURE__ */ s("span", { className: "cat-tile-label", children: n.label }),
147
+ /* @__PURE__ */ s("span", { className: "cat-tile-value", children: r ? ae(n.value) : n.value }),
148
+ n.variants && n.variants.length > 0 && /* @__PURE__ */ s("span", { className: "cat-tile-variants", "aria-hidden": "true", children: n.variants.map((l) => /* @__PURE__ */ s("span", { children: l }, l)) })
816
149
  ]
817
150
  },
818
151
  n.id
819
152
  );
820
153
  }) });
821
154
  }
822
- const se = ye(null);
823
- function oe() {
824
- return be(se);
825
- }
826
- function zt({ mode: e, dispatch: t }) {
827
- const s = oe();
828
- if (s == null && e == null) return null;
829
- const r = s?.mode ?? e ?? "add", n = s?.selectedTileId ?? null, c = s?.description ?? null, p = n == null;
830
- return /* @__PURE__ */ b("div", { className: "panel-footer catalog", children: [
831
- /* @__PURE__ */ a("div", { className: "cat-description", id: "cat-desc", children: c ?? /* @__PURE__ */ a("em", { children: "Tap a metric to see its description" }) }),
832
- /* @__PURE__ */ b("div", { style: { display: "flex", padding: "10px 14px", gap: 8 }, children: [
833
- /* @__PURE__ */ a("div", { className: "spacer", style: { flex: 1 } }),
834
- /* @__PURE__ */ a(
155
+ const k = H(null);
156
+ function re() {
157
+ return U(k);
158
+ }
159
+ function le({ mode: e, dispatch: t }) {
160
+ const o = re();
161
+ if (o == null && e == null) return null;
162
+ const n = o?.mode ?? e ?? "add", a = o?.selectedTileId ?? null, r = o?.description ?? null, d = a == null;
163
+ return /* @__PURE__ */ h("div", { className: "panel-footer catalog", children: [
164
+ /* @__PURE__ */ s("div", { className: "cat-description", id: "cat-desc", children: r ?? /* @__PURE__ */ s("em", { children: "Tap a metric to see its description" }) }),
165
+ /* @__PURE__ */ h("div", { style: { display: "flex", padding: "10px 14px", gap: 8 }, children: [
166
+ /* @__PURE__ */ s("div", { className: "spacer", style: { flex: 1 } }),
167
+ /* @__PURE__ */ s(
835
168
  "button",
836
169
  {
837
170
  id: "btn-cat-cancel",
@@ -841,24 +174,24 @@ function zt({ mode: e, dispatch: t }) {
841
174
  children: "Cancel"
842
175
  }
843
176
  ),
844
- r === "add" && /* @__PURE__ */ a(
177
+ n === "add" && /* @__PURE__ */ s(
845
178
  "button",
846
179
  {
847
180
  id: "btn-cat-add",
848
181
  type: "button",
849
182
  className: "btn btn-primary",
850
- disabled: p,
183
+ disabled: d,
851
184
  onClick: () => t({ type: "CLOSE_PANEL", reason: "apply-button" }),
852
185
  children: "Add metric"
853
186
  }
854
187
  ),
855
- r === "replace" && /* @__PURE__ */ a(
188
+ n === "replace" && /* @__PURE__ */ s(
856
189
  "button",
857
190
  {
858
191
  id: "btn-cat-replace",
859
192
  type: "button",
860
193
  className: "btn btn-primary",
861
- disabled: p,
194
+ disabled: d,
862
195
  onClick: () => t({ type: "CLOSE_PANEL", reason: "apply-button" }),
863
196
  children: "Replace metric"
864
197
  }
@@ -866,220 +199,192 @@ function zt({ mode: e, dispatch: t }) {
866
199
  ] })
867
200
  ] });
868
201
  }
869
- function pe(e, t) {
870
- if (t.length === 0) return !0;
871
- const s = t.toLowerCase();
872
- if (e.label.toLowerCase().includes(s) || e.value.toLowerCase().includes(s)) return !0;
873
- if (e.subStats) {
874
- for (const r of e.subStats)
875
- if (r.label.toLowerCase().includes(s) || r.value.toLowerCase().includes(s)) return !0;
876
- }
877
- return !1;
878
- }
879
- function rt() {
880
- const t = oe()?.description ?? null;
881
- return t == null ? /* @__PURE__ */ a("span", { style: { fontStyle: "italic" }, children: "Tap a metric to see its description" }) : /* @__PURE__ */ a("span", { children: t });
882
- }
883
- function Ht({
202
+ const W = [
203
+ "Revenue",
204
+ "Order flow",
205
+ "Rep performance",
206
+ "Brand portfolio",
207
+ "Account coverage",
208
+ "Commission"
209
+ ], G = "Order flow", Q = {
210
+ Revenue: [
211
+ { id: "rev-mtd", label: "Revenue MTD", value: "$184K", desc: "Month-to-date revenue across all manufacturers and territories." },
212
+ { id: "rev-ytd", label: "Revenue YTD", value: "$2.1M", desc: "Year-to-date revenue including pending and posted orders.", variants: ["1×1", "1×3"] },
213
+ { id: "rev-yoy", label: "YoY Δ", value: "+12.4%", desc: "Revenue growth versus the prior comparable period." },
214
+ { id: "rev-avg", label: "Avg order", value: "$1,820", desc: "Average order value over the last 30 days." }
215
+ ],
216
+ "Order flow": [
217
+ {
218
+ id: "of-funnel",
219
+ label: "Order funnel",
220
+ value: "New 42 · Incomplete 18 · Transmitted 91",
221
+ stack: !0,
222
+ desc: "Funnel snapshot — new orders, incomplete (awaiting attention), and transmitted to manufacturer.",
223
+ variants: ["1×3"]
224
+ },
225
+ { id: "of-incomplete", label: "Incomplete", value: "18", desc: "Orders started but not yet transmitted." },
226
+ { id: "of-transmitted", label: "Transmitted", value: "91", desc: "Orders successfully sent to manufacturer." },
227
+ { id: "of-today", label: "New today", value: "7", desc: "Orders created in the current calendar day." },
228
+ { id: "of-velocity", label: "Order velocity", value: "+3.1/d", desc: "Rolling 7-day order-creation rate change." }
229
+ ],
230
+ "Rep performance": [
231
+ { id: "rp-leader", label: "#1 Rep", value: "A. Chen", desc: "Top revenue performer in the current period." },
232
+ { id: "rp-quota", label: "Below quota", value: "4 reps", desc: "Reps currently tracking below pace-to-quota." },
233
+ { id: "rp-commission", label: "Commission pace", value: "$48K", desc: "Projected commission pool at current burn rate." },
234
+ { id: "rp-active", label: "Active reps", value: "14", desc: "Reps with at least one order this period." }
235
+ ],
236
+ "Brand portfolio": [
237
+ { id: "bp-top", label: "Top brand", value: "Acme Co.", desc: "Highest-revenue manufacturer this period." },
238
+ { id: "bp-mix", label: "Mix Δ", value: "+2pp", desc: "Portfolio mix shift versus the prior period." },
239
+ { id: "bp-coverage", label: "Brand coverage", value: "73%", desc: "Percent of accounts with at least one active brand." },
240
+ { id: "bp-new", label: "New brand adds", value: "3", desc: "Brands with first-order activity this period." }
241
+ ],
242
+ "Account coverage": [
243
+ { id: "ac-active", label: "Active accounts", value: "128", desc: "Accounts with at least one order in the period." },
244
+ { id: "ac-untouched", label: "Untouched", value: "34", desc: "Accounts with zero activity in the period." },
245
+ { id: "ac-concentration", label: "Concentration", value: "38% top-5", desc: "Revenue concentration in top-5 accounts." },
246
+ { id: "ac-new", label: "New accounts", value: "6", desc: "Accounts with first-ever order this period." }
247
+ ],
248
+ Commission: [
249
+ { id: "cm-projected", label: "Projected", value: "$48K", desc: "Forecast commission at current pace." },
250
+ { id: "cm-paid", label: "Paid", value: "$31K", desc: "Commission posted to ledger this period." },
251
+ { id: "cm-pending", label: "Pending", value: "$17K", desc: "Commission earned but not yet posted." },
252
+ { id: "cm-rate", label: "Effective rate", value: "6.8%", desc: "Realized commission rate across all orders." }
253
+ ]
254
+ };
255
+ function Te({
884
256
  isOpen: e,
885
- lenses: t = _e,
886
- defaultLens: s = Ce,
887
- tilesByLens: r = Se,
888
- lensMeta: n = Ne,
889
- renderTile: c,
890
- onAdd: p
257
+ lenses: t = W,
258
+ defaultLens: o = G,
259
+ tilesByLens: n = Q,
260
+ footerSlot: a
891
261
  }) {
892
- const o = M(), [i, l] = E(s), [d, u] = E(null), [h, y] = E(null), [m, v] = E(""), _ = r[i] ?? { primary: [] }, N = n[i], w = ie(
893
- () => _.primary.filter((P) => pe(P, m)),
894
- [_.primary, m]
895
- ), g = ie(
896
- () => (_.secondary ?? []).filter((P) => pe(P, m)),
897
- [_.secondary, m]
898
- ), x = () => {
899
- d != null && p?.(d), o?.dispatch({ type: "CLOSE_PANEL", reason: "apply-button" });
900
- }, R = () => o?.dispatch({ type: "CLOSE_PANEL", reason: "header-x" }), $ = d == null;
901
- return /* @__PURE__ */ a(
902
- se.Provider,
262
+ const [r, d] = y(o), [l, i] = y(null), [c, u] = y(null), m = n[r] ?? [];
263
+ return /* @__PURE__ */ h(
264
+ k.Provider,
903
265
  {
904
- value: { mode: "add", selectedTileId: d, description: h },
905
- children: /* @__PURE__ */ a(
906
- z,
907
- {
908
- variant: "no-stage",
909
- title: "Add a metric",
910
- onClose: R,
911
- footer: {
912
- left: /* @__PURE__ */ a(rt, {}),
913
- right: /* @__PURE__ */ a(
914
- "button",
915
- {
916
- id: "btn-cat-add",
917
- type: "button",
918
- className: "gloss-panel-chrome-v2__footer-btn gloss-panel-chrome-v2__footer-btn--primary",
919
- disabled: $,
920
- onClick: x,
921
- children: "Add metric"
922
- }
923
- )
924
- },
925
- children: /* @__PURE__ */ b("div", { "data-shell": "catalog-add", "aria-hidden": !e, children: [
926
- /* @__PURE__ */ a("div", { className: "cat-search", children: /* @__PURE__ */ a(
927
- "input",
928
- {
929
- type: "search",
930
- className: "cat-search-input",
931
- placeholder: "Search metrics",
932
- "aria-label": "Search metrics",
933
- value: m,
934
- onChange: (P) => v(P.target.value)
935
- }
936
- ) }),
937
- /* @__PURE__ */ a(
938
- Pe,
939
- {
940
- lenses: t,
941
- activeLens: i,
942
- lensMeta: n,
943
- variant: "pills",
944
- onLensChange: (P) => {
945
- l(P), u(null), y(null), v("");
946
- }
266
+ value: { mode: "add", selectedTileId: l, description: c },
267
+ children: [
268
+ /* @__PURE__ */ h("div", { "data-shell": "catalog-add", "aria-hidden": !e, children: [
269
+ /* @__PURE__ */ s("h3", { children: "Add a metric" }),
270
+ /* @__PURE__ */ s(
271
+ K,
272
+ {
273
+ lenses: t,
274
+ activeLens: r,
275
+ onLensChange: (f) => {
276
+ d(f), i(null), u(null);
947
277
  }
948
- ),
949
- N && /* @__PURE__ */ b("div", { className: "cat-lens-meta", children: [
950
- /* @__PURE__ */ a("h3", { className: "cat-lens-headline", children: N.headline }),
951
- /* @__PURE__ */ a("p", { className: "cat-lens-helper", children: N.helper })
952
- ] }),
953
- /* @__PURE__ */ a(
954
- te,
955
- {
956
- tiles: w,
957
- selectedTileId: d,
958
- onSelectTile: (P, A) => {
959
- u(P), y(A);
960
- },
961
- renderTile: c
278
+ }
279
+ ),
280
+ /* @__PURE__ */ s(
281
+ j,
282
+ {
283
+ tiles: m,
284
+ selectedTileId: l,
285
+ onSelectTile: (f, v) => {
286
+ i(f), u(v);
962
287
  }
963
- ),
964
- g.length > 0 && /* @__PURE__ */ b("div", { className: "cat-more-in-lens", children: [
965
- /* @__PURE__ */ a("div", { className: "cat-more-in-lens__heading", children: "MORE IN THIS LENS" }),
966
- /* @__PURE__ */ a(
967
- te,
968
- {
969
- tiles: g,
970
- selectedTileId: d,
971
- onSelectTile: (P, A) => {
972
- u(P), y(A);
973
- },
974
- renderTile: c
975
- }
976
- )
977
- ] }),
978
- w.length === 0 && g.length === 0 && m.length > 0 && /* @__PURE__ */ b("div", { className: "cat-empty", children: [
979
- 'No metrics match "',
980
- m,
981
- '".'
982
- ] })
983
- ] })
984
- }
985
- )
288
+ }
289
+ )
290
+ ] }),
291
+ a
292
+ ]
986
293
  }
987
294
  );
988
295
  }
989
- function lt() {
990
- const t = oe()?.description ?? null;
991
- return t == null ? /* @__PURE__ */ a("em", { children: "Tap a metric to see its description" }) : /* @__PURE__ */ a(ge, { children: t });
992
- }
993
- function Ut({
296
+ function Ie({
994
297
  isOpen: e,
995
298
  replacingLabel: t,
996
- lenses: s = _e,
997
- defaultLens: r = Ce,
998
- tilesByLens: n = Se,
999
- renderTile: c
299
+ lenses: o = W,
300
+ defaultLens: n = G,
301
+ tilesByLens: a = Q,
302
+ footerSlot: r
1000
303
  }) {
1001
- const p = M(), [o, i] = E(r), [l, d] = E(null), [u, h] = E(null), y = n[o] ?? { primary: [] }, m = [...y.primary, ...y.secondary ?? []], v = () => p?.dispatch({ type: "CLOSE_PANEL", reason: "apply-button" }), _ = () => p?.dispatch({ type: "CLOSE_PANEL", reason: "header-x" }), N = l == null;
1002
- return /* @__PURE__ */ a(
1003
- se.Provider,
304
+ const [d, l] = y(n), [i, c] = y(null), [u, m] = y(null), f = a[d] ?? [];
305
+ return /* @__PURE__ */ h(
306
+ k.Provider,
1004
307
  {
1005
- value: { mode: "replace", selectedTileId: l, description: u },
1006
- children: /* @__PURE__ */ a(
1007
- z,
1008
- {
1009
- variant: "no-stage",
1010
- title: "Replace metric",
1011
- onClose: _,
1012
- footer: {
1013
- left: /* @__PURE__ */ a(lt, {}),
1014
- right: /* @__PURE__ */ a(
1015
- "button",
1016
- {
1017
- id: "btn-cat-replace",
1018
- type: "button",
1019
- className: "gloss-panel-chrome-v2__footer-btn gloss-panel-chrome-v2__footer-btn--primary",
1020
- disabled: N,
1021
- onClick: v,
1022
- children: "Replace metric"
1023
- }
1024
- )
1025
- },
1026
- children: /* @__PURE__ */ b("div", { "data-shell": "catalog-replace", "aria-hidden": !e, children: [
1027
- t && /* @__PURE__ */ b("p", { className: "cat-subtitle", children: [
1028
- "replacing ",
1029
- t
1030
- ] }),
1031
- /* @__PURE__ */ a(
1032
- Pe,
1033
- {
1034
- lenses: s,
1035
- activeLens: o,
1036
- onLensChange: (w) => {
1037
- i(w), d(null), h(null);
1038
- }
308
+ value: { mode: "replace", selectedTileId: i, description: u },
309
+ children: [
310
+ /* @__PURE__ */ h("div", { "data-shell": "catalog-replace", "aria-hidden": !e, children: [
311
+ /* @__PURE__ */ s("h3", { children: "Replace metric" }),
312
+ t && /* @__PURE__ */ h("p", { className: "cat-subtitle", children: [
313
+ "replacing ",
314
+ t
315
+ ] }),
316
+ /* @__PURE__ */ s(
317
+ K,
318
+ {
319
+ lenses: o,
320
+ activeLens: d,
321
+ onLensChange: (v) => {
322
+ l(v), c(null), m(null);
1039
323
  }
1040
- ),
1041
- /* @__PURE__ */ a(
1042
- te,
1043
- {
1044
- tiles: m,
1045
- selectedTileId: l,
1046
- onSelectTile: (w, g) => {
1047
- d(w), h(g);
1048
- },
1049
- renderTile: c
324
+ }
325
+ ),
326
+ /* @__PURE__ */ s(
327
+ j,
328
+ {
329
+ tiles: f,
330
+ selectedTileId: i,
331
+ onSelectTile: (v, b) => {
332
+ c(v), m(b);
1050
333
  }
1051
- )
1052
- ] })
1053
- }
1054
- )
334
+ }
335
+ )
336
+ ] }),
337
+ r
338
+ ]
1055
339
  }
1056
340
  );
1057
341
  }
1058
- const Te = ye(null);
1059
- function we() {
1060
- return be(Te);
342
+ function ie({ page: e, onRename: t, onKebab: o, onDragStart: n }) {
343
+ const a = ["pm-row"];
344
+ return e.active && a.push("active"), /* @__PURE__ */ h("div", { className: a.join(" "), "data-page-id": e.id, role: "listitem", children: [
345
+ /* @__PURE__ */ s(
346
+ "div",
347
+ {
348
+ className: "pm-handle",
349
+ "aria-hidden": "true",
350
+ onMouseDown: () => n?.(e.id),
351
+ children: "⋮⋮"
352
+ }
353
+ ),
354
+ /* @__PURE__ */ s("div", { className: "pm-name", onClick: () => t?.(e.id), children: e.name }),
355
+ /* @__PURE__ */ s(
356
+ "button",
357
+ {
358
+ type: "button",
359
+ className: "pm-kebab",
360
+ "aria-label": "Page options",
361
+ onClick: () => o?.(e.id),
362
+ children: "⋯"
363
+ }
364
+ )
365
+ ] });
1061
366
  }
1062
- function it(e = {}) {
1063
- const t = we(), s = t?.createPage, r = t?.setPages;
1064
- return /* @__PURE__ */ b(
367
+ const X = H(null);
368
+ function ce() {
369
+ return U(X);
370
+ }
371
+ function de(e = {}) {
372
+ const o = ce()?.setPages;
373
+ return /* @__PURE__ */ h(
1065
374
  "div",
1066
375
  {
1067
376
  className: "panel-footer pm",
1068
377
  style: { display: "flex", justifyContent: "flex-end", padding: "10px 14px" },
1069
378
  children: [
1070
- /* @__PURE__ */ a("div", { className: "spacer", style: { flex: 1 } }),
1071
- /* @__PURE__ */ a(
379
+ /* @__PURE__ */ s("div", { className: "spacer", style: { flex: 1 } }),
380
+ /* @__PURE__ */ s(
1072
381
  "button",
1073
382
  {
1074
383
  id: "btn-new-page",
1075
384
  type: "button",
1076
385
  className: "btn btn-primary",
1077
386
  onClick: () => {
1078
- if (s) {
1079
- s();
1080
- return;
1081
- }
1082
- r && r((n) => [
387
+ o && o((n) => [
1083
388
  ...n,
1084
389
  { id: `new-${Date.now()}`, name: "Untitled", active: !1 }
1085
390
  ]);
@@ -1091,495 +396,377 @@ function it(e = {}) {
1091
396
  }
1092
397
  );
1093
398
  }
1094
- function me({ page: e, onRename: t, onKebab: s, onDragStart: r, onSwitchPage: n }) {
1095
- const c = we(), [p, o] = E(!1), i = K(null);
1096
- F(() => {
1097
- if (!p) return;
1098
- const m = (v) => {
1099
- i.current && (i.current.contains(v.target) || o(!1));
1100
- };
1101
- return document.addEventListener("mousedown", m, !0), () => document.removeEventListener("mousedown", m, !0);
1102
- }, [p]);
1103
- const l = () => {
1104
- if (o(!1), t) return t(e.id);
1105
- if (!c?.renamePage) return;
1106
- const m = window.prompt("Rename page", e.name);
1107
- m != null && m.trim().length > 0 && c.renamePage(e.id, m.trim());
1108
- }, d = () => {
1109
- o(!1), c?.duplicatePage?.(e.id);
1110
- }, u = () => {
1111
- o(!1), c?.deletePage?.(e.id);
1112
- }, h = (m) => {
1113
- m.stopPropagation(), n && !e.active && n(e.id);
1114
- }, y = ["pm-row"];
1115
- return e.active && y.push("active"), /* @__PURE__ */ b("div", { ref: i, className: y.join(" "), "data-page-id": e.id, role: "listitem", children: [
1116
- /* @__PURE__ */ a(
1117
- "div",
1118
- {
1119
- className: "pm-handle",
1120
- "aria-hidden": "true",
1121
- onMouseDown: () => r?.(e.id),
1122
- children: "⋮⋮"
1123
- }
1124
- ),
1125
- /* @__PURE__ */ a(
1126
- "div",
1127
- {
1128
- className: "pm-name",
1129
- role: n && !e.active ? "button" : void 0,
1130
- tabIndex: n && !e.active ? 0 : void 0,
1131
- onClick: n ? h : void 0,
1132
- onKeyDown: (m) => {
1133
- !n || e.active || (m.key === "Enter" || m.key === " ") && (m.preventDefault(), m.stopPropagation(), n(e.id));
1134
- },
1135
- "aria-label": n && !e.active ? `Switch to ${e.name}` : void 0,
1136
- children: e.name
1137
- }
1138
- ),
1139
- /* @__PURE__ */ a(
1140
- "button",
1141
- {
1142
- type: "button",
1143
- className: "pm-kebab",
1144
- "aria-label": "Page options",
1145
- "aria-haspopup": "menu",
1146
- "aria-expanded": p,
1147
- onPointerDown: (m) => m.stopPropagation(),
1148
- onMouseDown: (m) => m.stopPropagation(),
1149
- onClick: (m) => {
1150
- if (m.stopPropagation(), s) return s(e.id);
1151
- o((v) => !v);
1152
- },
1153
- children: "⋯"
1154
- }
1155
- ),
1156
- p && /* @__PURE__ */ b(
1157
- "div",
1158
- {
1159
- className: "pm-kebab-menu",
1160
- role: "menu",
1161
- "data-page-id": e.id,
1162
- onPointerDown: (m) => m.stopPropagation(),
1163
- onMouseDown: (m) => m.stopPropagation(),
1164
- children: [
1165
- /* @__PURE__ */ a("button", { type: "button", role: "menuitem", className: "pm-kebab-menu__item", onClick: l, children: "Rename" }),
1166
- /* @__PURE__ */ a("button", { type: "button", role: "menuitem", className: "pm-kebab-menu__item", onClick: d, children: "Duplicate" }),
1167
- /* @__PURE__ */ a(
1168
- "button",
1169
- {
1170
- type: "button",
1171
- role: "menuitem",
1172
- className: "pm-kebab-menu__item pm-kebab-menu__item--danger",
1173
- onClick: u,
1174
- children: "Delete"
1175
- }
1176
- )
1177
- ]
1178
- }
1179
- )
1180
- ] });
1181
- }
1182
- const ct = [
399
+ const ue = [
1183
400
  { id: "p-pipeline", name: "My Pipeline", active: !0 },
1184
401
  { id: "p-numbers", name: "My Numbers", active: !1 },
1185
402
  { id: "p-morning", name: "My Morning", active: !1 },
1186
403
  { id: "p-accounts", name: "My Accounts", active: !1 }
1187
404
  ];
1188
- function Bt({
405
+ function ke({
1189
406
  isOpen: e,
1190
- pages: t = ct,
1191
- externalPages: s,
1192
- activePageId: r,
1193
- onRename: n,
1194
- onDuplicate: c,
1195
- onDelete: p,
1196
- onReorder: o,
1197
- onCreatePage: i,
1198
- onSwitchPage: l
407
+ pages: t = ue,
408
+ footerSlot: o
1199
409
  }) {
1200
- const d = M(), [u, h] = E(() => [...t]), y = k((f, T) => {
1201
- h((S) => S.map((D) => D.id === f ? { ...D, name: T } : D));
1202
- }, []), m = k((f) => {
1203
- h((T) => {
1204
- const S = T.find((W) => W.id === f);
1205
- if (!S) return T;
1206
- const D = {
1207
- id: `${S.id}-copy-${Date.now()}`,
1208
- name: `${S.name} copy`,
1209
- active: !1
1210
- }, L = T.findIndex((W) => W.id === f);
1211
- return [...T.slice(0, L + 1), D, ...T.slice(L + 1)];
1212
- });
1213
- }, []), v = k((f) => {
1214
- h((T) => T.filter((S) => S.id !== f));
1215
- }, []), _ = k((f) => {
1216
- h((T) => {
1217
- const S = new Map(T.map((L) => [L.id, L])), D = f.map((L) => S.get(L)).filter(Boolean);
1218
- return D.length === T.length ? D : T;
1219
- });
1220
- }, []), N = s != null, w = N ? s : u, g = r != null ? w.map((f) => ({ ...f, active: f.id === r })) : [...w], x = n ?? (N ? void 0 : y), R = c ?? (N ? void 0 : m), $ = p ?? (N ? void 0 : v), P = o ?? (N ? void 0 : _), A = k(
1221
- (f) => {
1222
- N || h(f);
1223
- },
1224
- [N]
1225
- ), H = k(
1226
- (f) => {
1227
- const T = f[0]?.items.map((S) => S.id) ?? [];
1228
- T.length > 0 && P && P(T);
1229
- },
1230
- [P]
1231
- ), q = g.map((f) => `${f.id}:${f.name}`).join("|"), G = P != null && g.length > 1 ? /* @__PURE__ */ a(
1232
- De,
1233
- {
1234
- zones: [
1235
- {
1236
- zoneKey: "pm-pages",
1237
- items: g.map((f) => ({ ...f, id: f.id }))
1238
- }
1239
- ],
1240
- onZoneChange: H,
1241
- renderZone: (f, T, S) => /* @__PURE__ */ a("div", { className: "pm-list", role: "list", children: S }),
1242
- renderItem: (f) => /* @__PURE__ */ a(
1243
- me,
1244
- {
1245
- page: f,
1246
- onSwitchPage: l
1247
- },
1248
- f.id
1249
- )
1250
- },
1251
- q
1252
- ) : /* @__PURE__ */ a("div", { className: "pm-list", role: "list", children: g.map((f) => /* @__PURE__ */ a(
1253
- me,
1254
- {
1255
- page: f,
1256
- onSwitchPage: l
1257
- },
1258
- f.id
1259
- )) }), Q = () => d?.dispatch({ type: "CLOSE_PANEL", reason: "header-x" });
1260
- return /* @__PURE__ */ a(
1261
- Te.Provider,
1262
- {
1263
- value: {
1264
- pages: g,
1265
- setPages: A,
1266
- renamePage: x,
1267
- duplicatePage: R,
1268
- deletePage: $,
1269
- // Sprint 2026-05-20 — propagate live create binding for footer.
1270
- createPage: i
1271
- },
1272
- children: /* @__PURE__ */ a(
1273
- z,
1274
- {
1275
- variant: "no-stage",
1276
- title: "Manage pages",
1277
- onClose: Q,
1278
- footer: { right: /* @__PURE__ */ a(it, {}) },
1279
- children: /* @__PURE__ */ a("div", { "data-shell": "page-management", "aria-hidden": !e, children: G })
1280
- }
1281
- )
1282
- }
1283
- );
410
+ const [n, a] = y(() => [...t]);
411
+ return /* @__PURE__ */ h(X.Provider, { value: { pages: n, setPages: a }, children: [
412
+ /* @__PURE__ */ h("div", { "data-shell": "page-management", "aria-hidden": !e, children: [
413
+ /* @__PURE__ */ s("h3", { children: "Manage pages" }),
414
+ /* @__PURE__ */ s("div", { className: "pm-list", role: "list", children: n.map((r) => /* @__PURE__ */ s(ie, { page: r }, r.id)) })
415
+ ] }),
416
+ o
417
+ ] });
1284
418
  }
1285
- const Yt = {
419
+ const Me = {
1286
420
  SETTINGS: "settings",
1287
421
  CATALOG_ADD: "catalog-add",
1288
422
  CATALOG_REPLACE: "catalog-replace",
1289
423
  PAGE_MGMT: "page-management",
1290
424
  NOTIFICATION_CENTER: "notification-center"
1291
- }, dt = {
425
+ }, pe = {
1292
426
  position: "fixed",
1293
427
  inset: 0,
1294
428
  pointerEvents: "none",
1295
429
  zIndex: 55
1296
- }, ut = {
430
+ }, me = {
1297
431
  position: "absolute",
1298
432
  inset: 0,
1299
433
  zIndex: 1,
1300
434
  // CR-03 fix: pass-through tint — scrim is visual-only and must not intercept
1301
- // grid card clicks. Dismiss is ESC-only (see PanelHost.tsx CR-03 comment).
435
+ // grid card clicks. See PanelHost.tsx CR-03 comment for full rationale.
1302
436
  pointerEvents: "none",
1303
437
  background: "rgba(0, 0, 0, 0.04)"
1304
438
  };
1305
- function Vt() {
1306
- const { state: e, dispatch: t, getCloseLog: s } = Me();
439
+ function $e() {
440
+ const { state: e, dispatch: t, getCloseLog: o } = Z();
1307
441
  F(() => {
1308
442
  if (e.activePanelId == null) return;
1309
- function n(c) {
1310
- c.key === "Escape" && t({ type: "CLOSE_PANEL", reason: "escape-key" });
443
+ function r(d) {
444
+ d.key === "Escape" && t({ type: "CLOSE_PANEL", reason: "escape-key" });
1311
445
  }
1312
- return document.addEventListener("keydown", n), () => document.removeEventListener("keydown", n);
446
+ return document.addEventListener("keydown", r), () => document.removeEventListener("keydown", r);
1313
447
  }, [e.activePanelId, t]);
1314
- const r = K(e);
1315
- return ke(() => {
1316
- r.current = e;
448
+ const n = B(e);
449
+ te(() => {
450
+ n.current = e;
1317
451
  }), F(() => {
1318
452
  if (process.env.NODE_ENV === "production") return;
1319
- const n = window;
1320
- return n.__panelsHostHandle && console.warn("[panels] multiple PanelHost/PanelHostShell instances mounted; dev handle is unreliable"), n.__panelsHostHandle = {
453
+ const r = window;
454
+ return r.__panelsHostHandle && console.warn("[panels] multiple PanelHost/PanelHostShell instances mounted; dev handle is unreliable"), r.__panelsHostHandle = {
1321
455
  dispatch: t,
1322
- getState: () => r.current,
1323
- getCloseLog: s
456
+ getState: () => n.current,
457
+ getCloseLog: o
1324
458
  }, () => {
1325
- n.__panelsHostHandle?.dispatch === t && delete window.__panelsHostHandle;
459
+ r.__panelsHostHandle?.dispatch === t && delete window.__panelsHostHandle;
1326
460
  };
1327
- }, [t, s]), /* @__PURE__ */ a("div", { "data-panel-host": "true", style: dt, children: e.activePanelId != null && /* @__PURE__ */ a(
461
+ }, [t, o]);
462
+ const a = Y(() => {
463
+ t({ type: "CLOSE_PANEL", reason: "nav-escape-hatch" });
464
+ }, [t]);
465
+ return /* @__PURE__ */ s("div", { "data-panel-host": "true", style: pe, children: e.activePanelId != null && /* @__PURE__ */ s(
1328
466
  "div",
1329
467
  {
1330
468
  "data-panel-scrim": "true",
1331
- style: ut
469
+ style: me,
470
+ onClick: a
1332
471
  }
1333
472
  ) });
1334
473
  }
1335
- const pt = 700;
1336
- function mt(e, t) {
1337
- const [s, r] = E(null), n = K(null);
1338
- return F(() => {
1339
- if (e != null) {
1340
- n.current != null && (clearTimeout(n.current), n.current = null), r(null);
1341
- return;
474
+ function De({ panelComponents: e }) {
475
+ const t = I();
476
+ if (t == null) return null;
477
+ const { state: o, dispatch: n } = t;
478
+ if (o.activePanelId == null) return null;
479
+ const a = e[o.activePanelId];
480
+ if (a == null)
481
+ return process.env.NODE_ENV !== "production" && console.error(
482
+ "[panels] No panel component registered for activePanelId:",
483
+ o.activePanelId
484
+ ), null;
485
+ if (o.activePanelId === "settings")
486
+ return /* @__PURE__ */ s(N, { isOpen: !0, children: /* @__PURE__ */ s(
487
+ w,
488
+ {
489
+ isOpen: !0,
490
+ onClose: () => n({ type: "CLOSE_PANEL", reason: "header-x" }),
491
+ footer: /* @__PURE__ */ h(ee, { children: [
492
+ /* @__PURE__ */ s(
493
+ "button",
494
+ {
495
+ id: "settings-cancel",
496
+ type: "button",
497
+ className: "gloss-panel-chrome__footer-btn",
498
+ onClick: () => n({ type: "CLOSE_PANEL", reason: "cancel-button" }),
499
+ children: "Cancel"
500
+ }
501
+ ),
502
+ /* @__PURE__ */ s(
503
+ "button",
504
+ {
505
+ id: "settings-apply",
506
+ type: "button",
507
+ className: "gloss-panel-chrome__footer-btn gloss-panel-chrome__footer-btn--primary",
508
+ onClick: () => n({ type: "CLOSE_PANEL", reason: "apply-button" }),
509
+ children: "Apply"
510
+ }
511
+ )
512
+ ] }),
513
+ children: /* @__PURE__ */ s(a, { isOpen: !0 })
514
+ }
515
+ ) });
516
+ if (o.activePanelId === "catalog-add" || o.activePanelId === "catalog-replace") {
517
+ const r = o.activePanelId === "catalog-replace" ? "replace" : "add";
518
+ return /* @__PURE__ */ s(N, { isOpen: !0, children: /* @__PURE__ */ s(
519
+ w,
520
+ {
521
+ isOpen: !0,
522
+ onClose: () => n({ type: "CLOSE_PANEL", reason: "header-x" }),
523
+ footer: null,
524
+ children: /* @__PURE__ */ s(
525
+ a,
526
+ {
527
+ isOpen: !0,
528
+ footerSlot: /* @__PURE__ */ s(le, { mode: r, dispatch: n })
529
+ }
530
+ )
531
+ }
532
+ ) });
533
+ }
534
+ return o.activePanelId === "page-management" ? /* @__PURE__ */ s(N, { isOpen: !0, children: /* @__PURE__ */ s(
535
+ w,
536
+ {
537
+ isOpen: !0,
538
+ onClose: () => n({ type: "CLOSE_PANEL", reason: "header-x" }),
539
+ footer: null,
540
+ children: /* @__PURE__ */ s(a, { isOpen: !0, footerSlot: /* @__PURE__ */ s(de, {}) })
1342
541
  }
1343
- if (t) {
1344
- n.current != null && (clearTimeout(n.current), n.current = null), r(null);
1345
- return;
542
+ ) }) : /* @__PURE__ */ s(N, { isOpen: !0, children: /* @__PURE__ */ s(
543
+ w,
544
+ {
545
+ isOpen: !0,
546
+ onClose: () => n({ type: "CLOSE_PANEL", reason: "header-x" }),
547
+ footer: null,
548
+ children: /* @__PURE__ */ s(a, { isOpen: !0 })
1346
549
  }
1347
- return n.current = setTimeout(() => {
1348
- r(null), n.current = null;
1349
- }, pt), () => {
1350
- n.current != null && (clearTimeout(n.current), n.current = null);
1351
- };
1352
- }, [e, t]), F(() => {
1353
- e != null && r(e);
1354
- }, [e]), e != null ? { panelId: e, isOpen: !0 } : s != null ? { panelId: s, isOpen: !1 } : { panelId: null, isOpen: !1 };
1355
- }
1356
- function Kt({ panelComponents: e, children: t }) {
1357
- const s = M(), r = s?.state.lastClose?.reason === "section-hidden", n = mt(s?.state.activePanelId ?? null, r);
1358
- if (s == null || n.panelId == null) return null;
1359
- const c = n.panelId, p = n.isOpen, o = e?.[c];
1360
- return o == null && t == null ? (process.env.NODE_ENV !== "production" && console.error(
1361
- "[panels] No panel component registered for activePanelId:",
1362
- c
1363
- ), null) : /* @__PURE__ */ a(Le, { isOpen: p, children: o != null ? /* @__PURE__ */ a(o, { isOpen: p }) : t });
550
+ ) });
1364
551
  }
1365
- function he(e) {
552
+ function z(e) {
1366
553
  return e === null ? null : e.kind === "manage-pages-action" ? `global-${e.align ?? "left"}` : e.kind === "card-overflow" || e.kind === "empty-cell" ? `section-${e.sectionIndex}` : null;
1367
554
  }
1368
- const ht = 685, fe = 627, ft = "cubic-bezier(0.22, 1, 0.36, 1)", gt = 200;
1369
- function Ee(e, t) {
555
+ const he = 685, V = 627, fe = "cubic-bezier(0.22, 1, 0.36, 1)", ve = 200;
556
+ function J(e, t) {
1370
557
  if (typeof window > "u") return t;
1371
- const s = window.getComputedStyle(document.documentElement).getPropertyValue(e).trim();
1372
- if (!s) return t;
1373
- const r = parseFloat(s);
1374
- return Number.isNaN(r) ? t : s.endsWith("s") && !s.endsWith("ms") ? r * 1e3 : r;
558
+ const o = window.getComputedStyle(document.documentElement).getPropertyValue(e).trim();
559
+ if (!o) return t;
560
+ const n = parseFloat(o);
561
+ return Number.isNaN(n) ? t : o.endsWith("s") && !o.endsWith("ms") ? n * 1e3 : n;
1375
562
  }
1376
- function yt(e, t) {
563
+ function ge(e, t) {
1377
564
  return typeof window > "u" ? t : window.getComputedStyle(document.documentElement).getPropertyValue(e).trim() || t;
1378
565
  }
1379
- function Y(e) {
566
+ function S(e) {
1380
567
  e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger });
1381
568
  }
1382
- function bt(e) {
1383
- const { mountEl: t, chromeEl: s, reducedMotion: r, onAssert: n } = e;
1384
- if (t == null || s == null) {
1385
- Y(e), n?.({ branch: "slide-fallback-no-dom", timestamp: Date.now() });
569
+ function ye(e) {
570
+ const { mountEl: t, chromeEl: o, reducedMotion: n, onAssert: a } = e;
571
+ if (t == null || o == null) {
572
+ S(e), a?.({ branch: "slide-fallback-no-dom", timestamp: Date.now() });
1386
573
  return;
1387
574
  }
1388
- if (r) {
1389
- e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), n?.({ branch: "slide-reduced-motion", timestamp: Date.now() });
575
+ if (n) {
576
+ e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), a?.({ branch: "slide-reduced-motion", timestamp: Date.now() });
1390
577
  return;
1391
578
  }
1392
- if (typeof s.animate != "function") {
1393
- Y(e), n?.({ branch: "slide-no-waapi", timestamp: Date.now() });
579
+ if (typeof o.animate != "function") {
580
+ S(e), a?.({ branch: "slide-no-waapi", timestamp: Date.now() });
1394
581
  return;
1395
582
  }
1396
- const c = s.cloneNode(!0);
1397
- c.id = "panel-chrome-frozen", c.style.cssText = "position:absolute;left:8px;right:8px;top:8px;z-index:1;pointer-events:none;", t.appendChild(c), s.style.zIndex = "2", e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger });
1398
- const p = Ee("--panel-open-dur", ht), o = yt("--panel-easing", ft), i = s.animate(
583
+ const r = o.cloneNode(!0);
584
+ r.id = "panel-chrome-frozen", r.style.cssText = "position:absolute;left:8px;right:8px;top:8px;z-index:1;pointer-events:none;", t.appendChild(r), o.style.zIndex = "2", e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger });
585
+ const d = J("--panel-open-dur", he), l = ge("--panel-easing", fe), i = o.animate(
1399
586
  [{ transform: "translateY(100%)" }, { transform: "translateY(0)" }],
1400
- { duration: p, easing: o, fill: "forwards" }
587
+ { duration: d, easing: l, fill: "forwards" }
1401
588
  );
1402
589
  i.addEventListener(
1403
590
  "finish",
1404
591
  () => {
1405
- c.remove(), s.style.zIndex = "", i.cancel(), n?.({ branch: "slide-complete", frozen: "cleaned", timestamp: Date.now() });
592
+ r.remove(), o.style.zIndex = "", i.cancel(), a?.({ branch: "slide-complete", frozen: "cleaned", timestamp: Date.now() });
1406
593
  },
1407
594
  { once: !0 }
1408
595
  );
1409
596
  }
1410
- function vt(e) {
1411
- const { mountEl: t, onAssert: s } = e;
597
+ function be(e) {
598
+ const { mountEl: t, onAssert: o } = e;
1412
599
  if (t == null) {
1413
- e.dispatch({ type: "CLOSE_PANEL", reason: "mutex-handoff" }), setTimeout(() => Y(e), fe), s?.({ branch: "handoff-fallback-no-mount", timestamp: Date.now() });
600
+ e.dispatch({ type: "CLOSE_PANEL", reason: "mutex-handoff" }), setTimeout(() => S(e), V), o?.({ branch: "handoff-fallback-no-mount", timestamp: Date.now() });
1414
601
  return;
1415
602
  }
1416
- const r = Ee("--panel-close-dur", fe);
1417
- let n = !1, c = null;
1418
- const p = (i) => {
1419
- i.target !== t || i.propertyName !== "max-height" || n || (n = !0, c != null && clearTimeout(c), t.removeEventListener("transitionend", p), e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), s?.({ branch: "handoff-complete", timestamp: Date.now() }));
1420
- }, o = () => {
1421
- n || (n = !0, t.removeEventListener("transitionend", p), e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), s?.({ branch: "handoff-forced", timestamp: Date.now() }));
603
+ const n = J("--panel-close-dur", V);
604
+ let a = !1, r = null;
605
+ const d = (i) => {
606
+ i.target !== t || i.propertyName !== "max-height" || a || (a = !0, r != null && clearTimeout(r), t.removeEventListener("transitionend", d), e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), o?.({ branch: "handoff-complete", timestamp: Date.now() }));
607
+ }, l = () => {
608
+ a || (a = !0, t.removeEventListener("transitionend", d), e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), o?.({ branch: "handoff-forced", timestamp: Date.now() }));
1422
609
  };
1423
- t.addEventListener("transitionend", p), e.dispatch({ type: "CLOSE_PANEL", reason: "mutex-handoff" }), c = setTimeout(o, r + gt);
610
+ t.addEventListener("transitionend", d), e.dispatch({ type: "CLOSE_PANEL", reason: "mutex-handoff" }), r = setTimeout(l, n + ve);
1424
611
  }
1425
- function _t(e) {
1426
- const { state: t, onAssert: s } = e;
612
+ function Pe(e) {
613
+ const { state: t, onAssert: o } = e;
1427
614
  if (t.activePanelId && t.isDirty) {
1428
- e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), s?.({ branch: "blocked-dirty", timestamp: Date.now() });
615
+ e.dispatch({ type: "OPEN_PANEL", panelId: e.panelId, trigger: e.trigger }), o?.({ branch: "blocked-dirty", timestamp: Date.now() });
1429
616
  return;
1430
617
  }
1431
- const r = he(t.activeTrigger), n = he(e.trigger);
1432
- if (!!t.activePanelId && r != null && r === n) {
1433
- bt(e);
618
+ const n = z(t.activeTrigger), a = z(e.trigger);
619
+ if (!!t.activePanelId && n != null && n === a) {
620
+ ye(e);
1434
621
  return;
1435
622
  }
1436
623
  if (t.activePanelId) {
1437
- vt(e);
624
+ be(e);
1438
625
  return;
1439
626
  }
1440
- Y(e), s?.({ branch: "fresh-open", timestamp: Date.now() });
627
+ S(e), o?.({ branch: "fresh-open", timestamp: Date.now() });
1441
628
  }
1442
- function Ct() {
629
+ function Ce() {
1443
630
  if (!(typeof window > "u"))
1444
631
  return window.__panelsAsserter;
1445
632
  }
1446
- function qt() {
1447
- const e = M(), t = ae();
1448
- return k(
1449
- (s, r) => {
633
+ function Re() {
634
+ const e = I(), t = q();
635
+ return Y(
636
+ (o, n) => {
1450
637
  if (!e)
1451
638
  return;
1452
- const n = typeof document < "u" ? document.querySelector('[data-mount="panel"]') : null, c = typeof document < "u" ? document.querySelector('[data-chrome="panel"]') : null, p = {
1453
- panelId: s,
1454
- trigger: r,
639
+ const a = typeof document < "u" ? document.querySelector('[data-mount="panel"]') : null, r = typeof document < "u" ? document.querySelector('[data-chrome="panel"]') : null, d = {
640
+ panelId: o,
641
+ trigger: n,
1455
642
  state: e.state,
1456
643
  dispatch: e.dispatch,
1457
- mountEl: n,
1458
- chromeEl: c,
644
+ mountEl: a,
645
+ chromeEl: r,
1459
646
  reducedMotion: t,
1460
- onAssert: (o) => {
1461
- Ct()?.recordTransition?.(o);
647
+ onAssert: (l) => {
648
+ Ce()?.recordTransition?.(l);
1462
649
  }
1463
650
  };
1464
- _t(p);
651
+ Pe(d);
1465
652
  },
1466
653
  [e, t]
1467
654
  );
1468
655
  }
1469
- let V = !1, j = null;
1470
- function ne() {
656
+ let E = !1, _ = null;
657
+ function T() {
1471
658
  const e = [];
1472
659
  let t = "cleaned";
1473
660
  document.querySelectorAll("#panel-chrome-frozen").length > 0 && (e.push("#panel-chrome-frozen"), t = "lingering");
1474
- const r = document.querySelectorAll(".gloss-panel-mount");
1475
- r.length > 1 && e.push(`mount-count=${r.length}`);
1476
- const n = r[0] ?? null, c = n ? n.querySelectorAll(".gloss-panel-chrome") : [];
1477
- c.length > 1 && e.push(`chrome-count=${c.length}`);
1478
- const p = c[0] ?? null;
1479
- if (p) {
1480
- const d = p.style.zIndex;
1481
- d !== "" && d !== "2" && e.push(`chrome-zindex=${d}`);
661
+ const n = document.querySelectorAll(".gloss-panel-mount");
662
+ n.length > 1 && e.push(`mount-count=${n.length}`);
663
+ const a = n[0] ?? null, r = a ? a.querySelectorAll(".gloss-panel-chrome") : [];
664
+ r.length > 1 && e.push(`chrome-count=${r.length}`);
665
+ const d = r[0] ?? null;
666
+ if (d) {
667
+ const u = d.style.zIndex;
668
+ u !== "" && u !== "2" && e.push(`chrome-zindex=${u}`);
1482
669
  }
1483
- const o = n ? "present" : "absent", i = p ? "present" : "absent";
670
+ const l = a ? "present" : "absent", i = d ? "present" : "absent";
1484
671
  return {
1485
672
  valid: e.length === 0,
1486
- mount: o,
673
+ mount: l,
1487
674
  chrome: i,
1488
675
  frozen: t,
1489
676
  orphans: e,
1490
677
  timestamp: Date.now()
1491
678
  };
1492
679
  }
1493
- const Z = "8px 8px 0px", X = "64px", J = "inset(0px 0px 60px 0px)", ee = "inset(0px -40px -40px -40px)";
1494
- function C(e, t, s, r, n) {
1495
- return { id: e, constraint: t, expected: s, actual: r, pass: n };
680
+ const A = "8px 8px 0px", x = "64px", O = "inset(0px 0px 60px 0px)", L = "inset(0px -40px -40px -40px)";
681
+ function p(e, t, o, n, a) {
682
+ return { id: e, constraint: t, expected: o, actual: n, pass: a };
1496
683
  }
1497
- function O(e) {
684
+ function P(e) {
1498
685
  const t = parseInt(e, 10);
1499
686
  return Number.isFinite(t) ? t : NaN;
1500
687
  }
1501
- function re() {
1502
- const e = [], t = document.querySelector(".gloss-panel-mount"), s = t?.querySelector(".gloss-panel-chrome") ?? null, r = document.querySelector(".gloss-panel-coordinator") ?? document.querySelector("[data-panel-coordinator]"), n = document.querySelector(".bell-cutout"), c = document.querySelector(".bell-popover"), p = document.querySelector(".gloss-bottom-toolbar");
688
+ function M() {
689
+ const e = [], t = document.querySelector(".gloss-panel-mount"), o = t?.querySelector(".gloss-panel-chrome") ?? null, n = document.querySelector(".gloss-panel-coordinator") ?? document.querySelector("[data-panel-coordinator]"), a = document.querySelector(".bell-cutout"), r = document.querySelector(".bell-popover"), d = document.querySelector(".gloss-bottom-toolbar");
1503
690
  if (!t)
1504
- e.push(C("C1", "mount --reveal-y matches clip-path inset-bottom Npx", "mount present", "absent", !1));
691
+ e.push(p("C1", "mount --reveal-y matches clip-path inset-bottom Npx", "mount present", "absent", !1));
1505
692
  else {
1506
- const o = getComputedStyle(t), i = o.getPropertyValue("--reveal-y").trim() || t.style.getPropertyValue("--reveal-y").trim(), l = o.clipPath || t.style.clipPath || "", d = l.match(/inset\(\s*0(?:px)?\s+0(?:px)?\s+(\d+)px\s+0(?:px)?\s*\)/), u = d ? parseInt(d[1], 10) : NaN, h = O(i), y = Number.isFinite(u) && Number.isFinite(h) && u === h;
693
+ const l = getComputedStyle(t), i = l.getPropertyValue("--reveal-y").trim() || t.style.getPropertyValue("--reveal-y").trim(), c = l.clipPath || t.style.clipPath || "", u = c.match(/inset\(\s*0(?:px)?\s+0(?:px)?\s+(\d+)px\s+0(?:px)?\s*\)/), m = u ? parseInt(u[1], 10) : NaN, f = P(i), v = Number.isFinite(m) && Number.isFinite(f) && m === f;
1507
694
  e.push(
1508
- C(
695
+ p(
1509
696
  "C1",
1510
697
  "mount --reveal-y matches clip-path inset-bottom Npx",
1511
- `inset(0 0 ${h}px 0) === --reveal-y(${h}px)`,
1512
- `--reveal-y=${i || "n/a"} clip-path=${l || "n/a"}`,
1513
- y
698
+ `inset(0 0 ${f}px 0) === --reveal-y(${f}px)`,
699
+ `--reveal-y=${i || "n/a"} clip-path=${c || "n/a"}`,
700
+ v
1514
701
  )
1515
702
  );
1516
703
  }
1517
704
  if (!t)
1518
- e.push(C("C2", "mount padding constant", Z, "absent", !1));
705
+ e.push(p("C2", "mount padding constant", A, "absent", !1));
1519
706
  else {
1520
- const o = t.style.padding, i = getComputedStyle(t), l = o || i.padding || "", d = l === Z || l === "8px 8px 0px 8px";
1521
- e.push(C("C2", "mount padding constant", Z, l || "n/a", d));
707
+ const l = t.style.padding, i = getComputedStyle(t), c = l || i.padding || "", u = c === A || c === "8px 8px 0px 8px";
708
+ e.push(p("C2", "mount padding constant", A, c || "n/a", u));
1522
709
  }
1523
710
  if (!t)
1524
- e.push(C("C3", "mount.bottom resolves to var(--tb-h)=64px", X, "absent", !1));
711
+ e.push(p("C3", "mount.bottom resolves to var(--tb-h)=64px", x, "absent", !1));
1525
712
  else {
1526
- const i = getComputedStyle(t).bottom || t.style.bottom || "", l = i === X;
1527
- e.push(C("C3", "mount.bottom resolves to var(--tb-h)=64px", X, i || "n/a", l));
713
+ const i = getComputedStyle(t).bottom || t.style.bottom || "", c = i === x;
714
+ e.push(p("C3", "mount.bottom resolves to var(--tb-h)=64px", x, i || "n/a", c));
1528
715
  }
1529
- if (!s)
1530
- e.push(C("C4", "panel-chrome height formula = (row-h*3)+(row-gap*3)-8px", "formula match", "absent", !1));
716
+ if (!o)
717
+ e.push(p("C4", "panel-chrome height formula = (row-h*3)+(row-gap*3)-8px", "formula match", "absent", !1));
1531
718
  else {
1532
- const o = getComputedStyle(s), i = O(
1533
- o.getPropertyValue("--row-h").trim() || s.style.getPropertyValue("--row-h").trim() || "0"
1534
- ), l = O(
1535
- o.getPropertyValue("--row-gap").trim() || s.style.getPropertyValue("--row-gap").trim() || "0"
1536
- ), d = i * 3 + l * 3 - 8, u = O(o.height || s.style.height || ""), h = Number.isFinite(i) && Number.isFinite(l) && Number.isFinite(u) && Number.isFinite(d) && u === d;
719
+ const l = getComputedStyle(o), i = P(
720
+ l.getPropertyValue("--row-h").trim() || o.style.getPropertyValue("--row-h").trim() || "0"
721
+ ), c = P(
722
+ l.getPropertyValue("--row-gap").trim() || o.style.getPropertyValue("--row-gap").trim() || "0"
723
+ ), u = i * 3 + c * 3 - 8, m = P(l.height || o.style.height || ""), f = Number.isFinite(i) && Number.isFinite(c) && Number.isFinite(m) && Number.isFinite(u) && m === u;
1537
724
  e.push(
1538
- C(
725
+ p(
1539
726
  "C4",
1540
727
  "panel-chrome height formula = (row-h*3)+(row-gap*3)-8px",
1541
- `${d}px (rh=${i} rg=${l})`,
1542
- `${u}px`,
1543
- h
728
+ `${u}px (rh=${i} rg=${c})`,
729
+ `${m}px`,
730
+ f
1544
731
  )
1545
732
  );
1546
733
  }
1547
- if (!r || !s)
734
+ if (!n || !o)
1548
735
  e.push(
1549
- C(
736
+ p(
1550
737
  "C5",
1551
738
  'coordinator perspective + origin "center bottom"; chrome perspective-style flat',
1552
739
  "present",
1553
- `coordinator=${r ? "present" : "absent"} chrome=${s ? "present" : "absent"}`,
740
+ `coordinator=${n ? "present" : "absent"} chrome=${o ? "present" : "absent"}`,
1554
741
  !1
1555
742
  )
1556
743
  );
1557
744
  else {
1558
- const o = getComputedStyle(r), i = getComputedStyle(s), l = o.perspective || r.style.perspective || "", d = (o.perspectiveOrigin || r.style.perspectiveOrigin || "").trim(), u = i.perspectiveStyle || s.style.perspectiveStyle || "", v = l !== "" && l !== "none" && (d === "center bottom" || d === "50% 100%") && u === "flat";
745
+ const l = getComputedStyle(n), i = getComputedStyle(o), c = l.perspective || n.style.perspective || "", u = (l.perspectiveOrigin || n.style.perspectiveOrigin || "").trim(), m = i.perspectiveStyle || o.style.perspectiveStyle || "", g = c !== "" && c !== "none" && (u === "center bottom" || u === "50% 100%") && m === "flat";
1559
746
  e.push(
1560
- C(
747
+ p(
1561
748
  "C5",
1562
749
  'coordinator perspective + origin "center bottom"; chrome perspective-style flat',
1563
750
  "perspective:not-none, origin:center bottom, chrome-style:flat",
1564
- `perspective=${l} origin=${d} chrome-style=${u}`,
1565
- v
751
+ `perspective=${c} origin=${u} chrome-style=${m}`,
752
+ g
1566
753
  )
1567
754
  );
1568
755
  }
1569
756
  {
1570
- let o = !1, i = "absent";
757
+ let l = !1, i = "absent";
1571
758
  try {
1572
- for (const l of Array.from(document.styleSheets)) {
1573
- let d = [];
759
+ for (const c of Array.from(document.styleSheets)) {
760
+ let u = [];
1574
761
  try {
1575
- d = Array.from(l.cssRules ?? []);
762
+ u = Array.from(c.cssRules ?? []);
1576
763
  } catch {
1577
764
  continue;
1578
765
  }
1579
- for (const u of d)
1580
- if (u.name === "stage-spin") {
1581
- const y = Array.from(u.cssRules), m = y.find((g) => g.keyText === "0%" || g.keyText === "from"), v = y.find((g) => g.keyText === "100%" || g.keyText === "to"), _ = m?.style.transform ?? "", N = v?.style.transform ?? "", w = /rotateY\(\s*0(?:deg)?\s*\)/;
1582
- o = w.test(_) && w.test(N), i = `0%=${_ || "n/a"} 100%=${N || "n/a"}`;
766
+ for (const m of u)
767
+ if (m.name === "stage-spin") {
768
+ const v = Array.from(m.cssRules), b = v.find((C) => C.keyText === "0%" || C.keyText === "from"), g = v.find((C) => C.keyText === "100%" || C.keyText === "to"), $ = b?.style.transform ?? "", D = g?.style.transform ?? "", R = /rotateY\(\s*0(?:deg)?\s*\)/;
769
+ l = R.test($) && R.test(D), i = `0%=${$ || "n/a"} 100%=${D || "n/a"}`;
1583
770
  break;
1584
771
  }
1585
772
  if (i !== "absent") break;
@@ -1588,69 +775,69 @@ function re() {
1588
775
  i = "inspection-error";
1589
776
  }
1590
777
  e.push(
1591
- C(
778
+ p(
1592
779
  "C6",
1593
780
  "@keyframes stage-spin 0% AND 100% anchor at rotateY(0)",
1594
781
  "both frames rotateY(0)",
1595
782
  i,
1596
- o
783
+ l
1597
784
  )
1598
785
  );
1599
786
  }
1600
787
  {
1601
- const o = document.documentElement, i = getComputedStyle(o), l = i.getPropertyValue("--panel-open-dur").trim() || o.style.getPropertyValue("--panel-open-dur").trim(), d = i.getPropertyValue("--panel-close-dur").trim() || o.style.getPropertyValue("--panel-close-dur").trim(), u = O(l) || parseFloat(l) * (l.endsWith("s") && !l.endsWith("ms") ? 1e3 : 1), h = O(d) || parseFloat(d) * (d.endsWith("s") && !d.endsWith("ms") ? 1e3 : 1), y = Number.isFinite(u) && Number.isFinite(h) && u > h;
788
+ const l = document.documentElement, i = getComputedStyle(l), c = i.getPropertyValue("--panel-open-dur").trim() || l.style.getPropertyValue("--panel-open-dur").trim(), u = i.getPropertyValue("--panel-close-dur").trim() || l.style.getPropertyValue("--panel-close-dur").trim(), m = P(c) || parseFloat(c) * (c.endsWith("s") && !c.endsWith("ms") ? 1e3 : 1), f = P(u) || parseFloat(u) * (u.endsWith("s") && !u.endsWith("ms") ? 1e3 : 1), v = Number.isFinite(m) && Number.isFinite(f) && m > f;
1602
789
  e.push(
1603
- C("C7", "--panel-open-dur > --panel-close-dur", "open > close", `open=${l || "n/a"} close=${d || "n/a"}`, y)
790
+ p("C7", "--panel-open-dur > --panel-close-dur", "open > close", `open=${c || "n/a"} close=${u || "n/a"}`, v)
1604
791
  );
1605
792
  }
1606
- if (!n)
1607
- e.push(C("C8", "BellCutout zero computed animation/transition", "no inline timing", "absent", !1));
793
+ if (!a)
794
+ e.push(p("C8", "BellCutout zero computed animation/transition", "no inline timing", "absent", !1));
1608
795
  else {
1609
- const o = getComputedStyle(n), i = o.animationName || "", l = o.transitionProperty || "", d = (i === "" || i === "none") && (l === "" || l === "none" || l === "all");
796
+ const l = getComputedStyle(a), i = l.animationName || "", c = l.transitionProperty || "", u = (i === "" || i === "none") && (c === "" || c === "none" || c === "all");
1610
797
  e.push(
1611
- C(
798
+ p(
1612
799
  "C8",
1613
800
  "BellCutout zero computed animation/transition",
1614
801
  "animation:none AND transition:none",
1615
- `animation=${i || "n/a"} transition=${l || "n/a"}`,
1616
- d
802
+ `animation=${i || "n/a"} transition=${c || "n/a"}`,
803
+ u
1617
804
  )
1618
805
  );
1619
806
  }
1620
807
  if (!t)
1621
- e.push(C("C9", "mount closed-state clipPath", J, "absent", !1));
808
+ e.push(p("C9", "mount closed-state clipPath", O, "absent", !1));
1622
809
  else {
1623
- const o = t.style.clipPath, i = getComputedStyle(t), l = o || i.clipPath || "", d = l === J;
1624
- e.push(C("C9", "mount closed-state clipPath", J, l || "n/a", d));
810
+ const l = t.style.clipPath, i = getComputedStyle(t), c = l || i.clipPath || "", u = c === O;
811
+ e.push(p("C9", "mount closed-state clipPath", O, c || "n/a", u));
1625
812
  }
1626
- if (!c)
1627
- e.push(C("C10", "bell-popover parentElement === document.body (open)", "body", "absent", !1));
813
+ if (!r)
814
+ e.push(p("C10", "bell-popover parentElement === document.body (open)", "body", "absent", !1));
1628
815
  else {
1629
- const o = c.parentElement, i = o === document.body;
816
+ const l = r.parentElement, i = l === document.body;
1630
817
  e.push(
1631
- C(
818
+ p(
1632
819
  "C10",
1633
820
  "bell-popover parentElement === document.body (open)",
1634
821
  "body",
1635
- o === document.body ? "body" : o?.tagName ?? "n/a",
822
+ l === document.body ? "body" : l?.tagName ?? "n/a",
1636
823
  i
1637
824
  )
1638
825
  );
1639
826
  }
1640
- if (!r)
1641
- e.push(C("C11", "coordinator overflow === visible", "visible", "absent", !1));
827
+ if (!n)
828
+ e.push(p("C11", "coordinator overflow === visible", "visible", "absent", !1));
1642
829
  else {
1643
- const i = getComputedStyle(r).overflow || r.style.overflow || "", l = i === "visible";
1644
- e.push(C("C11", "coordinator overflow === visible", "visible", i || "n/a", l));
830
+ const i = getComputedStyle(n).overflow || n.style.overflow || "", c = i === "visible";
831
+ e.push(p("C11", "coordinator overflow === visible", "visible", i || "n/a", c));
1645
832
  }
1646
- if (!p)
1647
- e.push(C("C12", "toolbar clipPath = inset(0 -40 -40 -40)", ee, "absent", !1));
833
+ if (!d)
834
+ e.push(p("C12", "toolbar clipPath = inset(0 -40 -40 -40)", L, "absent", !1));
1648
835
  else {
1649
- const o = p.style.clipPath, i = getComputedStyle(p), l = o || i.clipPath || "", d = l === ee;
1650
- e.push(C("C12", "toolbar clipPath = inset(0 -40 -40 -40)", ee, l || "n/a", d));
836
+ const l = d.style.clipPath, i = getComputedStyle(d), c = l || i.clipPath || "", u = c === L;
837
+ e.push(p("C12", "toolbar clipPath = inset(0 -40 -40 -40)", L, c || "n/a", u));
1651
838
  }
1652
839
  return e.push(
1653
- C(
840
+ p(
1654
841
  "C13",
1655
842
  "same-position slide via WAAPI (mid-transition getAnimations().length > 0)",
1656
843
  "WAAPI driver wired in orchestrator (source-proof)",
@@ -1658,7 +845,7 @@ function re() {
1658
845
  "wiring_only"
1659
846
  )
1660
847
  ), e.push(
1661
- C(
848
+ p(
1662
849
  "C14",
1663
850
  'cross-position handoff transitionend filtered by propertyName="max-height"',
1664
851
  "transitionend filter wired in orchestrator (source-proof)",
@@ -1667,11 +854,11 @@ function re() {
1667
854
  )
1668
855
  ), e;
1669
856
  }
1670
- function Nt(e) {
1671
- return re().find((t) => t.id === e);
857
+ function Ne(e) {
858
+ return M().find((t) => t.id === e);
1672
859
  }
1673
- function St() {
1674
- const e = ne();
860
+ function we() {
861
+ const e = T();
1675
862
  return { q12: [
1676
863
  {
1677
864
  id: "Q12-12",
@@ -1680,84 +867,74 @@ function St() {
1680
867
  actual: `valid=${e.valid} mount=${e.mount} chrome=${e.chrome} frozen=${e.frozen} orphans=[${e.orphans.join(",")}]`,
1681
868
  pass: e.valid
1682
869
  }
1683
- ], cc: re() };
870
+ ], cc: M() };
1684
871
  }
1685
- function Pt() {
872
+ function Se() {
1686
873
  return {
1687
- enable: Tt,
1688
- disable: wt,
1689
- isEnabled: () => V,
1690
- getLastReport: () => j,
874
+ enable: Ee,
875
+ disable: _e,
876
+ isEnabled: () => E,
877
+ getLastReport: () => _,
1691
878
  recordTransition: (e) => {
1692
- V && (j = { ...e, ...ne() });
879
+ E && (_ = { ...e, ...T() });
1693
880
  },
1694
881
  assertOnce: () => {
1695
- const e = ne();
1696
- return j = e, e;
882
+ const e = T();
883
+ return _ = e, e;
1697
884
  },
1698
- assertCcOnly: re,
1699
- getCcRowById: Nt,
1700
- assertPanelTruths: St
885
+ assertCcOnly: M,
886
+ getCcRowById: Ne,
887
+ assertPanelTruths: we
1701
888
  };
1702
889
  }
1703
- function Tt() {
1704
- if (V = !0, typeof window > "u") return;
1705
- window.__panelsAsserter || (window.__panelsAsserter = Pt(), console.info(
890
+ function Ee() {
891
+ if (E = !0, typeof window > "u") return;
892
+ window.__panelsAsserter || (window.__panelsAsserter = Se(), console.info(
1706
893
  "[panels] asserter enabled (P3b Q12-12 + P6 W5 cc:C1..C14). Inspect via window.__panelsAsserter."
1707
894
  ));
1708
895
  }
1709
- function wt() {
1710
- V = !1;
896
+ function _e() {
897
+ E = !1;
1711
898
  }
1712
899
  export {
1713
- Wt as COMMITS,
1714
- Ht as CatalogAddShell,
1715
- zt as CatalogFooter,
1716
- Ut as CatalogReplaceShell,
1717
- se as CatalogStateContext,
1718
- ve as CloneCard,
1719
- Ze as CloneStage,
1720
- Ce as MOCK_DEFAULT_LENS,
1721
- _e as MOCK_LENSES,
1722
- Ne as MOCK_LENS_META,
1723
- ct as MOCK_PAGES,
1724
- Se as MOCK_TILES_BY_LENS,
1725
- st as MetricInfoShell,
1726
- jt as NotificationCenterShell,
1727
- Yt as PANEL_IDS,
1728
- it as PageMgmtFooter,
1729
- Bt as PageMgmtShell,
1730
- Te as PageMgmtStateContext,
1731
- Zt as PanelBody,
1732
- z as PanelChromeV2,
1733
- Xt as PanelFooter,
1734
- $t as PanelFooterMessage,
1735
- Jt as PanelHeader,
1736
- en as PanelHost,
1737
- Vt as PanelHostShell,
1738
- Le as PanelMount,
1739
- tn as PanelNavigation,
1740
- nn as PanelProvider,
1741
- Kt as PanelSlot,
1742
- an as PanelStage,
1743
- Ft as SettingsShell,
1744
- re as assertCcOnly,
1745
- ne as assertPanelDomShape,
1746
- St as assertPanelTruths,
1747
- sn as deriveSurfaceState,
1748
- wt as disablePanelAsserter,
1749
- Tt as enablePanelAsserter,
1750
- Nt as getCcRowById,
1751
- on as initialState,
1752
- he as positionKey,
1753
- rn as reducer,
1754
- _t as transitionToPanel,
1755
- oe as useCatalogState,
1756
- Rt as useEditingCardId,
1757
- we as usePageMgmtState,
1758
- Me as usePanelContext,
1759
- M as usePanelContextOptional,
1760
- ln as usePanelCoordinator,
1761
- ae as useReducedMotionPanel,
1762
- qt as useTransitionToPanel
900
+ Ve as COMMITS,
901
+ Te as CatalogAddShell,
902
+ le as CatalogFooter,
903
+ Ie as CatalogReplaceShell,
904
+ k as CatalogStateContext,
905
+ oe as CloneCard,
906
+ ne as CloneStage,
907
+ G as MOCK_DEFAULT_LENS,
908
+ W as MOCK_LENSES,
909
+ ue as MOCK_PAGES,
910
+ Q as MOCK_TILES_BY_LENS,
911
+ Me as PANEL_IDS,
912
+ de as PageMgmtFooter,
913
+ ke as PageMgmtShell,
914
+ X as PageMgmtStateContext,
915
+ w as PanelChrome,
916
+ qe as PanelHost,
917
+ $e as PanelHostShell,
918
+ N as PanelMount,
919
+ Be as PanelProvider,
920
+ De as PanelSlot,
921
+ Le as SettingsShell,
922
+ M as assertCcOnly,
923
+ T as assertPanelDomShape,
924
+ we as assertPanelTruths,
925
+ He as deriveSurfaceState,
926
+ _e as disablePanelAsserter,
927
+ Ee as enablePanelAsserter,
928
+ Ne as getCcRowById,
929
+ Ue as initialState,
930
+ z as positionKey,
931
+ Ye as reducer,
932
+ Pe as transitionToPanel,
933
+ re as useCatalogState,
934
+ ce as usePageMgmtState,
935
+ Z as usePanelContext,
936
+ I as usePanelContextOptional,
937
+ Ke as usePanelCoordinator,
938
+ q as useReducedMotionPanel,
939
+ Re as useTransitionToPanel
1763
940
  };