@octaviaflow/core 3.1.0-beta.70 → 3.1.0-beta.72

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/marketing.js CHANGED
@@ -249,15 +249,20 @@ function isValidEmail(value) {
249
249
  }
250
250
 
251
251
  // src/marketing/components/BetaAccessForm/BetaAccessForm.tsx
252
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
252
+ import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
253
253
  function BetaAccessForm({
254
254
  title = "Request early access",
255
255
  subtitle = "CURRENTLY IN PRIVATE BETA \u2014 WE REVIEW ACCESS REQUESTS WEEKLY",
256
256
  fields = "email",
257
+ nameLayout = "single",
257
258
  appearance = "card",
258
259
  teamSizes,
259
260
  plans,
260
261
  defaultPlan,
262
+ useCases,
263
+ showDetails = false,
264
+ detailsLabel = "Anything else we should know?",
265
+ detailsPlaceholder = "Current stack, timelines, must-have connectors\u2026",
261
266
  submitLabel = "Request access \u2192",
262
267
  footnote = "NO CREDIT CARD \xB7 SSO & SELF-HOSTING AVAILABLE",
263
268
  onSubmit,
@@ -270,9 +275,13 @@ function BetaAccessForm({
270
275
  const [values, setValues] = useState({
271
276
  email: "",
272
277
  name: "",
278
+ firstName: "",
279
+ lastName: "",
273
280
  company: "",
274
281
  teamSize: "",
275
- plan: defaultPlan ?? ""
282
+ plan: defaultPlan ?? "",
283
+ useCase: "",
284
+ details: ""
276
285
  });
277
286
  const [phase, setPhase] = useState("idle");
278
287
  const [error, setError] = useState(null);
@@ -283,14 +292,22 @@ function BetaAccessForm({
283
292
  setError("Please enter a valid work email.");
284
293
  return;
285
294
  }
286
- if (fields === "full" && !values.name?.trim()) {
295
+ if (fields === "full" && nameLayout === "single" && !values.name?.trim()) {
287
296
  setError("Please enter your name.");
288
297
  return;
289
298
  }
299
+ if (fields === "full" && nameLayout === "split" && !values.firstName?.trim()) {
300
+ setError("Please enter your first name.");
301
+ return;
302
+ }
290
303
  if (fields === "full" && teamSizes?.length && !values.teamSize) {
291
304
  setError("Please select your team size.");
292
305
  return;
293
306
  }
307
+ if (fields === "full" && useCases?.length && !values.useCase) {
308
+ setError("Please select your primary use case.");
309
+ return;
310
+ }
294
311
  setError(null);
295
312
  setPhase("submitting");
296
313
  try {
@@ -343,7 +360,7 @@ function BetaAccessForm({
343
360
  fields === "full" && "ods-mkt-access__fields--full"
344
361
  ),
345
362
  children: [
346
- fields === "full" && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
363
+ fields === "full" && nameLayout === "single" && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
347
364
  /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-name`, children: "Full name" }),
348
365
  /* @__PURE__ */ jsx3(
349
366
  Input,
@@ -357,6 +374,36 @@ function BetaAccessForm({
357
374
  }
358
375
  )
359
376
  ] }),
377
+ fields === "full" && nameLayout === "split" && /* @__PURE__ */ jsxs3(Fragment, { children: [
378
+ /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
379
+ /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-firstname`, children: "First name" }),
380
+ /* @__PURE__ */ jsx3(
381
+ Input,
382
+ {
383
+ id: `${uid}-firstname`,
384
+ autoComplete: "given-name",
385
+ placeholder: "Ada",
386
+ value: values.firstName ?? "",
387
+ onChange: (e) => setValues((v) => ({ ...v, firstName: e.target.value })),
388
+ disabled: busy
389
+ }
390
+ )
391
+ ] }),
392
+ /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
393
+ /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-lastname`, children: "Last name" }),
394
+ /* @__PURE__ */ jsx3(
395
+ Input,
396
+ {
397
+ id: `${uid}-lastname`,
398
+ autoComplete: "family-name",
399
+ placeholder: "Lovelace",
400
+ value: values.lastName ?? "",
401
+ onChange: (e) => setValues((v) => ({ ...v, lastName: e.target.value })),
402
+ disabled: busy
403
+ }
404
+ )
405
+ ] })
406
+ ] }),
360
407
  /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
361
408
  /* @__PURE__ */ jsx3("label", { className: "ods-mkt-access__label", htmlFor: `${uid}-email`, children: "Work email" }),
362
409
  /* @__PURE__ */ jsx3(
@@ -414,6 +461,43 @@ function BetaAccessForm({
414
461
  }
415
462
  )
416
463
  ] }),
464
+ fields === "full" && useCases && useCases.length > 0 && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field", children: [
465
+ /* @__PURE__ */ jsx3("span", { className: "ods-mkt-access__label", id: `${uid}-usecase-label`, children: "Primary use case" }),
466
+ /* @__PURE__ */ jsx3(
467
+ Select,
468
+ {
469
+ "aria-labelledby": `${uid}-usecase-label`,
470
+ placeholder: "Select a use case\u2026",
471
+ options: useCases.map((useCase) => ({ value: useCase, label: useCase })),
472
+ value: values.useCase ?? "",
473
+ onChange: (useCase) => setValues((v) => ({ ...v, useCase })),
474
+ disabled: busy
475
+ }
476
+ )
477
+ ] }),
478
+ fields === "full" && showDetails && /* @__PURE__ */ jsxs3("div", { className: "ods-mkt-access__field ods-mkt-access__field--wide", children: [
479
+ /* @__PURE__ */ jsx3(
480
+ "label",
481
+ {
482
+ className: "ods-mkt-access__label",
483
+ id: `${uid}-details-label`,
484
+ htmlFor: `${uid}-details`,
485
+ children: detailsLabel
486
+ }
487
+ ),
488
+ /* @__PURE__ */ jsx3(
489
+ Textarea,
490
+ {
491
+ id: `${uid}-details`,
492
+ "aria-labelledby": `${uid}-details-label`,
493
+ placeholder: detailsPlaceholder,
494
+ rows: 3,
495
+ value: values.details ?? "",
496
+ onChange: (e) => setValues((v) => ({ ...v, details: e.target.value })),
497
+ disabled: busy
498
+ }
499
+ )
500
+ ] }),
417
501
  /* @__PURE__ */ jsx3(
418
502
  Button,
419
503
  {
@@ -610,7 +694,7 @@ function ContactForm({
610
694
  {
611
695
  id: `${uid}-message`,
612
696
  "aria-labelledby": `${uid}-message-label`,
613
- placeholder: "What are you trying to build?",
697
+ placeholder: selectedTopic?.messagePlaceholder ?? "What are you trying to build?",
614
698
  rows: 4,
615
699
  value: values.message,
616
700
  onChange: (e) => setValues((v) => ({ ...v, message: e.target.value })),
@@ -732,7 +816,7 @@ function FeatureGrid({
732
816
  // src/marketing/components/IntegrationsFinder/IntegrationsFinder.tsx
733
817
  import { CheckmarkIcon, SearchIcon } from "@octaviaflow/icons";
734
818
  import { useMemo, useState as useState3 } from "react";
735
- import { Fragment, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
819
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
736
820
  function LetterTile({ name }) {
737
821
  return /* @__PURE__ */ jsx9("span", { className: "ods-mkt-finder__letter", "aria-hidden": "true", children: name.trim().charAt(0).toUpperCase() });
738
822
  }
@@ -854,7 +938,7 @@ function IntegrationsFinder({
854
938
  " ",
855
939
  /* @__PURE__ */ jsx9("strong", { children: query.trim() }),
856
940
  " connector is available."
857
- ] }) : /* @__PURE__ */ jsxs8(Fragment, { children: [
941
+ ] }) : /* @__PURE__ */ jsxs8(Fragment2, { children: [
858
942
  /* @__PURE__ */ jsxs8("h3", { className: "ods-mkt-finder__miss-title", children: [
859
943
  "No native ",
860
944
  /* @__PURE__ */ jsx9("strong", { children: query.trim() }),
@@ -1087,7 +1171,7 @@ function roleGlyph(role, size = 12) {
1087
1171
  }
1088
1172
 
1089
1173
  // src/marketing/components/MarketingFooter/MarketingFooter.tsx
1090
- import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
1174
+ import { Fragment as Fragment3, jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
1091
1175
  function MarketingFooter({
1092
1176
  brand,
1093
1177
  tagline,
@@ -1102,7 +1186,7 @@ function MarketingFooter({
1102
1186
  return /* @__PURE__ */ jsxs13("footer", { ...rest, className: cn("ods-mkt-footer", className), children: [
1103
1187
  /* @__PURE__ */ jsxs13("div", { className: "ods-mkt-footer__grid", children: [
1104
1188
  /* @__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: [
1189
+ /* @__PURE__ */ jsx14("div", { className: "ods-mkt-footer__brand", children: brand ?? /* @__PURE__ */ jsxs13(Fragment3, { children: [
1106
1190
  /* @__PURE__ */ jsx14(BrandMark, { size: 16 }),
1107
1191
  /* @__PURE__ */ jsx14("span", { children: "OctaviaFlow" })
1108
1192
  ] }) }),
@@ -1193,7 +1277,24 @@ function MarketingHero({
1193
1277
  }
1194
1278
 
1195
1279
  // src/marketing/components/MarketingNav/MarketingNav.tsx
1196
- import { Fragment as Fragment3, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
1280
+ import { useState as useState4 } from "react";
1281
+ import { Fragment as Fragment4, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
1282
+ function BurgerGlyph({ open }) {
1283
+ return /* @__PURE__ */ jsx16(
1284
+ "svg",
1285
+ {
1286
+ viewBox: "0 0 24 24",
1287
+ width: "20",
1288
+ height: "20",
1289
+ fill: "none",
1290
+ stroke: "currentColor",
1291
+ strokeWidth: "2",
1292
+ strokeLinecap: "round",
1293
+ "aria-hidden": "true",
1294
+ children: open ? /* @__PURE__ */ jsx16("path", { d: "M6 6l12 12M18 6 6 18" }) : /* @__PURE__ */ jsx16("path", { d: "M4 7h16M4 12h16M4 17h16" })
1295
+ }
1296
+ );
1297
+ }
1197
1298
  function MarketingNav({
1198
1299
  brand,
1199
1300
  brandHref = "/",
@@ -1203,8 +1304,9 @@ function MarketingNav({
1203
1304
  className,
1204
1305
  ...rest
1205
1306
  }) {
1307
+ const [mobileOpen, setMobileOpen] = useState4(false);
1206
1308
  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: [
1309
+ /* @__PURE__ */ jsx16("a", { className: "ods-mkt-nav__brand", href: brandHref, children: brand ?? /* @__PURE__ */ jsxs15(Fragment4, { children: [
1208
1310
  /* @__PURE__ */ jsx16(BrandMark, {}),
1209
1311
  /* @__PURE__ */ jsx16("span", { children: "OctaviaFlow" })
1210
1312
  ] }) }),
@@ -1218,7 +1320,35 @@ function MarketingNav({
1218
1320
  },
1219
1321
  link.href
1220
1322
  )) }),
1221
- actions && /* @__PURE__ */ jsx16("div", { className: "ods-mkt-nav__actions", children: actions })
1323
+ actions && /* @__PURE__ */ jsx16("div", { className: "ods-mkt-nav__actions", children: actions }),
1324
+ (links.length > 0 || actions) && /* @__PURE__ */ jsx16(
1325
+ "button",
1326
+ {
1327
+ type: "button",
1328
+ className: "ods-mkt-nav__toggle",
1329
+ "aria-expanded": mobileOpen,
1330
+ "aria-label": "Toggle menu",
1331
+ onClick: () => setMobileOpen((open) => !open),
1332
+ children: /* @__PURE__ */ jsx16(BurgerGlyph, { open: mobileOpen })
1333
+ }
1334
+ ),
1335
+ mobileOpen && /* @__PURE__ */ jsxs15("nav", { className: "ods-mkt-nav__mobile", "aria-label": "Main", children: [
1336
+ links.map((link) => /* @__PURE__ */ jsx16(
1337
+ "a",
1338
+ {
1339
+ href: link.href,
1340
+ className: cn(
1341
+ "ods-mkt-nav__mobile-link",
1342
+ link.active && "ods-mkt-nav__mobile-link--active"
1343
+ ),
1344
+ "aria-current": link.active ? "page" : void 0,
1345
+ onClick: () => setMobileOpen(false),
1346
+ children: link.label
1347
+ },
1348
+ link.href
1349
+ )),
1350
+ actions && /* @__PURE__ */ jsx16("div", { className: "ods-mkt-nav__mobile-actions", children: actions })
1351
+ ] })
1222
1352
  ] });
1223
1353
  }
1224
1354
 
@@ -1340,7 +1470,7 @@ function PricingTiers({ tiers, note, className, ...rest }) {
1340
1470
 
1341
1471
  // src/marketing/components/StatBand/StatBand.tsx
1342
1472
  import { useReducedMotion as useReducedMotion2 } from "framer-motion";
1343
- import { Fragment as Fragment4, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
1473
+ import { Fragment as Fragment5, jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
1344
1474
  function StatBand({ items, orientation = "column", className, ...rest }) {
1345
1475
  const reducedMotion = useReducedMotion2();
1346
1476
  return /* @__PURE__ */ jsx20(
@@ -1359,7 +1489,7 @@ function StatBand({ items, orientation = "column", className, ...rest }) {
1359
1489
  suffix: item.suffix,
1360
1490
  formatValue: (v) => Math.round(v).toLocaleString("en-US")
1361
1491
  }
1362
- ) : /* @__PURE__ */ jsxs19(Fragment4, { children: [
1492
+ ) : /* @__PURE__ */ jsxs19(Fragment5, { children: [
1363
1493
  item.prefix,
1364
1494
  item.value,
1365
1495
  item.suffix
@@ -1404,11 +1534,11 @@ import {
1404
1534
  useEffect as useEffect2,
1405
1535
  useMemo as useMemo2,
1406
1536
  useRef as useRef2,
1407
- useState as useState6
1537
+ useState as useState7
1408
1538
  } from "react";
1409
1539
 
1410
1540
  // src/marketing/components/WorkflowShowcase/ShowcaseScene.tsx
1411
- import { useEffect, useRef, useState as useState4 } from "react";
1541
+ import { useEffect, useRef, useState as useState5 } from "react";
1412
1542
  import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
1413
1543
  function slots(n) {
1414
1544
  return Array.from({ length: n }, (_, i) => 208 + (i - (n - 1) / 2) * 80);
@@ -1481,7 +1611,7 @@ function ShowcaseScene({
1481
1611
  caption,
1482
1612
  onCoreClick
1483
1613
  }) {
1484
- const [pulse, setPulse] = useState4(false);
1614
+ const [pulse, setPulse] = useState5(false);
1485
1615
  const pulseTimer = useRef(null);
1486
1616
  useEffect(
1487
1617
  () => () => {
@@ -1714,7 +1844,7 @@ function ShowcaseScene({
1714
1844
 
1715
1845
  // src/marketing/components/WorkflowShowcase/ShowcaseSignup.tsx
1716
1846
  import { AnimatePresence, motion as motion2, useReducedMotion as useReducedMotion3 } from "framer-motion";
1717
- import { useId as useId3, useState as useState5 } from "react";
1847
+ import { useId as useId3, useState as useState6 } from "react";
1718
1848
  import { FocusScope } from "react-aria";
1719
1849
  import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
1720
1850
  var OVERLAY_MOTION = {
@@ -1736,7 +1866,7 @@ function ShowcaseSignup({
1736
1866
  const reducedMotion = useReducedMotion3();
1737
1867
  const titleId = useId3();
1738
1868
  const subtitleId = useId3();
1739
- const [values, setValues] = useState5({
1869
+ const [values, setValues] = useState6({
1740
1870
  name: "",
1741
1871
  email: "",
1742
1872
  company: "",
@@ -1917,7 +2047,7 @@ function ShowcaseSignup({
1917
2047
  }
1918
2048
 
1919
2049
  // src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx
1920
- import { Fragment as Fragment5, jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
2050
+ import { Fragment as Fragment6, jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
1921
2051
  var EMPTY_PLAN = { left: [], right: [], all: [], totalSteps: 1 };
1922
2052
  function ConnectorTile({ connector }) {
1923
2053
  return /* @__PURE__ */ jsx24(
@@ -1954,21 +2084,21 @@ function WorkflowShowcase({
1954
2084
  }) {
1955
2085
  const reducedMotion = useReducedMotion4();
1956
2086
  const rotationActive = rotatePrompts && !defaultPrompt && examples.length > 0;
1957
- const [prompt, setPrompt] = useState6(
2087
+ const [prompt, setPrompt] = useState7(
1958
2088
  defaultPrompt || (rotationActive ? examples[0]?.prompt ?? "" : "")
1959
2089
  );
1960
- const [engagedWithPrompt, setEngagedWithPrompt] = useState6(false);
1961
- const [promptHovered, setPromptHovered] = useState6(false);
1962
- const [promptFocused, setPromptFocused] = useState6(false);
2090
+ const [engagedWithPrompt, setEngagedWithPrompt] = useState7(false);
2091
+ const [promptHovered, setPromptHovered] = useState7(false);
2092
+ const [promptFocused, setPromptFocused] = useState7(false);
1963
2093
  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);
2094
+ const [selected, setSelected] = useState7([]);
2095
+ const [phase, setPhase] = useState7("idle");
2096
+ const [shown, setShown] = useState7(0);
2097
+ const [status, setStatus] = useState7("");
2098
+ const [pickerOpen, setPickerOpen] = useState7(false);
2099
+ const [schedIdx, setSchedIdx] = useState7(0);
2100
+ const [swap, setSwap] = useState7(null);
2101
+ const [signupError, setSignupError] = useState7(null);
1972
2102
  const signupReturnPhase = useRef2("done");
1973
2103
  const cardRef = useRef2(null);
1974
2104
  const timers = useRef2([]);
@@ -2009,7 +2139,7 @@ function WorkflowShowcase({
2009
2139
  const manualSchedule = schedules[schedIdx];
2010
2140
  const scheduleShown = inferredSchedule ?? (manualSchedule === "AUTO" ? "HOURLY" : manualSchedule);
2011
2141
  const triggers = WORKFLOW_SHOWCASE_TRIGGERS;
2012
- const [triggerIdx, setTriggerIdx] = useState6(0);
2142
+ const [triggerIdx, setTriggerIdx] = useState7(0);
2013
2143
  const manualTrigger = triggers[triggerIdx];
2014
2144
  const cadenceShown = manualTrigger === "SCHEDULE" ? scheduleShown : manualTrigger;
2015
2145
  useEffect2(() => {
@@ -2229,7 +2359,7 @@ function WorkflowShowcase({
2229
2359
  // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature
2230
2360
  /* @__PURE__ */ jsx24("span", { children: seg.text }, i)
2231
2361
  )
2232
- ) : /* @__PURE__ */ jsxs22(Fragment5, { children: [
2362
+ ) : /* @__PURE__ */ jsxs22(Fragment6, { children: [
2233
2363
  /* @__PURE__ */ jsx24("span", { className: "ods-showcase__placeholder", children: "Describe your pipeline \u2014 e.g. " }),
2234
2364
  /* @__PURE__ */ jsx24("span", { className: "ods-showcase__placeholder ods-showcase__placeholder--faint", children: '"Sync Storefront orders to Warehouse hourly, alert sales in Team Chat"' })
2235
2365
  ] }) })
@@ -2347,7 +2477,7 @@ function WorkflowShowcase({
2347
2477
  }
2348
2478
  )
2349
2479
  ] }),
2350
- swap && swapRole && /* @__PURE__ */ jsxs22(Fragment5, { children: [
2480
+ swap && swapRole && /* @__PURE__ */ jsxs22(Fragment6, { children: [
2351
2481
  /* @__PURE__ */ jsx24(
2352
2482
  "button",
2353
2483
  {