@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,924 @@
1
+ "use client";
2
+ import { createContext, useState, useMemo, useContext, useRef, useCallback, useEffect } from 'react';
3
+ import { toPng } from 'html-to-image';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __defProps = Object.defineProperties;
8
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+
26
+ // src/shared/theme.ts
27
+ var BORDER = "#dedede";
28
+ var MUTED = "#777777";
29
+ var PAPER = "#f6f6f6";
30
+ var ACCENT = "#ff5000";
31
+ var ACCENT_SOFT = "#cc4000";
32
+ var SECONDARY = "#0364ff";
33
+ var CHART_PALETTE = [
34
+ "#ff5000",
35
+ "#0364ff",
36
+ "#16a34a",
37
+ "#dc2626",
38
+ "#7c3aed",
39
+ "#0891b2",
40
+ "#f59e0b",
41
+ "#6366f1",
42
+ "#ec4899",
43
+ "#84cc16",
44
+ "#e11d48",
45
+ "#0ea5e9"
46
+ ];
47
+ function ColumnSettingsPanel({ columns, hidden, onToggle, onShowAll, onHideAll }) {
48
+ return /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "6px", minWidth: "180px" }, children: [
49
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", paddingBottom: "4px", borderBottom: `1px solid ${BORDER}` }, children: [
50
+ /* @__PURE__ */ jsx(
51
+ "button",
52
+ {
53
+ onClick: onShowAll,
54
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: ACCENT, fontWeight: 500, padding: 0 },
55
+ children: "Show all"
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx(
59
+ "button",
60
+ {
61
+ onClick: onHideAll,
62
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: MUTED, fontWeight: 500, padding: 0 },
63
+ children: "Hide all"
64
+ }
65
+ )
66
+ ] }),
67
+ columns.map((col) => /* @__PURE__ */ jsxs(
68
+ "label",
69
+ {
70
+ style: { display: "flex", alignItems: "center", gap: "8px", cursor: "pointer", fontSize: "12px", color: "var(--foreground)" },
71
+ children: [
72
+ /* @__PURE__ */ jsx(
73
+ "input",
74
+ {
75
+ type: "checkbox",
76
+ checked: !hidden.has(col.key),
77
+ onChange: () => onToggle(col.key),
78
+ style: { accentColor: ACCENT, width: "14px", height: "14px", margin: 0, cursor: "pointer" }
79
+ }
80
+ ),
81
+ col.label
82
+ ]
83
+ },
84
+ col.key
85
+ ))
86
+ ] });
87
+ }
88
+ var DOT_COLOR = "#aaaaaa";
89
+ var DOT_HOVER = "#555555";
90
+ function ComponentActions({ children, onDownloadCSV, columnConfig, filename = "component" }) {
91
+ const [open, setOpen] = useState(false);
92
+ const [view, setView] = useState("main");
93
+ const contentRef = useRef(null);
94
+ const menuRef = useRef(null);
95
+ const btnRef = useRef(null);
96
+ const close = useCallback(() => {
97
+ setOpen(false);
98
+ setView("main");
99
+ }, []);
100
+ useEffect(() => {
101
+ if (!open) return;
102
+ const handler = (e) => {
103
+ var _a, _b;
104
+ if ((_a = menuRef.current) == null ? void 0 : _a.contains(e.target)) return;
105
+ if ((_b = btnRef.current) == null ? void 0 : _b.contains(e.target)) return;
106
+ close();
107
+ };
108
+ document.addEventListener("mousedown", handler);
109
+ return () => document.removeEventListener("mousedown", handler);
110
+ }, [open, close]);
111
+ const handleDownloadPNG = useCallback(async () => {
112
+ if (!contentRef.current) return;
113
+ try {
114
+ const url = await toPng(contentRef.current, { backgroundColor: "white", pixelRatio: 2 });
115
+ const a = document.createElement("a");
116
+ a.href = url;
117
+ a.download = `${filename}.png`;
118
+ a.click();
119
+ } catch (e) {
120
+ }
121
+ close();
122
+ }, [filename, close]);
123
+ const handleCSV = useCallback(() => {
124
+ onDownloadCSV == null ? void 0 : onDownloadCSV();
125
+ close();
126
+ }, [onDownloadCSV, close]);
127
+ return /* @__PURE__ */ jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column" }, children: [
128
+ /* @__PURE__ */ jsx("div", { ref: contentRef, style: { width: "100%" }, children }),
129
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "flex-end", marginTop: "4px", position: "relative", zIndex: 10, flexShrink: 0 }, children: [
130
+ /* @__PURE__ */ jsx(
131
+ "button",
132
+ {
133
+ ref: btnRef,
134
+ onClick: () => {
135
+ setOpen((o) => !o);
136
+ setView("main");
137
+ },
138
+ "aria-label": "Component actions",
139
+ style: {
140
+ background: "none",
141
+ border: "none",
142
+ cursor: "pointer",
143
+ padding: "4px 8px",
144
+ display: "flex",
145
+ gap: "3px",
146
+ alignItems: "center",
147
+ borderRadius: "6px",
148
+ transition: "background 0.15s"
149
+ },
150
+ onMouseEnter: (e) => {
151
+ e.currentTarget.style.background = "#f2f2f2";
152
+ e.currentTarget.querySelectorAll("circle").forEach((c) => c.style.fill = DOT_HOVER);
153
+ },
154
+ onMouseLeave: (e) => {
155
+ e.currentTarget.style.background = "none";
156
+ e.currentTarget.querySelectorAll("circle").forEach((c) => c.style.fill = DOT_COLOR);
157
+ },
158
+ children: /* @__PURE__ */ jsxs("svg", { width: "20", height: "6", viewBox: "0 0 20 6", children: [
159
+ /* @__PURE__ */ jsx("circle", { cx: "3", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } }),
160
+ /* @__PURE__ */ jsx("circle", { cx: "10", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } }),
161
+ /* @__PURE__ */ jsx("circle", { cx: "17", cy: "3", r: "2", style: { fill: DOT_COLOR, transition: "fill 0.15s" } })
162
+ ] })
163
+ }
164
+ ),
165
+ open && /* @__PURE__ */ jsx(
166
+ "div",
167
+ {
168
+ ref: menuRef,
169
+ style: {
170
+ position: "absolute",
171
+ bottom: "100%",
172
+ right: 0,
173
+ marginBottom: "4px",
174
+ background: "white",
175
+ border: `1px solid ${BORDER}`,
176
+ borderRadius: "0.75rem",
177
+ boxShadow: "0 4px 12px rgba(0,0,0,0.06)",
178
+ zIndex: 50,
179
+ padding: view === "columns" ? "10px" : "4px",
180
+ minWidth: view === "columns" ? "200px" : "160px"
181
+ },
182
+ children: view === "main" ? /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
183
+ columnConfig && /* @__PURE__ */ jsx(MenuButton, { label: "Customize columns", onClick: () => setView("columns") }),
184
+ onDownloadCSV && /* @__PURE__ */ jsx(MenuButton, { label: "Download CSV", onClick: handleCSV }),
185
+ /* @__PURE__ */ jsx(MenuButton, { label: "Download PNG", onClick: handleDownloadPNG })
186
+ ] }) : /* @__PURE__ */ jsxs("div", { children: [
187
+ /* @__PURE__ */ jsx(
188
+ "button",
189
+ {
190
+ onClick: () => setView("main"),
191
+ style: { background: "none", border: "none", cursor: "pointer", fontSize: "11px", color: MUTED, marginBottom: "6px", padding: 0 },
192
+ children: "\u2190 Back"
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsx(
196
+ ColumnSettingsPanel,
197
+ {
198
+ columns: columnConfig.columns,
199
+ hidden: columnConfig.hidden,
200
+ onToggle: columnConfig.onToggle,
201
+ onShowAll: columnConfig.onShowAll,
202
+ onHideAll: columnConfig.onHideAll
203
+ }
204
+ )
205
+ ] })
206
+ }
207
+ )
208
+ ] })
209
+ ] });
210
+ }
211
+ function MenuButton({ label, onClick }) {
212
+ return /* @__PURE__ */ jsx(
213
+ "button",
214
+ {
215
+ onClick,
216
+ style: {
217
+ background: "none",
218
+ border: "none",
219
+ cursor: "pointer",
220
+ padding: "8px 12px",
221
+ fontSize: "12.5px",
222
+ color: "var(--foreground)",
223
+ textAlign: "left",
224
+ borderRadius: "8px",
225
+ transition: "background 0.15s",
226
+ whiteSpace: "nowrap"
227
+ },
228
+ onMouseEnter: (e) => e.currentTarget.style.background = "#f2f2f2",
229
+ onMouseLeave: (e) => e.currentTarget.style.background = "none",
230
+ children: label
231
+ }
232
+ );
233
+ }
234
+ var DEFAULT_TOKENS = {
235
+ BORDER,
236
+ MUTED,
237
+ PAPER,
238
+ ACCENT,
239
+ ACCENT_SOFT,
240
+ SECONDARY,
241
+ CHART_PALETTE: [...CHART_PALETTE]
242
+ };
243
+ var GenUIThemeContext = createContext(DEFAULT_TOKENS);
244
+ function useTheme() {
245
+ return useContext(GenUIThemeContext);
246
+ }
247
+
248
+ // src/composites/pipeline-preview/opMeta.ts
249
+ var OP_META = {
250
+ REST: { label: "PULL DATA", color: "#3b82f6", bg: "#eff6ff", glyph: "\u21A7" },
251
+ REST_LOOP: { label: "PULL DATA", color: "#3b82f6", bg: "#eff6ff", glyph: "\u21A7" },
252
+ PAGINATION: { label: "PULL DATA", color: "#3b82f6", bg: "#eff6ff", glyph: "\u21A7" },
253
+ FILTER: { label: "FILTER", color: "#8b5cf6", bg: "#f5f3ff", glyph: "\u25BD" },
254
+ INTELLIGENT_FILTER: { label: "FILTER", color: "#8b5cf6", bg: "#f5f3ff", glyph: "\u25BD" },
255
+ JQ_FILTER: { label: "TRANSFORM", color: "#06b6d4", bg: "#ecfeff", glyph: "{}" },
256
+ PROMPT: { label: "AI ENRICH", color: "#ec4899", bg: "#fdf2f8", glyph: "\u2738" },
257
+ INTELLIGENT_OUTPUT: { label: "AI OUTPUT", color: "#ec4899", bg: "#fdf2f8", glyph: "\u2738" },
258
+ FLATTEN: { label: "DEDUPLICATE", color: "#f97316", bg: "#fff7ed", glyph: "\u21BA" },
259
+ STORE: { label: "STORE", color: "#10b981", bg: "#ecfdf5", glyph: "\u25A4" },
260
+ EXTRACT: { label: "EXTRACT", color: "#06b6d4", bg: "#ecfeff", glyph: "\u21A7" },
261
+ PROJECT: { label: "PROJECT", color: "#06b6d4", bg: "#ecfeff", glyph: "\u25A6" },
262
+ NOTIFY: { label: "NOTIFY", color: "#eab308", bg: "#fefce8", glyph: "\u25D4" },
263
+ BRANCH: { label: "BRANCH", color: "#6366f1", bg: "#eef2ff", glyph: "\u2442" },
264
+ CONDITION: { label: "BRANCH", color: "#6366f1", bg: "#eef2ff", glyph: "\u2442" },
265
+ MERGE: { label: "MERGE", color: "#14b8a6", bg: "#f0fdfa", glyph: "\u22C8" },
266
+ SORT: { label: "SORT", color: "#a855f7", bg: "#faf5ff", glyph: "\u21C5" },
267
+ OUTPUT_TABLE: { label: "OUTPUT", color: "#0ea5e9", bg: "#f0f9ff", glyph: "\u25A6" },
268
+ OUTPUT_TEXT: { label: "OUTPUT", color: "#0ea5e9", bg: "#f0f9ff", glyph: "\xB6" },
269
+ TEXT_TO_SQL: { label: "SQL QUERY", color: "#f43f5e", bg: "#fff1f2", glyph: "\u2317" },
270
+ TOOL_EXECUTION: { label: "TOOL", color: "#8b5cf6", bg: "#f5f3ff", glyph: "\u2699" },
271
+ PAYLOAD: { label: "PARSE", color: "#ca8a04", bg: "#fefce8", glyph: "\u2750" },
272
+ DATA_SOURCE_LOOKUP: { label: "LOOKUP", color: "#06b6d4", bg: "#ecfeff", glyph: "\u2315" },
273
+ FAN_OUT: { label: "LOOP", color: "#0d9488", bg: "#f0fdfa", glyph: "\u21BB" },
274
+ WRITE_TO_DB: { label: "WRITE", color: "#10b981", bg: "#ecfdf5", glyph: "\u25A4" },
275
+ READ_FROM_DB: { label: "READ DB", color: "#6366f1", bg: "#eef2ff", glyph: "\u2315" },
276
+ EMBEDDER: { label: "EMBEDDER", color: "#7c3aed", bg: "#f5f3ff", glyph: "\u2756" },
277
+ AGENTIC_SEARCH: { label: "AI SEARCH", color: "#0891b2", bg: "#ecfeff", glyph: "\u25CE" },
278
+ S3_READ: { label: "S3 READ", color: "#f59e0b", bg: "#fffbeb", glyph: "\u21A7" },
279
+ GOOGLE_DRIVE_READ: { label: "DRIVE READ", color: "#0f9d58", bg: "#e8f5e9", glyph: "\u25A4" },
280
+ GOOGLE_DRIVE_WRITE: { label: "DRIVE WRITE", color: "#0f9d58", bg: "#e8f5e9", glyph: "\u25A5" },
281
+ OUTLOOK: { label: "OUTLOOK", color: "#0078d4", bg: "#e8f2fc", glyph: "\u2709" },
282
+ GMAIL: { label: "GMAIL", color: "#ea4335", bg: "#fdecec", glyph: "\u2709" },
283
+ ESCALATE: { label: "ESCALATE", color: "#f59e0b", bg: "#fffbeb", glyph: "\u2691" },
284
+ PARSE_DOCUMENT: { label: "PARSE DOC", color: "#0d9488", bg: "#f0fdfa", glyph: "\u2750" },
285
+ RUN_ACTION: { label: "RUN ACTION", color: "#d97706", bg: "#fffbeb", glyph: "\u25B8" }
286
+ };
287
+ var FALLBACK_COLORS = [
288
+ { color: "#64748b", bg: "#f8fafc" },
289
+ { color: "#0ea5e9", bg: "#f0f9ff" },
290
+ { color: "#8b5cf6", bg: "#f5f3ff" },
291
+ { color: "#f97316", bg: "#fff7ed" },
292
+ { color: "#14b8a6", bg: "#f0fdfa" },
293
+ { color: "#ec4899", bg: "#fdf2f8" },
294
+ { color: "#6366f1", bg: "#eef2ff" },
295
+ { color: "#ca8a04", bg: "#fefce8" }
296
+ ];
297
+ function formatOpLabel(op) {
298
+ return op.split("_").map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" ");
299
+ }
300
+ function getOpMeta(operation) {
301
+ if (!operation) return { label: "Step", color: "#64748b", bg: "#f8fafc", glyph: "\u25B8" };
302
+ const known = OP_META[operation];
303
+ if (known) return known;
304
+ const { color, bg } = FALLBACK_COLORS[operation.length % FALLBACK_COLORS.length];
305
+ return { label: formatOpLabel(operation), color, bg, glyph: "\u25B8" };
306
+ }
307
+
308
+ // src/composites/pipeline-preview/layout.ts
309
+ var NODE_W = 220;
310
+ var NODE_H = 56;
311
+ var BRANCH_NODE_H = 44;
312
+ var GAP_Y = 32;
313
+ var GAP_X = 20;
314
+ var BRANCH_PAD = 12;
315
+ var BRANCH_HEADER = 36;
316
+ var FAN_OUT_PAD = 16;
317
+ var FAN_OUT_HEADER = 60;
318
+ var BRANCH_COLORS = ["#6366f1", "#0891b2", "#f59e0b", "#ec4899", "#14b8a6", "#a855f7"];
319
+ function layoutGraph(steps, startX = 0, startY = 0, keyPrefix = "") {
320
+ const nodes = [];
321
+ const edges = [];
322
+ let y = startY;
323
+ let prevId = null;
324
+ let totalW = NODE_W;
325
+ steps.forEach((step, idx) => {
326
+ var _a, _b, _c, _d;
327
+ const op = step.operation;
328
+ const isBranch = op === "BRANCH" || op === "CONDITION";
329
+ const isFanOut = op === "FAN_OUT";
330
+ const baseId = `${keyPrefix}${(_a = step.id) != null ? _a : `s${idx}`}`;
331
+ if (isFanOut && ((_b = step.subSteps) == null ? void 0 : _b.length)) {
332
+ const foNodeId = baseId;
333
+ const res = layoutGraph(step.subSteps, 0, 0, `${baseId}/`);
334
+ const containerW = Math.max(res.totalW, NODE_W) + FAN_OUT_PAD * 2;
335
+ const containerH = res.totalH + FAN_OUT_HEADER + FAN_OUT_PAD * 2 + 4;
336
+ nodes.push({
337
+ id: foNodeId,
338
+ type: "fan-out-group",
339
+ x: startX - containerW / 2,
340
+ y,
341
+ w: containerW,
342
+ h: containerH,
343
+ data: step
344
+ });
345
+ if (prevId) edges.push({ from: prevId, to: foNodeId });
346
+ const offX = res.nodes.length ? startX - res.nodes[0].x : startX;
347
+ const subNodes = [];
348
+ for (const n of res.nodes) {
349
+ const nn = __spreadProps(__spreadValues({}, n), { x: n.x + offX, y: n.y + y + FAN_OUT_HEADER });
350
+ subNodes.push(nn);
351
+ nodes.push(nn);
352
+ }
353
+ for (const e of res.edges) edges.push(e);
354
+ totalW = Math.max(totalW, containerW);
355
+ y += containerH + GAP_Y;
356
+ const lastSub = subNodes.filter((n) => n.type === "step").pop();
357
+ prevId = lastSub ? lastSub.id : foNodeId;
358
+ } else if (isBranch && ((_c = step.branches) == null ? void 0 : _c.length)) {
359
+ const bNodeId = baseId;
360
+ nodes.push({
361
+ id: bNodeId,
362
+ x: startX,
363
+ y,
364
+ w: NODE_W,
365
+ h: BRANCH_NODE_H,
366
+ data: step,
367
+ type: "branch-header"
368
+ });
369
+ if (prevId) edges.push({ from: prevId, to: bNodeId });
370
+ y += BRANCH_NODE_H + GAP_Y;
371
+ const branchResults = step.branches.map((br, bi) => {
372
+ var _a2;
373
+ return __spreadValues({
374
+ branch: __spreadProps(__spreadValues({}, br), { color: BRANCH_COLORS[bi % BRANCH_COLORS.length], _gid: `${bNodeId}-b${bi}` })
375
+ }, layoutGraph((_a2 = br.steps) != null ? _a2 : [], 0, 0, `${bNodeId}/b${bi}/`));
376
+ });
377
+ let bTotalW = branchResults.reduce((sum, r) => sum + r.totalW + GAP_X, 0) - GAP_X;
378
+ if (!Number.isFinite(bTotalW) || bTotalW <= 0) bTotalW = NODE_W;
379
+ totalW = Math.max(totalW, bTotalW);
380
+ let cx = startX - bTotalW / 2 + (((_d = branchResults[0]) == null ? void 0 : _d.totalW) || NODE_W) / 2;
381
+ for (const br of branchResults) {
382
+ const offX = br.nodes.length ? cx - br.nodes[0].x : cx;
383
+ const groupNodes = [];
384
+ for (const n of br.nodes) {
385
+ const nn = __spreadProps(__spreadValues({}, n), { x: n.x + offX, y: n.y + y + BRANCH_HEADER });
386
+ groupNodes.push(nn);
387
+ nodes.push(nn);
388
+ }
389
+ for (const e of br.edges) edges.push(e);
390
+ nodes.push({
391
+ id: `${br.branch._gid}-group`,
392
+ type: "branch-group",
393
+ x: cx - br.totalW / 2 - BRANCH_PAD,
394
+ y: y - 4,
395
+ w: br.totalW + BRANCH_PAD * 2,
396
+ h: br.totalH + BRANCH_HEADER + BRANCH_PAD * 2 + 4,
397
+ data: br.branch
398
+ });
399
+ if (groupNodes.length > 0) {
400
+ edges.push({ from: bNodeId, to: groupNodes[0].id, color: br.branch.color });
401
+ }
402
+ cx += br.totalW + GAP_X;
403
+ }
404
+ const maxBranchH = Math.max(
405
+ ...branchResults.map((b) => b.totalH + BRANCH_HEADER + BRANCH_PAD * 2 + 4)
406
+ );
407
+ y += maxBranchH + GAP_Y;
408
+ prevId = null;
409
+ } else {
410
+ const nodeId = baseId;
411
+ nodes.push({
412
+ id: nodeId,
413
+ x: startX,
414
+ y,
415
+ w: NODE_W,
416
+ h: NODE_H,
417
+ data: step,
418
+ type: "step"
419
+ });
420
+ if (prevId) edges.push({ from: prevId, to: nodeId });
421
+ prevId = nodeId;
422
+ y += NODE_H + GAP_Y;
423
+ }
424
+ });
425
+ return { nodes, edges, totalW, totalH: Math.max(y - startY - GAP_Y, 0) };
426
+ }
427
+ function layoutBounds(nodes) {
428
+ const real = nodes.filter((n) => n.type !== "branch-group" || true);
429
+ if (!real.length) return { minX: 0, minY: 0, maxX: NODE_W, maxY: NODE_H };
430
+ const left = (n) => n.type === "fan-out-group" || n.type === "branch-group" ? n.x : n.x - n.w / 2;
431
+ const right = (n) => n.type === "fan-out-group" || n.type === "branch-group" ? n.x + n.w : n.x + n.w / 2;
432
+ return {
433
+ minX: Math.min(...real.map(left)),
434
+ minY: Math.min(...real.map((n) => n.y)),
435
+ maxX: Math.max(...real.map(right)),
436
+ maxY: Math.max(...real.map((n) => n.y + n.h))
437
+ };
438
+ }
439
+ var STATE_CONFIG = {
440
+ draft: { label: "Draft", bg: "#f2f2f2", color: "#777777" },
441
+ running: { label: "Running", bg: "#dcfce7", color: "#15803d" },
442
+ paused: { label: "Paused", bg: "#fff7ed", color: "#f59e0b" }
443
+ };
444
+ var FANOUT_COLOR = getOpMeta("FAN_OUT").color;
445
+ var titleStyle = {
446
+ fontFamily: "var(--font-serif)",
447
+ fontSize: "15px",
448
+ fontWeight: 400,
449
+ color: "var(--foreground)",
450
+ letterSpacing: "-0.01em",
451
+ margin: 0
452
+ };
453
+ function Chip({
454
+ children,
455
+ bg,
456
+ color
457
+ }) {
458
+ return /* @__PURE__ */ jsx(
459
+ "span",
460
+ {
461
+ style: {
462
+ fontSize: "10px",
463
+ fontWeight: 600,
464
+ letterSpacing: "0.04em",
465
+ padding: "2px 8px",
466
+ borderRadius: "9999px",
467
+ background: bg,
468
+ color,
469
+ whiteSpace: "nowrap"
470
+ },
471
+ children
472
+ }
473
+ );
474
+ }
475
+ function edgePath(from, to) {
476
+ const isFromGroup = from.type === "fan-out-group" || from.type === "branch-group";
477
+ const isToGroup = to.type === "fan-out-group" || to.type === "branch-group";
478
+ const x1 = isFromGroup ? from.x + from.w / 2 : from.x;
479
+ const y1 = from.y + from.h;
480
+ const x2 = isToGroup ? to.x + to.w / 2 : to.x;
481
+ const y2 = to.y;
482
+ const midY = (y1 + y2) / 2;
483
+ return `M ${x1} ${y1} C ${x1} ${midY}, ${x2} ${midY}, ${x2} ${y2}`;
484
+ }
485
+ function IconBox({ color, bg, glyph }) {
486
+ return /* @__PURE__ */ jsx(
487
+ "div",
488
+ {
489
+ style: {
490
+ width: 30,
491
+ height: 30,
492
+ borderRadius: 7,
493
+ display: "flex",
494
+ alignItems: "center",
495
+ justifyContent: "center",
496
+ flexShrink: 0,
497
+ background: bg,
498
+ border: `1px solid ${color}4D`,
499
+ color,
500
+ fontSize: 14,
501
+ lineHeight: 1
502
+ },
503
+ children: glyph
504
+ }
505
+ );
506
+ }
507
+ function OpBadge({ color, bg, label }) {
508
+ return /* @__PURE__ */ jsx(
509
+ "span",
510
+ {
511
+ style: {
512
+ fontSize: 9,
513
+ fontWeight: 700,
514
+ padding: "1px 5px",
515
+ borderRadius: 3,
516
+ letterSpacing: "0.3px",
517
+ color,
518
+ background: bg
519
+ },
520
+ children: label
521
+ }
522
+ );
523
+ }
524
+ var ellipsis = {
525
+ whiteSpace: "nowrap",
526
+ overflow: "hidden",
527
+ textOverflow: "ellipsis",
528
+ display: "block"
529
+ };
530
+ function PipelinePreviewResolver(p) {
531
+ var _a, _b, _c, _d, _e, _f, _g;
532
+ const { MUTED: MUTED2, PAPER: PAPER2, BORDER: BORDER2, ACCENT: ACCENT2, ACCENT_SOFT: ACCENT_SOFT2 } = useTheme();
533
+ const [btnHovered, setBtnHovered] = useState(false);
534
+ const stateCfg = STATE_CONFIG[(_a = p.state) != null ? _a : "draft"];
535
+ const destinations = (_b = p.destinations) != null ? _b : [];
536
+ const steps = (_c = p.steps) != null ? _c : [];
537
+ const workstreams = (_d = p.workstreams) != null ? _d : [];
538
+ const scheduleLabel = p.schedule ? p.schedule.type === "manual" ? "Manual" : (_f = (_e = p.schedule.label) != null ? _e : p.schedule.cron) != null ? _f : "Scheduled" : null;
539
+ const { nodes, edges, viewBox, vbW, vbH } = useMemo(() => {
540
+ const res = layoutGraph(steps);
541
+ const b = layoutBounds(res.nodes);
542
+ const pad = 24;
543
+ const w = b.maxX - b.minX + pad * 2;
544
+ const h = b.maxY - b.minY + pad * 2;
545
+ return {
546
+ nodes: res.nodes,
547
+ edges: res.edges,
548
+ viewBox: `${b.minX - pad} ${b.minY - pad} ${w} ${h}`,
549
+ vbW: w,
550
+ vbH: h
551
+ };
552
+ }, [steps]);
553
+ const nodeMap = useMemo(() => {
554
+ const m = {};
555
+ nodes.forEach((n) => m[n.id] = n);
556
+ return m;
557
+ }, [nodes]);
558
+ return /* @__PURE__ */ jsx(ComponentActions, { filename: (_g = p.name) != null ? _g : "pipeline-preview", children: /* @__PURE__ */ jsxs("div", { style: { width: "100%", display: "flex", flexDirection: "column", gap: "12px" }, children: [
559
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px", flexWrap: "wrap" }, children: [
560
+ /* @__PURE__ */ jsx("p", { style: titleStyle, children: p.name }),
561
+ /* @__PURE__ */ jsx(Chip, { bg: stateCfg.bg, color: stateCfg.color, children: stateCfg.label })
562
+ ] }),
563
+ p.description && /* @__PURE__ */ jsx("span", { style: { fontSize: "12.5px", color: MUTED2, lineHeight: 1.45, marginTop: "-4px" }, children: p.description }),
564
+ (p.source || destinations.length > 0) && /* @__PURE__ */ jsxs(
565
+ "div",
566
+ {
567
+ style: {
568
+ display: "flex",
569
+ alignItems: "center",
570
+ gap: "8px",
571
+ flexWrap: "wrap",
572
+ padding: "10px 12px",
573
+ borderRadius: "0.6rem",
574
+ border: `1px solid ${BORDER2}`,
575
+ background: PAPER2
576
+ },
577
+ children: [
578
+ p.source && /* @__PURE__ */ jsx(
579
+ "span",
580
+ {
581
+ style: {
582
+ fontSize: "12px",
583
+ fontWeight: 600,
584
+ color: "var(--foreground)",
585
+ padding: "3px 10px",
586
+ borderRadius: "9999px",
587
+ background: "white",
588
+ border: `1px solid ${BORDER2}`
589
+ },
590
+ children: p.source.name
591
+ }
592
+ ),
593
+ p.source && destinations.length > 0 && /* @__PURE__ */ jsx("span", { style: { color: MUTED2, fontSize: "14px" }, children: "\u2192" }),
594
+ destinations.map((d, i) => /* @__PURE__ */ jsx(
595
+ "span",
596
+ {
597
+ style: {
598
+ fontSize: "12px",
599
+ fontWeight: 600,
600
+ color: "var(--foreground)",
601
+ padding: "3px 10px",
602
+ borderRadius: "9999px",
603
+ background: "white",
604
+ border: `1px solid ${BORDER2}`
605
+ },
606
+ children: d.name
607
+ },
608
+ i
609
+ ))
610
+ ]
611
+ }
612
+ ),
613
+ (scheduleLabel || workstreams.length > 0) && /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "10px", flexWrap: "wrap" }, children: [
614
+ scheduleLabel && /* @__PURE__ */ jsxs("span", { style: { fontSize: "11px", color: MUTED2 }, children: [
615
+ "\u23F1 ",
616
+ scheduleLabel
617
+ ] }),
618
+ workstreams.map((w, i) => /* @__PURE__ */ jsx(Chip, { bg: "#eef2ff", color: "#6366f1", children: w }, i))
619
+ ] }),
620
+ nodes.length > 0 && /* @__PURE__ */ jsx(
621
+ "div",
622
+ {
623
+ style: {
624
+ position: "relative",
625
+ border: `1px solid ${BORDER2}`,
626
+ borderRadius: 12,
627
+ background: PAPER2,
628
+ overflow: "auto",
629
+ maxHeight: 520,
630
+ display: "flex",
631
+ justifyContent: "center"
632
+ },
633
+ children: /* @__PURE__ */ jsxs(
634
+ "svg",
635
+ {
636
+ width: vbW,
637
+ height: vbH,
638
+ viewBox,
639
+ style: { maxWidth: "100%", display: "block" },
640
+ preserveAspectRatio: "xMidYMid meet",
641
+ children: [
642
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("filter", { id: "pp-shadow", x: "-10%", y: "-10%", width: "120%", height: "130%", children: /* @__PURE__ */ jsx("feDropShadow", { dx: "0", dy: "1", stdDeviation: "2", floodOpacity: "0.08" }) }) }),
643
+ edges.map((e, i) => {
644
+ const from = nodeMap[e.from];
645
+ const to = nodeMap[e.to];
646
+ if (!from || !to) return null;
647
+ return /* @__PURE__ */ jsx(
648
+ "path",
649
+ {
650
+ d: edgePath(from, to),
651
+ fill: "none",
652
+ stroke: e.color || BORDER2,
653
+ strokeWidth: 2,
654
+ strokeLinecap: "round"
655
+ },
656
+ `edge-${i}`
657
+ );
658
+ }),
659
+ nodes.filter((n) => n.type === "branch-group").map((n) => {
660
+ const color = n.data.color || "#94a3b8";
661
+ return /* @__PURE__ */ jsxs("g", { children: [
662
+ /* @__PURE__ */ jsx(
663
+ "rect",
664
+ {
665
+ x: n.x,
666
+ y: n.y,
667
+ width: n.w,
668
+ height: n.h,
669
+ rx: 10,
670
+ ry: 10,
671
+ fill: `${color}0D`,
672
+ stroke: color,
673
+ strokeWidth: 1.5,
674
+ strokeDasharray: "4 3",
675
+ opacity: 0.8
676
+ }
677
+ ),
678
+ /* @__PURE__ */ jsx(
679
+ "foreignObject",
680
+ {
681
+ x: n.x + 8,
682
+ y: n.y + 6,
683
+ width: n.w - 16,
684
+ height: 22,
685
+ style: { pointerEvents: "none" },
686
+ children: /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
687
+ /* @__PURE__ */ jsx(
688
+ "span",
689
+ {
690
+ style: {
691
+ width: 8,
692
+ height: 8,
693
+ borderRadius: "50%",
694
+ flexShrink: 0,
695
+ background: color
696
+ }
697
+ }
698
+ ),
699
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, fontWeight: 700, color: "var(--foreground)" }, children: n.data.label }),
700
+ n.data.condition && /* @__PURE__ */ jsx(
701
+ "span",
702
+ {
703
+ style: __spreadValues({
704
+ fontSize: 9,
705
+ color: MUTED2,
706
+ fontFamily: "monospace"
707
+ }, ellipsis),
708
+ children: n.data.condition
709
+ }
710
+ )
711
+ ] })
712
+ }
713
+ )
714
+ ] }, n.id);
715
+ }),
716
+ nodes.filter((n) => n.type === "fan-out-group").map((n) => {
717
+ const m = getOpMeta("FAN_OUT");
718
+ const count = Array.isArray(n.data.subSteps) ? n.data.subSteps.length : 0;
719
+ const titleText = n.data.label || n.data.id || "Loop";
720
+ return /* @__PURE__ */ jsxs("g", { children: [
721
+ /* @__PURE__ */ jsx(
722
+ "rect",
723
+ {
724
+ x: n.x,
725
+ y: n.y,
726
+ width: n.w,
727
+ height: n.h,
728
+ rx: 12,
729
+ ry: 12,
730
+ fill: `${FANOUT_COLOR}0D`,
731
+ stroke: FANOUT_COLOR,
732
+ strokeWidth: 1.5,
733
+ strokeDasharray: "6 3",
734
+ opacity: 0.9
735
+ }
736
+ ),
737
+ /* @__PURE__ */ jsxs(
738
+ "foreignObject",
739
+ {
740
+ x: n.x,
741
+ y: n.y,
742
+ width: n.w,
743
+ height: 60,
744
+ style: { pointerEvents: "none" },
745
+ children: [
746
+ /* @__PURE__ */ jsxs(
747
+ "div",
748
+ {
749
+ style: {
750
+ display: "flex",
751
+ alignItems: "center",
752
+ justifyContent: "space-between",
753
+ padding: "8px 12px 0 12px"
754
+ },
755
+ children: [
756
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [
757
+ /* @__PURE__ */ jsx(IconBox, { color: m.color, bg: m.bg, glyph: m.glyph }),
758
+ /* @__PURE__ */ jsx(OpBadge, { color: m.color, bg: m.bg, label: m.label })
759
+ ] }),
760
+ /* @__PURE__ */ jsxs("span", { style: { fontWeight: 500, color: FANOUT_COLOR, fontSize: 10, whiteSpace: "nowrap" }, children: [
761
+ count,
762
+ " steps"
763
+ ] })
764
+ ]
765
+ }
766
+ ),
767
+ /* @__PURE__ */ jsx(
768
+ "div",
769
+ {
770
+ style: __spreadValues({
771
+ fontSize: 11,
772
+ color: MUTED2,
773
+ padding: "2px 12px 6px 12px"
774
+ }, ellipsis),
775
+ title: titleText,
776
+ children: titleText
777
+ }
778
+ )
779
+ ]
780
+ }
781
+ )
782
+ ] }, n.id);
783
+ }),
784
+ nodes.filter((n) => n.type === "branch-header").map((n) => {
785
+ const m = getOpMeta(n.data.operation || "CONDITION");
786
+ const branchCount = Array.isArray(n.data.branches) ? n.data.branches.length : 0;
787
+ const titleText = n.data.label || n.data.id || m.label;
788
+ return /* @__PURE__ */ jsxs("g", { children: [
789
+ /* @__PURE__ */ jsx(
790
+ "rect",
791
+ {
792
+ x: n.x - n.w / 2,
793
+ y: n.y,
794
+ width: n.w,
795
+ height: n.h,
796
+ rx: 10,
797
+ ry: 10,
798
+ fill: m.bg,
799
+ stroke: m.color,
800
+ strokeWidth: 1.5,
801
+ filter: "url(#pp-shadow)"
802
+ }
803
+ ),
804
+ /* @__PURE__ */ jsx(
805
+ "foreignObject",
806
+ {
807
+ x: n.x - n.w / 2 + 8,
808
+ y: n.y + 4,
809
+ width: n.w - 16,
810
+ height: n.h - 8,
811
+ style: { pointerEvents: "none" },
812
+ children: /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, height: "100%" }, children: [
813
+ /* @__PURE__ */ jsx(IconBox, { color: m.color, bg: m.bg, glyph: m.glyph }),
814
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
815
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, fontWeight: 700, letterSpacing: "0.5px", color: m.color, display: "block" }, children: m.label }),
816
+ /* @__PURE__ */ jsx("span", { style: __spreadValues({ fontSize: 11, color: "var(--foreground)", fontWeight: 600 }, ellipsis), title: titleText, children: titleText })
817
+ ] }),
818
+ /* @__PURE__ */ jsxs(
819
+ "span",
820
+ {
821
+ style: {
822
+ fontSize: 9,
823
+ padding: "2px 6px",
824
+ borderRadius: 8,
825
+ fontWeight: 600,
826
+ flexShrink: 0,
827
+ color: m.color,
828
+ background: `${m.color}26`
829
+ },
830
+ children: [
831
+ branchCount,
832
+ "\u2192"
833
+ ]
834
+ }
835
+ )
836
+ ] })
837
+ }
838
+ )
839
+ ] }, n.id);
840
+ }),
841
+ nodes.filter((n) => n.type === "step").map((n) => {
842
+ const m = getOpMeta(n.data.operation);
843
+ const line = n.data.label || n.data.description || n.data.id || "";
844
+ return /* @__PURE__ */ jsxs("g", { children: [
845
+ /* @__PURE__ */ jsx(
846
+ "rect",
847
+ {
848
+ x: n.x - n.w / 2,
849
+ y: n.y,
850
+ width: n.w,
851
+ height: n.h,
852
+ rx: 10,
853
+ ry: 10,
854
+ fill: "white",
855
+ stroke: BORDER2,
856
+ strokeWidth: 1,
857
+ filter: "url(#pp-shadow)"
858
+ }
859
+ ),
860
+ /* @__PURE__ */ jsx(
861
+ "foreignObject",
862
+ {
863
+ x: n.x - n.w / 2 + 8,
864
+ y: n.y + 4,
865
+ width: n.w - 16,
866
+ height: n.h - 8,
867
+ style: { pointerEvents: "none" },
868
+ children: /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, height: "100%" }, children: [
869
+ /* @__PURE__ */ jsx(IconBox, { color: m.color, bg: m.bg, glyph: m.glyph }),
870
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
871
+ /* @__PURE__ */ jsx("div", { style: { display: "flex", alignItems: "center", gap: 4, flexWrap: "wrap" }, children: /* @__PURE__ */ jsx(OpBadge, { color: m.color, bg: m.bg, label: m.label }) }),
872
+ /* @__PURE__ */ jsx(
873
+ "span",
874
+ {
875
+ style: __spreadValues({
876
+ fontSize: 11,
877
+ color: "var(--foreground)",
878
+ fontWeight: 500,
879
+ marginTop: 2
880
+ }, ellipsis),
881
+ title: n.data.description || line,
882
+ children: line
883
+ }
884
+ )
885
+ ] })
886
+ ] })
887
+ }
888
+ )
889
+ ] }, n.id);
890
+ })
891
+ ]
892
+ }
893
+ )
894
+ }
895
+ ),
896
+ p.cta && /* @__PURE__ */ jsx(
897
+ "a",
898
+ {
899
+ href: p.cta.url,
900
+ target: "_blank",
901
+ rel: "noopener noreferrer",
902
+ onMouseEnter: () => setBtnHovered(true),
903
+ onMouseLeave: () => setBtnHovered(false),
904
+ style: {
905
+ alignSelf: "flex-start",
906
+ background: btnHovered ? ACCENT_SOFT2 : ACCENT2,
907
+ color: "white",
908
+ borderRadius: "8px",
909
+ padding: "8px 16px",
910
+ fontSize: "12px",
911
+ fontWeight: 600,
912
+ textDecoration: "none",
913
+ cursor: "pointer",
914
+ transition: "background 0.15s"
915
+ },
916
+ children: p.cta.label + " \u2192"
917
+ }
918
+ )
919
+ ] }) });
920
+ }
921
+
922
+ export { PipelinePreviewResolver };
923
+ //# sourceMappingURL=resolver.js.map
924
+ //# sourceMappingURL=resolver.js.map