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

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 (63) hide show
  1. package/dist/chunk-64R3BAO7.js +2755 -0
  2. package/dist/chunk-64R3BAO7.js.map +1 -0
  3. package/dist/chunk-7S3CSRRV.js +5700 -0
  4. package/dist/chunk-7S3CSRRV.js.map +1 -0
  5. package/dist/chunk-KCA7V5VN.js +5752 -0
  6. package/dist/chunk-KCA7V5VN.js.map +1 -0
  7. package/dist/chunk-KQKD4Z4H.js +1682 -0
  8. package/dist/chunk-KQKD4Z4H.js.map +1 -0
  9. package/dist/chunk-PWCRELX4.js +5700 -0
  10. package/dist/chunk-PWCRELX4.js.map +1 -0
  11. package/dist/chunk-U5T63SPL.js +5695 -0
  12. package/dist/chunk-U5T63SPL.js.map +1 -0
  13. package/dist/chunk-YIPBLM3G.js +2698 -0
  14. package/dist/chunk-YIPBLM3G.js.map +1 -0
  15. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  16. package/dist/index.cjs +5 -0
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.js +4462 -6007
  19. package/dist/index.js.map +1 -1
  20. package/dist/marketing/components/BackedBy/BackedBy.d.ts +17 -0
  21. package/dist/marketing/components/BackedBy/BackedBy.d.ts.map +1 -0
  22. package/dist/marketing/components/BetaAccessForm/BetaAccessForm.d.ts +36 -0
  23. package/dist/marketing/components/BetaAccessForm/BetaAccessForm.d.ts.map +1 -0
  24. package/dist/marketing/components/BlogGrid/BlogGrid.d.ts +32 -0
  25. package/dist/marketing/components/BlogGrid/BlogGrid.d.ts.map +1 -0
  26. package/dist/marketing/components/ContactForm/ContactForm.d.ts +31 -0
  27. package/dist/marketing/components/ContactForm/ContactForm.d.ts.map +1 -0
  28. package/dist/marketing/components/FaqSection/FaqSection.d.ts +13 -0
  29. package/dist/marketing/components/FaqSection/FaqSection.d.ts.map +1 -0
  30. package/dist/marketing/components/IntegrationsFinder/IntegrationsFinder.d.ts +32 -0
  31. package/dist/marketing/components/IntegrationsFinder/IntegrationsFinder.d.ts.map +1 -0
  32. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts +5 -3
  33. package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts.map +1 -1
  34. package/dist/marketing/components/LiveConsole/LiveConsole.d.ts.map +1 -1
  35. package/dist/marketing/components/LogoMarquee/LogoMarquee.d.ts +18 -0
  36. package/dist/marketing/components/LogoMarquee/LogoMarquee.d.ts.map +1 -0
  37. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts +6 -1
  38. package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts.map +1 -1
  39. package/dist/marketing/components/PageHero/PageHero.d.ts +12 -0
  40. package/dist/marketing/components/PageHero/PageHero.d.ts.map +1 -0
  41. package/dist/marketing/components/PricingTiers/PricingTiers.d.ts +29 -0
  42. package/dist/marketing/components/PricingTiers/PricingTiers.d.ts.map +1 -0
  43. package/dist/marketing/components/TestimonialStrip/TestimonialStrip.d.ts +24 -0
  44. package/dist/marketing/components/TestimonialStrip/TestimonialStrip.d.ts.map +1 -0
  45. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts +4 -2
  46. package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -1
  47. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts +9 -1
  48. package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -1
  49. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts +3 -1
  50. package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -1
  51. package/dist/marketing/index.d.ts +10 -0
  52. package/dist/marketing/index.d.ts.map +1 -1
  53. package/dist/marketing.cjs +5568 -2972
  54. package/dist/marketing.cjs.map +1 -1
  55. package/dist/marketing.js +1650 -717
  56. package/dist/marketing.js.map +1 -1
  57. package/dist/styles.css +1 -1
  58. package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts.map +1 -1
  59. package/dist/workflow.cjs +11 -2
  60. package/dist/workflow.cjs.map +1 -1
  61. package/dist/workflow.js +11 -7
  62. package/dist/workflow.js.map +1 -1
  63. package/package.json +1 -1
package/dist/marketing.js CHANGED
@@ -1,11 +1,16 @@
1
1
  import {
2
- CountUp
3
- } from "./chunk-X7YETDK7.js";
2
+ BlogCard,
3
+ CountUp,
4
+ TestimonialCard,
5
+ Textarea
6
+ } from "./chunk-KQKD4Z4H.js";
4
7
  import {
8
+ Accordion,
5
9
  Button,
6
10
  Input,
7
- Select
8
- } from "./chunk-KZP2MNBO.js";
11
+ Select,
12
+ Spinner
13
+ } from "./chunk-64R3BAO7.js";
9
14
  import {
10
15
  cn
11
16
  } from "./chunk-ZAUUGK2Y.js";
@@ -42,14 +47,603 @@ function AssistantTranscript({
42
47
  ] });
43
48
  }
44
49
 
