@octaviaflow/core 3.1.0-beta.67 → 3.1.0-beta.68

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 (70) hide show
  1. package/dist/chunk-JMSZOWT2.js +2616 -0
  2. package/dist/chunk-JMSZOWT2.js.map +1 -0
  3. package/dist/chunk-KZP2MNBO.js +2516 -0
  4. package/dist/chunk-KZP2MNBO.js.map +1 -0
  5. package/dist/chunk-S4LE4BFQ.js +5934 -0
  6. package/dist/chunk-S4LE4BFQ.js.map +1 -0
  7. package/dist/chunk-X7YETDK7.js +107 -0
  8. package/dist/chunk-X7YETDK7.js.map +1 -0
  9. package/dist/components/WorkflowShowcase/ShowcaseScene.d.ts +20 -0
  10. package/dist/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -0
  11. package/dist/components/WorkflowShowcase/ShowcaseSignup.d.ts +14 -0
  12. package/dist/components/WorkflowShowcase/ShowcaseSignup.d.ts.map +1 -0
  13. package/dist/components/WorkflowShowcase/WorkflowShowcase.d.ts +48 -0
  14. package/dist/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -0
  15. package/dist/components/WorkflowShowcase/index.d.ts +3 -0
  16. package/dist/components/WorkflowShowcase/index.d.ts.map +1 -0
  17. package/dist/components/WorkflowShowcase/showcaseEngine.d.ts +102 -0
  18. package/dist/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -0
  19. package/dist/index.js +7854 -13331
  20. package/dist/index.js.map +1 -1
  21. package/dist/marketing/components/AssistantTranscript/AssistantTranscript.d.ts +15 -0
  22. package/dist/marketing/components/AssistantTranscript/AssistantTranscript.d.ts.map +1 -0
  23. package/dist/marketing/components/CtaBanner/CtaBanner.d.ts +16 -0
  24. package/dist/marketing/components/CtaBanner/CtaBanner.d.ts.map +1 -0
  25. package/dist/marketing/components/FeatureGrid/FeatureGrid.d.ts +15 -0
  26. package/dist/marketing/components/FeatureGrid/FeatureGrid.d.ts.map +1 -0
  27. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts +19 -0
  28. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts.map +1 -0
  29. package/dist/marketing/components/LiveConsole/LiveConsole.d.ts +21 -0
  30. package/dist/marketing/components/LiveConsole/LiveConsole.d.ts.map +1 -0
  31. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts +25 -0
  32. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts.map +1 -0
  33. package/dist/marketing/components/MarketingHero/MarketingHero.d.ts +11 -0
  34. package/dist/marketing/components/MarketingHero/MarketingHero.d.ts.map +1 -0
  35. package/dist/marketing/components/MarketingNav/MarketingNav.d.ts +17 -0
  36. package/dist/marketing/components/MarketingNav/MarketingNav.d.ts.map +1 -0
  37. package/dist/marketing/components/MarketingSection/MarketingSection.d.ts +15 -0
  38. package/dist/marketing/components/MarketingSection/MarketingSection.d.ts.map +1 -0
  39. package/dist/marketing/components/StatBand/StatBand.d.ts +16 -0
  40. package/dist/marketing/components/StatBand/StatBand.d.ts.map +1 -0
  41. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts +20 -0
  42. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -0
  43. package/dist/marketing/components/WorkflowShowcase/ShowcaseSignup.d.ts +14 -0
  44. package/dist/marketing/components/WorkflowShowcase/ShowcaseSignup.d.ts.map +1 -0
  45. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts +48 -0
  46. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -0
  47. package/dist/marketing/components/WorkflowShowcase/index.d.ts +3 -0
  48. package/dist/marketing/components/WorkflowShowcase/index.d.ts.map +1 -0
  49. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts +102 -0
  50. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -0
  51. package/dist/marketing/glyphs.d.ts +20 -0
  52. package/dist/marketing/glyphs.d.ts.map +1 -0
  53. package/dist/marketing/index.d.ts +13 -0
  54. package/dist/marketing/index.d.ts.map +1 -0
  55. package/dist/marketing.cjs +3985 -0
  56. package/dist/marketing.cjs.map +1 -0
  57. package/dist/marketing.js +1669 -0
  58. package/dist/marketing.js.map +1 -0
  59. package/dist/styles.css +1 -1
  60. package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts +29 -0
  61. package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts.map +1 -0
  62. package/dist/workflow/components/HttpActionPanel/httpActionTypes.d.ts +135 -0
  63. package/dist/workflow/components/HttpActionPanel/httpActionTypes.d.ts.map +1 -0
  64. package/dist/workflow/index.d.ts +2 -0
  65. package/dist/workflow/index.d.ts.map +1 -1
  66. package/dist/workflow.cjs +6922 -271
  67. package/dist/workflow.cjs.map +1 -1
  68. package/dist/workflow.js +1587 -56
  69. package/dist/workflow.js.map +1 -1
  70. package/package.json +6 -1
