@adoptai/genui-components 0.1.32 → 0.1.45

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 (175) hide show
  1. package/README.md +5 -0
  2. package/dist/builders/BuilderForm.d.ts +16 -1
  3. package/dist/builders/BuilderForm.d.ts.map +1 -1
  4. package/dist/builders/EscalationCard.d.ts +6 -1
  5. package/dist/builders/EscalationCard.d.ts.map +1 -1
  6. package/dist/builders/FieldRenderer.d.ts +5 -1
  7. package/dist/builders/FieldRenderer.d.ts.map +1 -1
  8. package/dist/builders/FormBuilder.d.ts +7 -1
  9. package/dist/builders/FormBuilder.d.ts.map +1 -1
  10. package/dist/builders/StepperBuilder.d.ts +6 -1
  11. package/dist/builders/StepperBuilder.d.ts.map +1 -1
  12. package/dist/builders/fields.d.ts +5 -1
  13. package/dist/builders/fields.d.ts.map +1 -1
  14. package/dist/builders/resolver.d.ts +11 -0
  15. package/dist/builders/resolver.d.ts.map +1 -1
  16. package/dist/composites/aging-report/resolver.cjs +1 -1
  17. package/dist/composites/aging-report/resolver.cjs.map +1 -1
  18. package/dist/composites/aging-report/resolver.js +1 -1
  19. package/dist/composites/aging-report/resolver.js.map +1 -1
  20. package/dist/composites/alert/resolver.cjs +87 -0
  21. package/dist/composites/alert/resolver.cjs.map +1 -1
  22. package/dist/composites/alert/resolver.js +87 -0
  23. package/dist/composites/alert/resolver.js.map +1 -1
  24. package/dist/composites/audit-trail/resolver.cjs +86 -0
  25. package/dist/composites/audit-trail/resolver.cjs.map +1 -1
  26. package/dist/composites/audit-trail/resolver.js +86 -0
  27. package/dist/composites/audit-trail/resolver.js.map +1 -1
  28. package/dist/composites/balance-sheet/resolver.cjs +1 -1
  29. package/dist/composites/balance-sheet/resolver.cjs.map +1 -1
  30. package/dist/composites/balance-sheet/resolver.js +1 -1
  31. package/dist/composites/balance-sheet/resolver.js.map +1 -1
  32. package/dist/composites/cited-answer/resolver.cjs +86 -0
  33. package/dist/composites/cited-answer/resolver.cjs.map +1 -1
  34. package/dist/composites/cited-answer/resolver.js +86 -0
  35. package/dist/composites/cited-answer/resolver.js.map +1 -1
  36. package/dist/composites/compliance-checklist/resolver.cjs +86 -0
  37. package/dist/composites/compliance-checklist/resolver.cjs.map +1 -1
  38. package/dist/composites/compliance-checklist/resolver.js +86 -0
  39. package/dist/composites/compliance-checklist/resolver.js.map +1 -1
  40. package/dist/composites/connect-integration/resolver.cjs +465 -0
  41. package/dist/composites/connect-integration/resolver.cjs.map +1 -0
  42. package/dist/composites/connect-integration/resolver.js +463 -0
  43. package/dist/composites/connect-integration/resolver.js.map +1 -0
  44. package/dist/composites/document-preview/resolver.cjs +86 -0
  45. package/dist/composites/document-preview/resolver.cjs.map +1 -1
  46. package/dist/composites/document-preview/resolver.js +86 -0
  47. package/dist/composites/document-preview/resolver.js.map +1 -1
  48. package/dist/composites/download-card/resolver.cjs +86 -0
  49. package/dist/composites/download-card/resolver.cjs.map +1 -1
  50. package/dist/composites/download-card/resolver.js +86 -0
  51. package/dist/composites/download-card/resolver.js.map +1 -1
  52. package/dist/composites/engagement-pipeline/resolver.cjs +86 -0
  53. package/dist/composites/engagement-pipeline/resolver.cjs.map +1 -1
  54. package/dist/composites/engagement-pipeline/resolver.js +86 -0
  55. package/dist/composites/engagement-pipeline/resolver.js.map +1 -1
  56. package/dist/composites/entity-card-grid/resolver.cjs +2 -2
  57. package/dist/composites/entity-card-grid/resolver.cjs.map +1 -1
  58. package/dist/composites/entity-card-grid/resolver.js +2 -2
  59. package/dist/composites/entity-card-grid/resolver.js.map +1 -1
  60. package/dist/composites/general-ledger/resolver.cjs +1 -0
  61. package/dist/composites/general-ledger/resolver.cjs.map +1 -1
  62. package/dist/composites/general-ledger/resolver.d.ts.map +1 -1
  63. package/dist/composites/general-ledger/resolver.js +1 -0
  64. package/dist/composites/general-ledger/resolver.js.map +1 -1
  65. package/dist/composites/income-statement/resolver.cjs +1 -1
  66. package/dist/composites/income-statement/resolver.cjs.map +1 -1
  67. package/dist/composites/income-statement/resolver.js +1 -1
  68. package/dist/composites/income-statement/resolver.js.map +1 -1
  69. package/dist/composites/integrations-list/resolver.cjs +511 -0
  70. package/dist/composites/integrations-list/resolver.cjs.map +1 -0
  71. package/dist/composites/integrations-list/resolver.js +509 -0
  72. package/dist/composites/integrations-list/resolver.js.map +1 -0
  73. package/dist/composites/invoice-detail/resolver.cjs +86 -0
  74. package/dist/composites/invoice-detail/resolver.cjs.map +1 -1
  75. package/dist/composites/invoice-detail/resolver.js +86 -0
  76. package/dist/composites/invoice-detail/resolver.js.map +1 -1
  77. package/dist/composites/job-tracker/resolver.cjs +86 -0
  78. package/dist/composites/job-tracker/resolver.cjs.map +1 -1
  79. package/dist/composites/job-tracker/resolver.js +86 -0
  80. package/dist/composites/job-tracker/resolver.js.map +1 -1
  81. package/dist/composites/key-value-list/resolver.cjs +114 -3
  82. package/dist/composites/key-value-list/resolver.cjs.map +1 -1
  83. package/dist/composites/key-value-list/resolver.d.ts.map +1 -1
  84. package/dist/composites/key-value-list/resolver.js +114 -3
  85. package/dist/composites/key-value-list/resolver.js.map +1 -1
  86. package/dist/composites/legal-test-result/resolver.cjs +86 -0
  87. package/dist/composites/legal-test-result/resolver.cjs.map +1 -1
  88. package/dist/composites/legal-test-result/resolver.js +86 -0
  89. package/dist/composites/legal-test-result/resolver.js.map +1 -1
  90. package/dist/composites/news-feed/resolver.cjs +86 -0
  91. package/dist/composites/news-feed/resolver.cjs.map +1 -1
  92. package/dist/composites/news-feed/resolver.js +86 -0
  93. package/dist/composites/news-feed/resolver.js.map +1 -1
  94. package/dist/composites/pipeline-preview/resolver.cjs +926 -0
  95. package/dist/composites/pipeline-preview/resolver.cjs.map +1 -0
  96. package/dist/composites/pipeline-preview/resolver.js +924 -0
  97. package/dist/composites/pipeline-preview/resolver.js.map +1 -0
  98. package/dist/composites/provenance-chain/resolver.cjs +86 -0
  99. package/dist/composites/provenance-chain/resolver.cjs.map +1 -1
  100. package/dist/composites/provenance-chain/resolver.js +86 -0
  101. package/dist/composites/provenance-chain/resolver.js.map +1 -1
  102. package/dist/composites/reconciliation-view/resolver.cjs +90 -32
  103. package/dist/composites/reconciliation-view/resolver.cjs.map +1 -1
  104. package/dist/composites/reconciliation-view/resolver.d.ts.map +1 -1
  105. package/dist/composites/reconciliation-view/resolver.js +91 -33
  106. package/dist/composites/reconciliation-view/resolver.js.map +1 -1
  107. package/dist/composites/stacked-breakdown/resolver.cjs +13 -2
  108. package/dist/composites/stacked-breakdown/resolver.cjs.map +1 -1
  109. package/dist/composites/stacked-breakdown/resolver.d.ts.map +1 -1
  110. package/dist/composites/stacked-breakdown/resolver.js +13 -2
  111. package/dist/composites/stacked-breakdown/resolver.js.map +1 -1
  112. package/dist/composites/stat-grid/resolver.cjs +169 -5
  113. package/dist/composites/stat-grid/resolver.cjs.map +1 -1
  114. package/dist/composites/stat-grid/resolver.d.ts.map +1 -1
  115. package/dist/composites/stat-grid/resolver.js +170 -6
  116. package/dist/composites/stat-grid/resolver.js.map +1 -1
  117. package/dist/composites/status-card/resolver.cjs +86 -0
  118. package/dist/composites/status-card/resolver.cjs.map +1 -1
  119. package/dist/composites/status-card/resolver.js +86 -0
  120. package/dist/composites/status-card/resolver.js.map +1 -1
  121. package/dist/composites/tabs-panel/resolver.cjs +86 -0
  122. package/dist/composites/tabs-panel/resolver.cjs.map +1 -1
  123. package/dist/composites/tabs-panel/resolver.js +86 -0
  124. package/dist/composites/tabs-panel/resolver.js.map +1 -1
  125. package/dist/composites/transaction-feed/resolver.cjs +86 -0
  126. package/dist/composites/transaction-feed/resolver.cjs.map +1 -1
  127. package/dist/composites/transaction-feed/resolver.js +86 -0
  128. package/dist/composites/transaction-feed/resolver.js.map +1 -1
  129. package/dist/composites/trial-balance/resolver.cjs +1 -1
  130. package/dist/composites/trial-balance/resolver.cjs.map +1 -1
  131. package/dist/composites/trial-balance/resolver.js +1 -1
  132. package/dist/composites/trial-balance/resolver.js.map +1 -1
  133. package/dist/composites/variance-analysis/resolver.cjs +1 -1
  134. package/dist/composites/variance-analysis/resolver.cjs.map +1 -1
  135. package/dist/composites/variance-analysis/resolver.js +1 -1
  136. package/dist/composites/variance-analysis/resolver.js.map +1 -1
  137. package/dist/composites/workflow-stepper/resolver.cjs +976 -0
  138. package/dist/composites/workflow-stepper/resolver.cjs.map +1 -0
  139. package/dist/composites/workflow-stepper/resolver.d.ts +20 -0
  140. package/dist/composites/workflow-stepper/resolver.d.ts.map +1 -0
  141. package/dist/composites/workflow-stepper/resolver.js +969 -0
  142. package/dist/composites/workflow-stepper/resolver.js.map +1 -0
  143. package/dist/index.cjs +1268 -275
  144. package/dist/index.cjs.map +1 -1
  145. package/dist/index.d.ts +7 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +1105 -120
  148. package/dist/index.js.map +1 -1
  149. package/dist/renderer.cjs +1153 -211
  150. package/dist/renderer.cjs.map +1 -1
  151. package/dist/renderer.js +1015 -73
  152. package/dist/renderer.js.map +1 -1
  153. package/dist/resolver.cjs +1152 -210
  154. package/dist/resolver.cjs.map +1 -1
  155. package/dist/resolver.d.ts.map +1 -1
  156. package/dist/resolver.js +1015 -73
  157. package/dist/resolver.js.map +1 -1
  158. package/dist/schemas/index.cjs +75 -1
  159. package/dist/schemas/index.cjs.map +1 -1
  160. package/dist/schemas/index.d.ts +122 -0
  161. package/dist/schemas/index.d.ts.map +1 -1
  162. package/dist/schemas/index.js +75 -1
  163. package/dist/schemas/index.js.map +1 -1
  164. package/dist/schemas/workflow-stepper.d.ts +122 -0
  165. package/dist/schemas/workflow-stepper.d.ts.map +1 -0
  166. package/dist/shared/FitText.d.ts +22 -0
  167. package/dist/shared/FitText.d.ts.map +1 -0
  168. package/dist/shared/InteractionContext.d.ts +20 -0
  169. package/dist/shared/InteractionContext.d.ts.map +1 -0
  170. package/dist/shared/Markdown.d.ts +2 -1
  171. package/dist/shared/Markdown.d.ts.map +1 -1
  172. package/dist/shared/styles.d.ts +14 -0
  173. package/dist/shared/styles.d.ts.map +1 -0
  174. package/dist/tool-definitions.json +114 -3
  175. package/package.json +2 -2