45
- // src/marketing/components/CtaBanner/CtaBanner.tsx
50
+ // src/marketing/components/BackedBy/BackedBy.tsx
46
51
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
52
+ function BackedBy({
53
+ items,
54
+ label = "Backed by",
55
+ note,
56
+ align = "center",
57
+ className,
58
+ ...rest
59
+ }) {
60
+ return /* @__PURE__ */ jsxs2(
61
+ "div",
62
+ {
63
+ ...rest,
64
+ className: cn("ods-mkt-backedby", align === "start" && "ods-mkt-backedby--start", className),
65
+ children: [
66
+ label && /* @__PURE__ */ jsx2("p", { className: "ods-mkt-backedby__label", children: label }),
67
+ /* @__PURE__ */ jsx2("div", { className: "ods-mkt-backedby__row", children: items.map((item) => /* @__PURE__ */ jsx2("span", { className: "ods-mkt-backedby__mark", title: item.name, children: item.icon ?? /* @__PURE__ */ jsx2("span", { className: "ods-mkt-backedby__wordmark", children: item.name }) }, item.id)) }),
68
+ note && /* @__PURE__ */ jsx2("p", { className: "ods-mkt-backedby__note", children: note })
69
+ ]
70
+ }
71
+ );
72
+ }
73
+
74
+ // src/marketing/components/BetaAccessForm/BetaAccessForm.tsx
75
+ import { useId, useState } from "react";
76
+
77
+ // src/marketing/components/WorkflowShowcase/showcaseEngine.ts
78
+ var SETTLED_PHASES = [
79
+ "done",
80
+ "signup",
81
+ "creating",
82
+ "welcome"
83
+ ];
84
+ var WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS = [
85
+ { name: "Storefront", role: "source", aliases: ["store", "shop orders"] },
86
+ { name: "Payments", role: "source", aliases: ["payouts"] },
87
+ { name: "Orders DB", role: "source", aliases: ["orders database"] },
88
+ { name: "CRM", role: "source", aliases: ["crm leads"] },
89
+ { name: "Warehouse", role: "destination" },
90
+ { name: "Lakehouse", role: "destination" },
91
+ { name: "Campaigns", role: "action", aliases: ["campaign"] },
92
+ { name: "Team Chat", role: "notify", aliases: ["chat", "alert the team"] }
93
+ ];
94
+ var WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES = [
95
+ {
96
+ id: "hourly-sync",
97
+ label: "Storefront orders \u2192 Warehouse, hourly",
98
+ prompt: "Sync Storefront orders to Warehouse every hour, alert sales in Team Chat"
99
+ },
100
+ {
101
+ id: "daily-load",
102
+ label: "Payments payouts \u2192 Lakehouse, daily",
103
+ prompt: "Load Payments payouts into Lakehouse daily"
104
+ },
105
+ {
106
+ id: "realtime-stream",
107
+ label: "Orders DB changes \u2192 Warehouse + Team Chat",
108
+ prompt: "Stream Orders DB changes to Warehouse in real-time and notify Team Chat"
109
+ }
110
+ ];
111
+ var WORKFLOW_SHOWCASE_DEFAULT_METRICS = [
112
+ { id: "throughput", value: 2341, buildingValue: 842, unit: "rows/min", label: "THROUGHPUT" },
113
+ {
114
+ id: "latency",
115
+ value: 0.8,
116
+ buildingValue: 1.1,
117
+ decimals: 1,
118
+ unit: "s latency",
119
+ label: "SYNC SPEED"
120
+ },
121
+ { id: "cost", value: 43, suffix: "%", label: "SAVED VS BASELINE", tone: "success" }
122
+ ];
123
+ var WORKFLOW_SHOWCASE_SCHEDULES = ["AUTO", "HOURLY", "DAILY", "REAL-TIME"];
124
+ var WORKFLOW_SHOWCASE_TRIGGERS = ["SCHEDULE", "WEBHOOK", "APP EVENT", "MANUAL"];
125
+ var WORKFLOW_SHOWCASE_DEFAULT_TILES = [
126
+ "ELT",
127
+ "CDC",
128
+ "LLM",
129
+ "RAG",
130
+ "HEAL",
131
+ "COST",
132
+ "IDP",
133
+ "VEC"
134
+ ];
135
+ function escapeRegExp(value) {
136
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
137
+ }
138
+ function mentionsOf(catalog) {
139
+ const out = [];
140
+ for (const connector of catalog) {
141
+ out.push({ connector, pattern: connector.name });
142
+ for (const alias of connector.aliases ?? []) out.push({ connector, pattern: alias });
143
+ }
144
+ return out.sort((a, b) => b.pattern.length - a.pattern.length);
145
+ }
146
+ function detectConnectors(prompt, catalog) {
147
+ const lower = prompt.toLowerCase();
148
+ return catalog.filter((c) => [c.name, ...c.aliases ?? []].some((p) => lower.includes(p.toLowerCase()))).map((c) => c.name);
149
+ }
150
+ function segmentPrompt(prompt, catalog) {
151
+ if (!prompt) return [];
152
+ const mentions = mentionsOf(catalog);
153
+ if (!mentions.length) return [{ text: prompt }];
154
+ const re = new RegExp(`(${mentions.map((m) => escapeRegExp(m.pattern)).join("|")})`, "gi");
155
+ const byPattern = new Map(mentions.map((m) => [m.pattern.toLowerCase(), m.connector]));
156
+ return prompt.split(re).filter((part) => part !== "").map((part) => {
157
+ const connector = byPattern.get(part.toLowerCase());
158
+ return connector ? { text: part, connector } : { text: part };
159
+ });
160
+ }
161
+ function scheduleFromPrompt(prompt) {
162
+ const t = prompt.toLowerCase();
163
+ if (/stream|real.?time|cdc/.test(t)) return "REAL-TIME";
164
+ if (/hour/.test(t)) return "HOURLY";
165
+ if (/dail|every day|nightly/.test(t)) return "DAILY";
166
+ return null;
167
+ }
168
+ var RIGHT_ORDER = {
169
+ source: -1,
170
+ destination: 0,
171
+ action: 1,
172
+ notify: 2
173
+ };
174
+ function resolvePlan(selected, detected, catalog) {
175
+ const byName = new Map(catalog.map((c) => [c.name, c]));
176
+ let names = [.../* @__PURE__ */ new Set([...selected, ...detected])].filter((n) => byName.has(n));
177
+ if (!names.length) {
178
+ const fallback = [
179
+ catalog.find((c) => c.role === "source"),
180
+ catalog.find((c) => c.role === "destination"),
181
+ catalog.find((c) => c.role === "notify")
182
+ ].filter((c) => Boolean(c));
183
+ names = fallback.map((c) => c.name);
184
+ }
185
+ const has = (predicate) => names.some((n) => {
186
+ const c = byName.get(n);
187
+ return Boolean(c && predicate(c));
188
+ });
189
+ if (!has((c) => c.role === "source")) {
190
+ const source = catalog.find((c) => c.role === "source");
191
+ if (source) names = [source.name, ...names];
192
+ }
193
+ if (!has((c) => c.role !== "source")) {
194
+ const sink = catalog.find((c) => c.role === "notify") ?? catalog.find((c) => c.role !== "source");
195
+ if (sink) names = [...names, sink.name];
196
+ }
197
+ const picked = catalog.filter((c) => names.includes(c.name));
198
+ const left = picked.filter((c) => c.role === "source");
199
+ const right = picked.filter((c) => c.role !== "source").sort((a, b) => RIGHT_ORDER[a.role] - RIGHT_ORDER[b.role]);
200
+ const all = [...left, ...right];
201
+ return { left, right, all, totalSteps: all.length + 1 };
202
+ }
203
+ function stepVerb(role) {
204
+ if (role === "notify") return "alert";
205
+ if (role === "action") return "trigger";
206
+ return "load";
207
+ }
208
+ function assembleSteps(plan) {
209
+ return [
210
+ ...plan.left.map((c) => `${c.name.toLowerCase()} extract`),
211
+ "schema map \xB7 14 fields",
212
+ ...plan.right.map((c) => `${c.name.toLowerCase()} ${stepVerb(c.role)}`)
213
+ ];
214
+ }
215
+ function buildActivity(args) {
216
+ const { phase, shown, plan, selected, status } = args;
217
+ const settled = SETTLED_PHASES.includes(phase);
218
+ const lines = [];
219
+ if (phase === "idle") {
220
+ if (!selected.length) {
221
+ lines.push({ id: "wait", text: "\u25B8 waiting for instructions\u2026", tone: "muted" });
222
+ lines.push({ id: "hint", text: "\xB7 type a request or pick apps", tone: "faint" });
223
+ }
224
+ for (const name of selected.slice(-6)) {
225
+ lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: "plain" });
226
+ }
227
+ return lines;
228
+ }
229
+ if (phase === "analyzing") {
230
+ for (const name of selected.slice(-4)) {
231
+ lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: "muted" });
232
+ }
233
+ lines.push({ id: "status", text: `\u27F3 ${status}`, tone: "active" });
234
+ return lines;
235
+ }
236
+ assembleSteps(plan).forEach((step, i) => {
237
+ if (settled || shown > i) lines.push({ id: `step-${i}`, text: `\u2713 ${step}`, tone: "done" });
238
+ else if (shown === i) lines.push({ id: `step-${i}`, text: `\u27F3 ${step}\u2026`, tone: "active" });
239
+ else lines.push({ id: `step-${i}`, text: `\xB7 ${step} queued`, tone: "muted" });
240
+ });
241
+ if (settled) lines.push({ id: "errors", text: "\u2713 error handling attached", tone: "done" });
242
+ return lines.slice(-8);
243
+ }
244
+ function slugify(value) {
245
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "your-team";
246
+ }
247
+ function isValidEmail(value) {
248
+ return /^\S+@\S+\.\S+$/.test(value.trim());
249
+ }
250
+
251
+ // src/marketing/components/BetaAccessForm/BetaAccessForm.tsx
252
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
253
+ function BetaAccessForm({
254
+ title = "Request early access",
255
+ subtitle = "CURRENTLY IN PRIVATE BETA \u2014 WE REVIEW ACCESS REQUESTS WEEKLY",
256
+ fields = "email",
257
+ appearance = "card",
258
+ teamSizes,
259
+ plans,
260
+ defaultPlan,
261
+ submitLabel = "Request access \u2192",
262
+ footnote = "NO CREDIT CARD \xB7 SSO & SELF-HOSTING AVAILABLE",
263
+ onSubmit,
264
+ successTitle = "Request received.",
265
+ successBody = "We review access requests weekly \u2014 you'll hear from us by email.",
266
+ disabled = false,
267
+ className
268
+ }) {
269
+ const uid = useId();
270
+ const [values, setValues] = useState({
271
+ email: "",
272
+ name: "",
273
+ company: "",
274
+ teamSize: "",
275
+ plan: defaultPlan ?? ""
276
+ });
277
+ const [phase, setPhase] = useState("idle");
278
+ const [error, setError] = useState(null);
279
+ const handleSubmit = async (event) => {
280
+ event.preventDefault();
281
+ if (phase === "submitting") return;
282
+ if (!isValidEmail(values.email)) {
283
+ setError("Please enter a valid work email.");
284
+ return;
285
+ }
286
+ if (fields === "full" && !values.name?.trim()) {
287
+ setError("Please enter your name.");
288
+ return;
289
+ }
290
+ if (fields === "full" && teamSizes?.length && !values.teamSize) {
291
+ setError("Please select your team size.");
292
+ return;
293
+ }
294
+ setError(null);
295
+ setPhase("submitting");
296
+ try {
297
+ await onSubmit?.(values);
298
+ setPhase("success");
299
+ } catch {
300
+ setError("Something went wrong \u2014 please try again.");
301
+ setPhase("idle");
302
+ }
303
+ };
304
+ const inline = appearance === "inline";
305
+ if (phase === "success") {
306
+ return /* @__PURE__ */ jsxs3(
307
+ "div",
308
+ {
309
+ className: cn(
310
+ "ods-mkt-access",
311
+ "ods-mkt-access--success",
312
+ inline && "ods-mkt-access--inline",
313
+ className
314
+ ),
315
+ role: "status",
316
+ children: [
317
+ /* @__PURE__ */ jsxs3("p", { className: "ods-mkt-access__success-mark", children: [
318
+ "\u2713 ",
319
+ successTitle
320
+ ] }),
321
+ /* @__PURE__ */ jsx3("p", { className: "ods-mkt-access__success-body", children: successBody })
322
+ ]
323
+ }
324
+ );
325
+ }
326
+ const busy = disabled || phase === "submitting";
327
+ return /* @__PURE__ */ jsxs3(
328
+ "form",
329
+ {
330
+ className: cn("ods-mkt-access", inline && "ods-mkt-access--inline", className),
331
+ onSubmit: handleSubmit,
332
+ noValidate: true,
333
+ children: [
334
+ /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__head", children: [
335
+ /* @__PURE__ */ jsx3("h3", { className: "ods-mkt-access__title", children: title }),
336
+ subtitle && /* @__PURE__ */ jsx3("p", { className: "ods-mkt-access__subtitle", children: subtitle })
337
+ ] }),
338
+ /* @__PURE__ */ jsxs3(
339
+ "div",
340
+ {
341
+ className: cn(
342
+ "ods-mkt-access__fields",
343
+ fields === "full" && "ods-mkt-access__fields--full"
344
+ ),
345
+ children: [
346
+ fields === "full" && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
347
+ /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-name`, children: "Full name" }),
348
+ /* @__PURE__ */ jsx3(
349
+ Input,
350
+ {
351
+ id: `${uid}-name`,
352
+ autoComplete: "name",
353
+ placeholder: "Ada Lovelace",
354
+ value: values.name ?? "",
355
+ onChange: (e) => setValues((v) => ({ ...v, name: e.target.value })),
356
+ disabled: busy
357
+ }
358
+ )
359
+ ] }),
360
+ /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
361
+ /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-email`, children: "Work email" }),
362
+ /* @__PURE__ */ jsx3(
363
+ Input,
364
+ {
365
+ id: `${uid}-email`,
366
+ type: "email",
367
+ autoComplete: "email",
368
+ placeholder: "ada@company.com",
369
+ value: values.email,
370
+ onChange: (e) => setValues((v) => ({ ...v, email: e.target.value })),
371
+ disabled: busy
372
+ }
373
+ )
374
+ ] }),
375
+ fields === "full" && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
376
+ /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-company`, children: "Company" }),
377
+ /* @__PURE__ */ jsx3(
378
+ Input,
379
+ {
380
+ id: `${uid}-company`,
381
+ autoComplete: "organization",
382
+ placeholder: "Acme Inc.",
383
+ value: values.company ?? "",
384
+ onChange: (e) => setValues((v) => ({ ...v, company: e.target.value })),
385
+ disabled: busy
386
+ }
387
+ )
388
+ ] }),
389
+ fields === "full" && teamSizes && teamSizes.length > 0 && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
390
+ /* @__PURE__ */ jsx3("span", { className: "ods-mkt-access__label", id: `${uid}-teamsize-label`, children: "Team size" }),
391
+ /* @__PURE__ */ jsx3(
392
+ Select,
393
+ {
394
+ "aria-labelledby": `${uid}-teamsize-label`,
395
+ placeholder: "Select team size\u2026",
396
+ options: teamSizes.map((size) => ({ value: size, label: size })),
397
+ value: values.teamSize ?? "",
398
+ onChange: (teamSize) => setValues((v) => ({ ...v, teamSize })),
399
+ disabled: busy
400
+ }
401
+ )
402
+ ] }),
403
+ fields === "full" && plans && plans.length > 0 && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
404
+ /* @__PURE__ */ jsx3("span", { className: "ods-mkt-access__label", id: `${uid}-plan-label`, children: "Plan (optional)" }),
405
+ /* @__PURE__ */ jsx3(
406
+ Select,
407
+ {
408
+ "aria-labelledby": `${uid}-plan-label`,
409
+ placeholder: "Not sure yet",
410
+ options: plans.map((plan) => ({ value: plan, label: plan })),
411
+ value: values.plan ?? "",
412
+ onChange: (plan) => setValues((v) => ({ ...v, plan })),
413
+ disabled: busy
414
+ }
415
+ )
416
+ ] }),
417
+ /* @__PURE__ */ jsx3(
418
+ Button,
419
+ {
420
+ type: "submit",
421
+ variant: "primary",
422
+ loading: phase === "submitting",
423
+ disabled,
424
+ children: submitLabel
425
+ }
426
+ )
427
+ ]
428
+ }
429
+ ),
430
+ error && /* @__PURE__ */ jsx3("p", { className: "ods-mkt-access__error", role: "alert", children: error }),
431
+ footnote && /* @__PURE__ */ jsx3("p", { className: "ods-mkt-access__footnote", children: footnote })
432
+ ]
433
+ }
434
+ );
435
+ }
436
+
437
+ // src/marketing/components/BlogGrid/BlogGrid.tsx
438
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
439
+ function BlogGrid({
440
+ posts,
441
+ columns = 3,
442
+ viewAllHref,
443
+ viewAllLabel = "View all posts \u2192",
444
+ className,
445
+ ...rest
446
+ }) {
447
+ return /* @__PURE__ */ jsxs4("div", { ...rest, className: cn("ods-mkt-blog", className), children: [
448
+ /* @__PURE__ */ jsx4("div", { className: cn("ods-mkt-blog__grid", `ods-mkt-blog__grid--${columns}`), children: posts.map((post) => /* @__PURE__ */ jsx4(
449
+ BlogCard,
450
+ {
451
+ title: post.title,
452
+ description: post.excerpt,
453
+ href: post.href,
454
+ meta: post.date,
455
+ readingTime: post.readTime,
456
+ tags: post.tags,
457
+ cover: post.cover,
458
+ author: post.author
459
+ },
460
+ post.id
461
+ )) }),
462
+ viewAllHref && /* @__PURE__ */ jsx4("div", { className: "ods-mkt-blog__more", children: /* @__PURE__ */ jsx4("a", { className: "ods-mkt-blog__more-link", href: viewAllHref, children: viewAllLabel }) })
463
+ ] });
464
+ }
465
+
466
+ // src/marketing/components/ContactForm/ContactForm.tsx
467
+ import { useId as useId2, useState as useState2 } from "react";
468
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
469
+ function ContactForm({
470
+ title = "Talk to us",
471
+ subtitle = "SALES \xB7 PARTNERSHIPS \xB7 ANYTHING ELSE \u2014 WE READ EVERYTHING",
472
+ topics,
473
+ submitLabel = "Send message \u2192",
474
+ footnote = "WE USUALLY REPLY WITHIN ONE BUSINESS DAY",
475
+ onSubmit,
476
+ successTitle = "Message sent.",
477
+ successBody = "Thanks for reaching out \u2014 we'll get back to you by email.",
478
+ disabled = false,
479
+ className
480
+ }) {
481
+ const uid = useId2();
482
+ const [values, setValues] = useState2({
483
+ name: "",
484
+ email: "",
485
+ company: "",
486
+ topic: "",
487
+ message: ""
488
+ });
489
+ const selectedTopic = topics?.find((t) => t.value === values.topic);
490
+ const [phase, setPhase] = useState2("idle");
491
+ const [error, setError] = useState2(null);
492
+ const handleSubmit = async (event) => {
493
+ event.preventDefault();
494
+ if (phase === "submitting") return;
495
+ if (!values.name.trim()) {
496
+ setError("Please enter your name.");
497
+ return;
498
+ }
499
+ if (!isValidEmail(values.email)) {
500
+ setError("Please enter a valid work email.");
501
+ return;
502
+ }
503
+ if (topics?.length && !values.topic) {
504
+ setError("Please choose a topic.");
505
+ return;
506
+ }
507
+ if (!values.message.trim()) {
508
+ setError("Please write a short message.");
509
+ return;
510
+ }
511
+ setError(null);
512
+ setPhase("submitting");
513
+ try {
514
+ await onSubmit?.(values);
515
+ setPhase("success");
516
+ } catch {
517
+ setError("Something went wrong \u2014 please try again.");
518
+ setPhase("idle");
519
+ }
520
+ };
521
+ if (phase === "success") {
522
+ return /* @__PURE__ */ jsxs5("div", { className: cn("ods-mkt-contact", "ods-mkt-contact--success", className), role: "status", children: [
523
+ /* @__PURE__ */ jsxs5("p", { className: "ods-mkt-contact__success-mark", children: [
524
+ "\u2713 ",
525
+ successTitle
526
+ ] }),
527
+ /* @__PURE__ */ jsx5("p", { className: "ods-mkt-contact__success-body", children: successBody })
528
+ ] });
529
+ }
530
+ const busy = disabled || phase === "submitting";
531
+ return /* @__PURE__ */ jsxs5("form", { className: cn("ods-mkt-contact", className), onSubmit: handleSubmit, noValidate: true, children: [
532
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__head", children: [
533
+ /* @__PURE__ */ jsx5("h3", { className: "ods-mkt-contact__title", children: title }),
534
+ subtitle && /* @__PURE__ */ jsx5("p", { className: "ods-mkt-contact__subtitle", children: subtitle })
535
+ ] }),
536
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__grid", children: [
537
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__field", children: [
538
+ /* @__PURE__ */ jsx5("label", { className: "ods-mkt-contact__label", htmlFor: `${uid}-name`, children: "Full name" }),
539
+ /* @__PURE__ */ jsx5(
540
+ Input,
541
+ {
542
+ id: `${uid}-name`,
543
+ autoComplete: "name",
544
+ placeholder: "Ada Lovelace",
545
+ value: values.name,
546
+ onChange: (e) => setValues((v) => ({ ...v, name: e.target.value })),
547
+ disabled: busy
548
+ }
549
+ )
550
+ ] }),
551
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__field", children: [
552
+ /* @__PURE__ */ jsx5("label", { className: "ods-mkt-contact__label", htmlFor: `${uid}-email`, children: "Work email" }),
553
+ /* @__PURE__ */ jsx5(
554
+ Input,
555
+ {
556
+ id: `${uid}-email`,
557
+ type: "email",
558
+ autoComplete: "email",
559
+ placeholder: "ada@company.com",
560
+ value: values.email,
561
+ onChange: (e) => setValues((v) => ({ ...v, email: e.target.value })),
562
+ disabled: busy
563
+ }
564
+ )
565
+ ] }),
566
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__field ods-mkt-contact__field--wide", children: [
567
+ /* @__PURE__ */ jsxs5("label", { className: "ods-mkt-contact__label", htmlFor: `${uid}-company`, children: [
568
+ "Company ",
569
+ /* @__PURE__ */ jsx5("span", { className: "ods-mkt-contact__optional", children: "(optional)" })
570
+ ] }),
571
+ /* @__PURE__ */ jsx5(
572
+ Input,
573
+ {
574
+ id: `${uid}-company`,
575
+ autoComplete: "organization",
576
+ placeholder: "Acme Inc.",
577
+ value: values.company ?? "",
578
+ onChange: (e) => setValues((v) => ({ ...v, company: e.target.value })),
579
+ disabled: busy
580
+ }
581
+ )
582
+ ] }),
583
+ topics && topics.length > 0 && /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__field ods-mkt-contact__field--wide", children: [
584
+ /* @__PURE__ */ jsx5("span", { className: "ods-mkt-contact__label", id: `${uid}-topic-label`, children: "Topic" }),
585
+ /* @__PURE__ */ jsx5(
586
+ Select,
587
+ {
588
+ "aria-labelledby": `${uid}-topic-label`,
589
+ placeholder: "Choose a topic\u2026",
590
+ options: topics.map((t) => ({ value: t.value, label: t.label })),
591
+ value: values.topic ?? "",
592
+ onChange: (topic) => setValues((v) => ({ ...v, topic })),
593
+ disabled: busy
594
+ }
595
+ ),
596
+ selectedTopic?.hint && /* @__PURE__ */ jsx5("p", { className: "ods-mkt-contact__topic-hint", children: selectedTopic.hint })
597
+ ] }),
598
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__field ods-mkt-contact__field--wide", children: [
599
+ /* @__PURE__ */ jsx5(
600
+ "label",
601
+ {
602
+ className: "ods-mkt-contact__label",
603
+ id: `${uid}-message-label`,
604
+ htmlFor: `${uid}-message`,
605
+ children: "Message"
606
+ }
607
+ ),
608
+ /* @__PURE__ */ jsx5(
609
+ Textarea,
610
+ {
611
+ id: `${uid}-message`,
612
+ "aria-labelledby": `${uid}-message-label`,
613
+ placeholder: "What are you trying to build?",
614
+ rows: 4,
615
+ value: values.message,
616
+ onChange: (e) => setValues((v) => ({ ...v, message: e.target.value })),
617
+ disabled: busy
618
+ }
619
+ )
620
+ ] })
621
+ ] }),
622
+ error && /* @__PURE__ */ jsx5("p", { className: "ods-mkt-contact__error", role: "alert", children: error }),
623
+ /* @__PURE__ */ jsxs5("div", { className: "ods-mkt-contact__foot", children: [
624
+ footnote && /* @__PURE__ */ jsx5("p", { className: "ods-mkt-contact__footnote", children: footnote }),
625
+ /* @__PURE__ */ jsx5(
626
+ Button,
627
+ {
628
+ type: "submit",
629
+ variant: "primary",
630
+ loading: phase === "submitting",
631
+ disabled,
632
+ children: submitLabel
633
+ }
634
+ )
635
+ ] })
636
+ ] });
637
+ }
638
+
639
+ // src/marketing/components/CtaBanner/CtaBanner.tsx
640
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
47
641
  function Action({
48
642
  action,
49
643
  variant
50
644
  }) {
51
645
  if (action.href) {
52
- return /* @__PURE__ */ jsx2(
646
+ return /* @__PURE__ */ jsx6(
53
647
  "a",
54
648
  {
55
649
  className: cn("ods-mkt-cta__link", `ods-mkt-cta__link--${variant}`),
@@ -59,7 +653,7 @@ function Action({
59
653
  }
60
654
  );
61
655
  }
62
- return /* @__PURE__ */ jsx2(Button, { variant, onClick: action.onClick, children: action.label });
656
+ return /* @__PURE__ */ jsx6(Button, { variant, onClick: action.onClick, children: action.label });
63
657
  }
64
658
  function CtaBanner({
65
659
  title,
@@ -70,47 +664,373 @@ function CtaBanner({
70
664
  className,
71
665
  ...rest
72
666
  }) {
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" })
667
+ return /* @__PURE__ */ jsxs6("section", { ...rest, className: cn("ods-mkt-cta", className), children: [
668
+ /* @__PURE__ */ jsx6("h2", { className: "ods-mkt-cta__title", children: title }),
669
+ lede && /* @__PURE__ */ jsx6("p", { className: "ods-mkt-cta__lede", children: lede }),
670
+ /* @__PURE__ */ jsxs6("div", { className: "ods-mkt-cta__actions", children: [
671
+ /* @__PURE__ */ jsx6(Action, { action: primary, variant: "primary" }),
672
+ secondary && /* @__PURE__ */ jsx6(Action, { action: secondary, variant: "secondary" })
673
+ ] }),
674
+ footnote && /* @__PURE__ */ jsx6("p", { className: "ods-mkt-cta__footnote", children: footnote })
675
+ ] });
676
+ }
677
+
678
+ // src/marketing/components/FaqSection/FaqSection.tsx
679
+ import { jsx as jsx7 } from "react/jsx-runtime";
680
+ function FaqSection({
681
+ items,
682
+ columns = 1,
683
+ defaultOpenIds = [],
684
+ className,
685
+ ...rest
686
+ }) {
687
+ const half = Math.ceil(items.length / 2);
688
+ const columnItems = columns === 2 ? [items.slice(0, half), items.slice(half)] : [items];
689
+ return /* @__PURE__ */ jsx7("div", { ...rest, className: cn("ods-mkt-faq", columns === 2 && "ods-mkt-faq--2", className), children: columnItems.map((column, i) => /* @__PURE__ */ jsx7(
690
+ Accordion,
691
+ {
692
+ mode: "multiple",
693
+ defaultValue: defaultOpenIds,
694
+ items: column.map((item) => ({
695
+ id: item.id,
696
+ label: item.question,
697
+ content: /* @__PURE__ */ jsx7("div", { className: "ods-mkt-faq__answer", children: item.answer })
698
+ }))
699
+ },
700
+ i
701
+ )) });
702
+ }
703
+
704
+ // src/marketing/components/FeatureGrid/FeatureGrid.tsx
705
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
706
+ function FeatureGrid({
707
+ items,
708
+ columns = 3,
709
+ dense = false,
710
+ className,
711
+ ...rest
712
+ }) {
713
+ return /* @__PURE__ */ jsx8(
714
+ "div",
715
+ {
716
+ ...rest,
717
+ className: cn(
718
+ "ods-mkt-features",
719
+ `ods-mkt-features--${columns}`,
720
+ dense && "ods-mkt-features--dense",
721
+ className
722
+ ),
723
+ children: items.map((item) => /* @__PURE__ */ jsxs7("article", { className: "ods-mkt-features__cell", children: [
724
+ item.icon && /* @__PURE__ */ jsx8("span", { className: "ods-mkt-features__icon", "aria-hidden": "true", children: item.icon }),
725
+ /* @__PURE__ */ jsx8("h3", { className: "ods-mkt-features__title", children: item.title }),
726
+ /* @__PURE__ */ jsx8("p", { className: "ods-mkt-features__body", children: item.body })
727
+ ] }, item.id))
728
+ }
729
+ );
730
+ }
731
+
732
+ // src/marketing/components/IntegrationsFinder/IntegrationsFinder.tsx
733
+ import { CheckmarkIcon, SearchIcon } from "@octaviaflow/icons";
734
+ import { useMemo, useState as useState3 } from "react";
735
+ import { Fragment, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
736
+ function LetterTile({ name }) {
737
+ return /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__letter", "aria-hidden": "true", children: name.trim().charAt(0).toUpperCase() });
738
+ }
739
+ function IntegrationsFinder({
740
+ items,
741
+ categories,
742
+ searchPlaceholder = "Find your connector \u2014 search by name or category\u2026",
743
+ universalBadgeLabel = "Open API",
744
+ onRequestConnector,
745
+ requestErrorHint = "Couldn't send right now \u2014 please try again in a moment.",
746
+ className
747
+ }) {
748
+ const [query, setQuery] = useState3("");
749
+ const [activeCategory, setActiveCategory] = useState3(null);
750
+ const [email, setEmail] = useState3("");
751
+ const [requestState, setRequestState] = useState3("idle");
752
+ const [emailError, setEmailError] = useState3(false);
753
+ const pillCategories = useMemo(() => {
754
+ if (categories?.length) return categories;
755
+ const seen = [];
756
+ for (const item of items) {
757
+ if (!seen.includes(item.category)) seen.push(item.category);
758
+ }
759
+ return seen;
760
+ }, [categories, items]);
761
+ const counts = useMemo(() => {
762
+ const map = /* @__PURE__ */ new Map();
763
+ for (const item of items) map.set(item.category, (map.get(item.category) ?? 0) + 1);
764
+ return map;
765
+ }, [items]);
766
+ const results = useMemo(() => {
767
+ const q = query.trim().toLowerCase();
768
+ let list = items;
769
+ if (activeCategory) list = list.filter((c) => c.category === activeCategory);
770
+ if (q) {
771
+ list = list.filter(
772
+ (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q) || c.aliases?.some((a) => a.toLowerCase().includes(q))
773
+ );
774
+ }
775
+ return [...list].sort((a, b) => {
776
+ const aKind = a.kind ?? "native";
777
+ const bKind = b.kind ?? "native";
778
+ if (aKind !== bKind) return aKind === "native" ? -1 : 1;
779
+ return a.name.localeCompare(b.name);
780
+ });
781
+ }, [items, query, activeCategory]);
782
+ const handleRequest = async (event) => {
783
+ event.preventDefault();
784
+ if (!onRequestConnector || requestState === "sending") return;
785
+ if (!isValidEmail(email)) {
786
+ setEmailError(true);
787
+ return;
788
+ }
789
+ setEmailError(false);
790
+ setRequestState("sending");
791
+ try {
792
+ await onRequestConnector({ query: query.trim(), email });
793
+ setRequestState("sent");
794
+ } catch {
795
+ setRequestState("error");
796
+ }
797
+ };
798
+ return /* @__PURE__ */ jsxs8("div", { className: cn("ods-mkt-finder", className), children: [
799
+ /* @__PURE__ */ jsx9("div", { className: "ods-mkt-finder__search", children: /* @__PURE__ */ jsx9(
800
+ Input,
801
+ {
802
+ type: "search",
803
+ "aria-label": "Search connectors",
804
+ placeholder: searchPlaceholder,
805
+ leftIcon: /* @__PURE__ */ jsx9(SearchIcon, { size: "sm" }),
806
+ value: query,
807
+ onChange: (e) => {
808
+ setQuery(e.target.value);
809
+ setRequestState("idle");
810
+ }
811
+ }
812
+ ) }),
813
+ /* @__PURE__ */ jsxs8("fieldset", { className: "ods-mkt-finder__pills", "aria-label": "Connector categories", children: [
814
+ /* @__PURE__ */ jsxs8(
815
+ "button",
816
+ {
817
+ type: "button",
818
+ className: cn(
819
+ "ods-mkt-finder__pill",
820
+ activeCategory === null && "ods-mkt-finder__pill--active"
821
+ ),
822
+ onClick: () => setActiveCategory(null),
823
+ children: [
824
+ "All ",
825
+ /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__count", children: items.length })
826
+ ]
827
+ }
828
+ ),
829
+ pillCategories.map((category) => /* @__PURE__ */ jsxs8(
830
+ "button",
831
+ {
832
+ type: "button",
833
+ className: cn(
834
+ "ods-mkt-finder__pill",
835
+ activeCategory === category && "ods-mkt-finder__pill--active"
836
+ ),
837
+ onClick: () => setActiveCategory(activeCategory === category ? null : category),
838
+ children: [
839
+ category,
840
+ " ",
841
+ /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__count", children: counts.get(category) ?? 0 })
842
+ ]
843
+ },
844
+ category
845
+ ))
846
+ ] }),
847
+ results.length > 0 ? /* @__PURE__ */ jsx9("div", { className: "ods-mkt-finder__grid", children: results.map((item) => /* @__PURE__ */ jsxs8("div", { className: "ods-mkt-finder__card", children: [
848
+ /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__card-icon", "aria-hidden": "true", children: item.icon ?? /* @__PURE__ */ jsx9(LetterTile, { name: item.name }) }),
849
+ /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__card-name", children: item.name }),
850
+ (item.kind ?? "native") === "universal" && /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__badge", children: universalBadgeLabel })
851
+ ] }, item.name)) }) : /* @__PURE__ */ jsx9("div", { className: "ods-mkt-finder__miss", children: requestState === "sent" ? /* @__PURE__ */ jsxs8("p", { className: "ods-mkt-finder__sent", role: "status", children: [
852
+ /* @__PURE__ */ jsx9(CheckmarkIcon, { size: "sm", "aria-hidden": "true" }),
853
+ " Got it \u2014 we'll let you know when a",
854
+ " ",
855
+ /* @__PURE__ */ jsx9("strong", { children: query.trim() }),
856
+ " connector is available."
857
+ ] }) : /* @__PURE__ */ jsxs8(Fragment, { children: [
858
+ /* @__PURE__ */ jsxs8("h3", { className: "ods-mkt-finder__miss-title", children: [
859
+ "No native ",
860
+ /* @__PURE__ */ jsx9("strong", { children: query.trim() }),
861
+ " connector yet"
862
+ ] }),
863
+ /* @__PURE__ */ jsxs8("p", { className: "ods-mkt-finder__miss-body", children: [
864
+ "Our universal open connectors likely cover it today \u2014 and we build native connectors on request. ",
865
+ onRequestConnector && "Leave your email and we'll notify you."
866
+ ] }),
867
+ onRequestConnector && /* @__PURE__ */ jsxs8("form", { className: "ods-mkt-finder__miss-form", onSubmit: handleRequest, noValidate: true, children: [
868
+ /* @__PURE__ */ jsx9(
869
+ Input,
870
+ {
871
+ type: "email",
872
+ "aria-label": "Work email for connector request",
873
+ placeholder: "you@company.com",
874
+ value: email,
875
+ error: emailError,
876
+ errorMessage: emailError ? "Please enter a valid work email." : void 0,
877
+ onChange: (e) => {
878
+ setEmail(e.target.value);
879
+ setEmailError(false);
880
+ }
881
+ }
882
+ ),
883
+ /* @__PURE__ */ jsx9(Button, { type: "submit", variant: "primary", loading: requestState === "sending", children: "Request connector" })
884
+ ] }),
885
+ requestState === "error" && /* @__PURE__ */ jsx9("p", { className: "ods-mkt-finder__miss-error", role: "alert", children: requestErrorHint })
886
+ ] }) })
887
+ ] });
888
+ }
889
+
890
+ // src/marketing/components/IntegrationsWall/IntegrationsWall.tsx
891
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
892
+ function IntegrationsWall({
893
+ categories,
894
+ footnote,
895
+ columns = 3,
896
+ className,
897
+ ...rest
898
+ }) {
899
+ return /* @__PURE__ */ jsxs9("div", { ...rest, className: cn("ods-mkt-wall", className), children: [
900
+ /* @__PURE__ */ jsx10("div", { className: cn("ods-mkt-wall__grid", `ods-mkt-wall__grid--${columns}`), children: categories.map((category) => /* @__PURE__ */ jsxs9("div", { className: "ods-mkt-wall__card", children: [
901
+ /* @__PURE__ */ jsxs9("div", { className: "ods-mkt-wall__card-head", children: [
902
+ category.icon && /* @__PURE__ */ jsx10("span", { className: "ods-mkt-wall__card-icon", "aria-hidden": "true", children: category.icon }),
903
+ /* @__PURE__ */ jsx10("h3", { className: "ods-mkt-wall__card-label", children: category.label })
904
+ ] }),
905
+ /* @__PURE__ */ jsx10("div", { className: "ods-mkt-wall__pills", children: category.items.map((item) => /* @__PURE__ */ jsxs9("span", { className: "ods-mkt-wall__pill", children: [
906
+ item.icon && /* @__PURE__ */ jsx10("span", { className: "ods-mkt-wall__pill-icon", "aria-hidden": "true", children: item.icon }),
907
+ item.name
908
+ ] }, item.name)) })
909
+ ] }, category.id)) }),
910
+ footnote && /* @__PURE__ */ jsx10("p", { className: "ods-mkt-wall__footnote", children: footnote })
911
+ ] });
912
+ }
913
+
914
+ // src/marketing/components/LiveConsole/LiveConsole.tsx
915
+ import { CheckmarkIcon as CheckmarkIcon2, CloseIcon } from "@octaviaflow/icons";
916
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
917
+ function PendingGlyph() {
918
+ return /* @__PURE__ */ jsx11(
919
+ "svg",
920
+ {
921
+ viewBox: "0 0 24 24",
922
+ width: "13",
923
+ height: "13",
924
+ fill: "none",
925
+ stroke: "currentColor",
926
+ strokeWidth: "2.4",
927
+ strokeLinecap: "round",
928
+ strokeDasharray: "3.5 3.5",
929
+ "aria-hidden": "true",
930
+ children: /* @__PURE__ */ jsx11("circle", { cx: "12", cy: "12", r: "9" })
931
+ }
932
+ );
933
+ }
934
+ function StateGlyph({ state }) {
935
+ switch (state) {
936
+ case "done":
937
+ return /* @__PURE__ */ jsx11(CheckmarkIcon2, { size: "sm", "aria-hidden": "true" });
938
+ case "running":
939
+ return /* @__PURE__ */ jsx11(Spinner, { size: "sm" });
940
+ case "error":
941
+ return /* @__PURE__ */ jsx11(CloseIcon, { size: "sm", "aria-hidden": "true" });
942
+ case "queued":
943
+ return /* @__PURE__ */ jsx11(PendingGlyph, {});
944
+ }
945
+ }
946
+ function LiveConsole({
947
+ title,
948
+ badge = "LIVE",
949
+ lines,
950
+ animated = true,
951
+ className,
952
+ ...rest
953
+ }) {
954
+ return /* @__PURE__ */ jsxs10("div", { ...rest, className: cn("ods-mkt-console", className), children: [
955
+ /* @__PURE__ */ jsxs10("div", { className: "ods-mkt-console__head", children: [
956
+ /* @__PURE__ */ jsx11("span", { className: "ods-mkt-console__title", children: title }),
957
+ badge != null && /* @__PURE__ */ jsxs10("span", { className: "ods-mkt-console__badge", children: [
958
+ /* @__PURE__ */ jsx11("span", { className: "ods-mkt-console__dot" }),
959
+ badge
960
+ ] })
79
961
  ] }),
80
- footnote && /* @__PURE__ */ jsx2("p", { className: "ods-mkt-cta__footnote", children: footnote })
962
+ /* @__PURE__ */ jsx11("div", { className: "ods-mkt-console__body", children: lines.map((line, i) => {
963
+ const state = line.state ?? "done";
964
+ return /* @__PURE__ */ jsxs10(
965
+ "div",
966
+ {
967
+ className: cn("ods-mkt-console__line", animated && "ods-mkt-console__line--animated"),
968
+ style: animated ? { animationDelay: `${0.3 + i * 0.6}s` } : void 0,
969
+ children: [
970
+ /* @__PURE__ */ jsx11(
971
+ "span",
972
+ {
973
+ className: cn("ods-mkt-console__glyph", `ods-mkt-console__glyph--${state}`),
974
+ "aria-hidden": "true",
975
+ children: /* @__PURE__ */ jsx11(StateGlyph, { state })
976
+ }
977
+ ),
978
+ /* @__PURE__ */ jsxs10("span", { className: "ods-mkt-console__text", children: [
979
+ /* @__PURE__ */ jsx11("span", { className: "ods-mkt-console__label", children: line.label }),
980
+ line.detail && /* @__PURE__ */ jsxs10(
981
+ "span",
982
+ {
983
+ className: cn(
984
+ "ods-mkt-console__detail",
985
+ state === "running" && "ods-mkt-console__detail--running",
986
+ state === "error" && "ods-mkt-console__detail--error"
987
+ ),
988
+ children: [
989
+ " ",
990
+ line.detail
991
+ ]
992
+ }
993
+ )
994
+ ] })
995
+ ]
996
+ },
997
+ line.id
998
+ );
999
+ }) })
81
1000
  ] });
82
1001
  }
83
1002
 
84
- // src/marketing/components/FeatureGrid/FeatureGrid.tsx
85
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
86
- function FeatureGrid({
1003
+ // src/marketing/components/LogoMarquee/LogoMarquee.tsx
1004
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1005
+ function Track({ items, hidden }) {
1006
+ return /* @__PURE__ */ jsx12("div", { className: "ods-mkt-marquee__track", "aria-hidden": hidden || void 0, children: items.map((item) => /* @__PURE__ */ jsx12("span", { className: "ods-mkt-marquee__logo", title: item.label, children: item.icon ?? /* @__PURE__ */ jsx12("span", { className: "ods-mkt-marquee__wordmark", children: item.label }) }, item.id)) });
1007
+ }
1008
+ function LogoMarquee({
87
1009
  items,
88
- columns = 3,
89
- dense = false,
1010
+ label,
1011
+ speed = 30,
1012
+ grayscale = true,
90
1013
  className,
91
1014
  ...rest
92
1015
  }) {
93
- return /* @__PURE__ */ jsx3(
1016
+ return /* @__PURE__ */ jsxs11(
94
1017
  "div",
95
1018
  {
96
1019
  ...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))
1020
+ className: cn("ods-mkt-marquee", grayscale && "ods-mkt-marquee--gray", className),
1021
+ children: [
1022
+ label && /* @__PURE__ */ jsx12("p", { className: "ods-mkt-marquee__label", children: label }),
1023
+ /* @__PURE__ */ jsx12("div", { className: "ods-mkt-marquee__viewport", children: /* @__PURE__ */ jsxs11("div", { className: "ods-mkt-marquee__rail", style: { animationDuration: `${speed}s` }, children: [
1024
+ /* @__PURE__ */ jsx12(Track, { items }),
1025
+ /* @__PURE__ */ jsx12(Track, { items, hidden: true })
1026
+ ] }) })
1027
+ ]
108
1028
  }
109
1029
  );
110
1030
  }
111
1031
 
112
1032
  // src/marketing/glyphs.tsx
113
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1033
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
114
1034
  var base = {
115
1035
  xmlns: "http://www.w3.org/2000/svg",
116
1036
  viewBox: "0 0 24 24",
@@ -121,172 +1041,90 @@ var base = {
121
1041
  strokeLinejoin: "round"
122
1042
  };
123
1043
  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" })
1044
+ return /* @__PURE__ */ jsxs12("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
1045
+ /* @__PURE__ */ jsx13("ellipse", { cx: "12", cy: "5", rx: "9", ry: "3" }),
1046
+ /* @__PURE__ */ jsx13("path", { d: "M3 5v14a9 3 0 0 0 18 0V5" }),
1047
+ /* @__PURE__ */ jsx13("path", { d: "M3 12a9 3 0 0 0 18 0" })
128
1048
  ] });
129
1049
  }
130
1050
  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" })
1051
+ return /* @__PURE__ */ jsxs12("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
1052
+ /* @__PURE__ */ jsx13("rect", { x: "2", y: "3", width: "20", height: "5", rx: "1" }),
1053
+ /* @__PURE__ */ jsx13("path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" }),
1054
+ /* @__PURE__ */ jsx13("path", { d: "M10 12h4" })
135
1055
  ] });
136
1056
  }
137
1057
  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" }) });
1058
+ return /* @__PURE__ */ jsx13("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: /* @__PURE__ */ jsx13("path", { d: "M13 2 3 14h9l-1 8 10-12h-9l1-8z" }) });
139
1059
  }
140
1060
  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" }) });
1061
+ return /* @__PURE__ */ jsx13("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: /* @__PURE__ */ jsx13("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
1062
  }
143
1063
  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" })
1064
+ return /* @__PURE__ */ jsxs12("svg", { ...base, width: size, height: size, "aria-hidden": "true", children: [
1065
+ /* @__PURE__ */ jsx13("path", { d: "M12 22v-5" }),
1066
+ /* @__PURE__ */ jsx13("path", { d: "M9 8V2M15 8V2" }),
1067
+ /* @__PURE__ */ jsx13("path", { d: "M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8h12z" })
148
1068
  ] });
149
1069
  }
150
1070
  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" })
1071
+ return /* @__PURE__ */ jsxs12("svg", { viewBox: "0 0 18 18", width: size, height: size, "aria-hidden": "true", children: [
1072
+ /* @__PURE__ */ jsx13("rect", { width: "18", height: "18", fill: "var(--ods-accent)" }),
1073
+ /* @__PURE__ */ jsx13("path", { d: "M4 9h8.5M9.5 5.5 13 9l-3.5 3.5", stroke: "#fff", strokeWidth: "1.6", fill: "none" })
154
1074
  ] });
155
1075
  }
156
1076
  function roleGlyph(role, size = 12) {
157
1077
  switch (role) {
158
1078
  case "source":
159
- return /* @__PURE__ */ jsx4(SourceGlyph, { size });
1079
+ return /* @__PURE__ */ jsx13(SourceGlyph, { size });
160
1080
  case "destination":
161
- return /* @__PURE__ */ jsx4(DestinationGlyph, { size });
1081
+ return /* @__PURE__ */ jsx13(DestinationGlyph, { size });
162
1082
  case "action":
163
- return /* @__PURE__ */ jsx4(ActionGlyph, { size });
1083
+ return /* @__PURE__ */ jsx13(ActionGlyph, { size });
164
1084
  case "notify":
165
- return /* @__PURE__ */ jsx4(NotifyGlyph, { size });
1085
+ return /* @__PURE__ */ jsx13(NotifyGlyph, { size });
166
1086
  }
167
1087
  }
168
1088
 
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
1089
  // src/marketing/components/MarketingFooter/MarketingFooter.tsx
254
- import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
1090
+ import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
255
1091
  function MarketingFooter({
256
1092
  brand,
257
1093
  tagline,
258
1094
  meta,
259
1095
  columns = [],
1096
+ newsletter,
260
1097
  legal,
261
1098
  social,
262
1099
  className,
263
1100
  ...rest
264
1101
  }) {
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" })
1102
+ return /* @__PURE__ */ jsxs13("footer", { ...rest, className: cn("ods-mkt-footer", className), children: [
1103
+ /* @__PURE__ */ jsxs13("div", { className: "ods-mkt-footer__grid", children: [
1104
+ /* @__PURE__ */ jsxs13("div", { className: "ods-mkt-footer__brand-col", children: [
1105
+ /* @__PURE__ */ jsx14("div", { className: "ods-mkt-footer__brand", children: brand ?? /* @__PURE__ */ jsxs13(Fragment2, { children: [
1106
+ /* @__PURE__ */ jsx14(BrandMark, { size: 16 }),
1107
+ /* @__PURE__ */ jsx14("span", { children: "OctaviaFlow" })
271
1108
  ] }) }),
272
- tagline && /* @__PURE__ */ jsx7("p", { className: "ods-mkt-footer__tagline", children: tagline }),
273
- meta && /* @__PURE__ */ jsx7("div", { className: "ods-mkt-footer__meta", children: meta })
1109
+ tagline && /* @__PURE__ */ jsx14("p", { className: "ods-mkt-footer__tagline", children: tagline }),
1110
+ meta && /* @__PURE__ */ jsx14("div", { className: "ods-mkt-footer__meta", children: meta }),
1111
+ newsletter && /* @__PURE__ */ jsx14("div", { className: "ods-mkt-footer__newsletter", children: newsletter })
274
1112
  ] }),
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))
1113
+ columns.map((column) => /* @__PURE__ */ jsxs13("nav", { className: "ods-mkt-footer__col", "aria-label": String(column.id), children: [
1114
+ /* @__PURE__ */ jsx14("span", { className: "ods-mkt-footer__col-label", children: column.label }),
1115
+ column.links.map((link) => /* @__PURE__ */ jsx14("a", { className: "ods-mkt-footer__link", href: link.href, children: link.label }, link.href))
278
1116
  ] }, column.id))
279
1117
  ] }),
280
- (legal || social) && /* @__PURE__ */ jsxs7("div", { className: "ods-mkt-footer__bar", children: [
281
- /* @__PURE__ */ jsx7("span", { children: legal }),
282
- /* @__PURE__ */ jsx7("span", { children: social })
1118
+ (legal || social) && /* @__PURE__ */ jsxs13("div", { className: "ods-mkt-footer__bar", children: [
1119
+ /* @__PURE__ */ jsx14("span", { children: legal }),
1120
+ /* @__PURE__ */ jsx14("span", { children: social })
283
1121
  ] })
284
1122
  ] });
285
1123
  }
286
1124
 
287
1125
  // src/marketing/components/MarketingHero/MarketingHero.tsx
288
1126
  import { motion, useReducedMotion } from "framer-motion";
289
- import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
1127
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
290
1128
  function MarketingHero({
291
1129
  kicker,
292
1130
  title,
@@ -298,19 +1136,19 @@ function MarketingHero({
298
1136
  }) {
299
1137
  const reducedMotion = useReducedMotion();
300
1138
  const words = title.split(/\s+/).filter(Boolean);
301
- return /* @__PURE__ */ jsxs8(
1139
+ return /* @__PURE__ */ jsxs14(
302
1140
  "section",
303
1141
  {
304
1142
  ...rest,
305
1143
  className: cn("ods-mkt-hero", align === "center" && "ods-mkt-hero--center", className),
306
1144
  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(
1145
+ kicker && /* @__PURE__ */ jsx15("p", { className: "ods-mkt-hero__kicker", children: kicker }),
1146
+ /* @__PURE__ */ jsx15("h1", { className: "ods-mkt-hero__title", children: words.map((word, i) => /* @__PURE__ */ jsxs14(
309
1147
  "span",
310
1148
  {
311
1149
  className: "ods-mkt-hero__word-clip",
312
1150
  children: [
313
- /* @__PURE__ */ jsx8(
1151
+ /* @__PURE__ */ jsx15(
314
1152
  motion.span,
315
1153
  {
316
1154
  className: "ods-mkt-hero__word",
@@ -329,7 +1167,7 @@ function MarketingHero({
329
1167
  },
330
1168
  i
331
1169
  )) }),
332
- lede && /* @__PURE__ */ jsx8(
1170
+ lede && /* @__PURE__ */ jsx15(
333
1171
  motion.p,
334
1172
  {
335
1173
  className: "ods-mkt-hero__lede",
@@ -339,7 +1177,7 @@ function MarketingHero({
339
1177
  children: lede
340
1178
  }
341
1179
  ),
342
- children && /* @__PURE__ */ jsx8(
1180
+ children && /* @__PURE__ */ jsx15(
343
1181
  motion.div,
344
1182
  {
345
1183
  className: "ods-mkt-hero__body",
@@ -355,7 +1193,7 @@ function MarketingHero({
355
1193
  }
356
1194
 
357
1195
  // src/marketing/components/MarketingNav/MarketingNav.tsx
358
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
1196
+ import { Fragment as Fragment3, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
359
1197
  function MarketingNav({
360
1198
  brand,
361
1199
  brandHref = "/",
@@ -365,12 +1203,12 @@ function MarketingNav({
365
1203
  className,
366
1204
  ...rest
367
1205
  }) {
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" })
1206
+ return /* @__PURE__ */ jsxs15("header", { ...rest, className: cn("ods-mkt-nav", sticky && "ods-mkt-nav--sticky", className), children: [
1207
+ /* @__PURE__ */ jsx16("a", { className: "ods-mkt-nav__brand", href: brandHref, children: brand ?? /* @__PURE__ */ jsxs15(Fragment3, { children: [
1208
+ /* @__PURE__ */ jsx16(BrandMark, {}),
1209
+ /* @__PURE__ */ jsx16("span", { children: "OctaviaFlow" })
372
1210
  ] }) }),
373
- links.length > 0 && /* @__PURE__ */ jsx9("nav", { className: "ods-mkt-nav__links", "aria-label": "Main", children: links.map((link) => /* @__PURE__ */ jsx9(
1211
+ links.length > 0 && /* @__PURE__ */ jsx16("nav", { className: "ods-mkt-nav__links", "aria-label": "Main", children: links.map((link) => /* @__PURE__ */ jsx16(
374
1212
  "a",
375
1213
  {
376
1214
  href: link.href,
@@ -380,12 +1218,12 @@ function MarketingNav({
380
1218
  },
381
1219
  link.href
382
1220
  )) }),
383
- actions && /* @__PURE__ */ jsx9("div", { className: "ods-mkt-nav__actions", children: actions })
1221
+ actions && /* @__PURE__ */ jsx16("div", { className: "ods-mkt-nav__actions", children: actions })
384
1222
  ] });
385
1223
  }
386
1224
 
387
1225
  // src/marketing/components/MarketingSection/MarketingSection.tsx
388
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
1226
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
389
1227
  function MarketingSection({
390
1228
  kicker,
391
1229
  title,
@@ -397,7 +1235,7 @@ function MarketingSection({
397
1235
  children,
398
1236
  ...rest
399
1237
  }) {
400
- return /* @__PURE__ */ jsxs10(
1238
+ return /* @__PURE__ */ jsxs16(
401
1239
  "section",
402
1240
  {
403
1241
  ...rest,
@@ -409,10 +1247,10 @@ function MarketingSection({
409
1247
  className
410
1248
  ),
411
1249
  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 })
1250
+ (kicker || title || lede) && /* @__PURE__ */ jsxs16("header", { className: "ods-mkt-section__head", children: [
1251
+ kicker && /* @__PURE__ */ jsx17("p", { className: "ods-mkt-section__kicker", children: kicker }),
1252
+ title && /* @__PURE__ */ jsx17("h2", { className: "ods-mkt-section__title", children: title }),
1253
+ lede && /* @__PURE__ */ jsx17("p", { className: "ods-mkt-section__lede", children: lede })
416
1254
  ] }),
417
1255
  children
418
1256
  ]
@@ -420,209 +1258,143 @@ function MarketingSection({
420
1258
  );
421
1259
  }
422
1260
 
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" });
1261
+ // src/marketing/components/PageHero/PageHero.tsx
1262
+ import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
1263
+ function PageHero({
1264
+ kicker,
1265
+ title,
1266
+ subtitle,
1267
+ actions,
1268
+ align = "center",
1269
+ className,
1270
+ ...rest
1271
+ }) {
1272
+ return /* @__PURE__ */ jsxs17(
1273
+ "header",
1274
+ {
1275
+ ...rest,
1276
+ className: cn("ods-mkt-pagehero", align === "start" && "ods-mkt-pagehero--start", className),
1277
+ children: [
1278
+ kicker && /* @__PURE__ */ jsx18("span", { className: "ods-mkt-pagehero__kicker", children: kicker }),
1279
+ /* @__PURE__ */ jsx18("h1", { className: "ods-mkt-pagehero__title", children: title }),
1280
+ subtitle && /* @__PURE__ */ jsx18("p", { className: "ods-mkt-pagehero__subtitle", children: subtitle }),
1281
+ actions && /* @__PURE__ */ jsx18("div", { className: "ods-mkt-pagehero__actions", children: actions })
1282
+ ]
609
1283
  }
610
- lines.push({ id: "status", text: `\u27F3 ${status}`, tone: "active" });
611
- return lines;
1284
+ );
1285
+ }
1286
+
1287
+ // src/marketing/components/PricingTiers/PricingTiers.tsx
1288
+ import { CheckmarkIcon as CheckmarkIcon3 } from "@octaviaflow/icons";
1289
+ import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
1290
+ function TierCta({ cta, featured }) {
1291
+ if (cta.href) {
1292
+ return /* @__PURE__ */ jsx19(
1293
+ "a",
1294
+ {
1295
+ className: cn(
1296
+ "ods-mkt-pricing__cta",
1297
+ featured ? "ods-mkt-pricing__cta--primary" : "ods-mkt-pricing__cta--secondary"
1298
+ ),
1299
+ href: cta.href,
1300
+ onClick: cta.onClick,
1301
+ children: cta.label
1302
+ }
1303
+ );
612
1304
  }
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);
1305
+ return /* @__PURE__ */ jsx19(Button, { variant: featured ? "primary" : "secondary", fullWidth: true, onClick: cta.onClick, children: cta.label });
620
1306
  }
621
- function slugify(value) {
622
- return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "your-team";
1307
+ function PricingTiers({ tiers, note, className, ...rest }) {
1308
+ return /* @__PURE__ */ jsxs18("div", { ...rest, className: cn("ods-mkt-pricing", className), children: [
1309
+ /* @__PURE__ */ jsx19("div", { className: "ods-mkt-pricing__grid", children: tiers.map((tier) => /* @__PURE__ */ jsxs18(
1310
+ "article",
1311
+ {
1312
+ className: cn(
1313
+ "ods-mkt-pricing__card",
1314
+ tier.featured && "ods-mkt-pricing__card--featured"
1315
+ ),
1316
+ children: [
1317
+ tier.featured && /* @__PURE__ */ jsx19("span", { className: "ods-mkt-pricing__badge", children: tier.badge ?? "Recommended" }),
1318
+ /* @__PURE__ */ jsx19("h3", { className: "ods-mkt-pricing__name", children: tier.name }),
1319
+ /* @__PURE__ */ jsxs18("div", { className: "ods-mkt-pricing__price-row", children: [
1320
+ /* @__PURE__ */ jsx19("span", { className: "ods-mkt-pricing__price", children: tier.price }),
1321
+ tier.period && /* @__PURE__ */ jsx19("span", { className: "ods-mkt-pricing__period", children: tier.period })
1322
+ ] }),
1323
+ tier.annualNote && /* @__PURE__ */ jsx19("span", { className: "ods-mkt-pricing__annual", children: tier.annualNote }),
1324
+ tier.description && /* @__PURE__ */ jsx19("p", { className: "ods-mkt-pricing__desc", children: tier.description }),
1325
+ /* @__PURE__ */ jsx19("ul", { className: "ods-mkt-pricing__features", children: tier.features.map((feature, i) => (
1326
+ // biome-ignore lint/suspicious/noArrayIndexKey: features are positional copy
1327
+ /* @__PURE__ */ jsxs18("li", { className: "ods-mkt-pricing__feature", children: [
1328
+ /* @__PURE__ */ jsx19(CheckmarkIcon3, { size: "sm", "aria-hidden": "true" }),
1329
+ /* @__PURE__ */ jsx19("span", { children: feature })
1330
+ ] }, i)
1331
+ )) }),
1332
+ /* @__PURE__ */ jsx19(TierCta, { cta: tier.cta, featured: Boolean(tier.featured) })
1333
+ ]
1334
+ },
1335
+ tier.id
1336
+ )) }),
1337
+ note && /* @__PURE__ */ jsx19("p", { className: "ods-mkt-pricing__note", children: note })
1338
+ ] });
623
1339
  }
624
- function isValidEmail(value) {
625
- return /^\S+@\S+\.\S+$/.test(value.trim());
1340
+
1341
+ // src/marketing/components/StatBand/StatBand.tsx
1342
+ import { useReducedMotion as useReducedMotion2 } from "framer-motion";
1343
+ import { Fragment as Fragment4, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
1344
+ function StatBand({ items, orientation = "column", className, ...rest }) {
1345
+ const reducedMotion = useReducedMotion2();
1346
+ return /* @__PURE__ */ jsx20(
1347
+ "div",
1348
+ {
1349
+ ...rest,
1350
+ className: cn("ods-mkt-statband", `ods-mkt-statband--${orientation}`, className),
1351
+ children: items.map((item) => /* @__PURE__ */ jsxs19("div", { className: "ods-mkt-statband__item", children: [
1352
+ /* @__PURE__ */ jsx20("div", { className: "ods-mkt-statband__value", children: typeof item.value === "number" ? /* @__PURE__ */ jsx20(
1353
+ CountUp,
1354
+ {
1355
+ value: item.value,
1356
+ duration: 900,
1357
+ disableAnimation: Boolean(reducedMotion),
1358
+ prefix: item.prefix,
1359
+ suffix: item.suffix,
1360
+ formatValue: (v) => Math.round(v).toLocaleString("en-US")
1361
+ }
1362
+ ) : /* @__PURE__ */ jsxs19(Fragment4, { children: [
1363
+ item.prefix,
1364
+ item.value,
1365
+ item.suffix
1366
+ ] }) }),
1367
+ /* @__PURE__ */ jsx20("div", { className: "ods-mkt-statband__label", children: item.label })
1368
+ ] }, item.id))
1369
+ }
1370
+ );
1371
+ }
1372
+
1373
+ // src/marketing/components/TestimonialStrip/TestimonialStrip.tsx
1374
+ import { jsx as jsx21 } from "react/jsx-runtime";
1375
+ function TestimonialStrip({
1376
+ items,
1377
+ columns = 3,
1378
+ className,
1379
+ ...rest
1380
+ }) {
1381
+ return /* @__PURE__ */ jsx21(
1382
+ "div",
1383
+ {
1384
+ ...rest,
1385
+ className: cn("ods-mkt-testimonials", `ods-mkt-testimonials--${columns}`, className),
1386
+ children: items.map((item) => /* @__PURE__ */ jsx21(
1387
+ TestimonialCard,
1388
+ {
1389
+ quote: item.quote,
1390
+ author: item.author,
1391
+ rating: item.rating,
1392
+ logo: item.logo
1393
+ },
1394
+ item.id
1395
+ ))
1396
+ }
1397
+ );
626
1398
  }
627
1399
 
628
1400
  // src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx
@@ -630,19 +1402,21 @@ import { AnimatePresence as AnimatePresence2, motion as motion3, useReducedMotio
630
1402
  import {
631
1403
  useCallback,
632
1404
  useEffect as useEffect2,
633
- useMemo,
1405
+ useMemo as useMemo2,
634
1406
  useRef as useRef2,
635
- useState as useState3
1407
+ useState as useState6
636
1408
  } from "react";
637
1409
 
638
1410
  // 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";
1411
+ import { useEffect, useRef, useState as useState4 } from "react";
1412
+ import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
641
1413
  function slots(n) {
642
1414
  return Array.from({ length: n }, (_, i) => 208 + (i - (n - 1) / 2) * 80);
643
1415
  }
644
- var leftGuide = (cy) => `M74 ${cy} H150 V228 H193`;
645
- var rightGuide = (cy) => `M263 228 H340 V${cy} H388`;
1416
+ var LANES = [228, 190, 266, 152, 304];
1417
+ var laneFor = (index) => LANES[index % LANES.length];
1418
+ var leftGuide = (cy, lane) => `M74 ${cy} H150 V${lane} H193`;
1419
+ var rightGuide = (cy, lane) => `M263 ${lane} H340 V${cy} H388`;
646
1420
  function particlesFor(side, index, path, active, fast) {
647
1421
  const base2 = index * 0.4 + (side === "r" ? 0.5 : 0);
648
1422
  const duration = fast ? active ? "1.1s" : "2.6s" : active ? "2.2s" : "4.8s";
@@ -671,9 +1445,9 @@ function particlesFor(side, index, path, active, fast) {
671
1445
  return out;
672
1446
  }
673
1447
  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(
1448
+ return /* @__PURE__ */ jsxs20("svg", { viewBox: "0 0 24 24", width: "30", height: "30", fill: "none", "aria-hidden": "true", children: [
1449
+ /* @__PURE__ */ jsx22("rect", { x: "3", y: "3", width: "18", height: "18", rx: "1", stroke: "currentColor", strokeWidth: "1.6" }),
1450
+ /* @__PURE__ */ jsx22(
677
1451
  "path",
678
1452
  {
679
1453
  d: "M7 12h7M11.5 8.5 15 12l-3.5 3.5",
@@ -686,7 +1460,7 @@ function DefaultCoreGlyph() {
686
1460
  ] });
687
1461
  }
688
1462
  function CubeFace({ connector }) {
689
- return /* @__PURE__ */ jsx12(
1463
+ return /* @__PURE__ */ jsx22(
690
1464
  "span",
691
1465
  {
692
1466
  className: cn(
@@ -704,9 +1478,10 @@ function ShowcaseScene({
704
1478
  engaged,
705
1479
  tiles,
706
1480
  coreIcon,
707
- caption
1481
+ caption,
1482
+ onCoreClick
708
1483
  }) {
709
- const [pulse, setPulse] = useState(false);
1484
+ const [pulse, setPulse] = useState4(false);
710
1485
  const pulseTimer = useRef(null);
711
1486
  useEffect(
712
1487
  () => () => {
@@ -723,26 +1498,48 @@ function ShowcaseScene({
723
1498
  const rightYs = slots(right.length);
724
1499
  const guides = [];
725
1500
  const particles = [];
1501
+ const bypassFor = (index) => index % 2 === 0 ? 188 : 268;
726
1502
  left.forEach((node, i) => {
727
- const d = leftGuide(leftYs[i]);
728
1503
  const on = engaged && node.active;
1504
+ const laneIn = laneFor(i);
1505
+ const bypass = bypassFor(i);
1506
+ let d;
1507
+ if (right.length) {
1508
+ const pairIdx = i % right.length;
1509
+ const laneOut = laneFor(i + 1);
1510
+ d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H270 V${laneOut} H340 V${rightYs[pairIdx]} H388`;
1511
+ } else {
1512
+ d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H${210 + i % 3 * 40} V372`;
1513
+ }
729
1514
  guides.push({ d, on, delay: `${i * 0.2}s` });
730
1515
  particles.push(...particlesFor("l", i, d, on, pulse));
731
1516
  });
732
1517
  right.forEach((node, j) => {
733
- const d = rightGuide(rightYs[j]);
1518
+ if (left.length > 0 && j < left.length) return;
1519
+ const d = rightGuide(rightYs[j], laneFor(j + 1));
734
1520
  const on = engaged && node.active;
735
1521
  guides.push({ d, on, delay: `${j * 0.2 + 0.3}s` });
736
1522
  particles.push(...particlesFor("r", j, d, on, pulse));
737
1523
  });
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" });
1524
+ if (!left.length) guides.push({ d: leftGuide(208, 228), on: false, delay: "0s" });
1525
+ if (!right.length) guides.push({ d: rightGuide(208, 228), on: false, delay: "0s" });
740
1526
  const pins = [];
1527
+ const pads = [];
741
1528
  for (let x = 118; x <= 338; x += 20) {
742
- pins.push({ d: `M${x} 346 L${x} 368`, accent: x / 20 % 4 === 0 });
1529
+ const south = x / 20 % 4 === 0;
1530
+ const north = x / 20 % 4 === 2;
1531
+ pins.push({ d: `M${x} 346 L${x} 366`, accent: south });
1532
+ pads.push({ x, y: 369, accent: south });
1533
+ pins.push({ d: `M${x} 110 L${x} 90`, accent: north });
1534
+ pads.push({ x, y: 87, accent: north });
743
1535
  }
744
1536
  for (let y = 118; y <= 338; y += 20) {
745
- pins.push({ d: `M346 ${y} L368 ${y}`, accent: y / 20 % 4 === 1 });
1537
+ const east = y / 20 % 4 === 1;
1538
+ const west = y / 20 % 4 === 3;
1539
+ pins.push({ d: `M346 ${y} L366 ${y}`, accent: east });
1540
+ pads.push({ x: 369, y, accent: east });
1541
+ pins.push({ d: `M110 ${y} L90 ${y}`, accent: west });
1542
+ pads.push({ x: 87, y, accent: west });
746
1543
  }
747
1544
  const tilePositions = [
748
1545
  { left: 8, top: 8 },
@@ -754,10 +1551,10 @@ function ShowcaseScene({
754
1551
  { left: 83, top: 158 },
755
1552
  { left: 158, top: 158 }
756
1553
  ];
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(
1554
+ return /* @__PURE__ */ jsxs20("div", { className: "ods-showcase__scene", "aria-hidden": "true", children: [
1555
+ /* @__PURE__ */ jsxs20("div", { className: "ods-showcase__scene-stage", children: [
1556
+ /* @__PURE__ */ jsxs20("svg", { className: "ods-showcase__wires", width: "460", height: "460", "aria-hidden": "true", children: [
1557
+ pins.map((pin) => /* @__PURE__ */ jsx22(
761
1558
  "path",
762
1559
  {
763
1560
  d: pin.d,
@@ -765,9 +1562,20 @@ function ShowcaseScene({
765
1562
  },
766
1563
  pin.d
767
1564
  )),
768
- guides.map((guide) => /* @__PURE__ */ jsxs12("g", { children: [
769
- /* @__PURE__ */ jsx12("path", { d: guide.d, className: "ods-showcase__guide" }),
770
- /* @__PURE__ */ jsx12(
1565
+ pads.map((pad) => /* @__PURE__ */ jsx22(
1566
+ "rect",
1567
+ {
1568
+ x: pad.x - 2,
1569
+ y: pad.y - 2,
1570
+ width: 4,
1571
+ height: 4,
1572
+ className: cn("ods-showcase__pin-pad", pad.accent && "ods-showcase__pin-pad--accent")
1573
+ },
1574
+ `${pad.x}-${pad.y}`
1575
+ )),
1576
+ guides.map((guide) => /* @__PURE__ */ jsxs20("g", { children: [
1577
+ /* @__PURE__ */ jsx22("path", { d: guide.d, className: "ods-showcase__guide" }),
1578
+ /* @__PURE__ */ jsx22(
771
1579
  "path",
772
1580
  {
773
1581
  d: guide.d,
@@ -780,7 +1588,7 @@ function ShowcaseScene({
780
1588
  )
781
1589
  ] }, guide.d))
782
1590
  ] }),
783
- particles.map((p) => /* @__PURE__ */ jsx12(
1591
+ particles.map((p) => /* @__PURE__ */ jsx22(
784
1592
  "span",
785
1593
  {
786
1594
  className: cn("ods-showcase__particle", `ods-showcase__particle--${p.variant}`),
@@ -794,75 +1602,121 @@ function ShowcaseScene({
794
1602
  },
795
1603
  p.key
796
1604
  )),
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(
1605
+ /* @__PURE__ */ jsxs20("div", { className: "ods-showcase__platform", children: [
1606
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__platform-south" }),
1607
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__platform-east" }),
1608
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__platform-top" }),
1609
+ tiles.slice(0, 8).map((label, i) => /* @__PURE__ */ jsxs20(
802
1610
  "span",
803
1611
  {
804
1612
  className: "ods-showcase__tile",
805
1613
  style: { left: tilePositions[i].left, top: tilePositions[i].top },
806
- children: label
1614
+ children: [
1615
+ /* @__PURE__ */ jsxs20("span", { className: "ods-showcase__tile-flip", children: [
1616
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__tile-wall ods-showcase__tile-wall--south" }),
1617
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__tile-wall ods-showcase__tile-wall--east" })
1618
+ ] }),
1619
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__tile-wall ods-showcase__tile-wall--south" }),
1620
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__tile-wall ods-showcase__tile-wall--east" }),
1621
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__tile-face", children: label })
1622
+ ]
807
1623
  },
808
1624
  label
809
1625
  )),
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
- ] })
1626
+ pulse && /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-ring" }),
1627
+ /* @__PURE__ */ jsxs20(
1628
+ "button",
1629
+ {
1630
+ type: "button",
1631
+ tabIndex: -1,
1632
+ className: "ods-showcase__core",
1633
+ onClick: () => {
1634
+ firePulse();
1635
+ onCoreClick?.();
1636
+ },
1637
+ children: [
1638
+ /* @__PURE__ */ jsxs20("span", { className: "ods-showcase__core-flip", children: [
1639
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-wall ods-showcase__core-wall--south ods-showcase__core-wall--back" }),
1640
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-wall ods-showcase__core-wall--east ods-showcase__core-wall--back" })
1641
+ ] }),
1642
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-wall ods-showcase__core-wall--south" }),
1643
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-wall ods-showcase__core-wall--east" }),
1644
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__core-top", children: coreIcon ?? /* @__PURE__ */ jsx22(DefaultCoreGlyph, {}) })
1645
+ ]
1646
+ }
1647
+ )
816
1648
  ] }),
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(
1649
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__floater ods-showcase__floater--a" }),
1650
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__floater ods-showcase__floater--b" }),
1651
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__floater ods-showcase__floater--c" }),
1652
+ !left.length && /* @__PURE__ */ jsx22("span", { className: "ods-showcase__ghost", style: { left: 8, top: 178 }, children: "+" }),
1653
+ !right.length && /* @__PURE__ */ jsx22("span", { className: "ods-showcase__ghost", style: { left: 392, top: 178 }, children: "+" }),
1654
+ left.map((node, i) => /* @__PURE__ */ jsx22(
823
1655
  "span",
824
1656
  {
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
- ]
1657
+ className: "ods-showcase__cube-slot",
1658
+ style: { left: 8, top: leftYs[i] - 30 },
1659
+ children: /* @__PURE__ */ jsxs20(
1660
+ "span",
1661
+ {
1662
+ className: cn(
1663
+ "ods-showcase__cube",
1664
+ node.active && "ods-showcase__cube--active",
1665
+ i % 2 ? "ods-showcase__cube--float-b" : "ods-showcase__cube--float-a"
1666
+ ),
1667
+ style: { animationDelay: `${i * 0.15}s` },
1668
+ children: [
1669
+ /* @__PURE__ */ jsxs20("span", { className: "ods-showcase__cube-flip", children: [
1670
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-south ods-showcase__cube-wall--back" }),
1671
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-east ods-showcase__cube-wall--back" })
1672
+ ] }),
1673
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-south" }),
1674
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-east" }),
1675
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-top", children: /* @__PURE__ */ jsx22(CubeFace, { connector: node.connector }) })
1676
+ ]
1677
+ }
1678
+ )
836
1679
  },
837
1680
  node.connector.name
838
1681
  )),
839
- right.map((node, j) => /* @__PURE__ */ jsxs12(
1682
+ right.map((node, j) => /* @__PURE__ */ jsx22(
840
1683
  "span",
841
1684
  {
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
- ]
1685
+ className: "ods-showcase__cube-slot",
1686
+ style: { left: 392, top: rightYs[j] - 30 },
1687
+ children: /* @__PURE__ */ jsxs20(
1688
+ "span",
1689
+ {
1690
+ className: cn(
1691
+ "ods-showcase__cube",
1692
+ node.active && "ods-showcase__cube--active",
1693
+ j % 2 ? "ods-showcase__cube--float-a" : "ods-showcase__cube--float-b"
1694
+ ),
1695
+ style: { animationDelay: `${j * 0.15}s` },
1696
+ children: [
1697
+ /* @__PURE__ */ jsxs20("span", { className: "ods-showcase__cube-flip", children: [
1698
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-south ods-showcase__cube-wall--back" }),
1699
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-east ods-showcase__cube-wall--back" })
1700
+ ] }),
1701
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-south" }),
1702
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-east" }),
1703
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__cube-top", children: /* @__PURE__ */ jsx22(CubeFace, { connector: node.connector }) })
1704
+ ]
1705
+ }
1706
+ )
853
1707
  },
854
1708
  node.connector.name
855
1709
  ))
856
1710
  ] }),
857
- /* @__PURE__ */ jsx12("span", { className: "ods-showcase__scene-caption", children: caption })
1711
+ /* @__PURE__ */ jsx22("span", { className: "ods-showcase__scene-caption", children: caption })
858
1712
  ] });
859
1713
  }
860
1714
 
861
1715
  // src/marketing/components/WorkflowShowcase/ShowcaseSignup.tsx
862
1716
  import { AnimatePresence, motion as motion2, useReducedMotion as useReducedMotion3 } from "framer-motion";
863
- import { useId, useState as useState2 } from "react";
1717
+ import { useId as useId3, useState as useState5 } from "react";
864
1718
  import { FocusScope } from "react-aria";
865
- import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
1719
+ import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
866
1720
  var OVERLAY_MOTION = {
867
1721
  initial: { opacity: 0 },
868
1722
  animate: { opacity: 1 },
@@ -880,9 +1734,9 @@ function ShowcaseSignup({
880
1734
  onboardingHref = "#"
881
1735
  }) {
882
1736
  const reducedMotion = useReducedMotion3();
883
- const titleId = useId();
884
- const subtitleId = useId();
885
- const [values, setValues] = useState2({
1737
+ const titleId = useId3();
1738
+ const subtitleId = useId3();
1739
+ const [values, setValues] = useState5({
886
1740
  name: "",
887
1741
  email: "",
888
1742
  company: "",
@@ -901,14 +1755,14 @@ function ShowcaseSignup({
901
1755
  const firstName = values.name.trim().split(/\s+/)[0] || "";
902
1756
  const emailShown = values.email.trim() || "your inbox";
903
1757
  const slug = `${slugify(values.company)}.${workspaceDomain}`;
904
- return /* @__PURE__ */ jsx13(AnimatePresence, { children: open && /* @__PURE__ */ jsx13(
1758
+ return /* @__PURE__ */ jsx23(AnimatePresence, { children: open && /* @__PURE__ */ jsx23(
905
1759
  motion2.div,
906
1760
  {
907
1761
  className: "ods-showcase__veil",
908
1762
  ...OVERLAY_MOTION,
909
1763
  transition: { duration: reducedMotion ? 0 : 0.22 },
910
- children: /* @__PURE__ */ jsxs13(FocusScope, { contain: true, restoreFocus: true, autoFocus: true, children: [
911
- phase === "signup" && /* @__PURE__ */ jsxs13(
1764
+ children: /* @__PURE__ */ jsxs21(FocusScope, { contain: true, restoreFocus: true, autoFocus: true, children: [
1765
+ phase === "signup" && /* @__PURE__ */ jsxs21(
912
1766
  motion2.form,
913
1767
  {
914
1768
  className: "ods-showcase__glass-card",
@@ -923,18 +1777,18 @@ function ShowcaseSignup({
923
1777
  ...cardMotion,
924
1778
  transition: { duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] },
925
1779
  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: [
1780
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-head", children: [
1781
+ /* @__PURE__ */ jsx23("h3", { id: titleId, className: "ods-showcase__glass-title", children: "Create your workspace" }),
1782
+ /* @__PURE__ */ jsxs21("p", { id: subtitleId, className: "ods-showcase__microcopy", children: [
929
1783
  "FREE IN PRIVATE BETA \xB7 YOUR ",
930
1784
  stepCount,
931
1785
  "-STEP WORKFLOW COMES WITH YOU"
932
1786
  ] })
933
1787
  ] }),
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(
1788
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__form-grid", children: [
1789
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__field", children: [
1790
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__field-label", children: "FULL NAME" }),
1791
+ /* @__PURE__ */ jsx23(
938
1792
  Input,
939
1793
  {
940
1794
  "aria-label": "Full name",
@@ -945,9 +1799,9 @@ function ShowcaseSignup({
945
1799
  }
946
1800
  )
947
1801
  ] }),
948
- /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
949
- /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "WORK EMAIL" }),
950
- /* @__PURE__ */ jsx13(
1802
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__field", children: [
1803
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__field-label", children: "WORK EMAIL" }),
1804
+ /* @__PURE__ */ jsx23(
951
1805
  Input,
952
1806
  {
953
1807
  "aria-label": "Work email",
@@ -959,9 +1813,9 @@ function ShowcaseSignup({
959
1813
  }
960
1814
  )
961
1815
  ] }),
962
- /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
963
- /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "COMPANY" }),
964
- /* @__PURE__ */ jsx13(
1816
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__field", children: [
1817
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__field-label", children: "COMPANY" }),
1818
+ /* @__PURE__ */ jsx23(
965
1819
  Input,
966
1820
  {
967
1821
  "aria-label": "Company",
@@ -972,9 +1826,9 @@ function ShowcaseSignup({
972
1826
  }
973
1827
  )
974
1828
  ] }),
975
- /* @__PURE__ */ jsxs13("div", { className: "ods-showcase__field", children: [
976
- /* @__PURE__ */ jsx13("span", { className: "ods-showcase__field-label", children: "TEAM SIZE" }),
977
- /* @__PURE__ */ jsx13(
1829
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__field", children: [
1830
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__field-label", children: "TEAM SIZE" }),
1831
+ /* @__PURE__ */ jsx23(
978
1832
  Select,
979
1833
  {
980
1834
  "aria-label": "Team size",
@@ -985,19 +1839,19 @@ function ShowcaseSignup({
985
1839
  )
986
1840
  ] })
987
1841
  ] }),
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" })
1842
+ error && /* @__PURE__ */ jsx23("p", { className: "ods-showcase__form-error", role: "alert", children: error }),
1843
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-foot", children: [
1844
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__microcopy", children: "NO CREDIT CARD \xB7 SSO & SELF-HOSTING LATER" }),
1845
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-actions", children: [
1846
+ /* @__PURE__ */ jsx23(Button, { type: "button", variant: "secondary", onClick: onBack, children: "Back" }),
1847
+ /* @__PURE__ */ jsx23(Button, { type: "submit", variant: "primary", children: "Create account & deploy \u2192" })
994
1848
  ] })
995
1849
  ] })
996
1850
  ]
997
1851
  },
998
1852
  "signup"
999
1853
  ),
1000
- phase === "creating" && /* @__PURE__ */ jsxs13(
1854
+ phase === "creating" && /* @__PURE__ */ jsxs21(
1001
1855
  motion2.div,
1002
1856
  {
1003
1857
  className: "ods-showcase__glass-card ods-showcase__glass-card--slim",
@@ -1005,8 +1859,8 @@ function ShowcaseSignup({
1005
1859
  ...cardMotion,
1006
1860
  transition: { duration: reducedMotion ? 0 : 0.25 },
1007
1861
  children: [
1008
- /* @__PURE__ */ jsx13("span", { className: "ods-showcase__spin", "aria-hidden": "true", children: "\u27F3" }),
1009
- /* @__PURE__ */ jsxs13("span", { className: "ods-showcase__creating-line", children: [
1862
+ /* @__PURE__ */ jsx23("span", { className: "ods-showcase__spin", "aria-hidden": "true", children: "\u27F3" }),
1863
+ /* @__PURE__ */ jsxs21("span", { className: "ods-showcase__creating-line", children: [
1010
1864
  "provisioning workspace \xB7 saving draft \xB7 inviting ",
1011
1865
  emailShown
1012
1866
  ] })
@@ -1014,7 +1868,7 @@ function ShowcaseSignup({
1014
1868
  },
1015
1869
  "creating"
1016
1870
  ),
1017
- phase === "welcome" && /* @__PURE__ */ jsxs13(
1871
+ phase === "welcome" && /* @__PURE__ */ jsxs21(
1018
1872
  motion2.div,
1019
1873
  {
1020
1874
  className: "ods-showcase__glass-card ods-showcase__glass-card--welcome",
@@ -1024,32 +1878,32 @@ function ShowcaseSignup({
1024
1878
  ...cardMotion,
1025
1879
  transition: { duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] },
1026
1880
  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: [
1881
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-head", children: [
1882
+ /* @__PURE__ */ jsx23("p", { className: "ods-showcase__microcopy ods-showcase__microcopy--success", children: "\u2713 WORKSPACE READY" }),
1883
+ /* @__PURE__ */ jsxs21("h3", { id: titleId, className: "ods-showcase__glass-title", children: [
1030
1884
  "Welcome to OctaviaFlow",
1031
1885
  firstName ? `, ${firstName}` : "",
1032
1886
  "."
1033
1887
  ] }),
1034
- /* @__PURE__ */ jsxs13("p", { className: "ods-showcase__welcome-body", children: [
1888
+ /* @__PURE__ */ jsxs21("p", { className: "ods-showcase__welcome-body", children: [
1035
1889
  "We emailed a sign-in link to ",
1036
- /* @__PURE__ */ jsx13("strong", { children: emailShown }),
1890
+ /* @__PURE__ */ jsx23("strong", { children: emailShown }),
1037
1891
  ". Your ",
1038
1892
  stepCount,
1039
1893
  "-step workflow is saved as a draft in",
1040
1894
  " ",
1041
- /* @__PURE__ */ jsx13("code", { className: "ods-showcase__slug", children: slug }),
1895
+ /* @__PURE__ */ jsx23("code", { className: "ods-showcase__slug", children: slug }),
1042
1896
  " \u2014 deploy it from the dashboard whenever you're ready."
1043
1897
  ] })
1044
1898
  ] }),
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" })
1899
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-foot", children: [
1900
+ /* @__PURE__ */ jsxs21("div", { className: "ods-showcase__glass-actions", children: [
1901
+ /* @__PURE__ */ jsx23("a", { className: "ods-showcase__solid-link", href: dashboardHref, children: "Open dashboard \u2192" }),
1902
+ /* @__PURE__ */ jsx23("a", { className: "ods-showcase__text-link", href: onboardingHref, children: "Book onboarding \u2192" })
1049
1903
  ] }),
1050
- /* @__PURE__ */ jsxs13("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--right", children: [
1904
+ /* @__PURE__ */ jsxs21("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--right", children: [
1051
1905
  "PRIVATE BETA",
1052
- /* @__PURE__ */ jsx13("br", {}),
1906
+ /* @__PURE__ */ jsx23("br", {}),
1053
1907
  "ONBOARDING INCLUDED"
1054
1908
  ] })
1055
1909
  ] })
@@ -1063,10 +1917,10 @@ function ShowcaseSignup({
1063
1917
  }
1064
1918
 
1065
1919
  // src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx
1066
- import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
1920
+ import { Fragment as Fragment5, jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
1067
1921
  var EMPTY_PLAN = { left: [], right: [], all: [], totalSteps: 1 };
1068
1922
  function ConnectorTile({ connector }) {
1069
- return /* @__PURE__ */ jsx14(
1923
+ return /* @__PURE__ */ jsx24(
1070
1924
  "span",
1071
1925
  {
1072
1926
  "aria-hidden": "true",
@@ -1080,6 +1934,7 @@ function WorkflowShowcase({
1080
1934
  examples = WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,
1081
1935
  metrics = WORKFLOW_SHOWCASE_DEFAULT_METRICS,
1082
1936
  defaultPrompt = "",
1937
+ rotatePrompts = true,
1083
1938
  modelLabel = "octavia-core-1",
1084
1939
  canvasLabel = "workflow_canvas",
1085
1940
  railLabel = "OCTAVIA IS DOING",
@@ -1098,15 +1953,23 @@ function WorkflowShowcase({
1098
1953
  ...rest
1099
1954
  }) {
1100
1955
  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);
1956
+ const rotationActive = rotatePrompts && !defaultPrompt && examples.length > 0;
1957
+ const [prompt, setPrompt] = useState6(
1958
+ defaultPrompt || (rotationActive ? examples[0]?.prompt ?? "" : "")
1959
+ );
1960
+ const [engagedWithPrompt, setEngagedWithPrompt] = useState6(false);
1961
+ const [promptHovered, setPromptHovered] = useState6(false);
1962
+ const [promptFocused, setPromptFocused] = useState6(false);
1963
+ const rotateIdx = useRef2(0);
1964
+ const [selected, setSelected] = useState6([]);
1965
+ const [phase, setPhase] = useState6("idle");
1966
+ const [shown, setShown] = useState6(0);
1967
+ const [status, setStatus] = useState6("");
1968
+ const [pickerOpen, setPickerOpen] = useState6(false);
1969
+ const [schedIdx, setSchedIdx] = useState6(0);
1970
+ const [swap, setSwap] = useState6(null);
1971
+ const [signupError, setSignupError] = useState6(null);
1972
+ const signupReturnPhase = useRef2("done");
1110
1973
  const cardRef = useRef2(null);
1111
1974
  const timers = useRef2([]);
1112
1975
  const clearTimers = useCallback(() => {
@@ -1131,13 +1994,13 @@ function WorkflowShowcase({
1131
1994
  }, [phase, onPhaseChange]);
1132
1995
  const phaseRef = useRef2(phase);
1133
1996
  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]);
1997
+ const byName = useMemo2(() => new Map(connectors.map((c) => [c.name, c])), [connectors]);
1998
+ const detected = useMemo2(() => detectConnectors(prompt, connectors), [prompt, connectors]);
1999
+ const union = useMemo2(() => [.../* @__PURE__ */ new Set([...selected, ...detected])], [selected, detected]);
1137
2000
  const settled = SETTLED_PHASES.includes(phase);
1138
2001
  const engaged = phase !== "idle";
1139
2002
  const buildingNow = phase === "analyzing" || phase === "building";
1140
- const plan = useMemo(() => {
2003
+ const plan = useMemo2(() => {
1141
2004
  if (!selected.length) return EMPTY_PLAN;
1142
2005
  return resolvePlan(selected, [], connectors);
1143
2006
  }, [selected, connectors]);
@@ -1145,6 +2008,20 @@ function WorkflowShowcase({
1145
2008
  const inferredSchedule = scheduleFromPrompt(prompt);
1146
2009
  const manualSchedule = schedules[schedIdx];
1147
2010
  const scheduleShown = inferredSchedule ?? (manualSchedule === "AUTO" ? "HOURLY" : manualSchedule);
2011
+ const triggers = WORKFLOW_SHOWCASE_TRIGGERS;
2012
+ const [triggerIdx, setTriggerIdx] = useState6(0);
2013
+ const manualTrigger = triggers[triggerIdx];
2014
+ const cadenceShown = manualTrigger === "SCHEDULE" ? scheduleShown : manualTrigger;
2015
+ useEffect2(() => {
2016
+ if (!rotationActive || engagedWithPrompt || promptHovered || promptFocused || phase !== "idle") {
2017
+ return;
2018
+ }
2019
+ const timer = setInterval(() => {
2020
+ rotateIdx.current = (rotateIdx.current + 1) % examples.length;
2021
+ setPrompt(examples[rotateIdx.current].prompt);
2022
+ }, 4200);
2023
+ return () => clearInterval(timer);
2024
+ }, [rotationActive, engagedWithPrompt, promptHovered, promptFocused, phase, examples]);
1148
2025
  const startBuild = useCallback(
1149
2026
  (text, baseSelected) => {
1150
2027
  if (phaseRef.current === "analyzing" || phaseRef.current === "building") return;
@@ -1160,7 +2037,12 @@ function WorkflowShowcase({
1160
2037
  setStatus("analyzing request \xB7 matching connectors");
1161
2038
  setPickerOpen(false);
1162
2039
  setSwap(null);
1163
- onBuild?.({ prompt: text, connectors: target, schedule: scheduleShown });
2040
+ onBuild?.({
2041
+ prompt: text,
2042
+ connectors: target,
2043
+ schedule: scheduleShown,
2044
+ trigger: manualTrigger
2045
+ });
1164
2046
  additions.forEach((name, i) => {
1165
2047
  at(250 + i * 200, () => setSelected((s) => s.includes(name) ? s : [...s, name]));
1166
2048
  });
@@ -1175,7 +2057,7 @@ function WorkflowShowcase({
1175
2057
  }
1176
2058
  at(t0 + 1600 + resolved.totalSteps * 380 + 350, () => setPhase("done"));
1177
2059
  },
1178
- [clearTimers, connectors, onBuild, scheduleShown, at]
2060
+ [clearTimers, connectors, onBuild, scheduleShown, manualTrigger, at]
1179
2061
  );
1180
2062
  const resetToIdle = useCallback(() => {
1181
2063
  clearTimers();
@@ -1229,10 +2111,10 @@ function WorkflowShowcase({
1229
2111
  coachLine = "DESTINATION SET \u2014 WHAT SHOULD OCTAVIA PULL FROM?";
1230
2112
  coachAdds = connectors.filter((c) => c.role === "source" && notIn(c)).slice(0, 2);
1231
2113
  } else if (!hasNotify) {
1232
- coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${scheduleShown} \xB7 TIP: ALERT YOUR TEAM WHEN RUNS FINISH`;
2114
+ coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${cadenceShown} \xB7 TIP: ALERT YOUR TEAM WHEN RUNS FINISH`;
1233
2115
  coachAdds = connectors.filter((c) => c.role === "notify" && notIn(c)).slice(0, 1);
1234
2116
  } else {
1235
- coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${scheduleShown} \xB7 CLICK A HIGHLIGHTED NAME TO SWAP IT`;
2117
+ coachLine = `\u2713 ${union.length} CONNECTORS \xB7 ${cadenceShown} \xB7 CLICK A HIGHLIGHTED NAME TO SWAP IT`;
1236
2118
  }