@@ -0,0 +1,1669 @@
1
+ import {
2
+ CountUp
3
+ } from "./chunk-X7YETDK7.js";
4
+ import {
5
+ Button,
6
+ Input,
7
+ Select
8
+ } from "./chunk-KZP2MNBO.js";
9
+ import {
10
+ cn
11
+ } from "./chunk-ZAUUGK2Y.js";
12
+
13
+ // src/marketing/components/AssistantTranscript/AssistantTranscript.tsx
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ function AssistantTranscript({
16
+ title = "OctaviaFlow AI Assistant",
17
+ turns,
18
+ userLabel = "you",
19
+ assistantLabel = "octavia",
20
+ className,
21
+ ...rest
22
+ }) {
23
+ return /* @__PURE__ */ jsxs("div", { ...rest, className: cn("ods-mkt-transcript", className), children: [
24
+ /* @__PURE__ */ jsx("div", { className: "ods-mkt-transcript__head", children: title }),
25
+ /* @__PURE__ */ jsx("div", { className: "ods-mkt-transcript__body", children: turns.map((turn) => /* @__PURE__ */ jsxs("div", { className: "ods-mkt-transcript__turn", children: [
26
+ /* @__PURE__ */ jsxs(
27
+ "span",
28
+ {
29
+ className: cn(
30
+ "ods-mkt-transcript__speaker",
31
+ `ods-mkt-transcript__speaker--${turn.speaker}`
32
+ ),
33
+ children: [
34
+ turn.speaker === "user" ? userLabel : assistantLabel,
35
+ " \u2192"
36
+ ]
37
+ }
38
+ ),
39
+ " ",
40
+ /* @__PURE__ */ jsx("span", { className: "ods-mkt-transcript__content", children: turn.content })
41
+ ] }, turn.id)) })
42
+ ] });
43
+ }
44
+
45
+ // src/marketing/components/CtaBanner/CtaBanner.tsx
46
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
47
+ function Action({
48
+ action,
49
+ variant
50
+ }) {
51
+ if (action.href) {
52
+ return /* @__PURE__ */ jsx2(
53
+ "a",
54
+ {
55
+ className: cn("ods-mkt-cta__link", `ods-mkt-cta__link--${variant}`),
56
+ href: action.href,
57
+ onClick: action.onClick,
58
+ children: action.label
59
+ }
60
+ );
61
+ }
62
+ return /* @__PURE__ */ jsx2(Button, { variant, onClick: action.onClick, children: action.label });
63
+ }
64
+ function CtaBanner({
65
+ title,
66
+ lede,
67
+ primary,
68
+ secondary,
69
+ footnote,
70
+ className,
71
+ ...rest
72
+ }) {
73
+ return /* @__PURE__ */ jsxs2("section", { ...rest, className: cn("ods-mkt-cta", className), children: [
74
+ /* @__PURE__ */ jsx2("h2", { className: "ods-mkt-cta__title", children: title }),
75
+ lede && /* @__PURE__ */ jsx2("p", { className: "ods-mkt-cta__lede", children: lede }),
76
+ /* @__PURE__ */ jsxs2("div", { className: "ods-mkt-cta__actions", children: [
77
+ /* @__PURE__ */ jsx2(Action, { action: primary, variant: "primary" }),
78
+ secondary && /* @__PURE__ */ jsx2(Action, { action: secondary, variant: "secondary" })
79
+ ] }),
80
+ footnote && /* @__PURE__ */ jsx2("p", { className: "ods-mkt-cta__footnote", children: footnote })
81
+ ] });
82
+ }
83
+
84
+ // src/marketing/components/FeatureGrid/FeatureGrid.tsx
85
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
86
+ function FeatureGrid({
87
+ items,
88
+ columns = 3,
89
+ dense = false,
90
+ className,
91
+ ...rest
92
+ }) {
93
+ return /* @__PURE__ */ jsx3(
94
+ "div",
95
+ {
96
+ ...rest,
97
+ className: cn(
98
+ "ods-mkt-features",
99
+ `ods-mkt-features--${columns}`,
100
+ dense && "ods-mkt-features--dense",
101
+ className
102
+ ),
103
+ children: items.map((item) => /* @__PURE__ */ jsxs3("article", { className: "ods-mkt-features__cell", children: [
104
+ item.icon && /* @__PURE__ */ jsx3("span", { className: "ods-mkt-features__icon", "aria-hidden": "true", children: item.icon }),
105
+ /* @__PURE__ */ jsx3("h3", { className: "ods-mkt-features__title", children: item.title }),
106
+ /* @__PURE__ */ jsx3("p", { className: "ods-mkt-features__body", children: item.body })
107
+ ] }, item.id))
108
+ }
109
+ );
110
+ }
111
+
112
+ // src/marketing/glyphs.tsx
113
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
114
+ var base = {
115
+ xmlns: "http://www.w3.org/2000/svg",
116
+ viewBox: "0 0 24 24",
117
+ fill: "none",
118
+ stroke: "currentColor",
119
+ strokeWidth: 2,
120
+ strokeLinecap: "round",
121
+ strokeLinejoin: "round"
122
+ };
123
+ function SourceGlyph({ size = 12 }) {
124
+ return /* @__PURE__ */ jsxs4("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
125
+ /* @__PURE__ */ jsx4("ellipse", { cx: "12", cy: "5", rx: "9", ry: "3" }),
126
+ /* @__PURE__ */ jsx4("path", { d: "M3 5v14a9 3 0 0 0 18 0V5" }),
127
+ /* @__PURE__ */ jsx4("path", { d: "M3 12a9 3 0 0 0 18 0" })
128
+ ] });
129
+ }
130
+ function DestinationGlyph({ size = 12 }) {
131
+ return /* @__PURE__ */ jsxs4("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
132
+ /* @__PURE__ */ jsx4("rect", { x: "2", y: "3", width: "20", height: "5", rx: "1" }),
133
+ /* @__PURE__ */ jsx4("path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" }),
134
+ /* @__PURE__ */ jsx4("path", { d: "M10 12h4" })
135
+ ] });
136
+ }
137
+ function ActionGlyph({ size = 12 }) {
138
+ return /* @__PURE__ */ jsx4("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: /* @__PURE__ */ jsx4("path", { d: "M13 2 3 14h9l-1 8 10-12h-9l1-8z" }) });
139
+ }
140
+ function NotifyGlyph({ size = 12 }) {
141
+ return /* @__PURE__ */ jsx4("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: /* @__PURE__ */ jsx4("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) });
142
+ }
143
+ function ConnectorGlyph({ size = 12 }) {
144
+ return /* @__PURE__ */ jsxs4("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
145
+ /* @__PURE__ */ jsx4("path", { d: "M12 22v-5" }),
146
+ /* @__PURE__ */ jsx4("path", { d: "M9 8V2M15 8V2" }),
147
+ /* @__PURE__ */ jsx4("path", { d: "M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8h12z" })
148
+ ] });
149
+ }
150
+ function BrandMark({ size = 18 }) {
151
+ return /* @__PURE__ */ jsxs4("svg", { viewBox: "0 0 18 18", width: size, height: size, "aria-hidden": "true", children: [
152
+ /* @__PURE__ */ jsx4("rect", { width: "18", height: "18", fill: "var(--ods-accent)" }),
153
+ /* @__PURE__ */ jsx4("path", { d: "M4 9h8.5M9.5 5.5 13 9l-3.5 3.5", stroke: "#fff", strokeWidth: "1.6", fill: "none" })
154
+ ] });
155
+ }
156
+ function roleGlyph(role, size = 12) {
157
+ switch (role) {
158
+ case "source":
159
+ return /* @__PURE__ */ jsx4(SourceGlyph, { size });
160
+ case "destination":
161
+ return /* @__PURE__ */ jsx4(DestinationGlyph, { size });
162
+ case "action":
163
+ return /* @__PURE__ */ jsx4(ActionGlyph, { size });
164
+ case "notify":
165
+ return /* @__PURE__ */ jsx4(NotifyGlyph, { size });
166
+ }
167
+ }
168
+
169
+ // src/marketing/components/IntegrationsWall/IntegrationsWall.tsx
170
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
171
+ function IntegrationsWall({
172
+ categories,
173
+ footnote,
174
+ bareChips = false,
175
+ className,
176
+ ...rest
177
+ }) {
178
+ return /* @__PURE__ */ jsxs5("div", { ...rest, className: cn("ods-mkt-wall", className), children: [
179
+ /* @__PURE__ */ jsx5("div", { className: "ods-mkt-wall__grid", children: categories.map((category) => /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-wall__row", children: [
180
+ /* @__PURE__ */ jsx5("div", { className: "ods-mkt-wall__category", children: category.label }),
181
+ /* @__PURE__ */ jsx5("div", { className: "ods-mkt-wall__chips", children: category.items.map((item) => /* @__PURE__ */ jsxs5("span", { className: "ods-mkt-wall__chip", children: [
182
+ (item.icon || !bareChips) && /* @__PURE__ */ jsx5("span", { className: "ods-mkt-wall__chip-icon", "aria-hidden": "true", children: item.icon ?? /* @__PURE__ */ jsx5(ConnectorGlyph, { size: 13 }) }),
183
+ item.name
184
+ ] }, item.name)) })
185
+ ] }, category.id)) }),
186
+ footnote && /* @__PURE__ */ jsx5("p", { className: "ods-mkt-wall__footnote", children: footnote })
187
+ ] });
188
+ }
189
+
190
+ // src/marketing/components/LiveConsole/LiveConsole.tsx
191
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
192
+ var STATE_GLYPH = {
193
+ done: "\u2713",
194
+ running: "\u27F3",
195
+ queued: "\u2192",
196
+ error: "\u2715"
197
+ };
198
+ function LiveConsole({
199
+ title,
200
+ badge = "LIVE",
201
+ lines,
202
+ animated = true,
203
+ className,
204
+ ...rest
205
+ }) {
206
+ return /* @__PURE__ */ jsxs6("div", { ...rest, className: cn("ods-mkt-console", className), children: [
207
+ /* @__PURE__ */ jsxs6("div", { className: "ods-mkt-console__head", children: [
208
+ /* @__PURE__ */ jsx6("span", { className: "ods-mkt-console__title", children: title }),
209
+ badge != null && /* @__PURE__ */ jsxs6("span", { className: "ods-mkt-console__badge", children: [
210
+ /* @__PURE__ */ jsx6("span", { className: "ods-mkt-console__dot" }),
211
+ badge
212
+ ] })
213
+ ] }),
214
+ /* @__PURE__ */ jsx6("div", { className: "ods-mkt-console__body", children: lines.map((line, i) => {
215
+ const state = line.state ?? "done";
216
+ return /* @__PURE__ */ jsxs6(
217
+ "div",
218
+ {
219
+ className: cn("ods-mkt-console__line", animated && "ods-mkt-console__line--animated"),
220
+ style: animated ? { animationDelay: `${0.3 + i * 0.6}s` } : void 0,
221
+ children: [
222
+ /* @__PURE__ */ jsx6(
223
+ "span",
224
+ {
225
+ className: cn("ods-mkt-console__glyph", `ods-mkt-console__glyph--${state}`),
226
+ "aria-hidden": "true",
227
+ children: STATE_GLYPH[state]
228
+ }
229
+ ),
230
+ " ",
231
+ /* @__PURE__ */ jsx6("span", { className: "ods-mkt-console__label", children: line.label }),
232
+ line.detail && /* @__PURE__ */ jsxs6(
233
+ "span",
234
+ {
235
+ className: cn(
236
+ "ods-mkt-console__detail",
237
+ state === "running" && "ods-mkt-console__detail--running"
238
+ ),
239
+ children: [
240
+ " ",
241
+ line.detail
242
+ ]
243
+ }
244
+ )
245
+ ]
246
+ },
247
+ line.id
248
+ );
249
+ }) })
250
+ ] });
251
+ }
252
+
253
+ // src/marketing/components/MarketingFooter/MarketingFooter.tsx
254
+ import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
255
+ function MarketingFooter({
256
+ brand,
257
+ tagline,
258
+ meta,
259
+ columns = [],
260
+ legal,
261
+ social,
262
+ className,
263
+ ...rest
264
+ }) {
265
+ return /* @__PURE__ */ jsxs7("footer", { ...rest, className: cn("ods-mkt-footer", className), children: [
266
+ /* @__PURE__ */ jsxs7("div", { className: "ods-mkt-footer__grid", children: [
267
+ /* @__PURE__ */ jsxs7("div", { className: "ods-mkt-footer__brand-col", children: [
268
+ /* @__PURE__ */ jsx7("div", { className: "ods-mkt-footer__brand", children: brand ?? /* @__PURE__ */ jsxs7(Fragment, { children: [
269
+ /* @__PURE__ */ jsx7(BrandMark, { size: 16 }),
270
+ /* @__PURE__ */ jsx7("span", { children: "OctaviaFlow" })
271
+ ] }) }),
272
+ tagline && /* @__PURE__ */ jsx7("p", { className: "ods-mkt-footer__tagline", children: tagline }),
273
+ meta && /* @__PURE__ */ jsx7("div", { className: "ods-mkt-footer__meta", children: meta })
274
+ ] }),
275
+ columns.map((column) => /* @__PURE__ */ jsxs7("nav", { className: "ods-mkt-footer__col", "aria-label": String(column.id), children: [
276
+ /* @__PURE__ */ jsx7("span", { className: "ods-mkt-footer__col-label", children: column.label }),
277
+ column.links.map((link) => /* @__PURE__ */ jsx7("a", { className: "ods-mkt-footer__link", href: link.href, children: link.label }, link.href))
278
+ ] }, column.id))
279
+ ] }),
280
+ (legal || social) && /* @__PURE__ */ jsxs7("div", { className: "ods-mkt-footer__bar", children: [
281
+ /* @__PURE__ */ jsx7("span", { children: legal }),
282
+ /* @__PURE__ */ jsx7("span", { children: social })
283
+ ] })
284
+ ] });
285
+ }
286
+
287
+ // src/marketing/components/MarketingHero/MarketingHero.tsx
288
+ import { motion, useReducedMotion } from "framer-motion";
289
+ import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
290
+ function MarketingHero({
291
+ kicker,
292
+ title,
293
+ lede,
294
+ align = "center",
295
+ className,
296
+ children,
297
+ ...rest
298
+ }) {
299
+ const reducedMotion = useReducedMotion();
300
+ const words = title.split(/\s+/).filter(Boolean);
301
+ return /* @__PURE__ */ jsxs8(
302
+ "section",
303
+ {
304
+ ...rest,
305
+ className: cn("ods-mkt-hero", align === "center" && "ods-mkt-hero--center", className),
306
+ children: [
307
+ kicker && /* @__PURE__ */ jsx8("p", { className: "ods-mkt-hero__kicker", children: kicker }),
308
+ /* @__PURE__ */ jsx8("h1", { className: "ods-mkt-hero__title", children: words.map((word, i) => /* @__PURE__ */ jsxs8(
309
+ "span",
310
+ {
311
+ className: "ods-mkt-hero__word-clip",
312
+ children: [
313
+ /* @__PURE__ */ jsx8(
314
+ motion.span,
315
+ {
316
+ className: "ods-mkt-hero__word",
317
+ initial: reducedMotion ? false : { opacity: 0, y: "100%" },
318
+ animate: { opacity: 1, y: 0 },
319
+ transition: {
320
+ duration: 0.7,
321
+ delay: 0.05 + i * 0.08,
322
+ ease: [0.2, 0.7, 0.2, 1]
323
+ },
324
+ children: word
325
+ }
326
+ ),
327
+ " "
328
+ ]
329
+ },
330
+ i
331
+ )) }),
332
+ lede && /* @__PURE__ */ jsx8(
333
+ motion.p,
334
+ {
335
+ className: "ods-mkt-hero__lede",
336
+ initial: reducedMotion ? false : { opacity: 0, y: 12 },
337
+ animate: { opacity: 1, y: 0 },
338
+ transition: { duration: 0.8, delay: 0.6, ease: [0.2, 0.7, 0.2, 1] },
339
+ children: lede
340
+ }
341
+ ),
342
+ children && /* @__PURE__ */ jsx8(
343
+ motion.div,
344
+ {
345
+ className: "ods-mkt-hero__body",
346
+ initial: reducedMotion ? false : { opacity: 0, y: 12 },
347
+ animate: { opacity: 1, y: 0 },
348
+ transition: { duration: 0.8, delay: 0.75, ease: [0.2, 0.7, 0.2, 1] },
349
+ children
350
+ }
351
+ )
352
+ ]
353
+ }
354
+ );
355
+ }
356
+
357
+ // src/marketing/components/MarketingNav/MarketingNav.tsx
358
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
359
+ function MarketingNav({
360
+ brand,
361
+ brandHref = "/",
362
+ links = [],
363
+ actions,
364
+ sticky = true,
365
+ className,
366
+ ...rest
367
+ }) {
368
+ return /* @__PURE__ */ jsxs9("header", { ...rest, className: cn("ods-mkt-nav", sticky && "ods-mkt-nav--sticky", className), children: [
369
+ /* @__PURE__ */ jsx9("a", { className: "ods-mkt-nav__brand", href: brandHref, children: brand ?? /* @__PURE__ */ jsxs9(Fragment2, { children: [
370
+ /* @__PURE__ */ jsx9(BrandMark, {}),
371
+ /* @__PURE__ */ jsx9("span", { children: "OctaviaFlow" })
372
+ ] }) }),
373
+ links.length > 0 && /* @__PURE__ */ jsx9("nav", { className: "ods-mkt-nav__links", "aria-label": "Main", children: links.map((link) => /* @__PURE__ */ jsx9(
374
+ "a",
375
+ {
376
+ href: link.href,
377
+ className: cn("ods-mkt-nav__link", link.active && "ods-mkt-nav__link--active"),
378
+ "aria-current": link.active ? "page" : void 0,
379
+ children: link.label
380
+ },
381
+ link.href
382
+ )) }),
383
+ actions && /* @__PURE__ */ jsx9("div", { className: "ods-mkt-nav__actions", children: actions })
384
+ ] });
385
+ }
386
+
387
+ // src/marketing/components/MarketingSection/MarketingSection.tsx
388
+ import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
389
+ function MarketingSection({
390
+ kicker,
391
+ title,
392
+ lede,
393
+ align = "start",
394
+ tone = "default",
395
+ flushTop = false,
396
+ className,
397
+ children,
398
+ ...rest
399
+ }) {
400
+ return /* @__PURE__ */ jsxs10(
401
+ "section",
402
+ {
403
+ ...rest,
404
+ className: cn(
405
+ "ods-mkt-section",
406
+ align === "center" && "ods-mkt-section--center",
407
+ tone === "subtle" && "ods-mkt-section--subtle",
408
+ flushTop && "ods-mkt-section--flush",
409
+ className
410
+ ),
411
+ children: [
412
+ (kicker || title || lede) && /* @__PURE__ */ jsxs10("header", { className: "ods-mkt-section__head", children: [
413
+ kicker && /* @__PURE__ */ jsx10("p", { className: "ods-mkt-section__kicker", children: kicker }),
414
+ title && /* @__PURE__ */ jsx10("h2", { className: "ods-mkt-section__title", children: title }),
415
+ lede && /* @__PURE__ */ jsx10("p", { className: "ods-mkt-section__lede", children: lede })
416
+ ] }),
417
+ children
418
+ ]
419
+ }
420
+ );
421
+ }
422
+
423
+ // src/marketing/components/StatBand/StatBand.tsx
424
+ import { useReducedMotion as useReducedMotion2 } from "framer-motion";
425
+ import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
426
+ function StatBand({ items, orientation = "column", className, ...rest }) {
427
+ const reducedMotion = useReducedMotion2();
428
+ return /* @__PURE__ */ jsx11(
429
+ "div",
430
+ {
431
+ ...rest,
432
+ className: cn("ods-mkt-statband", `ods-mkt-statband--${orientation}`, className),
433
+ children: items.map((item) => /* @__PURE__ */ jsxs11("div", { className: "ods-mkt-statband__item", children: [
434
+ /* @__PURE__ */ jsx11("div", { className: "ods-mkt-statband__value", children: typeof item.value === "number" ? /* @__PURE__ */ jsx11(
435
+ CountUp,
436
+ {
437
+ value: item.value,
438
+ duration: 900,
439
+ disableAnimation: Boolean(reducedMotion),
440
+ prefix: item.prefix,
441
+ suffix: item.suffix,
442
+ formatValue: (v) => Math.round(v).toLocaleString("en-US")
443
+ }
444
+ ) : /* @__PURE__ */ jsxs11(Fragment3, { children: [
445
+ item.prefix,
446
+ item.value,
447
+ item.suffix
448
+ ] }) }),
449
+ /* @__PURE__ */ jsx11("div", { className: "ods-mkt-statband__label", children: item.label })
450
+ ] }, item.id))
451
+ }
452
+ );
453
+ }
454
+
455
+ // src/marketing/components/WorkflowShowcase/showcaseEngine.ts
456
+ var SETTLED_PHASES = [
457
+ "done",
458
+ "signup",
459
+ "creating",
460
+ "welcome"
461
+ ];
462
+ var WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS = [
463
+ { name: "Storefront", role: "source", aliases: ["store", "shop orders"] },
464
+ { name: "Payments", role: "source", aliases: ["payouts"] },
465
+ { name: "Orders DB", role: "source", aliases: ["orders database"] },
466
+ { name: "CRM", role: "source", aliases: ["crm leads"] },
467
+ { name: "Warehouse", role: "destination" },
468
+ { name: "Lakehouse", role: "destination" },
469
+ { name: "Campaigns", role: "action", aliases: ["campaign"] },
470
+ { name: "Team Chat", role: "notify", aliases: ["chat", "alert the team"] }
471
+ ];
472
+ var WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES = [
473
+ {
474
+ id: "hourly-sync",
475
+ label: "Storefront orders \u2192 Warehouse, hourly",
476
+ prompt: "Sync Storefront orders to Warehouse every hour, alert sales in Team Chat"
477
+ },
478
+ {
479
+ id: "daily-load",
480
+ label: "Payments payouts \u2192 Lakehouse, daily",
481
+ prompt: "Load Payments payouts into Lakehouse daily"
482
+ },
483
+ {
484
+ id: "realtime-stream",
485
+ label: "Orders DB changes \u2192 Warehouse + Team Chat",
486
+ prompt: "Stream Orders DB changes to Warehouse in real-time and notify Team Chat"
487
+ }
488
+ ];
489
+ var WORKFLOW_SHOWCASE_DEFAULT_METRICS = [
490
+ { id: "throughput", value: 2341, buildingValue: 842, unit: "rows/min", label: "THROUGHPUT" },
491
+ {
492
+ id: "latency",
493
+ value: 0.8,
494
+ buildingValue: 1.1,
495
+ decimals: 1,
496
+ unit: "s latency",
497
+ label: "SYNC SPEED"
498
+ },
499
+ { id: "cost", value: 43, prefix: "\u2212", suffix: "%", label: "COST VS BASELINE", tone: "success" }
500
+ ];
501
+ var WORKFLOW_SHOWCASE_SCHEDULES = ["AUTO", "HOURLY", "DAILY", "REAL-TIME"];
502
+ var WORKFLOW_SHOWCASE_DEFAULT_TILES = [
503
+ "ELT",
504
+ "CDC",
505
+ "DAG",
506
+ "CRON",
507
+ "HEAL",
508
+ "COST",
509
+ "API",
510
+ "LOG"
511
+ ];
512
+ function escapeRegExp(value) {
513
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
514
+ }
515
+ function mentionsOf(catalog) {
516
+ const out = [];
517
+ for (const connector of catalog) {
518
+ out.push({ connector, pattern: connector.name });
519
+ for (const alias of connector.aliases ?? []) out.push({ connector, pattern: alias });
520
+ }
521
+ return out.sort((a, b) => b.pattern.length - a.pattern.length);
522
+ }
523
+ function detectConnectors(prompt, catalog) {
524
+ const lower = prompt.toLowerCase();
525
+ return catalog.filter((c) => [c.name, ...c.aliases ?? []].some((p) => lower.includes(p.toLowerCase()))).map((c) => c.name);
526
+ }
527
+ function segmentPrompt(prompt, catalog) {
528
+ if (!prompt) return [];
529
+ const mentions = mentionsOf(catalog);
530
+ if (!mentions.length) return [{ text: prompt }];
531
+ const re = new RegExp(`(${mentions.map((m) => escapeRegExp(m.pattern)).join("|")})`, "gi");
532
+ const byPattern = new Map(mentions.map((m) => [m.pattern.toLowerCase(), m.connector]));
533
+ return prompt.split(re).filter((part) => part !== "").map((part) => {
534
+ const connector = byPattern.get(part.toLowerCase());
535
+ return connector ? { text: part, connector } : { text: part };
536
+ });
537
+ }
538
+ function scheduleFromPrompt(prompt) {
539
+ const t = prompt.toLowerCase();
540
+ if (/stream|real.?time|cdc/.test(t)) return "REAL-TIME";
541
+ if (/hour/.test(t)) return "HOURLY";
542
+ if (/dail|every day|nightly/.test(t)) return "DAILY";
543
+ return null;
544
+ }
545
+ var RIGHT_ORDER = {
546
+ source: -1,
547
+ destination: 0,
548
+ action: 1,
549
+ notify: 2
550
+ };
551
+ function resolvePlan(selected, detected, catalog) {
552
+ const byName = new Map(catalog.map((c) => [c.name, c]));
553
+ let names = [.../* @__PURE__ */ new Set([...selected, ...detected])].filter((n) => byName.has(n));
554
+ if (!names.length) {
555
+ const fallback = [
556
+ catalog.find((c) => c.role === "source"),
557
+ catalog.find((c) => c.role === "destination"),
558
+ catalog.find((c) => c.role === "notify")
559
+ ].filter((c) => Boolean(c));
560
+ names = fallback.map((c) => c.name);
561
+ }
562
+ const has = (predicate) => names.some((n) => {
563
+ const c = byName.get(n);
564
+ return Boolean(c && predicate(c));
565
+ });
566
+ if (!has((c) => c.role === "source")) {
567
+ const source = catalog.find((c) => c.role === "source");
568
+ if (source) names = [source.name, ...names];
569
+ }
570
+ if (!has((c) => c.role !== "source")) {
571
+ const sink = catalog.find((c) => c.role === "notify") ?? catalog.find((c) => c.role !== "source");
572
+ if (sink) names = [...names, sink.name];
573
+ }
574
+ const picked = catalog.filter((c) => names.includes(c.name));
575
+ const left = picked.filter((c) => c.role === "source");
576
+ const right = picked.filter((c) => c.role !== "source").sort((a, b) => RIGHT_ORDER[a.role] - RIGHT_ORDER[b.role]);
577
+ const all = [...left, ...right];
578
+ return { left, right, all, totalSteps: all.length + 1 };
579
+ }
580
+ function stepVerb(role) {
581
+ if (role === "notify") return "alert";
582
+ if (role === "action") return "trigger";
583
+ return "load";
584
+ }
585
+ function assembleSteps(plan) {
586
+ return [
587
+ ...plan.left.map((c) => `${c.name.toLowerCase()} extract`),
588
+ "schema map \xB7 14 fields",
589
+ ...plan.right.map((c) => `${c.name.toLowerCase()} ${stepVerb(c.role)}`)
590
+ ];
591
+ }
592
+ function buildActivity(args) {
593
+ const { phase, shown, plan, selected, status } = args;
594
+ const settled = SETTLED_PHASES.includes(phase);
595
+ const lines = [];
596
+ if (phase === "idle") {
597
+ if (!selected.length) {
598
+ lines.push({ id: "wait", text: "\u25B8 waiting for instructions\u2026", tone: "muted" });
599
+ lines.push({ id: "hint", text: "\xB7 type a request or pick apps", tone: "faint" });
600
+ }
601
+ for (const name of selected.slice(-6)) {
602
+ lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: "plain" });
603
+ }
604
+ return lines;
605
+ }
606
+ if (phase === "analyzing") {
607
+ for (const name of selected.slice(-4)) {
608
+ lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: "muted" });
609
+ }
610
+ lines.push({ id: "status", text: `\u27F3 ${status}`, tone: "active" });
611
+ return lines;
612
+ }
613
+ assembleSteps(plan).forEach((step, i) => {
614
+ if (settled || shown > i) lines.push({ id: `step-${i}`, text: `\u2713 ${step}`, tone: "done" });
615
+ else if (shown === i) lines.push({ id: `step-${i}`, text: `\u27F3 ${step}\u2026`, tone: "active" });
616
+ else lines.push({ id: `step-${i}`, text: `\xB7 ${step} queued`, tone: "muted" });
617
+ });
618
+ if (settled) lines.push({ id: "errors", text: "\u2713 error handling attached", tone: "done" });
619
+ return lines.slice(-8);
620
+ }
621
+ function slugify(value) {
622
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "your-team";
623
+ }
624
+ function isValidEmail(value) {
625
+ return /^\S+@\S+\.\S+$/.test(value.trim());
626
+ }
627
+
628
+ // src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx
629
+ import { AnimatePresence as AnimatePresence2, motion as motion3, useReducedMotion as useReducedMotion4 } from "framer-motion";
630
+ import {
631
+ useCallback,
632
+ useEffect as useEffect2,
633
+ useMemo,
634
+ useRef as useRef2,
635
+ useState as useState3
636
+ } from "react";
637
+
638
+ // src/marketing/components/WorkflowShowcase/ShowcaseScene.tsx
639
+ import { useEffect, useRef, useState } from "react";
640
+ import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
641
+ function slots(n) {
642
+ return Array.from({ length: n }, (_, i) => 208 + (i - (n - 1) / 2) * 80);
643
+ }
644
+ var leftGuide = (cy) => `M74 ${cy} H150 V228 H193`;
645
+ var rightGuide = (cy) => `M263 228 H340 V${cy} H388`;
646
+ function particlesFor(side, index, path, active, fast) {
647
+ const base2 = index * 0.4 + (side === "r" ? 0.5 : 0);
648
+ const duration = fast ? active ? "1.1s" : "2.6s" : active ? "2.2s" : "4.8s";
649
+ const size = active ? 8 : 6;
650
+ const out = [
651
+ { key: `${side}${index}-a`, path, size, duration, delay: `${base2}s`, variant: "lead" },
652
+ {
653
+ key: `${side}${index}-b`,
654
+ path,
655
+ size,
656
+ duration,
657
+ delay: `${base2 + (active ? 1.1 : 2.4)}s`,
658
+ variant: "echo"
659
+ }
660
+ ];
661
+ if (active) {
662
+ out.push({
663
+ key: `${side}${index}-c`,
664
+ path,
665
+ size: 6,
666
+ duration,
667
+ delay: `${base2 + 0.55}s`,
668
+ variant: "spark"
669
+ });
670
+ }
671
+ return out;
672
+ }
673
+ function DefaultCoreGlyph() {
674
+ return /* @__PURE__ */ jsxs12("svg", { viewBox: "0 0 24 24", width: "30", height: "30", fill: "none", "aria-hidden": "true", children: [
675
+ /* @__PURE__ */ jsx12("rect", { x: "3", y: "3", width: "18", height: "18", rx: "1", stroke: "currentColor", strokeWidth: "1.6" }),
676
+ /* @__PURE__ */ jsx12(
677
+ "path",
678
+ {
679
+ d: "M7 12h7M11.5 8.5 15 12l-3.5 3.5",
680
+ stroke: "currentColor",
681
+ strokeWidth: "1.6",
682
+ strokeLinecap: "round",
683
+ strokeLinejoin: "round"
684
+ }
685
+ )
686
+ ] });
687
+ }
688
+ function CubeFace({ connector }) {
689
+ return /* @__PURE__ */ jsx12(
690
+ "span",
691
+ {
692
+ className: cn(
693
+ "ods-showcase__apptile",
694
+ "ods-showcase__apptile--lg",
695
+ `ods-showcase__apptile--${connector.role}`
696
+ ),
697
+ children: connector.icon ?? roleGlyph(connector.role, 18)
698
+ }
699
+ );
700
+ }
701
+ function ShowcaseScene({
702
+ left,
703
+ right,
704
+ engaged,
705
+ tiles,
706
+ coreIcon,
707
+ caption
708
+ }) {
709
+ const [pulse, setPulse] = useState(false);
710
+ const pulseTimer = useRef(null);
711
+ useEffect(
712
+ () => () => {
713
+ if (pulseTimer.current) clearTimeout(pulseTimer.current);
714
+ },
715
+ []
716
+ );
717
+ const firePulse = () => {
718
+ if (pulse) return;
719
+ setPulse(true);
720
+ pulseTimer.current = setTimeout(() => setPulse(false), 1500);
721
+ };
722
+ const leftYs = slots(left.length);
723
+ const rightYs = slots(right.length);
724
+ const guides = [];
725
+ const particles = [];
726
+ left.forEach((node, i) => {
727
+ const d = leftGuide(leftYs[i]);
728
+ const on = engaged && node.active;
729
+ guides.push({ d, on, delay: `${i * 0.2}s` });
730
+ particles.push(...particlesFor("l", i, d, on, pulse));
731
+ });
732
+ right.forEach((node, j) => {
733
+ const d = rightGuide(rightYs[j]);
734
+ const on = engaged && node.active;
735
+ guides.push({ d, on, delay: `${j * 0.2 + 0.3}s` });
736
+ particles.push(...particlesFor("r", j, d, on, pulse));
737
+ });
738
+ if (!left.length) guides.push({ d: leftGuide(208), on: false, delay: "0s" });
739
+ if (!right.length) guides.push({ d: rightGuide(208), on: false, delay: "0s" });
740
+ const pins = [];
741
+ for (let x = 118; x <= 338; x += 20) {
742
+ pins.push({ d: `M${x} 346 L${x} 368`, accent: x / 20 % 4 === 0 });
743
+ }
744
+ for (let y = 118; y <= 338; y += 20) {
745
+ pins.push({ d: `M346 ${y} L368 ${y}`, accent: y / 20 % 4 === 1 });
746
+ }
747
+ const tilePositions = [
748
+ { left: 8, top: 8 },
749
+ { left: 83, top: 8 },
750
+ { left: 158, top: 8 },
751
+ { left: 8, top: 83 },
752
+ { left: 158, top: 83 },
753
+ { left: 8, top: 158 },
754
+ { left: 83, top: 158 },
755
+ { left: 158, top: 158 }
756
+ ];
757
+ return /* @__PURE__ */ jsxs12("div", { className: "ods-showcase__scene", "aria-hidden": "true", children: [
758
+ /* @__PURE__ */ jsxs12("div", { className: "ods-showcase__scene-stage", children: [
759
+ /* @__PURE__ */ jsxs12("svg", { className: "ods-showcase__wires", width: "460", height: "460", "aria-hidden": "true", children: [
760
+ pins.map((pin) => /* @__PURE__ */ jsx12(
761
+ "path",
762
+ {
763
+ d: pin.d,
764
+ className: cn("ods-showcase__pin", pin.accent && "ods-showcase__pin--accent")
765
+ },
766
+ pin.d
767
+ )),
768
+ guides.map((guide) => /* @__PURE__ */ jsxs12("g", { children: [
769
+ /* @__PURE__ */ jsx12("path", { d: guide.d, className: "ods-showcase__guide" }),
770
+ /* @__PURE__ */ jsx12(
771
+ "path",
772
+ {
773
+ d: guide.d,
774
+ className: cn(
775
+ "ods-showcase__guide-trace",
776
+ guide.on && "ods-showcase__guide-trace--on"
777
+ ),
778
+ style: { animationDelay: guide.delay }
779
+ }
780
+ )
781
+ ] }, guide.d))
782
+ ] }),
783
+ particles.map((p) => /* @__PURE__ */ jsx12(
784
+ "span",
785
+ {
786
+ className: cn("ods-showcase__particle", `ods-showcase__particle--${p.variant}`),
787
+ style: {
788
+ width: p.size,
789
+ height: p.size,
790
+ offsetPath: `path('${p.path}')`,
791
+ animationDuration: p.duration,
792
+ animationDelay: p.delay
793
+ }
794
+ },
795
+ p.key
796
+ )),
797
+ /* @__PURE__ */ jsxs12("div", { className: "ods-showcase__platform", children: [
798
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__platform-south" }),
799
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__platform-east" }),
800
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__platform-top" }),
801
+ tiles.slice(0, 8).map((label, i) => /* @__PURE__ */ jsx12(
802
+ "span",
803
+ {
804
+ className: "ods-showcase__tile",
805
+ style: { left: tilePositions[i].left, top: tilePositions[i].top },
806
+ children: label
807
+ },
808
+ label
809
+ )),
810
+ pulse && /* @__PURE__ */ jsx12("span", { className: "ods-showcase__core-ring" }),
811
+ /* @__PURE__ */ jsxs12("button", { type: "button", tabIndex: -1, className: "ods-showcase__core", onClick: firePulse, children: [
812
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__core-south" }),
813
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__core-east" }),
814
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__core-top", children: coreIcon ?? /* @__PURE__ */ jsx12(DefaultCoreGlyph, {}) })
815
+ ] })
816
+ ] }),
817
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__floater ods-showcase__floater--a" }),
818
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__floater ods-showcase__floater--b" }),
819
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__floater ods-showcase__floater--c" }),
820
+ !left.length && /* @__PURE__ */ jsx12("span", { className: "ods-showcase__ghost", style: { left: 8, top: 178 }, children: "+" }),
821
+ !right.length && /* @__PURE__ */ jsx12("span", { className: "ods-showcase__ghost", style: { left: 392, top: 178 }, children: "+" }),
822
+ left.map((node, i) => /* @__PURE__ */ jsxs12(
823
+ "span",
824
+ {
825
+ className: cn(
826
+ "ods-showcase__cube",
827
+ node.active && "ods-showcase__cube--active",
828
+ i % 2 ? "ods-showcase__cube--float-b" : "ods-showcase__cube--float-a"
829
+ ),
830
+ style: { left: 8, top: leftYs[i] - 30, animationDelay: `${i * 0.15}s` },
831
+ children: [
832
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-south" }),
833
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-east" }),
834
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-top", children: /* @__PURE__ */ jsx12(CubeFace, { connector: node.connector }) })
835
+ ]
836
+ },
837
+ node.connector.name
838
+ )),
839
+ right.map((node, j) => /* @__PURE__ */ jsxs12(
840
+ "span",
841
+ {
842
+ className: cn(
843
+ "ods-showcase__cube",
844
+ node.active && "ods-showcase__cube--active",
845
+ j % 2 ? "ods-showcase__cube--float-a" : "ods-showcase__cube--float-b"
846
+ ),
847
+ style: { left: 392, top: rightYs[j] - 30, animationDelay: `${j * 0.15}s` },
848
+ children: [
849
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-south" }),
850
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-east" }),
851
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__cube-top", children: /* @__PURE__ */ jsx12(CubeFace, { connector: node.connector }) })
852
+ ]
853
+ },
854
+ node.connector.name
855
+ ))
856
+ ] }),
857
+ /* @__PURE__ */ jsx12("span", { className: "ods-showcase__scene-caption", children: caption })
858
+ ] });
859
+ }
860
+
861
+ // src/marketing/components/WorkflowShowcase/ShowcaseSignup.tsx
862
+ import { AnimatePresence, motion as motion2, useReducedMotion as useReducedMotion3 } from "framer-motion";
863
+ import { useId, useState as useState2 } from "react";
864
+ import { FocusScope } from "react-aria";
865
+ import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
866
+ var OVERLAY_MOTION = {
867
+ initial: { opacity: 0 },
868
+ animate: { opacity: 1 },
869
+ exit: { opacity: 0 }
870
+ };
871
+ function ShowcaseSignup({
872
+ phase,
873
+ stepCount,
874
+ workspaceDomain,
875
+ teamSizes,
876
+ error,
877
+ onSubmit,
878
+ onBack,
879
+ dashboardHref = "#",
880
+ onboardingHref = "#"
881
+ }) {
882
+ const reducedMotion = useReducedMotion3();
883
+ const titleId = useId();
884
+ const subtitleId = useId();
885
+ const [values, setValues] = useState2({
886
+ name: "",
887
+ email: "",
888
+ company: "",
889
+ teamSize: teamSizes[0] ?? "1\u201310"
890
+ });
891
+ const open = phase === "signup" || phase === "creating" || phase === "welcome";
892
+ const cardMotion = reducedMotion ? OVERLAY_MOTION : {
893
+ initial: { opacity: 0, y: 14, scale: 0.985 },
894
+ animate: { opacity: 1, y: 0, scale: 1 },
895
+ exit: { opacity: 0, y: 8, scale: 0.99 }
896
+ };
897
+ const handleSubmit = (event) => {
898
+ event.preventDefault();
899
+ onSubmit(values);
900
+ };
901
+ const firstName = values.name.trim().split(/\s+/)[0] || "";
902
+ const emailShown = values.email.trim() || "your inbox";
903
+ const slug = `${slugify(values.company)}.${workspaceDomain}`;
904
+ return /* @__PURE__ */ jsx13(AnimatePresence, { children: open && /* @__PURE__ */ jsx13(
905
+ motion2.div,
906
+ {
907
+ className: "ods-showcase__veil",
908
+ ...OVERLAY_MOTION,
909
+ transition: { duration: reducedMotion ? 0 : 0.22 },
910
+ children: /* @__PURE__ */ jsxs13(FocusScope, { contain: true, restoreFocus: true, autoFocus: true, children: [
911
+ phase === "signup" && /* @__PURE__ */ jsxs13(
912
+ motion2.form,
913
+ {
914
+ className: "ods-showcase__glass-card",
915
+ role: "dialog",
916
+ "aria-modal": "true",
917
+ "aria-labelledby": titleId,
918
+ "aria-describedby": subtitleId,
919
+ onSubmit: handleSubmit,
920
+ onKeyDown: (e) => {
921
+ if (e.key === "Escape") onBack();
922
+ },
923
+ ...cardMotion,
924
+ transition: { duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] },
925
+ children: [
926
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-head", children: [
927
+ /* @__PURE__ */ jsx13("h3", { id: titleId, className: "ods-showcase__glass-title", children: "Create your workspace" }),
928
+ /* @__PURE__ */ jsxs13("p", { id: subtitleId, className: "ods-showcase__microcopy", children: [
929
+ "FREE IN PRIVATE BETA \xB7 YOUR ",
930
+ stepCount,
931
+ "-STEP WORKFLOW COMES WITH YOU"
932
+ ] })
933
+ ] }),
934
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__form-grid", children: [
935
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
936
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "FULL NAME" }),
937
+ /* @__PURE__ */ jsx13(
938
+ Input,
939
+ {
940
+ "aria-label": "Full name",
941
+ autoComplete: "name",
942
+ placeholder: "Ada Lovelace",
943
+ value: values.name,
944
+ onChange: (e) => setValues((v) => ({ ...v, name: e.target.value }))
945
+ }
946
+ )
947
+ ] }),
948
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
949
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "WORK EMAIL" }),
950
+ /* @__PURE__ */ jsx13(
951
+ Input,
952
+ {
953
+ "aria-label": "Work email",
954
+ type: "email",
955
+ autoComplete: "email",
956
+ placeholder: "ada@company.com",
957
+ value: values.email,
958
+ onChange: (e) => setValues((v) => ({ ...v, email: e.target.value }))
959
+ }
960
+ )
961
+ ] }),
962
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
963
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "COMPANY" }),
964
+ /* @__PURE__ */ jsx13(
965
+ Input,
966
+ {
967
+ "aria-label": "Company",
968
+ autoComplete: "organization",
969
+ placeholder: "Acme Inc.",
970
+ value: values.company,
971
+ onChange: (e) => setValues((v) => ({ ...v, company: e.target.value }))
972
+ }
973
+ )
974
+ ] }),
975
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
976
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "TEAM SIZE" }),
977
+ /* @__PURE__ */ jsx13(
978
+ Select,
979
+ {
980
+ "aria-label": "Team size",
981
+ options: teamSizes.map((size) => ({ value: size, label: size })),
982
+ value: values.teamSize,
983
+ onChange: (teamSize) => setValues((v) => ({ ...v, teamSize }))
984
+ }
985
+ )
986
+ ] })
987
+ ] }),
988
+ error && /* @__PURE__ */ jsx13("p", { className: "ods-showcase__form-error", role: "alert", children: error }),
989
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-foot", children: [
990
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__microcopy", children: "NO CREDIT CARD \xB7 SSO & SELF-HOSTING LATER" }),
991
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-actions", children: [
992
+ /* @__PURE__ */ jsx13(Button, { type: "button", variant: "secondary", onClick: onBack, children: "Back" }),
993
+ /* @__PURE__ */ jsx13(Button, { type: "submit", variant: "primary", children: "Create account & deploy \u2192" })
994
+ ] })
995
+ ] })
996
+ ]
997
+ },
998
+ "signup"
999
+ ),
1000
+ phase === "creating" && /* @__PURE__ */ jsxs13(
1001
+ motion2.div,
1002
+ {
1003
+ className: "ods-showcase__glass-card ods-showcase__glass-card--slim",
1004
+ role: "status",
1005
+ ...cardMotion,
1006
+ transition: { duration: reducedMotion ? 0 : 0.25 },
1007
+ children: [
1008
+ /* @__PURE__ */ jsx13("span", { className: "ods-showcase__spin", "aria-hidden": "true", children: "\u27F3" }),
1009
+ /* @__PURE__ */ jsxs13("span", { className: "ods-showcase__creating-line", children: [
1010
+ "provisioning workspace \xB7 saving draft \xB7 inviting ",
1011
+ emailShown
1012
+ ] })
1013
+ ]
1014
+ },
1015
+ "creating"
1016
+ ),
1017
+ phase === "welcome" && /* @__PURE__ */ jsxs13(
1018
+ motion2.div,
1019
+ {
1020
+ className: "ods-showcase__glass-card ods-showcase__glass-card--welcome",
1021
+ role: "dialog",
1022
+ "aria-modal": "true",
1023
+ "aria-labelledby": titleId,
1024
+ ...cardMotion,
1025
+ transition: { duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] },
1026
+ children: [
1027
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-head", children: [
1028
+ /* @__PURE__ */ jsx13("p", { className: "ods-showcase__microcopy ods-showcase__microcopy--success", children: "\u2713 WORKSPACE READY" }),
1029
+ /* @__PURE__ */ jsxs13("h3", { id: titleId, className: "ods-showcase__glass-title", children: [
1030
+ "Welcome to OctaviaFlow",
1031
+ firstName ? `, ${firstName}` : "",
1032
+ "."
1033
+ ] }),
1034
+ /* @__PURE__ */ jsxs13("p", { className: "ods-showcase__welcome-body", children: [
1035
+ "We emailed a sign-in link to ",
1036
+ /* @__PURE__ */ jsx13("strong", { children: emailShown }),
1037
+ ". Your ",
1038
+ stepCount,
1039
+ "-step workflow is saved as a draft in",
1040
+ " ",
1041
+ /* @__PURE__ */ jsx13("code", { className: "ods-showcase__slug", children: slug }),
1042
+ " \u2014 deploy it from the dashboard whenever you're ready."
1043
+ ] })
1044
+ ] }),
1045
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-foot", children: [
1046
+ /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__glass-actions", children: [
1047
+ /* @__PURE__ */ jsx13("a", { className: "ods-showcase__solid-link", href: dashboardHref, children: "Open dashboard \u2192" }),
1048
+ /* @__PURE__ */ jsx13("a", { className: "ods-showcase__text-link", href: onboardingHref, children: "Book onboarding \u2192" })
1049
+ ] }),
1050
+ /* @__PURE__ */ jsxs13("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--right", children: [
1051
+ "PRIVATE BETA",
1052
+ /* @__PURE__ */ jsx13("br", {}),
1053
+ "ONBOARDING INCLUDED"
1054
+ ] })
1055
+ ] })
1056
+ ]
1057
+ },
1058
+ "welcome"
1059
+ )
1060
+ ] })
1061
+ }
1062
+ ) });
1063
+ }
1064
+
1065
+ // src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx
1066
+ import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1067
+ var EMPTY_PLAN = { left: [], right: [], all: [], totalSteps: 1 };
1068
+ function ConnectorTile({ connector }) {
1069
+ return /* @__PURE__ */ jsx14(
1070
+ "span",
1071
+ {
1072
+ "aria-hidden": "true",
1073
+ className: cn("ods-showcase__apptile", `ods-showcase__apptile--${connector.role}`),
1074
+ children: connector.icon ?? roleGlyph(connector.role)
1075
+ }
1076
+ );
1077
+ }
1078
+ function WorkflowShowcase({
1079
+ connectors = WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,
1080
+ examples = WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,
1081
+ metrics = WORKFLOW_SHOWCASE_DEFAULT_METRICS,
1082
+ defaultPrompt = "",
1083
+ modelLabel = "octavia-core-1",
1084
+ canvasLabel = "workflow_canvas",
1085
+ railLabel = "OCTAVIA IS DOING",
1086
+ platformTiles = WORKFLOW_SHOWCASE_DEFAULT_TILES,
1087
+ coreIcon,
1088
+ catalogNote = "600+",
1089
+ teamSizes = ["1\u201310", "11\u201350", "51\u2013200", "200+"],
1090
+ workspaceDomain = "octaviaflow.com",
1091
+ dashboardHref,
1092
+ onboardingHref = "#",
1093
+ promptAriaLabel = "Describe your pipeline",
1094
+ onBuild,
1095
+ onPhaseChange,
1096
+ onSignup,
1097
+ className,
1098
+ ...rest
1099
+ }) {
1100
+ const reducedMotion = useReducedMotion4();
1101
+ const [prompt, setPrompt] = useState3(defaultPrompt);
1102
+ const [selected, setSelected] = useState3([]);
1103
+ const [phase, setPhase] = useState3("idle");
1104
+ const [shown, setShown] = useState3(0);
1105
+ const [status, setStatus] = useState3("");
1106
+ const [pickerOpen, setPickerOpen] = useState3(false);
1107
+ const [schedIdx, setSchedIdx] = useState3(0);
1108
+ const [swap, setSwap] = useState3(null);
1109
+ const [signupError, setSignupError] = useState3(null);
1110
+ const cardRef = useRef2(null);
1111
+ const timers = useRef2([]);
1112
+ const clearTimers = useCallback(() => {
1113
+ for (const t of timers.current) clearTimeout(t);
1114
+ timers.current = [];
1115
+ }, []);
1116
+ useEffect2(() => clearTimers, [clearTimers]);
1117
+ const tempo = reducedMotion ? 0.35 : 1;
1118
+ const at = useCallback(
1119
+ (ms, fn) => {
1120
+ timers.current.push(setTimeout(fn, ms * tempo));
1121
+ },
1122
+ [tempo]
1123
+ );
1124
+ const firstPhase = useRef2(true);
1125
+ useEffect2(() => {
1126
+ if (firstPhase.current) {
1127
+ firstPhase.current = false;
1128
+ return;
1129
+ }
1130
+ onPhaseChange?.(phase);
1131
+ }, [phase, onPhaseChange]);
1132
+ const phaseRef = useRef2(phase);
1133
+ phaseRef.current = phase;
1134
+ const byName = useMemo(() => new Map(connectors.map((c) => [c.name, c])), [connectors]);
1135
+ const detected = useMemo(() => detectConnectors(prompt, connectors), [prompt, connectors]);
1136
+ const union = useMemo(() => [.../* @__PURE__ */ new Set([...selected, ...detected])], [selected, detected]);
1137
+ const settled = SETTLED_PHASES.includes(phase);
1138
+ const engaged = phase !== "idle";
1139
+ const buildingNow = phase === "analyzing" || phase === "building";
1140
+ const plan = useMemo(() => {
1141
+ if (!selected.length) return EMPTY_PLAN;
1142
+ return resolvePlan(selected, [], connectors);
1143
+ }, [selected, connectors]);
1144
+ const schedules = WORKFLOW_SHOWCASE_SCHEDULES;
1145
+ const inferredSchedule = scheduleFromPrompt(prompt);
1146
+ const manualSchedule = schedules[schedIdx];
1147
+ const scheduleShown = inferredSchedule ?? (manualSchedule === "AUTO" ? "HOURLY" : manualSchedule);
1148
+ const startBuild = useCallback(
1149
+ (text, baseSelected) => {
1150
+ if (phaseRef.current === "analyzing" || phaseRef.current === "building") return;
1151
+ phaseRef.current = "analyzing";
1152
+ clearTimers();
1153
+ const resolved = resolvePlan(baseSelected, detectConnectors(text, connectors), connectors);
1154
+ const target = resolved.all.map((c) => c.name);
1155
+ const additions = target.filter((n) => !baseSelected.includes(n));
1156
+ setPrompt(text);
1157
+ setSelected(baseSelected);
1158
+ setPhase("analyzing");
1159
+ setShown(0);
1160
+ setStatus("analyzing request \xB7 matching connectors");
1161
+ setPickerOpen(false);
1162
+ setSwap(null);
1163
+ onBuild?.({ prompt: text, connectors: target, schedule: scheduleShown });
1164
+ additions.forEach((name, i) => {
1165
+ at(250 + i * 200, () => setSelected((s) => s.includes(name) ? s : [...s, name]));
1166
+ });
1167
+ const t0 = 250 + additions.length * 200;
1168
+ at(t0 + 750, () => setStatus("wiring transforms \xB7 adding error handling"));
1169
+ at(t0 + 1500, () => {
1170
+ setPhase("building");
1171
+ setStatus("assembling workflow \xB7 optimizing plan");
1172
+ });
1173
+ for (let i = 0; i < resolved.totalSteps; i++) {
1174
+ at(t0 + 1600 + i * 380, () => setShown(i + 1));
1175
+ }
1176
+ at(t0 + 1600 + resolved.totalSteps * 380 + 350, () => setPhase("done"));
1177
+ },
1178
+ [clearTimers, connectors, onBuild, scheduleShown, at]
1179
+ );
1180
+ const resetToIdle = useCallback(() => {
1181
+ clearTimers();
1182
+ phaseRef.current = "idle";
1183
+ setPhase("idle");
1184
+ setShown(0);
1185
+ setStatus("");
1186
+ setSwap(null);
1187
+ }, [clearTimers]);
1188
+ const toggleConnector = (name) => {
1189
+ resetToIdle();
1190
+ setSelected((s) => s.includes(name) ? s.filter((n) => n !== name) : [...s, name]);
1191
+ };
1192
+ const runExample = (example) => {
1193
+ resetToIdle();
1194
+ startBuild(example.prompt, []);
1195
+ };
1196
+ const openSwap = (name, text, anchor) => {
1197
+ const card = cardRef.current;
1198
+ if (!card) return;
1199
+ const r = anchor.getBoundingClientRect();
1200
+ const cr = card.getBoundingClientRect();
1201
+ const x = Math.max(8, Math.min(r.left - cr.left, cr.width - 264));
1202
+ setSwap({ name, text, x, y: r.bottom - cr.top + 6 });
1203
+ };
1204
+ const doSwap = (current, next) => {
1205
+ resetToIdle();
1206
+ const re = new RegExp(current.text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i");
1207
+ setPrompt((p) => p.replace(re, next));
1208
+ setSelected((s) => s.map((n) => n === current.name ? next : n));
1209
+ };
1210
+ const swapRole = swap ? byName.get(swap.name)?.role : void 0;
1211
+ const swapItems = swapRole ? connectors.filter((c) => c.role === swapRole) : [];
1212
+ const roles = union.map((n) => byName.get(n)?.role);
1213
+ const hasSource = roles.includes("source");
1214
+ const hasSink = roles.some((r) => r && r !== "source");
1215
+ const hasNotify = roles.includes("notify");
1216
+ let coachLine;
1217
+ let coachAdds = [];
1218
+ const notIn = (c) => !union.includes(c.name);
1219
+ if (!union.length) {
1220
+ coachLine = prompt ? "LISTENING\u2026 CONNECTOR NAMES LIGHT UP AS OCTAVIA RECOGNIZES THEM" : `OCTAVIA MATCHES CONNECTORS LIVE AS YOU TYPE \u2014 OR PICK FROM ${catalogNote}`;
1221
+ } else if (union.length >= connectors.length) {
1222
+ coachLine = "FULL STACK \u2014 OCTAVIA SPLITS THIS INTO PARALLEL INGEST \u2192 AI TRANSFORM \u2192 SEQUENCED ACTIONS";
1223
+ } else if (union.length >= 6) {
1224
+ coachLine = `BIG STACK \u2014 ${union.length} CONNECTORS FAN OUT ACROSS PARALLEL BRANCHES \xB7 COST OPTIMIZER ON`;
1225
+ } else if (hasSource && !hasSink) {
1226
+ coachLine = "SOURCES WIRED \u2014 WHERE SHOULD THE DATA LAND?";
1227
+ coachAdds = connectors.filter((c) => c.role === "destination" && notIn(c)).slice(0, 2);
1228
+ } else if (!hasSource && hasSink) {
1229
+ coachLine = "DESTINATION SET \u2014 WHAT SHOULD OCTAVIA PULL FROM?";
1230
+ coachAdds = connectors.filter((c) => c.role === "source" && notIn(c)).slice(0, 2);
1231
+ } else if (!hasNotify) {
1232
+ coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${scheduleShown} \xB7 TIP: ALERT YOUR TEAM WHEN RUNS FINISH`;
1233
+ coachAdds = connectors.filter((c) => c.role === "notify" && notIn(c)).slice(0, 1);
1234
+ } else {
1235
+ coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${scheduleShown} \xB7 CLICK A HIGHLIGHTED NAME TO SWAP IT`;
1236
+ }
1237
+ const coachTone = union.length ? hasSource && hasSink ? "success" : "accent" : "muted";
1238
+ const badge = settled ? { label: "LIVE", tone: "success", pulse: true } : buildingNow ? {
1239
+ label: phase === "analyzing" ? "ANALYZING" : "BUILDING",
1240
+ tone: "accent",
1241
+ pulse: true
1242
+ } : { label: "IDLE", tone: "muted", pulse: false };
1243
+ const canvasSub = settled ? "production" : buildingNow ? "generating" : "draft";
1244
+ const sceneCaption = settled ? "PIPELINE LIVE \xB7 SQUARES = ROWS IN FLIGHT" : phase === "building" ? "ASSEMBLING WORKFLOW\u2026" : phase === "analyzing" ? "ANALYZING REQUEST\u2026" : "CLICK THE CORE \xB7 CONNECTORS LAND AS CUBES";
1245
+ const activity = buildActivity({ phase, shown, plan, selected, status });
1246
+ const costMetric = metrics.find((m) => m.tone === "success");
1247
+ const costLabel = costMetric ? `${costMetric.prefix ?? ""}${costMetric.value}${costMetric.suffix ?? ""}` : "";
1248
+ const railFoot = phase === "idle" ? `${catalogNote} CONNECTORS \xB7 FREE IN PRIVATE BETA` : settled ? `COST PLAN SELECTED \xB7 ${costLabel}` : "COST OPTIMIZER RUNNING\u2026";
1249
+ const nLeft = plan.left.length;
1250
+ const sceneLeft = plan.left.map((c, i) => ({
1251
+ connector: c,
1252
+ active: engaged && (settled || shown > i)
1253
+ }));
1254
+ const sceneRight = plan.right.map((c, j) => ({
1255
+ connector: c,
1256
+ active: engaged && (settled || shown > nLeft + 1 + j)
1257
+ }));
1258
+ const stepCount = (selected.length || 3) + 1;
1259
+ const doneNote = costMetric ? `${stepCount}-step workflow generated \xB7 cost optimizer: ${costMetric.value}% below baseline` : `${stepCount}-step workflow generated`;
1260
+ const submitSignup = (values) => {
1261
+ if (!values.name.trim() || !isValidEmail(values.email)) {
1262
+ setSignupError("Please enter your name and a valid work email.");
1263
+ return;
1264
+ }
1265
+ setSignupError(null);
1266
+ setPhase("creating");
1267
+ const finish = () => setPhase("welcome");
1268
+ const fail = () => {
1269
+ setSignupError("Something went wrong \u2014 please try again.");
1270
+ setPhase("signup");
1271
+ };
1272
+ if (!onSignup) {
1273
+ at(1600, finish);
1274
+ return;
1275
+ }
1276
+ try {
1277
+ const result = onSignup(values);
1278
+ if (result && typeof result.then === "function") {
1279
+ result.then(finish, fail);
1280
+ } else {
1281
+ finish();
1282
+ }
1283
+ } catch {
1284
+ fail();
1285
+ }
1286
+ };
1287
+ const segments = segmentPrompt(prompt, connectors);
1288
+ const onPromptKeyDown = (e) => {
1289
+ if (e.key === "Enter" && !e.shiftKey) {
1290
+ e.preventDefault();
1291
+ startBuild(prompt, selected);
1292
+ }
1293
+ };
1294
+ const rise = (delay = 0) => reducedMotion ? {} : {
1295
+ initial: { opacity: 0, y: 10 },
1296
+ animate: { opacity: 1, y: 0 },
1297
+ transition: { duration: 0.4, delay, ease: [0.2, 0.7, 0.2, 1] }
1298
+ };
1299
+ return /* @__PURE__ */ jsxs14("section", { ...rest, className: cn("ods-showcase", className), children: [
1300
+ /* @__PURE__ */ jsxs14("div", { ref: cardRef, className: "ods-showcase__card", children: [
1301
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__prompt", children: [
1302
+ /* @__PURE__ */ jsx14(
1303
+ "textarea",
1304
+ {
1305
+ className: "ods-showcase__prompt-input",
1306
+ value: prompt,
1307
+ onChange: (e) => setPrompt(e.target.value),
1308
+ onKeyDown: onPromptKeyDown,
1309
+ "aria-label": promptAriaLabel,
1310
+ spellCheck: false,
1311
+ rows: 2
1312
+ }
1313
+ ),
1314
+ /* @__PURE__ */ jsx14("div", { className: "ods-showcase__prompt-render", "aria-hidden": "true", children: prompt ? segments.map(
1315
+ (seg, i) => seg.connector ? /* @__PURE__ */ jsx14(
1316
+ "button",
1317
+ {
1318
+ type: "button",
1319
+ tabIndex: -1,
1320
+ className: cn(
1321
+ "ods-showcase__token",
1322
+ `ods-showcase__token--${seg.connector.role}`
1323
+ ),
1324
+ onClick: (e) => {
1325
+ const name = seg.connector?.name;
1326
+ if (name) openSwap(name, seg.text, e.currentTarget);
1327
+ },
1328
+ children: seg.text
1329
+ },
1330
+ i
1331
+ ) : (
1332
+ // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature
1333
+ /* @__PURE__ */ jsx14("span", { children: seg.text }, i)
1334
+ )
1335
+ ) : /* @__PURE__ */ jsxs14(Fragment4, { children: [
1336
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__placeholder", children: "Describe your pipeline \u2014 e.g. " }),
1337
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__placeholder ods-showcase__placeholder--faint", children: '"Sync Storefront orders to Warehouse hourly, alert sales in Team Chat"' })
1338
+ ] }) })
1339
+ ] }),
1340
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__coach", children: [
1341
+ /* @__PURE__ */ jsx14(
1342
+ "span",
1343
+ {
1344
+ className: cn("ods-showcase__coach-line", `ods-showcase__coach-line--${coachTone}`),
1345
+ children: coachLine
1346
+ }
1347
+ ),
1348
+ coachAdds.map((c) => /* @__PURE__ */ jsxs14(
1349
+ "button",
1350
+ {
1351
+ type: "button",
1352
+ className: "ods-showcase__coach-add",
1353
+ onClick: () => toggleConnector(c.name),
1354
+ children: [
1355
+ /* @__PURE__ */ jsx14(ConnectorTile, { connector: c }),
1356
+ "+ ",
1357
+ c.name
1358
+ ]
1359
+ },
1360
+ c.name
1361
+ ))
1362
+ ] }),
1363
+ /* @__PURE__ */ jsx14(AnimatePresence2, { initial: false, children: pickerOpen && /* @__PURE__ */ jsx14(
1364
+ motion3.div,
1365
+ {
1366
+ className: "ods-showcase__picker",
1367
+ initial: reducedMotion ? false : { opacity: 0, height: 0 },
1368
+ animate: { opacity: 1, height: "auto" },
1369
+ exit: reducedMotion ? { opacity: 0 } : { opacity: 0, height: 0 },
1370
+ transition: { duration: 0.22, ease: [0.2, 0.7, 0.2, 1] },
1371
+ children: /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__picker-row", children: [
1372
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__microcopy", children: "CONNECTORS" }),
1373
+ connectors.map((c) => /* @__PURE__ */ jsxs14(
1374
+ "button",
1375
+ {
1376
+ type: "button",
1377
+ className: cn(
1378
+ "ods-showcase__pick",
1379
+ selected.includes(c.name) && "ods-showcase__pick--on"
1380
+ ),
1381
+ "aria-pressed": selected.includes(c.name),
1382
+ onClick: () => toggleConnector(c.name),
1383
+ children: [
1384
+ /* @__PURE__ */ jsx14(ConnectorTile, { connector: c }),
1385
+ c.name
1386
+ ]
1387
+ },
1388
+ c.name
1389
+ )),
1390
+ /* @__PURE__ */ jsxs14("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--faint", children: [
1391
+ "+ ",
1392
+ catalogNote,
1393
+ " IN THE APP"
1394
+ ] })
1395
+ ] })
1396
+ }
1397
+ ) }),
1398
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__toolbar", children: [
1399
+ /* @__PURE__ */ jsxs14(
1400
+ "button",
1401
+ {
1402
+ type: "button",
1403
+ className: cn(
1404
+ "ods-showcase__tool",
1405
+ (pickerOpen || selected.length > 0) && "ods-showcase__tool--on"
1406
+ ),
1407
+ "aria-expanded": pickerOpen,
1408
+ onClick: () => setPickerOpen((o) => !o),
1409
+ children: [
1410
+ "\uFF0B Connectors",
1411
+ selected.length ? ` \xB7 ${selected.length}` : ""
1412
+ ]
1413
+ }
1414
+ ),
1415
+ /* @__PURE__ */ jsxs14(
1416
+ "button",
1417
+ {
1418
+ type: "button",
1419
+ className: "ods-showcase__tool",
1420
+ onClick: () => setSchedIdx((i) => (i + 1) % schedules.length),
1421
+ children: [
1422
+ "\u25F7 ",
1423
+ manualSchedule
1424
+ ]
1425
+ }
1426
+ ),
1427
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__model", children: modelLabel }),
1428
+ /* @__PURE__ */ jsx14(
1429
+ Button,
1430
+ {
1431
+ variant: "primary",
1432
+ onClick: () => startBuild(prompt, selected),
1433
+ disabled: buildingNow,
1434
+ children: buildingNow ? "Building\u2026" : "Build workflow \u2192"
1435
+ }
1436
+ )
1437
+ ] }),
1438
+ swap && swapRole && /* @__PURE__ */ jsxs14(Fragment4, { children: [
1439
+ /* @__PURE__ */ jsx14(
1440
+ "button",
1441
+ {
1442
+ type: "button",
1443
+ className: "ods-showcase__swap-backdrop",
1444
+ "aria-label": "Close swap menu",
1445
+ onClick: () => setSwap(null)
1446
+ }
1447
+ ),
1448
+ /* @__PURE__ */ jsxs14(
1449
+ "div",
1450
+ {
1451
+ className: "ods-showcase__swap",
1452
+ role: "menu",
1453
+ style: { left: swap.x, top: swap.y },
1454
+ onKeyDown: (e) => {
1455
+ if (e.key === "Escape") setSwap(null);
1456
+ },
1457
+ children: [
1458
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__swap-head", children: [
1459
+ "SWAP ",
1460
+ swapRole.toUpperCase(),
1461
+ " \u2014 ",
1462
+ swap.name.toUpperCase()
1463
+ ] }),
1464
+ swapItems.map((c) => /* @__PURE__ */ jsxs14(
1465
+ "button",
1466
+ {
1467
+ type: "button",
1468
+ role: "menuitem",
1469
+ className: "ods-showcase__swap-item",
1470
+ onClick: () => doSwap(swap, c.name),
1471
+ children: [
1472
+ /* @__PURE__ */ jsx14(ConnectorTile, { connector: c }),
1473
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__swap-name", children: c.name }),
1474
+ c.name === swap.name && /* @__PURE__ */ jsx14("span", { className: "ods-showcase__swap-mark", children: "\u25CF CURRENT" })
1475
+ ]
1476
+ },
1477
+ c.name
1478
+ )),
1479
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__swap-foot", children: [
1480
+ catalogNote,
1481
+ " CONNECTORS IN THE APP"
1482
+ ] })
1483
+ ]
1484
+ }
1485
+ )
1486
+ ] })
1487
+ ] }),
1488
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__examples", children: [
1489
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__microcopy", children: "TRY:" }),
1490
+ examples.map((ex) => /* @__PURE__ */ jsx14(
1491
+ "button",
1492
+ {
1493
+ type: "button",
1494
+ className: "ods-showcase__try",
1495
+ onClick: () => runExample(ex),
1496
+ children: ex.label
1497
+ },
1498
+ ex.id
1499
+ ))
1500
+ ] }),
1501
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__canvas", children: [
1502
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__canvas-head", children: [
1503
+ /* @__PURE__ */ jsxs14("span", { className: "ods-showcase__microcopy", children: [
1504
+ canvasLabel,
1505
+ " \xB7 ",
1506
+ canvasSub
1507
+ ] }),
1508
+ /* @__PURE__ */ jsxs14("span", { className: cn("ods-showcase__badge", `ods-showcase__badge--${badge.tone}`), children: [
1509
+ /* @__PURE__ */ jsx14("span", { className: cn("ods-showcase__dot", badge.pulse && "ods-showcase__dot--pulse") }),
1510
+ badge.label
1511
+ ] })
1512
+ ] }),
1513
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__stage", children: [
1514
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__rail", children: [
1515
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__rail-head", children: [
1516
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__microcopy", children: railLabel }),
1517
+ /* @__PURE__ */ jsx14(
1518
+ "span",
1519
+ {
1520
+ className: cn("ods-showcase__dot", badge.pulse && "ods-showcase__dot--pulse")
1521
+ }
1522
+ )
1523
+ ] }),
1524
+ /* @__PURE__ */ jsx14("div", { className: "ods-showcase__rail-body", children: /* @__PURE__ */ jsx14(AnimatePresence2, { initial: false, children: activity.map((line) => /* @__PURE__ */ jsx14(
1525
+ motion3.div,
1526
+ {
1527
+ className: cn("ods-showcase__act", `ods-showcase__act--${line.tone}`),
1528
+ initial: reducedMotion ? false : { opacity: 0, y: 6 },
1529
+ animate: { opacity: 1, y: 0 },
1530
+ exit: { opacity: 0 },
1531
+ transition: { duration: 0.25 },
1532
+ children: line.text
1533
+ },
1534
+ line.id
1535
+ )) }) }),
1536
+ /* @__PURE__ */ jsx14(
1537
+ "div",
1538
+ {
1539
+ className: cn(
1540
+ "ods-showcase__rail-foot",
1541
+ settled && "ods-showcase__rail-foot--done",
1542
+ buildingNow && "ods-showcase__rail-foot--active"
1543
+ ),
1544
+ children: railFoot
1545
+ }
1546
+ )
1547
+ ] }),
1548
+ /* @__PURE__ */ jsx14(
1549
+ ShowcaseScene,
1550
+ {
1551
+ left: sceneLeft,
1552
+ right: sceneRight,
1553
+ engaged,
1554
+ tiles: platformTiles,
1555
+ coreIcon,
1556
+ caption: sceneCaption
1557
+ }
1558
+ ),
1559
+ /* @__PURE__ */ jsx14("div", { className: "ods-showcase__metrics", children: metrics.map((m, idx) => {
1560
+ const revealed = settled || phase === "building" && shown > idx;
1561
+ const interim = m.buildingValue != null && !settled && revealed;
1562
+ return /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__metric", children: [
1563
+ /* @__PURE__ */ jsxs14(
1564
+ "div",
1565
+ {
1566
+ className: cn(
1567
+ "ods-showcase__metric-value",
1568
+ !revealed && "ods-showcase__metric-value--empty",
1569
+ m.tone === "success" && settled && "ods-showcase__metric-value--success"
1570
+ ),
1571
+ children: [
1572
+ settled ? /* @__PURE__ */ jsx14(
1573
+ CountUp,
1574
+ {
1575
+ value: m.value,
1576
+ from: m.buildingValue ?? 0,
1577
+ decimals: m.decimals ?? 0,
1578
+ duration: reducedMotion ? 0 : 900,
1579
+ disableAnimation: Boolean(reducedMotion),
1580
+ prefix: m.prefix,
1581
+ formatValue: m.decimals ? void 0 : (v) => Math.round(v).toLocaleString("en-US")
1582
+ }
1583
+ ) : interim ? `${m.prefix ?? ""}${m.buildingValue}` : "\u2014",
1584
+ revealed && m.suffix ? m.suffix : null,
1585
+ revealed && m.unit ? /* @__PURE__ */ jsxs14("span", { className: "ods-showcase__metric-unit", children: [
1586
+ " ",
1587
+ m.unit
1588
+ ] }) : null
1589
+ ]
1590
+ }
1591
+ ),
1592
+ /* @__PURE__ */ jsx14("div", { className: "ods-showcase__microcopy", children: m.label })
1593
+ ] }, m.id);
1594
+ }) }),
1595
+ /* @__PURE__ */ jsx14(
1596
+ ShowcaseSignup,
1597
+ {
1598
+ phase,
1599
+ stepCount,
1600
+ workspaceDomain,
1601
+ teamSizes,
1602
+ error: signupError,
1603
+ onSubmit: submitSignup,
1604
+ onBack: () => {
1605
+ setSignupError(null);
1606
+ setPhase("done");
1607
+ },
1608
+ dashboardHref,
1609
+ onboardingHref
1610
+ }
1611
+ )
1612
+ ] })
1613
+ ] }),
1614
+ /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__outro", "aria-live": "polite", children: [
1615
+ buildingNow && /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__building", children: [
1616
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__spin", "aria-hidden": "true", children: "\u27F3" }),
1617
+ " ",
1618
+ status
1619
+ ] }),
1620
+ phase === "done" && /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__done", children: [
1621
+ /* @__PURE__ */ jsxs14(motion3.div, { className: "ods-showcase__done-note", ...rise(0), children: [
1622
+ "\u2713 ",
1623
+ doneNote
1624
+ ] }),
1625
+ /* @__PURE__ */ jsxs14(motion3.div, { className: "ods-showcase__cta", ...rise(0.2), children: [
1626
+ /* @__PURE__ */ jsx14("span", { className: "ods-showcase__cta-copy", children: "Deploy it on your own data \u2014 takes 2 minutes." }),
1627
+ /* @__PURE__ */ jsx14(
1628
+ Button,
1629
+ {
1630
+ variant: "primary",
1631
+ onClick: () => {
1632
+ setSignupError(null);
1633
+ setPhase("signup");
1634
+ },
1635
+ children: "Create free account \u2192"
1636
+ }
1637
+ ),
1638
+ /* @__PURE__ */ jsx14("a", { className: "ods-showcase__text-link", href: onboardingHref, children: "Book onboarding \u2192" })
1639
+ ] })
1640
+ ] })
1641
+ ] })
1642
+ ] });
1643
+ }
1644
+ export {
1645
+ ActionGlyph,
1646
+ AssistantTranscript,
1647
+ BrandMark,
1648
+ ConnectorGlyph,
1649
+ CtaBanner,
1650
+ DestinationGlyph,
1651
+ FeatureGrid,
1652
+ IntegrationsWall,
1653
+ LiveConsole,
1654
+ MarketingFooter,
1655
+ MarketingHero,
1656
+ MarketingNav,
1657
+ MarketingSection,
1658
+ NotifyGlyph,
1659
+ SourceGlyph,
1660
+ StatBand,
1661
+ WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,
1662
+ WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,
1663
+ WORKFLOW_SHOWCASE_DEFAULT_METRICS,
1664
+ WORKFLOW_SHOWCASE_DEFAULT_TILES,
1665
+ WORKFLOW_SHOWCASE_SCHEDULES,
1666
+ WorkflowShowcase,
1667
+ roleGlyph
1668
+ };
1669
+ //# sourceMappingURL=marketing.js.map