@octaviaflow/core 3.1.0-beta.65 → 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 (145) hide show
  1. package/dist/chunk-5AKA6EJB.js +3003 -0
  2. package/dist/chunk-5AKA6EJB.js.map +1 -0
  3. package/dist/chunk-JMSZOWT2.js +2616 -0
  4. package/dist/chunk-JMSZOWT2.js.map +1 -0
  5. package/dist/chunk-KZP2MNBO.js +2516 -0
  6. package/dist/chunk-KZP2MNBO.js.map +1 -0
  7. package/dist/chunk-S4LE4BFQ.js +5934 -0
  8. package/dist/chunk-S4LE4BFQ.js.map +1 -0
  9. package/dist/chunk-X7YETDK7.js +107 -0
  10. package/dist/chunk-X7YETDK7.js.map +1 -0
  11. package/dist/components/AgentCard/AgentCard.d.ts +5 -0
  12. package/dist/components/AgentCard/AgentCard.d.ts.map +1 -1
  13. package/dist/components/Catalog/Catalog.d.ts +116 -0
  14. package/dist/components/Catalog/Catalog.d.ts.map +1 -0
  15. package/dist/components/Catalog/index.d.ts +2 -0
  16. package/dist/components/Catalog/index.d.ts.map +1 -0
  17. package/dist/components/ExecutionConsole/ExecutionConsole.d.ts.map +1 -1
  18. package/dist/components/FlowMinimap/FlowMinimap.d.ts.map +1 -1
  19. package/dist/components/FlowToolbar/FlowToolbar.d.ts +27 -0
  20. package/dist/components/FlowToolbar/FlowToolbar.d.ts.map +1 -1
  21. package/dist/components/FlowToolbar/index.d.ts +1 -1
  22. package/dist/components/FlowToolbar/index.d.ts.map +1 -1
  23. package/dist/components/ItemDetail/ItemDetail.d.ts +57 -0
  24. package/dist/components/ItemDetail/ItemDetail.d.ts.map +1 -0
  25. package/dist/components/ItemDetail/index.d.ts +2 -0
  26. package/dist/components/ItemDetail/index.d.ts.map +1 -0
  27. package/dist/components/MessageBlockBuilder/BlockFieldsEditor.d.ts +18 -0
  28. package/dist/components/MessageBlockBuilder/BlockFieldsEditor.d.ts.map +1 -0
  29. package/dist/components/MessageBlockBuilder/MessageBlockBuilder.d.ts +6 -0
  30. package/dist/components/MessageBlockBuilder/MessageBlockBuilder.d.ts.map +1 -0
  31. package/dist/components/MessageBlockBuilder/MessagePreview.d.ts +9 -0
  32. package/dist/components/MessageBlockBuilder/MessagePreview.d.ts.map +1 -0
  33. package/dist/components/MessageBlockBuilder/TokenPanel.d.ts +17 -0
  34. package/dist/components/MessageBlockBuilder/TokenPanel.d.ts.map +1 -0
  35. package/dist/components/MessageBlockBuilder/glyphs.d.ts +18 -0
  36. package/dist/components/MessageBlockBuilder/glyphs.d.ts.map +1 -0
  37. package/dist/components/MessageBlockBuilder/index.d.ts +4 -0
  38. package/dist/components/MessageBlockBuilder/index.d.ts.map +1 -0
  39. package/dist/components/MessageBlockBuilder/internal.d.ts +33 -0
  40. package/dist/components/MessageBlockBuilder/internal.d.ts.map +1 -0
  41. package/dist/components/MessageBlockBuilder/platforms/googleChat.d.ts +7 -0
  42. package/dist/components/MessageBlockBuilder/platforms/googleChat.d.ts.map +1 -0
  43. package/dist/components/MessageBlockBuilder/platforms/index.d.ts +7 -0
  44. package/dist/components/MessageBlockBuilder/platforms/index.d.ts.map +1 -0
  45. package/dist/components/MessageBlockBuilder/platforms/slack.d.ts +7 -0
  46. package/dist/components/MessageBlockBuilder/platforms/slack.d.ts.map +1 -0
  47. package/dist/components/MessageBlockBuilder/platforms/teams.d.ts +7 -0
  48. package/dist/components/MessageBlockBuilder/platforms/teams.d.ts.map +1 -0
  49. package/dist/components/MessageBlockBuilder/types.d.ts +183 -0
  50. package/dist/components/MessageBlockBuilder/types.d.ts.map +1 -0
  51. package/dist/components/PlanCard/PlanCard.d.ts +35 -0
  52. package/dist/components/PlanCard/PlanCard.d.ts.map +1 -0
  53. package/dist/components/PlanCard/index.d.ts +2 -0
  54. package/dist/components/PlanCard/index.d.ts.map +1 -0
  55. package/dist/components/PlanPicker/PlanPicker.d.ts +16 -0
  56. package/dist/components/PlanPicker/PlanPicker.d.ts.map +1 -0
  57. package/dist/components/PlanPicker/context.d.ts +8 -0
  58. package/dist/components/PlanPicker/context.d.ts.map +1 -0
  59. package/dist/components/PlanPicker/index.d.ts +2 -0
  60. package/dist/components/PlanPicker/index.d.ts.map +1 -0
  61. package/dist/components/PricingCard/index.d.ts +1 -1
  62. package/dist/components/PricingCard/index.d.ts.map +1 -1
  63. package/dist/components/TemplateCard/TemplateCard.d.ts +27 -0
  64. package/dist/components/TemplateCard/TemplateCard.d.ts.map +1 -1
  65. package/dist/components/UsageMeter/UsageMeter.d.ts +41 -0
  66. package/dist/components/UsageMeter/UsageMeter.d.ts.map +1 -0
  67. package/dist/components/UsageMeter/index.d.ts +2 -0
  68. package/dist/components/UsageMeter/index.d.ts.map +1 -0
  69. package/dist/components/WorkflowShowcase/ShowcaseScene.d.ts +20 -0
  70. package/dist/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -0
  71. package/dist/components/WorkflowShowcase/ShowcaseSignup.d.ts +14 -0
  72. package/dist/components/WorkflowShowcase/ShowcaseSignup.d.ts.map +1 -0
  73. package/dist/components/WorkflowShowcase/WorkflowShowcase.d.ts +48 -0
  74. package/dist/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -0
  75. package/dist/components/WorkflowShowcase/index.d.ts +3 -0
  76. package/dist/components/WorkflowShowcase/index.d.ts.map +1 -0
  77. package/dist/components/WorkflowShowcase/showcaseEngine.d.ts +102 -0
  78. package/dist/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -0
  79. package/dist/index.cjs +16261 -11888
  80. package/dist/index.cjs.map +1 -1
  81. package/dist/index.d.ts +8 -2
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +19366 -20520
  84. package/dist/index.js.map +1 -1
  85. package/dist/marketing/components/AssistantTranscript/AssistantTranscript.d.ts +15 -0
  86. package/dist/marketing/components/AssistantTranscript/AssistantTranscript.d.ts.map +1 -0
  87. package/dist/marketing/components/CtaBanner/CtaBanner.d.ts +16 -0
  88. package/dist/marketing/components/CtaBanner/CtaBanner.d.ts.map +1 -0
  89. package/dist/marketing/components/FeatureGrid/FeatureGrid.d.ts +15 -0
  90. package/dist/marketing/components/FeatureGrid/FeatureGrid.d.ts.map +1 -0
  91. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts +19 -0
  92. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts.map +1 -0
  93. package/dist/marketing/components/LiveConsole/LiveConsole.d.ts +21 -0
  94. package/dist/marketing/components/LiveConsole/LiveConsole.d.ts.map +1 -0
  95. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts +25 -0
  96. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts.map +1 -0
  97. package/dist/marketing/components/MarketingHero/MarketingHero.d.ts +11 -0
  98. package/dist/marketing/components/MarketingHero/MarketingHero.d.ts.map +1 -0
  99. package/dist/marketing/components/MarketingNav/MarketingNav.d.ts +17 -0
  100. package/dist/marketing/components/MarketingNav/MarketingNav.d.ts.map +1 -0
  101. package/dist/marketing/components/MarketingSection/MarketingSection.d.ts +15 -0
  102. package/dist/marketing/components/MarketingSection/MarketingSection.d.ts.map +1 -0
  103. package/dist/marketing/components/StatBand/StatBand.d.ts +16 -0
  104. package/dist/marketing/components/StatBand/StatBand.d.ts.map +1 -0
  105. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts +20 -0
  106. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -0
  107. package/dist/marketing/components/WorkflowShowcase/ShowcaseSignup.d.ts +14 -0
  108. package/dist/marketing/components/WorkflowShowcase/ShowcaseSignup.d.ts.map +1 -0
  109. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts +48 -0
  110. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -0
  111. package/dist/marketing/components/WorkflowShowcase/index.d.ts +3 -0
  112. package/dist/marketing/components/WorkflowShowcase/index.d.ts.map +1 -0
  113. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts +102 -0
  114. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -0
  115. package/dist/marketing/glyphs.d.ts +20 -0
  116. package/dist/marketing/glyphs.d.ts.map +1 -0
  117. package/dist/marketing/index.d.ts +13 -0
  118. package/dist/marketing/index.d.ts.map +1 -0
  119. package/dist/marketing.cjs +3985 -0
  120. package/dist/marketing.cjs.map +1 -0
  121. package/dist/marketing.js +1669 -0
  122. package/dist/marketing.js.map +1 -0
  123. package/dist/styles.css +1 -1
  124. package/dist/workflow/components/FlowCanvas/FlowCanvas.d.ts +3 -3
  125. package/dist/workflow/components/FlowCanvas/FlowCanvas.d.ts.map +1 -1
  126. package/dist/workflow/components/FlowNode/FlowNode.d.ts.map +1 -1
  127. package/dist/workflow/components/Handle/Handle.d.ts.map +1 -1
  128. package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts +29 -0
  129. package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts.map +1 -0
  130. package/dist/workflow/components/HttpActionPanel/httpActionTypes.d.ts +135 -0
  131. package/dist/workflow/components/HttpActionPanel/httpActionTypes.d.ts.map +1 -0
  132. package/dist/workflow/components/NodeResizer/NodeResizer.d.ts.map +1 -1
  133. package/dist/workflow/index.d.ts +2 -0
  134. package/dist/workflow/index.d.ts.map +1 -1
  135. package/dist/workflow/layout/dagre.d.ts.map +1 -1
  136. package/dist/workflow/layout/elk.d.ts.map +1 -1
  137. package/dist/workflow/layout/types.d.ts +1 -1
  138. package/dist/workflow/layout/types.d.ts.map +1 -1
  139. package/dist/workflow/utils/parenting.d.ts +26 -6
  140. package/dist/workflow/utils/parenting.d.ts.map +1 -1
  141. package/dist/workflow.cjs +7118 -411
  142. package/dist/workflow.cjs.map +1 -1
  143. package/dist/workflow.js +1598 -68
  144. package/dist/workflow.js.map +1 -1
  145. 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