1237
2119
  const coachTone = union.length ? hasSource && hasSink ? "success" : "accent" : "muted";
1238
2120
  const badge = settled ? { label: "LIVE", tone: "success", pulse: true } : buildingNow ? {
@@ -1245,7 +2127,7 @@ function WorkflowShowcase({
1245
2127
  const activity = buildActivity({ phase, shown, plan, selected, status });
1246
2128
  const costMetric = metrics.find((m) => m.tone === "success");
1247
2129
  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";
2130
+ const railFoot = phase === "idle" ? `${catalogNote} CONNECTORS \xB7 FREE IN PRIVATE BETA` : settled ? `COST PLAN SELECTED \xB7 ${costLabel} SAVED` : "COST OPTIMIZER RUNNING\u2026";
1249
2131
  const nLeft = plan.left.length;
1250
2132
  const sceneLeft = plan.left.map((c, i) => ({
1251
2133
  connector: c,
@@ -1296,198 +2178,230 @@ function WorkflowShowcase({
1296
2178
  animate: { opacity: 1, y: 0 },
1297
2179
  transition: { duration: 0.4, delay, ease: [0.2, 0.7, 0.2, 1] }
1298
2180
  };
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(
2181
+ return /* @__PURE__ */ jsxs22("section", { ...rest, className: cn("ods-showcase", className), children: [
2182
+ /* @__PURE__ */ jsxs22(
2183
+ "div",
2184
+ {
2185
+ ref: cardRef,
2186
+ className: "ods-showcase__card",
2187
+ onMouseEnter: () => setPromptHovered(true),
2188
+ onMouseLeave: () => setPromptHovered(false),
2189
+ children: [
2190
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__prompt", children: [
2191
+ /* @__PURE__ */ jsx24(
2192
+ "textarea",
2193
+ {
2194
+ className: "ods-showcase__prompt-input",
2195
+ value: prompt,
2196
+ onChange: (e) => {
2197
+ setEngagedWithPrompt(true);
2198
+ setPrompt(e.target.value);
2199
+ },
2200
+ onKeyDown: onPromptKeyDown,
2201
+ onFocus: () => setPromptFocused(true),
2202
+ onBlur: () => setPromptFocused(false),
2203
+ "aria-label": promptAriaLabel,
2204
+ spellCheck: false,
2205
+ rows: 2
2206
+ }
2207
+ ),
2208
+ /* @__PURE__ */ jsx24("div", { className: "ods-showcase__prompt-render", "aria-hidden": "true", children: prompt ? segments.map(
2209
+ (seg, i) => seg.connector ? /* @__PURE__ */ jsxs22(
2210
+ "button",
2211
+ {
2212
+ type: "button",
2213
+ tabIndex: -1,
2214
+ className: cn(
2215
+ "ods-showcase__token",
2216
+ `ods-showcase__token--${seg.connector.role}`
2217
+ ),
2218
+ onClick: (e) => {
2219
+ const name = seg.connector?.name;
2220
+ if (name) openSwap(name, seg.text, e.currentTarget);
2221
+ },
2222
+ children: [
2223
+ !promptFocused && /* @__PURE__ */ jsx24(ConnectorTile, { connector: seg.connector }),
2224
+ seg.text
2225
+ ]
2226
+ },
2227
+ i
2228
+ ) : (
2229
+ // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature
2230
+ /* @__PURE__ */ jsx24("span", { children: seg.text }, i)
2231
+ )
2232
+ ) : /* @__PURE__ */ jsxs22(Fragment5, { children: [
2233
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__placeholder", children: "Describe your pipeline \u2014 e.g. " }),
2234
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__placeholder ods-showcase__placeholder--faint", children: '"Sync Storefront orders to Warehouse hourly, alert sales in Team Chat"' })
2235
+ ] }) })
2236
+ ] }),
2237
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__coach", children: [
2238
+ /* @__PURE__ */ jsx24(
2239
+ "span",
2240
+ {
2241
+ className: cn("ods-showcase__coach-line", `ods-showcase__coach-line--${coachTone}`),
2242
+ children: coachLine
2243
+ }
2244
+ ),
2245
+ coachAdds.map((c) => /* @__PURE__ */ jsxs22(
1374
2246
  "button",
1375
2247
  {
1376
2248
  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),
2249
+ className: "ods-showcase__coach-add",
1382
2250
  onClick: () => toggleConnector(c.name),
1383
2251
  children: [
1384
- /* @__PURE__ */ jsx14(ConnectorTile, { connector: c }),
2252
+ /* @__PURE__ */ jsx24(ConnectorTile, { connector: c }),
2253
+ "+ ",
1385
2254
  c.name
1386
2255
  ]
1387
2256
  },
1388
2257
  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"
2258
+ ))
2259
+ ] }),
2260
+ /* @__PURE__ */ jsx24(AnimatePresence2, { initial: false, children: pickerOpen && /* @__PURE__ */ jsx24(
2261
+ motion3.div,
2262
+ {
2263
+ className: "ods-showcase__picker",
2264
+ initial: reducedMotion ? false : { opacity: 0, height: 0 },
2265
+ animate: { opacity: 1, height: "auto" },
2266
+ exit: reducedMotion ? { opacity: 0 } : { opacity: 0, height: 0 },
2267
+ transition: { duration: 0.22, ease: [0.2, 0.7, 0.2, 1] },
2268
+ children: /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__picker-row", children: [
2269
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__microcopy", children: "CONNECTORS" }),
2270
+ connectors.map((c) => /* @__PURE__ */ jsxs22(
2271
+ "button",
2272
+ {
2273
+ type: "button",
2274
+ className: cn(
2275
+ "ods-showcase__pick",
2276
+ selected.includes(c.name) && "ods-showcase__pick--on"
2277
+ ),
2278
+ "aria-pressed": selected.includes(c.name),
2279
+ onClick: () => toggleConnector(c.name),
2280
+ children: [
2281
+ /* @__PURE__ */ jsx24(ConnectorTile, { connector: c }),
2282
+ c.name
2283
+ ]
2284
+ },
2285
+ c.name
2286
+ )),
2287
+ /* @__PURE__ */ jsxs22("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--faint", children: [
2288
+ "+ ",
2289
+ catalogNote,
2290
+ " IN THE APP"
2291
+ ] })
2292
+ ] })
2293
+ }
2294
+ ) }),
2295
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__toolbar", children: [
2296
+ /* @__PURE__ */ jsxs22(
2297
+ "button",
2298
+ {
2299
+ type: "button",
2300
+ className: cn(
2301
+ "ods-showcase__tool",
2302
+ (pickerOpen || selected.length > 0) && "ods-showcase__tool--on"
2303
+ ),
2304
+ "aria-expanded": pickerOpen,
2305
+ onClick: () => setPickerOpen((o) => !o),
2306
+ children: [
2307
+ "\uFF0B Connectors",
2308
+ selected.length ? ` \xB7 ${selected.length}` : ""
2309
+ ]
2310
+ }
1406
2311
  ),
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
- ]
2312
+ /* @__PURE__ */ jsxs22(
2313
+ "button",
2314
+ {
2315
+ type: "button",
2316
+ className: cn(
2317
+ "ods-showcase__tool",
2318
+ manualTrigger !== "SCHEDULE" && "ods-showcase__tool--on"
2319
+ ),
2320
+ onClick: () => setTriggerIdx((i) => (i + 1) % triggers.length),
2321
+ children: [
2322
+ "\u2691 ",
2323
+ manualTrigger
2324
+ ]
2325
+ }
2326
+ ),
2327
+ manualTrigger === "SCHEDULE" && /* @__PURE__ */ jsxs22(
2328
+ "button",
2329
+ {
2330
+ type: "button",
2331
+ className: "ods-showcase__tool",
2332
+ onClick: () => setSchedIdx((i) => (i + 1) % schedules.length),
2333
+ children: [
2334
+ "\u25F7 ",
2335
+ manualSchedule
2336
+ ]
2337
+ }
2338
+ ),
2339
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__model", children: modelLabel }),
2340
+ /* @__PURE__ */ jsx24(
2341
+ Button,
2342
+ {
2343
+ variant: "primary",
2344
+ onClick: () => startBuild(prompt, selected),
2345
+ disabled: buildingNow,
2346
+ children: buildingNow ? "Building\u2026" : "Build workflow \u2192"
2347
+ }
2348
+ )
2349
+ ] }),
2350
+ swap && swapRole && /* @__PURE__ */ jsxs22(Fragment5, { children: [
2351
+ /* @__PURE__ */ jsx24(
2352
+ "button",
2353
+ {
2354
+ type: "button",
2355
+ className: "ods-showcase__swap-backdrop",
2356
+ "aria-label": "Close swap menu",
2357
+ onClick: () => setSwap(null)
2358
+ }
2359
+ ),
2360
+ /* @__PURE__ */ jsxs22(
2361
+ "div",
2362
+ {
2363
+ className: "ods-showcase__swap",
2364
+ role: "menu",
2365
+ style: { left: swap.x, top: swap.y },
2366
+ onKeyDown: (e) => {
2367
+ if (e.key === "Escape") setSwap(null);
1476
2368
  },
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(
2369
+ children: [
2370
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__swap-head", children: [
2371
+ "SWAP ",
2372
+ swapRole.toUpperCase(),
2373
+ " \u2014 ",
2374
+ swap.name.toUpperCase()
2375
+ ] }),
2376
+ swapItems.map((c) => /* @__PURE__ */ jsxs22(
2377
+ "button",
2378
+ {
2379
+ type: "button",
2380
+ role: "menuitem",
2381
+ className: "ods-showcase__swap-item",
2382
+ onClick: () => doSwap(swap, c.name),
2383
+ children: [
2384
+ /* @__PURE__ */ jsx24(ConnectorTile, { connector: c }),
2385
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__swap-name", children: c.name }),
2386
+ c.name === swap.name && /* @__PURE__ */ jsx24("span", { className: "ods-showcase__swap-mark", children: "\u25CF CURRENT" })
2387
+ ]
2388
+ },
2389
+ c.name
2390
+ )),
2391
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__swap-foot", children: [
2392
+ catalogNote,
2393
+ " CONNECTORS IN THE APP"
2394
+ ] })
2395
+ ]
2396
+ }
2397
+ )
2398
+ ] })
2399
+ ]
2400
+ }
2401
+ ),
2402
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__examples", children: [
2403
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__microcopy", children: "TRY:" }),
2404
+ examples.map((ex) => /* @__PURE__ */ jsx24(
1491
2405
  "button",
1492
2406
  {
1493
2407
  type: "button",
@@ -1498,30 +2412,30 @@ function WorkflowShowcase({
1498
2412
  ex.id
1499
2413
  ))
1500
2414
  ] }),
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: [
2415
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__canvas", children: [
2416
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__canvas-head", children: [
2417
+ /* @__PURE__ */ jsxs22("span", { className: "ods-showcase__microcopy", children: [
1504
2418
  canvasLabel,
1505
2419
  " \xB7 ",
1506
2420
  canvasSub
1507
2421
  ] }),
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") }),
2422
+ /* @__PURE__ */ jsxs22("span", { className: cn("ods-showcase__badge", `ods-showcase__badge--${badge.tone}`), children: [
2423
+ /* @__PURE__ */ jsx24("span", { className: cn("ods-showcase__dot", badge.pulse && "ods-showcase__dot--pulse") }),
1510
2424
  badge.label
1511
2425
  ] })
1512
2426
  ] }),
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(
2427
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__stage", children: [
2428
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__rail", children: [
2429
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__rail-head", children: [
2430
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__microcopy", children: railLabel }),
2431
+ /* @__PURE__ */ jsx24(
1518
2432
  "span",
1519
2433
  {
1520
2434
  className: cn("ods-showcase__dot", badge.pulse && "ods-showcase__dot--pulse")
1521
2435
  }
1522
2436
  )
1523
2437
  ] }),