@@ -0,0 +1,976 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React4 = require('react');
5
+ var htmlToImage = require('html-to-image');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var React4__default = /*#__PURE__*/_interopDefault(React4);
11
+
12
+ var __defProp = Object.defineProperty;
13
+ var __defProps = Object.defineProperties;
14
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
15
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
16
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
17
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
18
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
19
+ var __spreadValues = (a, b) => {
20
+ for (var prop in b || (b = {}))
21
+ if (__hasOwnProp.call(b, prop))
22
+ __defNormalProp(a, prop, b[prop]);
23
+ if (__getOwnPropSymbols)
24
+ for (var prop of __getOwnPropSymbols(b)) {
25
+ if (__propIsEnum.call(b, prop))
26
+ __defNormalProp(a, prop, b[prop]);
27
+ }
28
+ return a;
29
+ };
30
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
31
+
32
+ // src/shared/theme.ts
33
+ var BORDER = "#dedede";
34
+ var MUTED = "#777777";
35
+ var PAPER = "#f6f6f6";
36
+ var ACCENT = "#ff5000";
37
+ var ACCENT_SOFT = "#cc4000";
38
+ var SECONDARY = "#0364ff";
39
+ var CHART_PALETTE = [
40
+ "#ff5000",
41
+ "#0364ff",
42
+ "#16a34a",
43
+ "#dc2626",
44
+ "#7c3aed",
45
+ "#0891b2",
46
+ "#f59e0b",
47
+ "#6366f1",
48
+ "#ec4899",
49
+ "#84cc16",
50
+ "#e11d48",
51
+ "#0ea5e9"
52
+ ];
53
+ function ColumnSettingsPanel({ columns, hidden, onToggle, onShowAll, onHideAll }) {
54
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "6px", minWidth: "180px" }, children: [
55
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", paddingBottom: "4px", borderBottom: `1px solid ${BORDER}` }, children: [
56
+ /* @__PURE__ */ jsxRuntime.jsx(
57
+ "button",
58
+ {
59
+ onClick: onShowAll,
60
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: ACCENT, fontWeight: 500, padding: 0 },
61
+ children: "Show all"
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ "button",
66
+ {
67
+ onClick: onHideAll,
68
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: MUTED, fontWeight: 500, padding: 0 },
69
+ children: "Hide all"
70
+ }
71
+ )
72
+ ] }),
73
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsxs(
74
+ "label",
75
+ {
76
+ style: { display: "flex", alignItems: "center", gap: "8px", cursor: "pointer", fontSize: "12px", color: "var(--foreground)" },
77
+ children: [
78
+ /* @__PURE__ */ jsxRuntime.jsx(
79
+ "input",
80
+ {
81
+ type: "checkbox",
82
+ checked: !hidden.has(col.key),
83
+ onChange: () => onToggle(col.key),
84
+ style: { accentColor: ACCENT, width: "14px", height: "14px", margin: 0, cursor: "pointer" }
85
+ }
86
+ ),
87
+ col.label
88
+ ]
89
+ },
90
+ col.key
91
+ ))
92
+ ] });
93
+ }
94
+ var DOT_COLOR = "#aaaaaa";
95
+ var DOT_HOVER = "#555555";
96
+ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
97
+ const [open, setOpen] = React4.useState(false);
98
+ const [view, setView] = React4.useState("main");
99
+ const contentRef = React4.useRef(null);
100
+ const menuRef = React4.useRef(null);
101
+ const btnRef = React4.useRef(null);
102
+ const close = React4.useCallback(() => {
103
+ setOpen(false);
104
+ setView("main");
105
+ }, []);
106
+ React4.useEffect(() => {
107
+ if (!open) return;
108
+ const handler = (e) => {
109
+ var _a, _b;
110
+ if ((_a = menuRef.current) == null ? void 0 : _a.contains(e.target)) return;
111
+ if ((_b = btnRef.current) == null ? void 0 : _b.contains(e.target)) return;
112
+ close();
113
+ };
114
+ document.addEventListener("mousedown", handler);
115
+ return () => document.removeEventListener("mousedown", handler);
116
+ }, [open, close]);
117
+ const handleDownloadPNG = React4.useCallback(async () => {
118
+ if (!contentRef.current) return;
119
+ try {
120
+ const url = await htmlToImage.toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
121
+ const a = document.createElement("a");
122
+ a.href = url;
123
+ a.download = `${filename}.png`;
124
+ a.click();
125
+ } catch (e) {
126
+ }
127
+ close();
128
+ }, [filename, close]);
129
+ const handleCSV = React4.useCallback(() => {
130
+ onDownloadCSV == null ? void 0 : onDownloadCSV();
131
+ close();
132
+ }, [onDownloadCSV, close]);
133
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column" }, children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: contentRef, style: { width: "100%" }, children }),
135
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "flex-end", marginTop: "4px", position: "relative", zIndex: 10, flexShrink: 0 }, children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx(
137
+ "button",
138
+ {
139
+ ref: btnRef,
140
+ onClick: () => {
141
+ setOpen((o) => !o);
142
+ setView("main");
143
+ },
144
+ "aria-label": "Component actions",
145
+ style: {
146
+ background: "none",
147
+ border: "none",
148
+ cursor: "pointer",
149
+ padding: "4px 8px",
150
+ display: "flex",
151
+ gap: "3px",
152
+ alignItems: "center",
153
+ borderRadius: "6px",
154
+ transition: "background 0.15s"
155
+ },
156
+ onMouseEnter: (e) => {
157
+ e.currentTarget.style.background = "#f2f2f2";
158
+ e.currentTarget.querySelectorAll("circle").forEach((c) => c.style.fill = DOT_HOVER);
159
+ },
160
+ onMouseLeave: (e) => {
161
+ e.currentTarget.style.background = "none";
162
+ e.currentTarget.querySelectorAll("circle").forEach((c) => c.style.fill = DOT_COLOR);
163
+ },
164
+ children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "20", height: "6", viewBox: "0 0 20 6", children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "3", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } }),
166
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "10", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } }),
167
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "17", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } })
168
+ ] })
169
+ }
170
+ ),
171
+ open && /* @__PURE__ */ jsxRuntime.jsx(
172
+ "div",
173
+ {
174
+ ref: menuRef,
175
+ style: {
176
+ position: "absolute",
177
+ bottom: "100%",
178
+ right: 0,
179
+ marginBottom: "4px",
180
+ background: "white",
181
+ border: `1px solid ${BORDER}`,
182
+ borderRadius: "0.75rem",
183
+ boxShadow: "0 4px 12px rgba(0,0,0,0.06)",
184
+ zIndex: 50,
185
+ padding: view === "columns" ? "10px" : "4px",
186
+ minWidth: view === "columns" ? "200px" : "160px"
187
+ },
188
+ children: view === "main" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
189
+ columnConfig && /* @__PURE__ */ jsxRuntime.jsx(MenuButton, { label: "Customize columns", onClick: () => setView("columns") }),
190
+ onDownloadCSV && /* @__PURE__ */ jsxRuntime.jsx(MenuButton, { label: "Download CSV", onClick: handleCSV }),
191
+ /* @__PURE__ */ jsxRuntime.jsx(MenuButton, { label: "Download PNG", onClick: handleDownloadPNG })
192
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
193
+ /* @__PURE__ */ jsxRuntime.jsx(
194
+ "button",
195
+ {
196
+ onClick: () => setView("main"),
197
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: MUTED, marginBottom: "6px", padding: 0 },
198
+ children: "\u2190 Back"
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsxRuntime.jsx(
202
+ ColumnSettingsPanel,
203
+ {
204
+ columns: columnConfig.columns,
205
+ hidden: columnConfig.hidden,
206
+ onToggle: columnConfig.onToggle,
207
+ onShowAll: columnConfig.onShowAll,
208
+ onHideAll: columnConfig.onHideAll
209
+ }
210
+ )
211
+ ] })
212
+ }
213
+ )
214
+ ] })
215
+ ] });
216
+ }
217
+ function MenuButton({ label, onClick }) {
218
+ return /* @__PURE__ */ jsxRuntime.jsx(
219
+ "button",
220
+ {
221
+ onClick,
222
+ style: {
223
+ background: "none",
224
+ border: "none",
225
+ cursor: "pointer",
226
+ padding: "8px 12px",
227
+ fontSize: "12.5px",
228
+ color: "var(--foreground)",
229
+ textAlign: "left",
230
+ borderRadius: "8px",
231
+ transition: "background 0.15s",
232
+ whiteSpace: "nowrap"
233
+ },
234
+ onMouseEnter: (e) => e.currentTarget.style.background = "#f2f2f2",
235
+ onMouseLeave: (e) => e.currentTarget.style.background = "none",
236
+ children: label
237
+ }
238
+ );
239
+ }
240
+ var DEFAULT_TOKENS = {
241
+ BORDER,
242
+ MUTED,
243
+ PAPER,
244
+ ACCENT,
245
+ ACCENT_SOFT,
246
+ SECONDARY,
247
+ CHART_PALETTE: [...CHART_PALETTE]
248
+ };
249
+ var GenUIThemeContext = React4.createContext(DEFAULT_TOKENS);
250
+ function useTheme() {
251
+ return React4.useContext(GenUIThemeContext);
252
+ }
253
+ var DEFAULT_INTERACTION = {
254
+ selectedStepId: null,
255
+ onStepSelect: void 0
256
+ };
257
+ var GenUIInteractionContext = React4.createContext(DEFAULT_INTERACTION);
258
+ function useGenUIInteraction() {
259
+ return React4.useContext(GenUIInteractionContext);
260
+ }
261
+ var STATUS_COLORS = {
262
+ done: "#15803d",
263
+ active: "",
264
+ // filled from theme ACCENT at render time
265
+ review: "#f59e0b",
266
+ pending: "#9ca3af",
267
+ failed: "#dc2626"
268
+ };
269
+ var STATUS_LABELS = {
270
+ done: "Complete",
271
+ active: "In progress",
272
+ review: "In review",
273
+ pending: "Pending",
274
+ failed: "Failed"
275
+ };
276
+ var HUMAN_PALETTE = ["#2563eb", "#0f766e", "#7c3aed", "#b45309", "#be185d", "#4d7c0f"];
277
+ function hashColor(name) {
278
+ let h = 0;
279
+ for (let i = 0; i < name.length; i++) h = h * 31 + name.charCodeAt(i) | 0;
280
+ return HUMAN_PALETTE[Math.abs(h) % HUMAN_PALETTE.length];
281
+ }
282
+ function initialsOf(a) {
283
+ var _a, _b, _c, _d;
284
+ if (a.initials) return a.initials.slice(0, 2).toUpperCase();
285
+ const parts = a.name.trim().split(/\s+/);
286
+ return (((_b = (_a = parts[0]) == null ? void 0 : _a[0]) != null ? _b : "") + ((_d = (_c = parts[1]) == null ? void 0 : _c[0]) != null ? _d : "")).toUpperCase() || "?";
287
+ }
288
+ function SparkMark({ size, color }) {
289
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: size, height: size, viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
290
+ "path",
291
+ {
292
+ d: "M12 2C12 2 12.8 6.5 14.5 9.5C16.2 12.5 20 13 20 13C20 13 16.2 13.5 14.5 16.5C12.8 19.5 12 24 12 24C12 24 11.2 19.5 9.5 16.5C7.8 13.5 4 13 4 13C4 13 7.8 12.5 9.5 9.5C11.2 6.5 12 2 12 2Z",
293
+ fill: color
294
+ }
295
+ ) });
296
+ }
297
+ function AvatarStack({ assignees, accent }) {
298
+ const shown = assignees.slice(0, 4);
299
+ const overflow = assignees.length - shown.length;
300
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
301
+ shown.map((a, i) => {
302
+ const isAgent = a.kind === "agent";
303
+ const bg = isAgent ? `${accent}1f` : a.color || hashColor(a.name);
304
+ return /* @__PURE__ */ jsxRuntime.jsx(
305
+ "div",
306
+ {
307
+ title: `${a.name}${a.role ? ` \xB7 ${a.role}` : isAgent ? " \xB7 agent" : ""}`,
308
+ style: {
309
+ width: 20,
310
+ height: 20,
311
+ borderRadius: "50%",
312
+ flexShrink: 0,
313
+ marginLeft: i === 0 ? 0 : -7,
314
+ zIndex: shown.length - i,
315
+ display: "flex",
316
+ alignItems: "center",
317
+ justifyContent: "center",
318
+ background: bg,
319
+ border: "1.5px solid white",
320
+ boxShadow: isAgent ? `inset 0 0 0 1px ${accent}59` : "none"
321
+ },
322
+ children: isAgent ? /* @__PURE__ */ jsxRuntime.jsx(SparkMark, { size: 11, color: accent }) : /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 8, fontWeight: 700, color: "white", letterSpacing: "0.02em" }, children: initialsOf(a) })
323
+ },
324
+ `${a.name}-${i}`
325
+ );
326
+ }),
327
+ overflow > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
328
+ "span",
329
+ {
330
+ style: {
331
+ marginLeft: -7,
332
+ zIndex: 0,
333
+ width: 20,
334
+ height: 20,
335
+ borderRadius: "50%",
336
+ background: "#f2f2f2",
337
+ border: "1.5px solid white",
338
+ display: "flex",
339
+ alignItems: "center",
340
+ justifyContent: "center",
341
+ fontSize: 8,
342
+ fontWeight: 700,
343
+ color: "#777777"
344
+ },
345
+ children: [
346
+ "+",
347
+ overflow
348
+ ]
349
+ }
350
+ )
351
+ ] });
352
+ }
353
+ function IndexDot({ step, index, accent }) {
354
+ var _a;
355
+ const n = (_a = step.n) != null ? _a : index + 1;
356
+ const base = {
357
+ width: 18,
358
+ height: 18,
359
+ borderRadius: "50%",
360
+ flexShrink: 0,
361
+ display: "flex",
362
+ alignItems: "center",
363
+ justifyContent: "center",
364
+ fontSize: 10,
365
+ fontWeight: 700,
366
+ lineHeight: 1
367
+ };
368
+ if (step.status === "done") {
369
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: __spreadProps(__spreadValues({}, base), { background: "#15803d", color: "white" }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 10 }, children: "\u2713" }) });
370
+ }
371
+ if (step.status === "failed") {
372
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: __spreadProps(__spreadValues({}, base), { background: "#dc2626", color: "white" }), children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: 10 }, children: "!" }) });
373
+ }
374
+ if (step.status === "active") {
375
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: __spreadProps(__spreadValues({}, base), { background: accent, color: "white" }), children: n });
376
+ }
377
+ if (step.status === "review") {
378
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: __spreadProps(__spreadValues({}, base), { background: "white", border: "1.5px solid #f59e0b", color: "#b45309" }), children: n });
379
+ }
380
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: __spreadProps(__spreadValues({}, base), { background: "#f2f2f2", color: "#9ca3af" }), children: n });
381
+ }
382
+ var CARD_MIN = 132;
383
+ var CARD_GAP = 16;
384
+ var AUTO_COMPACT_BELOW = 360;
385
+ function useContainerWidth(ref) {
386
+ const [w, setW] = React4__default.default.useState(0);
387
+ React4__default.default.useLayoutEffect(() => {
388
+ const el = ref.current;
389
+ if (!el || typeof ResizeObserver === "undefined") return;
390
+ const ro = new ResizeObserver((entries) => {
391
+ var _a;
392
+ const cr = (_a = entries[0]) == null ? void 0 : _a.contentRect;
393
+ if (cr) setW(cr.width);
394
+ });
395
+ ro.observe(el);
396
+ setW(el.getBoundingClientRect().width);
397
+ return () => ro.disconnect();
398
+ }, [ref]);
399
+ return w;
400
+ }
401
+ var KEYFRAMES = `
402
+ @keyframes wfsPulse{0%,100%{opacity:1}50%{opacity:.35}}
403
+ @keyframes wfsLampPulse{0%,100%{box-shadow:0 0 0 0 var(--wfs-accent,#6366f1)73}50%{box-shadow:0 0 0 4px transparent}}
404
+ @keyframes wfsRise{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
405
+ @keyframes wfsShimmer{0%{background-position:-200px 0}100%{background-position:calc(200px + 100%) 0}}
406
+ .wfs-rise{animation:wfsRise 0.32s cubic-bezier(0.22,1,0.36,1) both}
407
+ @media (prefers-reduced-motion: reduce){
408
+ .wfs-anim,.wfs-rise,.wfs-shim{animation:none !important}
409
+ .wfs-rise{opacity:1 !important;transform:none !important}
410
+ }`;
411
+ function ProgressMeter({
412
+ done,
413
+ total,
414
+ accent,
415
+ muted,
416
+ loading
417
+ }) {
418
+ const pct = total > 0 ? Math.round(done / total * 100) : 0;
419
+ return /* @__PURE__ */ jsxRuntime.jsxs(
420
+ "div",
421
+ {
422
+ "data-testid": "workflow-stepper-progress",
423
+ style: { display: "flex", alignItems: "center", gap: 8, padding: "0 2px 6px" },
424
+ children: [
425
+ /* @__PURE__ */ jsxRuntime.jsx(
426
+ "span",
427
+ {
428
+ style: {
429
+ fontSize: 10.5,
430
+ fontWeight: 600,
431
+ color: muted,
432
+ fontVariantNumeric: "tabular-nums",
433
+ letterSpacing: "0.01em",
434
+ whiteSpace: "nowrap"
435
+ },
436
+ children: loading ? "\u2014" : `${done} / ${total} \xB7 ${pct}%`
437
+ }
438
+ ),
439
+ /* @__PURE__ */ jsxRuntime.jsx(
440
+ "span",
441
+ {
442
+ style: {
443
+ flex: 1,
444
+ height: 3,
445
+ borderRadius: 3,
446
+ background: "#eceff4",
447
+ overflow: "hidden",
448
+ minWidth: 40
449
+ },
450
+ children: /* @__PURE__ */ jsxRuntime.jsx(
451
+ "span",
452
+ {
453
+ className: loading ? "wfs-shim" : void 0,
454
+ style: {
455
+ display: "block",
456
+ height: "100%",
457
+ width: loading ? "100%" : `${pct}%`,
458
+ borderRadius: 3,
459
+ background: loading ? `linear-gradient(90deg, #eceff4, ${accent}55, #eceff4)` : accent,
460
+ backgroundSize: loading ? "200px 100%" : void 0,
461
+ animation: loading ? "wfsShimmer 1.1s linear infinite" : void 0,
462
+ transition: "width 0.45s cubic-bezier(0.22,1,0.36,1)"
463
+ }
464
+ }
465
+ )
466
+ }
467
+ )
468
+ ]
469
+ }
470
+ );
471
+ }
472
+ function WorkflowStepperRenderer({
473
+ data,
474
+ selectedStep = null,
475
+ onSelectStep,
476
+ density = "auto",
477
+ loading = false,
478
+ loadingSteps = 6,
479
+ showProgress = true
480
+ }) {
481
+ var _a, _b, _c, _d, _e, _f;
482
+ const { BORDER: BORDER2, MUTED: MUTED2, ACCENT: ACCENT2 } = useTheme();
483
+ const steps = (_a = data.steps) != null ? _a : [];
484
+ const activeStepId = (_d = (_c = data.active_step) != null ? _c : (_b = steps.find((s) => s.status === "active")) == null ? void 0 : _b.id) != null ? _d : null;
485
+ const interactive = typeof onSelectStep === "function";
486
+ const statusColor = (s) => s === "active" ? ACCENT2 : STATUS_COLORS[s];
487
+ const doneCount = steps.filter((s) => s.status === "done").length;
488
+ const rootRef = React4__default.default.useRef(null);
489
+ const containerW = useContainerWidth(rootRef);
490
+ let resolved = density === "auto" ? "full" : density;
491
+ if (density === "auto" && containerW > 0) {
492
+ const needed = steps.length * CARD_MIN + Math.max(0, steps.length - 1) * CARD_GAP;
493
+ resolved = containerW < AUTO_COMPACT_BELOW || needed > containerW * 1.6 ? "compact" : "full";
494
+ }
495
+ const scrollerRef = React4__default.default.useRef(null);
496
+ React4__default.default.useEffect(() => {
497
+ if (resolved !== "full" || loading) return;
498
+ const sc = scrollerRef.current;
499
+ if (!sc) return;
500
+ const el = sc.querySelector(
501
+ `[data-testid="workflow-stepper-step-${selectedStep != null ? selectedStep : activeStepId}"]`
502
+ );
503
+ if (el && sc.scrollWidth > sc.clientWidth) {
504
+ el.scrollIntoView({ inline: "center", block: "nearest", behavior: "smooth" });
505
+ }
506
+ }, [resolved, loading, selectedStep, activeStepId]);
507
+ const [edges, setEdges] = React4__default.default.useState({
508
+ left: false,
509
+ right: false
510
+ });
511
+ const updateEdges = React4__default.default.useCallback(() => {
512
+ const sc = scrollerRef.current;
513
+ if (!sc) return;
514
+ const max = sc.scrollWidth - sc.clientWidth;
515
+ const sl = sc.scrollLeft;
516
+ const left = sl > 1;
517
+ const right = sl < max - 1;
518
+ setEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
519
+ }, []);
520
+ React4__default.default.useLayoutEffect(() => {
521
+ if (resolved !== "full" || loading) return;
522
+ updateEdges();
523
+ const sc = scrollerRef.current;
524
+ if (!sc || typeof ResizeObserver === "undefined") return;
525
+ const ro = new ResizeObserver(updateEdges);
526
+ ro.observe(sc);
527
+ return () => ro.disconnect();
528
+ }, [resolved, loading, steps.length, updateEdges]);
529
+ const edgeMask = edges.left || edges.right ? `linear-gradient(90deg, ${edges.left ? "transparent 0, #000 14px" : "#000 0"}, ${edges.right ? "#000 calc(100% - 14px), transparent 100%" : "#000 100%"})` : void 0;
530
+ const themeStyle = { ["--wfs-accent"]: ACCENT2 };
531
+ if (loading) {
532
+ const ghosts = Array.from({ length: Math.max(2, loadingSteps) });
533
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-testid": "workflow-stepper-loading", style: __spreadValues({ width: "100%", minWidth: 0 }, themeStyle), children: [
534
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: KEYFRAMES }),
535
+ showProgress && /* @__PURE__ */ jsxRuntime.jsx(ProgressMeter, { done: 0, total: 0, accent: ACCENT2, muted: MUTED2, loading: true }),
536
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "stretch", gap: CARD_GAP, padding: "2px 2px 6px", overflow: "hidden" }, children: ghosts.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
537
+ "div",
538
+ {
539
+ className: "wfs-shim",
540
+ "aria-hidden": "true",
541
+ style: {
542
+ flex: "0 1 168px",
543
+ minWidth: CARD_MIN,
544
+ height: 84,
545
+ borderRadius: 10,
546
+ border: `1px solid ${BORDER2}`,
547
+ background: `linear-gradient(90deg, #f4f6f9, #eceff4 40%, #f4f6f9 80%)`,
548
+ backgroundSize: "200px 100%",
549
+ animation: "wfsShimmer 1.1s linear infinite",
550
+ animationDelay: `${i * 0.08}s`
551
+ }
552
+ },
553
+ i
554
+ )) })
555
+ ] });
556
+ }
557
+ if (resolved === "compact") {
558
+ const activeStep = (_e = steps.find((s) => s.id === activeStepId)) != null ? _e : null;
559
+ return /* @__PURE__ */ jsxRuntime.jsxs(
560
+ "div",
561
+ {
562
+ ref: rootRef,
563
+ "data-testid": "workflow-stepper-compact",
564
+ style: __spreadValues({ width: "100%", minWidth: 0 }, themeStyle),
565
+ children: [
566
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: KEYFRAMES }),
567
+ showProgress && /* @__PURE__ */ jsxRuntime.jsx(ProgressMeter, { done: doneCount, total: steps.length, accent: ACCENT2, muted: MUTED2 }),
568
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 12, minWidth: 0 }, children: [
569
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", flexShrink: 0 }, children: steps.map((s, i) => {
570
+ const sel = selectedStep === s.id;
571
+ const act = s.status === "active";
572
+ const done = s.status === "done";
573
+ const reached = s.status !== "pending";
574
+ const clickable = interactive && reached;
575
+ const size = act ? 11 : done ? 9 : 8;
576
+ return /* @__PURE__ */ jsxRuntime.jsxs(React4__default.default.Fragment, { children: [
577
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
578
+ "span",
579
+ {
580
+ "aria-hidden": "true",
581
+ style: {
582
+ width: 14,
583
+ height: 1.5,
584
+ borderRadius: 1,
585
+ background: steps[i - 1].status === "done" ? "#15803d" : "#e5e7eb",
586
+ transition: "background 0.36s ease-out"
587
+ }
588
+ }
589
+ ),
590
+ /* @__PURE__ */ jsxRuntime.jsx(
591
+ "button",
592
+ {
593
+ type: "button",
594
+ disabled: interactive && !reached,
595
+ "aria-disabled": interactive && !reached ? true : void 0,
596
+ title: `${s.title} \xB7 ${STATUS_LABELS[s.status]}`,
597
+ onClick: clickable ? () => onSelectStep == null ? void 0 : onSelectStep(sel ? null : s.id) : void 0,
598
+ "data-testid": `workflow-stepper-step-${s.id}`,
599
+ "data-status": s.status,
600
+ "data-reached": reached || void 0,
601
+ className: act ? "wfs-anim" : void 0,
602
+ style: {
603
+ position: "relative",
604
+ width: size,
605
+ height: size,
606
+ padding: 0,
607
+ borderRadius: "50%",
608
+ background: statusColor(s.status),
609
+ flexShrink: 0,
610
+ // border-box so the selected 2px border can't grow the dot
611
+ // and reflow the rail.
612
+ boxSizing: "border-box",
613
+ opacity: reached ? 1 : 0.55,
614
+ border: sel ? `2px solid ${ACCENT2}` : done ? "none" : "1px solid rgba(255,255,255,0.6)",
615
+ boxShadow: sel ? "0 0 0 2px #fff" : "none",
616
+ cursor: clickable ? "pointer" : "default",
617
+ transition: "width 0.15s, height 0.15s",
618
+ animation: act ? "wfsLampPulse 1.8s ease-in-out infinite" : "none"
619
+ }
620
+ }
621
+ )
622
+ ] }, s.id);
623
+ }) }),
624
+ activeStep && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
625
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", style: { width: 1, height: 16, background: "#e6eaf1", flexShrink: 0 } }),
626
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { display: "flex", alignItems: "center", gap: 7, minWidth: 0 }, children: [
627
+ /* @__PURE__ */ jsxRuntime.jsx(
628
+ "span",
629
+ {
630
+ "aria-hidden": "true",
631
+ style: {
632
+ width: 17,
633
+ height: 17,
634
+ borderRadius: "50%",
635
+ flexShrink: 0,
636
+ display: "flex",
637
+ alignItems: "center",
638
+ justifyContent: "center",
639
+ fontSize: 9.5,
640
+ fontWeight: 700,
641
+ lineHeight: 1,
642
+ background: activeStep.status === "done" ? "#15803d" : activeStep.status === "review" ? "#fff" : activeStep.status === "failed" ? "#dc2626" : ACCENT2,
643
+ color: activeStep.status === "review" ? "#b45309" : "#fff",
644
+ border: activeStep.status === "review" ? "1.5px solid #f59e0b" : "none"
645
+ },
646
+ children: activeStep.status === "done" ? "\u2713" : activeStep.status === "failed" ? "!" : (_f = activeStep.n) != null ? _f : steps.findIndex((x) => x.id === activeStep.id) + 1
647
+ }
648
+ ),
649
+ /* @__PURE__ */ jsxRuntime.jsxs(
650
+ "span",
651
+ {
652
+ style: {
653
+ fontSize: 12.5,
654
+ fontWeight: 650,
655
+ color: "var(--foreground)",
656
+ letterSpacing: "-0.01em",
657
+ whiteSpace: "nowrap",
658
+ overflow: "hidden",
659
+ textOverflow: "ellipsis",
660
+ minWidth: 0
661
+ },
662
+ children: [
663
+ activeStep.title,
664
+ activeStep.sub ? /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontWeight: 400, color: MUTED2 }, children: [
665
+ " \xB7 ",
666
+ activeStep.sub
667
+ ] }) : null
668
+ ]
669
+ }
670
+ )
671
+ ] })
672
+ ] })
673
+ ] })
674
+ ]
675
+ }
676
+ );
677
+ }
678
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: rootRef, "data-testid": "workflow-stepper", style: __spreadValues({ width: "100%", minWidth: 0 }, themeStyle), children: [
679
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: KEYFRAMES }),
680
+ showProgress && /* @__PURE__ */ jsxRuntime.jsx(ProgressMeter, { done: doneCount, total: steps.length, accent: ACCENT2, muted: MUTED2 }),
681
+ /* @__PURE__ */ jsxRuntime.jsxs(
682
+ "div",
683
+ {
684
+ ref: scrollerRef,
685
+ className: "wfs-scroller",
686
+ onScroll: updateEdges,
687
+ style: {
688
+ display: "flex",
689
+ alignItems: "stretch",
690
+ overflowX: "auto",
691
+ scrollSnapType: "x proximity",
692
+ padding: "2px 2px 4px",
693
+ // Thin, always-styled scrollbar (Firefox + Windows/desktop WebKit
694
+ // where overlay scrollbars aren't available). macOS/mobile show
695
+ // overlay scrollbars on scroll; harmless either way.
696
+ scrollbarWidth: "thin",
697
+ scrollbarColor: "#c2c9d6 transparent",
698
+ // Edge fade ONLY on the side(s) with hidden content — never when the
699
+ // row isn't scrollable, so the last card's right edge stays crisp.
700
+ maskImage: edgeMask,
701
+ WebkitMaskImage: edgeMask
702
+ },
703
+ children: [
704
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
705
+ .wfs-scroller::-webkit-scrollbar{height:8px}
706
+ .wfs-scroller::-webkit-scrollbar-track{background:transparent}
707
+ .wfs-scroller::-webkit-scrollbar-thumb{background:#c2c9d6;border-radius:8px;border:2px solid transparent;background-clip:padding-box}
708
+ .wfs-scroller:hover::-webkit-scrollbar-thumb{background:#aab2c2;background-clip:padding-box}
709
+ ` }),
710
+ steps.map((step, i) => {
711
+ var _a2;
712
+ const isSelected = selectedStep === step.id;
713
+ const isActive = step.status === "active";
714
+ const reached = step.status !== "pending";
715
+ const clickable = interactive && reached;
716
+ const color = statusColor(step.status);
717
+ const humans = ((_a2 = step.assignees) != null ? _a2 : []).filter((a) => a.kind === "human");
718
+ const roleCaption = humans.map((h) => h.role).filter(Boolean).slice(0, 2).join(" \xB7 ");
719
+ return /* @__PURE__ */ jsxRuntime.jsxs(React4__default.default.Fragment, { children: [
720
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(
721
+ "div",
722
+ {
723
+ style: {
724
+ width: CARD_GAP,
725
+ flexShrink: 0,
726
+ display: "flex",
727
+ alignItems: "center"
728
+ },
729
+ "aria-hidden": "true",
730
+ children: /* @__PURE__ */ jsxRuntime.jsx(
731
+ "div",
732
+ {
733
+ style: {
734
+ width: "100%",
735
+ height: 1.5,
736
+ borderRadius: 1,
737
+ // Fill sweep: completed rails wash green left→right.
738
+ background: steps[i - 1].status === "done" ? "linear-gradient(90deg, #15803d, #15803d)" : "#e5e7eb",
739
+ backgroundSize: "100% 100%",
740
+ transition: "background 0.36s ease-out"
741
+ }
742
+ }
743
+ )
744
+ }
745
+ ),
746
+ /* @__PURE__ */ jsxRuntime.jsxs(
747
+ "div",
748
+ {
749
+ role: clickable ? "button" : void 0,
750
+ tabIndex: clickable ? 0 : void 0,
751
+ "aria-disabled": interactive && !reached ? true : void 0,
752
+ className: "wfs-rise",
753
+ "data-testid": `workflow-stepper-step-${step.id}`,
754
+ "data-status": step.status,
755
+ "data-selected": isSelected || void 0,
756
+ "data-reached": reached || void 0,
757
+ onClick: clickable ? () => onSelectStep == null ? void 0 : onSelectStep(isSelected ? null : step.id) : void 0,
758
+ onKeyDown: clickable ? (e) => {
759
+ if (e.key === "Enter" || e.key === " ") {
760
+ e.preventDefault();
761
+ onSelectStep == null ? void 0 : onSelectStep(isSelected ? null : step.id);
762
+ }
763
+ } : void 0,
764
+ onMouseEnter: clickable ? (e) => {
765
+ e.currentTarget.style.transform = "translateY(-1px)";
766
+ e.currentTarget.style.boxShadow = "0 3px 10px rgba(15,23,42,0.08)";
767
+ } : void 0,
768
+ onMouseLeave: clickable ? (e) => {
769
+ e.currentTarget.style.transform = "none";
770
+ e.currentTarget.style.boxShadow = "0 1px 2px rgba(0,0,0,0.04)";
771
+ } : void 0,
772
+ style: {
773
+ position: "relative",
774
+ flex: "0 1 168px",
775
+ minWidth: CARD_MIN,
776
+ maxWidth: 208,
777
+ scrollSnapAlign: "center",
778
+ borderRadius: 10,
779
+ boxSizing: "border-box",
780
+ // Selection changes border COLOR only (constant 1px width) so
781
+ // the card never reflows the row on click.
782
+ border: `1px solid ${isSelected ? ACCENT2 : BORDER2}`,
783
+ background: isSelected ? `${ACCENT2}0d` : "white",
784
+ boxShadow: "0 1px 2px rgba(0,0,0,0.04)",
785
+ padding: "10px 11px",
786
+ display: "flex",
787
+ flexDirection: "column",
788
+ gap: 7,
789
+ cursor: clickable ? "pointer" : "default",
790
+ opacity: reached ? 1 : 0.62,
791
+ transition: "border-color 0.15s, background 0.15s, transform 0.12s, box-shadow 0.12s",
792
+ animationDelay: `${Math.min(i, 10) * 0.04}s`,
793
+ overflow: "hidden"
794
+ },
795
+ children: [
796
+ isActive && !isSelected && /* @__PURE__ */ jsxRuntime.jsx(
797
+ "span",
798
+ {
799
+ style: {
800
+ position: "absolute",
801
+ left: 0,
802
+ top: 6,
803
+ bottom: 6,
804
+ width: 2,
805
+ borderRadius: 2,
806
+ background: ACCENT2
807
+ }
808
+ }
809
+ ),
810
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" }, children: [
811
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
812
+ /* @__PURE__ */ jsxRuntime.jsx(IndexDot, { step, index: i, accent: ACCENT2 }),
813
+ /* @__PURE__ */ jsxRuntime.jsx(
814
+ "span",
815
+ {
816
+ className: isActive ? "wfs-anim" : void 0,
817
+ style: {
818
+ width: 6,
819
+ height: 6,
820
+ borderRadius: "50%",
821
+ background: color,
822
+ animation: isActive ? "wfsLampPulse 1.8s ease-in-out infinite" : "none"
823
+ }
824
+ }
825
+ )
826
+ ] }),
827
+ /* @__PURE__ */ jsxRuntime.jsx(
828
+ "span",
829
+ {
830
+ style: {
831
+ fontSize: 9,
832
+ fontWeight: 600,
833
+ letterSpacing: "0.05em",
834
+ textTransform: "uppercase",
835
+ color
836
+ },
837
+ children: STATUS_LABELS[step.status]
838
+ }
839
+ )
840
+ ] }),
841
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { minWidth: 0 }, children: [
842
+ /* @__PURE__ */ jsxRuntime.jsx(
843
+ "div",
844
+ {
845
+ style: {
846
+ fontSize: 12.5,
847
+ fontWeight: 600,
848
+ color: "var(--foreground)",
849
+ lineHeight: 1.25,
850
+ letterSpacing: "-0.01em",
851
+ overflow: "hidden",
852
+ textOverflow: "ellipsis",
853
+ whiteSpace: "nowrap"
854
+ },
855
+ children: step.title
856
+ }
857
+ ),
858
+ step.sub && /* @__PURE__ */ jsxRuntime.jsx(
859
+ "div",
860
+ {
861
+ style: {
862
+ fontSize: 10.5,
863
+ color: MUTED2,
864
+ marginTop: 2,
865
+ overflow: "hidden",
866
+ textOverflow: "ellipsis",
867
+ whiteSpace: "nowrap"
868
+ },
869
+ children: step.sub
870
+ }
871
+ )
872
+ ] }),
873
+ /* @__PURE__ */ jsxRuntime.jsxs(
874
+ "div",
875
+ {
876
+ style: {
877
+ display: "flex",
878
+ alignItems: "center",
879
+ justifyContent: "space-between",
880
+ marginTop: "auto",
881
+ minHeight: 20
882
+ },
883
+ children: [
884
+ step.assignees && step.assignees.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(AvatarStack, { assignees: step.assignees, accent: ACCENT2 }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
885
+ roleCaption && /* @__PURE__ */ jsxRuntime.jsx(
886
+ "span",
887
+ {
888
+ style: {
889
+ fontSize: 9,
890
+ color: "#9ca3af",
891
+ fontWeight: 500,
892
+ textAlign: "right",
893
+ maxWidth: 76,
894
+ lineHeight: 1.2,
895
+ overflow: "hidden"
896
+ },
897
+ children: roleCaption
898
+ }
899
+ )
900
+ ]
901
+ }
902
+ )
903
+ ]
904
+ }
905
+ )
906
+ ] }, step.id);
907
+ })
908
+ ]
909
+ }
910
+ )
911
+ ] });
912
+ }
913
+ function WorkflowStepperResolver(p) {
914
+ var _a;
915
+ const { selectedStepId, onStepSelect } = useGenUIInteraction();
916
+ return /* @__PURE__ */ jsxRuntime.jsx(ComponentActions, { filename: (_a = p.title) != null ? _a : "workflow-stepper", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: 10 }, children: [
917
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }, children: [
918
+ /* @__PURE__ */ jsxRuntime.jsx(
919
+ "p",
920
+ {
921
+ style: {
922
+ fontFamily: "var(--font-serif)",
923
+ fontSize: "15px",
924
+ fontWeight: 400,
925
+ color: "var(--foreground)",
926
+ letterSpacing: "-0.01em",
927
+ margin: 0
928
+ },
929
+ children: p.title
930
+ }
931
+ ),
932
+ p.period && /* @__PURE__ */ jsxRuntime.jsx(
933
+ "span",
934
+ {
935
+ style: {
936
+ fontSize: 11,
937
+ fontWeight: 600,
938
+ padding: "2px 8px",
939
+ borderRadius: 9999,
940
+ background: "#f2f2f2",
941
+ color: "#777777",
942
+ fontVariantNumeric: "tabular-nums"
943
+ },
944
+ children: p.period
945
+ }
946
+ ),
947
+ p.badge && /* @__PURE__ */ jsxRuntime.jsx(
948
+ "span",
949
+ {
950
+ style: {
951
+ fontSize: 11,
952
+ fontWeight: 600,
953
+ padding: "2px 8px",
954
+ borderRadius: 9999,
955
+ border: "1px solid #dedede",
956
+ color: "#777777"
957
+ },
958
+ children: p.badge
959
+ }
960
+ )
961
+ ] }),
962
+ /* @__PURE__ */ jsxRuntime.jsx(
963
+ WorkflowStepperRenderer,
964
+ {
965
+ data: p,
966
+ selectedStep: selectedStepId,
967
+ onSelectStep: onStepSelect
968
+ }
969
+ )
970
+ ] }) });
971
+ }
972
+
973
+ exports.WorkflowStepperRenderer = WorkflowStepperRenderer;
974
+ exports.WorkflowStepperResolver = WorkflowStepperResolver;
975
+ //# sourceMappingURL=resolver.cjs.map
976
+ //# sourceMappingURL=resolver.cjs.map