@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.
- package/dist/chunk-64R3BAO7.js +2755 -0
- package/dist/chunk-64R3BAO7.js.map +1 -0
- package/dist/chunk-7S3CSRRV.js +5700 -0
- package/dist/chunk-7S3CSRRV.js.map +1 -0
- package/dist/chunk-KCA7V5VN.js +5752 -0
- package/dist/chunk-KCA7V5VN.js.map +1 -0
- package/dist/chunk-KQKD4Z4H.js +1682 -0
- package/dist/chunk-KQKD4Z4H.js.map +1 -0
- package/dist/chunk-PWCRELX4.js +5700 -0
- package/dist/chunk-PWCRELX4.js.map +1 -0
- package/dist/chunk-U5T63SPL.js +5695 -0
- package/dist/chunk-U5T63SPL.js.map +1 -0
- package/dist/chunk-YIPBLM3G.js +2698 -0
- package/dist/chunk-YIPBLM3G.js.map +1 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4462 -6007
- package/dist/index.js.map +1 -1
- package/dist/marketing/components/BackedBy/BackedBy.d.ts +17 -0
- package/dist/marketing/components/BackedBy/BackedBy.d.ts.map +1 -0
- package/dist/marketing/components/BetaAccessForm/BetaAccessForm.d.ts +36 -0
- package/dist/marketing/components/BetaAccessForm/BetaAccessForm.d.ts.map +1 -0
- package/dist/marketing/components/BlogGrid/BlogGrid.d.ts +32 -0
- package/dist/marketing/components/BlogGrid/BlogGrid.d.ts.map +1 -0
- package/dist/marketing/components/ContactForm/ContactForm.d.ts +31 -0
- package/dist/marketing/components/ContactForm/ContactForm.d.ts.map +1 -0
- package/dist/marketing/components/FaqSection/FaqSection.d.ts +13 -0
- package/dist/marketing/components/FaqSection/FaqSection.d.ts.map +1 -0
- package/dist/marketing/components/IntegrationsFinder/IntegrationsFinder.d.ts +32 -0
- package/dist/marketing/components/IntegrationsFinder/IntegrationsFinder.d.ts.map +1 -0
- package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts +5 -3
- package/dist/marketing/components/IntegrationsWall/IntegrationsWall.d.ts.map +1 -1
- package/dist/marketing/components/LiveConsole/LiveConsole.d.ts.map +1 -1
- package/dist/marketing/components/LogoMarquee/LogoMarquee.d.ts +18 -0
- package/dist/marketing/components/LogoMarquee/LogoMarquee.d.ts.map +1 -0
- package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts +6 -1
- package/dist/marketing/components/MarketingFooter/MarketingFooter.d.ts.map +1 -1
- package/dist/marketing/components/PageHero/PageHero.d.ts +12 -0
- package/dist/marketing/components/PageHero/PageHero.d.ts.map +1 -0
- package/dist/marketing/components/PricingTiers/PricingTiers.d.ts +29 -0
- package/dist/marketing/components/PricingTiers/PricingTiers.d.ts.map +1 -0
- package/dist/marketing/components/TestimonialStrip/TestimonialStrip.d.ts +24 -0
- package/dist/marketing/components/TestimonialStrip/TestimonialStrip.d.ts.map +1 -0
- package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts +4 -2
- package/dist/marketing/components/WorkflowShowcase/ShowcaseScene.d.ts.map +1 -1
- package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts +9 -1
- package/dist/marketing/components/WorkflowShowcase/WorkflowShowcase.d.ts.map +1 -1
- package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts +3 -1
- package/dist/marketing/components/WorkflowShowcase/showcaseEngine.d.ts.map +1 -1
- package/dist/marketing/index.d.ts +10 -0
- package/dist/marketing/index.d.ts.map +1 -1
- package/dist/marketing.cjs +5568 -2972
- package/dist/marketing.cjs.map +1 -1
- package/dist/marketing.js +1650 -717
- package/dist/marketing.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow/components/HttpActionPanel/HttpActionPanel.d.ts.map +1 -1
- package/dist/workflow.cjs +11 -2
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.js +11 -7
- package/dist/workflow.js.map +1 -1
- package/package.json +1 -1
package/dist/marketing.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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/
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
lede && /* @__PURE__ */
|
|
76
|
-
/* @__PURE__ */
|
|
77
|
-
/* @__PURE__ */
|
|
78
|
-
secondary && /* @__PURE__ */
|
|
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
|
-
|
|
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/
|
|
85
|
-
import { jsx as
|
|
86
|
-
function
|
|
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
|
-
|
|
89
|
-
|
|
1010
|
+
label,
|
|
1011
|
+
speed = 30,
|
|
1012
|
+
grayscale = true,
|
|
90
1013
|
className,
|
|
91
1014
|
...rest
|
|
92
1015
|
}) {
|
|
93
|
-
return /* @__PURE__ */
|
|
1016
|
+
return /* @__PURE__ */ jsxs11(
|
|
94
1017
|
"div",
|
|
95
1018
|
{
|
|
96
1019
|
...rest,
|
|
97
|
-
className: cn(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
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__ */
|
|
125
|
-
/* @__PURE__ */
|
|
126
|
-
/* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */
|
|
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__ */
|
|
132
|
-
/* @__PURE__ */
|
|
133
|
-
/* @__PURE__ */
|
|
134
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
/* @__PURE__ */
|
|
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__ */
|
|
152
|
-
/* @__PURE__ */
|
|
153
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1079
|
+
return /* @__PURE__ */ jsx13(SourceGlyph, { size });
|
|
160
1080
|
case "destination":
|
|
161
|
-
return /* @__PURE__ */
|
|
1081
|
+
return /* @__PURE__ */ jsx13(DestinationGlyph, { size });
|
|
162
1082
|
case "action":
|
|
163
|
-
return /* @__PURE__ */
|
|
1083
|
+
return /* @__PURE__ */ jsx13(ActionGlyph, { size });
|
|
164
1084
|
case "notify":
|
|
165
|
-
return /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
266
|
-
/* @__PURE__ */
|
|
267
|
-
/* @__PURE__ */
|
|
268
|
-
/* @__PURE__ */
|
|
269
|
-
/* @__PURE__ */
|
|
270
|
-
/* @__PURE__ */
|
|
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__ */
|
|
273
|
-
meta && /* @__PURE__ */
|
|
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__ */
|
|
276
|
-
/* @__PURE__ */
|
|
277
|
-
column.links.map((link) => /* @__PURE__ */
|
|
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__ */
|
|
281
|
-
/* @__PURE__ */
|
|
282
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
308
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
369
|
-
/* @__PURE__ */
|
|
370
|
-
/* @__PURE__ */
|
|
371
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
413
|
-
kicker && /* @__PURE__ */
|
|
414
|
-
title && /* @__PURE__ */
|
|
415
|
-
lede && /* @__PURE__ */
|
|
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/
|
|
424
|
-
import {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
611
|
-
|
|
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
|
-
|
|
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
|
|
622
|
-
return
|
|
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
|
-
|
|
625
|
-
|
|
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
|
|
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
|
|
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
|
|
645
|
-
var
|
|
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__ */
|
|
675
|
-
/* @__PURE__ */
|
|
676
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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] =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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__ */
|
|
758
|
-
/* @__PURE__ */
|
|
759
|
-
/* @__PURE__ */
|
|
760
|
-
pins.map((pin) => /* @__PURE__ */
|
|
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
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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__ */
|
|
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__ */
|
|
798
|
-
/* @__PURE__ */
|
|
799
|
-
/* @__PURE__ */
|
|
800
|
-
/* @__PURE__ */
|
|
801
|
-
tiles.slice(0, 8).map((label, i) => /* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
811
|
-
/* @__PURE__ */
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
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__ */
|
|
818
|
-
/* @__PURE__ */
|
|
819
|
-
/* @__PURE__ */
|
|
820
|
-
!left.length && /* @__PURE__ */
|
|
821
|
-
!right.length && /* @__PURE__ */
|
|
822
|
-
left.map((node, i) => /* @__PURE__ */
|
|
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:
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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__ */
|
|
1682
|
+
right.map((node, j) => /* @__PURE__ */ jsx22(
|
|
840
1683
|
"span",
|
|
841
1684
|
{
|
|
842
|
-
className:
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
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__ */
|
|
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
|
|
1717
|
+
import { useId as useId3, useState as useState5 } from "react";
|
|
864
1718
|
import { FocusScope } from "react-aria";
|
|
865
|
-
import { jsx as
|
|
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 =
|
|
884
|
-
const subtitleId =
|
|
885
|
-
const [values, setValues] =
|
|
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__ */
|
|
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__ */
|
|
911
|
-
phase === "signup" && /* @__PURE__ */
|
|
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__ */
|
|
927
|
-
/* @__PURE__ */
|
|
928
|
-
/* @__PURE__ */
|
|
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__ */
|
|
935
|
-
/* @__PURE__ */
|
|
936
|
-
/* @__PURE__ */
|
|
937
|
-
/* @__PURE__ */
|
|
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__ */
|
|
949
|
-
/* @__PURE__ */
|
|
950
|
-
/* @__PURE__ */
|
|
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__ */
|
|
963
|
-
/* @__PURE__ */
|
|
964
|
-
/* @__PURE__ */
|
|
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__ */
|
|
976
|
-
/* @__PURE__ */
|
|
977
|
-
/* @__PURE__ */
|
|
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__ */
|
|
989
|
-
/* @__PURE__ */
|
|
990
|
-
/* @__PURE__ */
|
|
991
|
-
/* @__PURE__ */
|
|
992
|
-
/* @__PURE__ */
|
|
993
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1009
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1028
|
-
/* @__PURE__ */
|
|
1029
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1888
|
+
/* @__PURE__ */ jsxs21("p", { className: "ods-showcase__welcome-body", children: [
|
|
1035
1889
|
"We emailed a sign-in link to ",
|
|
1036
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1046
|
-
/* @__PURE__ */
|
|
1047
|
-
/* @__PURE__ */
|
|
1048
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1904
|
+
/* @__PURE__ */ jsxs21("span", { className: "ods-showcase__microcopy ods-showcase__microcopy--right", children: [
|
|
1051
1905
|
"PRIVATE BETA",
|
|
1052
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
1102
|
-
const [
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
const [
|
|
1106
|
-
const [
|
|
1107
|
-
const [
|
|
1108
|
-
const
|
|
1109
|
-
const [
|
|
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 =
|
|
1135
|
-
const detected =
|
|
1136
|
-
const union =
|
|
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 =
|
|
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?.({
|
|
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 ${
|
|
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 ${
|
|
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__ */
|
|
1300
|
-
/* @__PURE__ */
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
"
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
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:
|
|
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__ */
|
|
2252
|
+
/* @__PURE__ */ jsx24(ConnectorTile, { connector: c }),
|
|
2253
|
+
"+ ",
|
|
1385
2254
|
c.name
|
|
1386
2255
|
]
|
|
1387
2256
|
},
|
|
1388
2257
|
c.name
|
|
1389
|
-
))
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
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
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
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
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
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__ */
|
|
1502
|
-
/* @__PURE__ */
|
|
1503
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1509
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1514
|
-
/* @__PURE__ */
|
|
1515
|
-
/* @__PURE__ */
|
|
1516
|
-
/* @__PURE__ */
|
|
1517
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1563
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2514
|
+
/* @__PURE__ */ jsx24("div", { className: "ods-showcase__microcopy", children: m.label })
|
|
1593
2515
|
] }, m.id);
|
|
1594
2516
|
}) }),
|
|
1595
|
-
/* @__PURE__ */
|
|
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(
|
|
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__ */
|
|
1615
|
-
buildingNow && /* @__PURE__ */
|
|
1616
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1621
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1626
|
-
/* @__PURE__ */
|
|
1627
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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,
|