1524
- /* @__PURE__ */ jsx14("div", { className: "ods-showcase__rail-body", children: /* @__PURE__ */ jsx14(AnimatePresence2, { initial: false, children: activity.map((line) => /* @__PURE__ */ jsx14(
2438
+ /* @__PURE__ */ jsx24("div", { className: "ods-showcase__rail-body", children: /* @__PURE__ */ jsx24(AnimatePresence2, { initial: false, children: activity.map((line) => /* @__PURE__ */ jsx24(
1525
2439
  motion3.div,
1526
2440
  {
1527
2441
  className: cn("ods-showcase__act", `ods-showcase__act--${line.tone}`),
@@ -1533,7 +2447,7 @@ function WorkflowShowcase({
1533
2447
  },
1534
2448
  line.id
1535
2449
  )) }) }),
1536
- /* @__PURE__ */ jsx14(
2450
+ /* @__PURE__ */ jsx24(
1537
2451
  "div",
1538
2452
  {
1539
2453
  className: cn(
@@ -1545,7 +2459,7 @@ function WorkflowShowcase({
1545
2459
  }
1546
2460
  )
1547
2461
  ] }),
1548
- /* @__PURE__ */ jsx14(
2462
+ /* @__PURE__ */ jsx24(
1549
2463
  ShowcaseScene,
1550
2464
  {
1551
2465
  left: sceneLeft,
@@ -1553,14 +2467,22 @@ function WorkflowShowcase({
1553
2467
  engaged,
1554
2468
  tiles: platformTiles,
1555
2469
  coreIcon,
1556
- caption: sceneCaption
2470
+ caption: sceneCaption,
2471
+ onCoreClick: () => {
2472
+ if (buildingNow || phase === "signup" || phase === "creating" || phase === "welcome") {
2473
+ return;
2474
+ }
2475
+ signupReturnPhase.current = phase;
2476
+ setSignupError(null);
2477
+ setPhase("signup");
2478
+ }
1557
2479
  }
1558
2480
  ),
1559
- /* @__PURE__ */ jsx14("div", { className: "ods-showcase__metrics", children: metrics.map((m, idx) => {
2481
+ /* @__PURE__ */ jsx24("div", { className: "ods-showcase__metrics", children: metrics.map((m, idx) => {
1560
2482
  const revealed = settled || phase === "building" && shown > idx;
1561
2483
  const interim = m.buildingValue != null && !settled && revealed;
1562
- return /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__metric", children: [
1563
- /* @__PURE__ */ jsxs14(
2484
+ return /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__metric", children: [
2485
+ /* @__PURE__ */ jsxs22(
1564
2486
  "div",
1565
2487
  {
1566
2488
  className: cn(
@@ -1569,7 +2491,7 @@ function WorkflowShowcase({
1569
2491
  m.tone === "success" && settled && "ods-showcase__metric-value--success"
1570
2492
  ),
1571
2493
  children: [
1572
- settled ? /* @__PURE__ */ jsx14(
2494
+ settled ? /* @__PURE__ */ jsx24(
1573
2495
  CountUp,
1574
2496
  {
1575
2497
  value: m.value,
@@ -1582,17 +2504,17 @@ function WorkflowShowcase({
1582
2504
  }
1583
2505
  ) : interim ? `${m.prefix ?? ""}${m.buildingValue}` : "\u2014",
1584
2506
  revealed && m.suffix ? m.suffix : null,
1585
- revealed && m.unit ? /* @__PURE__ */ jsxs14("span", { className: "ods-showcase__metric-unit", children: [
2507
+ revealed && m.unit ? /* @__PURE__ */ jsxs22("span", { className: "ods-showcase__metric-unit", children: [
1586
2508
  " ",
1587
2509
  m.unit
1588
2510
  ] }) : null
1589
2511
  ]
1590
2512
  }
1591
2513
  ),
1592
- /* @__PURE__ */ jsx14("div", { className: "ods-showcase__microcopy", children: m.label })
2514
+ /* @__PURE__ */ jsx24("div", { className: "ods-showcase__microcopy", children: m.label })
1593
2515
  ] }, m.id);
1594
2516
  }) }),
1595
- /* @__PURE__ */ jsx14(
2517
+ /* @__PURE__ */ jsx24(
1596
2518
  ShowcaseSignup,
1597
2519
  {
1598
2520
  phase,
@@ -1603,7 +2525,7 @@ function WorkflowShowcase({
1603
2525
  onSubmit: submitSignup,
1604
2526
  onBack: () => {
1605
2527
  setSignupError(null);
1606
- setPhase("done");
2528
+ setPhase(signupReturnPhase.current);
1607
2529
  },
1608
2530
  dashboardHref,
1609
2531
  onboardingHref
@@ -1611,31 +2533,32 @@ function WorkflowShowcase({
1611
2533
  )
1612
2534
  ] })
1613
2535
  ] }),
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" }),
2536
+ /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__outro", "aria-live": "polite", children: [
2537
+ buildingNow && /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__building", children: [
2538
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__spin", "aria-hidden": "true", children: "\u27F3" }),
1617
2539
  " ",
1618
2540
  status
1619
2541
  ] }),
1620
- phase === "done" && /* @__PURE__ */ jsxs14("div", { className: "ods-showcase__done", children: [
1621
- /* @__PURE__ */ jsxs14(motion3.div, { className: "ods-showcase__done-note", ...rise(0), children: [
2542
+ phase === "done" && /* @__PURE__ */ jsxs22("div", { className: "ods-showcase__done", children: [
2543
+ /* @__PURE__ */ jsxs22(motion3.div, { className: "ods-showcase__done-note", ...rise(0), children: [
1622
2544
  "\u2713 ",
1623
2545
  doneNote
1624
2546
  ] }),
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(
2547
+ /* @__PURE__ */ jsxs22(motion3.div, { className: "ods-showcase__cta", ...rise(0.2), children: [
2548
+ /* @__PURE__ */ jsx24("span", { className: "ods-showcase__cta-copy", children: "Deploy it on your own data \u2014 takes 2 minutes." }),
2549
+ /* @__PURE__ */ jsx24(
1628
2550
  Button,
1629
2551
  {
1630
2552
  variant: "primary",
1631
2553
  onClick: () => {
2554
+ signupReturnPhase.current = "done";
1632
2555
  setSignupError(null);
1633
2556
  setPhase("signup");
1634
2557
  },
1635
2558
  children: "Create free account \u2192"
1636
2559
  }
1637
2560
  ),
1638
- /* @__PURE__ */ jsx14("a", { className: "ods-showcase__text-link", href: onboardingHref, children: "Book onboarding \u2192" })
2561
+ /* @__PURE__ */ jsx24("a", { className: "ods-showcase__text-link", href: onboardingHref, children: "Book onboarding \u2192" })
1639
2562
  ] })
1640
2563
  ] })
1641
2564
  ] })
@@ -1644,20 +2567,30 @@ function WorkflowShowcase({
1644
2567
  export {
1645
2568
  ActionGlyph,
1646
2569
  AssistantTranscript,
2570
+ BackedBy,
2571
+ BetaAccessForm,
2572
+ BlogGrid,
1647
2573
  BrandMark,
1648
2574
  ConnectorGlyph,
2575
+ ContactForm,
1649
2576
  CtaBanner,
1650
2577
  DestinationGlyph,
2578
+ FaqSection,
1651
2579
  FeatureGrid,
2580
+ IntegrationsFinder,
1652
2581
  IntegrationsWall,
1653
2582
  LiveConsole,
2583
+ LogoMarquee,
1654
2584
  MarketingFooter,
1655
2585
  MarketingHero,
1656
2586
  MarketingNav,
1657
2587
  MarketingSection,
1658
2588
  NotifyGlyph,
2589
+ PageHero,
2590
+ PricingTiers,
1659
2591
  SourceGlyph,
1660
2592
  StatBand,
2593
+ TestimonialStrip,
1661
2594
  WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,
1662
2595
  WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,
1663
2596
  WORKFLOW_SHOWCASE_DEFAULT_METRICS,