@octaviaflow/core 3.1.0-beta.78 → 3.1.0-beta.80
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-FJHUWP4K.js +2756 -0
- package/dist/chunk-FJHUWP4K.js.map +1 -0
- package/dist/chunk-PB4O5GEF.js +5701 -0
- package/dist/chunk-PB4O5GEF.js.map +1 -0
- package/dist/chunk-XD5G2K2M.js +1646 -0
- package/dist/chunk-XD5G2K2M.js.map +1 -0
- package/dist/components/AuthScreen/AuthScreen.d.ts +17 -2
- package/dist/components/AuthScreen/AuthScreen.d.ts.map +1 -1
- package/dist/components/Combobox/Combobox.d.ts.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/index.cjs +636 -555
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +270 -193
- package/dist/index.js.map +1 -1
- package/dist/marketing.cjs +1 -0
- package/dist/marketing.cjs.map +1 -1
- package/dist/marketing.js +2 -2
- package/dist/styles.css +1 -1
- package/dist/workflow.cjs +2 -0
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.js +2 -2
- package/package.json +1 -1
package/dist/marketing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/marketing/index.ts","../src/utils/cn.ts","../src/marketing/components/AssistantTranscript/AssistantTranscript.tsx","../src/marketing/components/BackedBy/BackedBy.tsx","../src/marketing/components/BetaAccessForm/BetaAccessForm.tsx","../src/components/Button/Button.tsx","../src/utils/a11y.ts","../src/utils/Slot.tsx","../src/utils/composeRefs.ts","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../../../node_modules/react-stately/dist/private/utils/packages/react-stately/src/utils/useControlledState.ts","../../../node_modules/react-stately/dist/private/form/packages/react-stately/src/form/useFormValidationState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/getChildNodes.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/ListCollection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/Selection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/useMultipleSelectionState.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/SelectionManager.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/CollectionBuilder.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/useCollection.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useListState.ts","../../../node_modules/react-stately/dist/private/overlays/packages/react-stately/src/overlays/useOverlayTriggerState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/Item.ts","../../../node_modules/react-stately/dist/private/select/packages/react-stately/src/select/useSelectState.ts","../../../node_modules/react-stately/dist/private/tooltip/packages/react-stately/src/tooltip/useTooltipTriggerState.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/Textarea/Textarea.tsx","../src/hooks/useTextareaCommands.ts","../src/hooks/useTextareaSelection.ts","../src/hooks/useTextareaTools.tsx","../src/marketing/components/WorkflowShowcase/showcaseEngine.ts","../src/components/BlogCard/BlogCard.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Card/Card.tsx","../src/marketing/components/BlogGrid/BlogGrid.tsx","../src/marketing/components/ContactForm/ContactForm.tsx","../src/marketing/components/CtaBanner/CtaBanner.tsx","../src/components/Accordion/Accordion.tsx","../src/marketing/components/FaqSection/FaqSection.tsx","../src/marketing/components/FeatureGrid/FeatureGrid.tsx","../src/marketing/components/IntegrationsFinder/IntegrationsFinder.tsx","../src/marketing/components/IntegrationsWall/IntegrationsWall.tsx","../src/marketing/components/LiveConsole/LiveConsole.tsx","../src/components/Spinner/Spinner.tsx","../src/marketing/components/LogoMarquee/LogoMarquee.tsx","../src/marketing/glyphs.tsx","../src/marketing/components/MarketingFooter/MarketingFooter.tsx","../src/marketing/components/MarketingHero/MarketingHero.tsx","../src/marketing/components/MarketingNav/MarketingNav.tsx","../src/marketing/components/MarketingSection/MarketingSection.tsx","../src/marketing/components/PageHero/PageHero.tsx","../src/marketing/components/PricingTiers/PricingTiers.tsx","../src/marketing/components/StatBand/StatBand.tsx","../src/components/CountUp/CountUp.tsx","../src/components/TestimonialCard/TestimonialCard.tsx","../src/marketing/components/TestimonialStrip/TestimonialStrip.tsx","../src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx","../src/marketing/components/WorkflowShowcase/ShowcaseScene.tsx","../src/marketing/components/WorkflowShowcase/ShowcaseSignup.tsx"],"sourcesContent":["/* ---------------------------------------------------------------------------\n * @octaviaflow/core/marketing — everything for the marketing site.\n *\n * A dedicated subsystem (like `@octaviaflow/core/workflow`) so marketing\n * surfaces stay clearly separated from product components. Storybook group:\n * `Marketing/`.\n * ------------------------------------------------------------------------- */\n\nexport {\n AssistantTranscript,\n type AssistantTranscriptProps,\n type AssistantTranscriptTurn,\n} from \"./components/AssistantTranscript/AssistantTranscript\";\nexport {\n BackedBy,\n type BackedByItem,\n type BackedByProps,\n} from \"./components/BackedBy/BackedBy\";\nexport {\n BetaAccessForm,\n type BetaAccessFormProps,\n type BetaAccessValues,\n} from \"./components/BetaAccessForm/BetaAccessForm\";\nexport {\n BlogGrid,\n type BlogGridPost,\n type BlogGridProps,\n} from \"./components/BlogGrid/BlogGrid\";\nexport {\n ContactForm,\n type ContactFormProps,\n type ContactFormTopic,\n type ContactFormValues,\n} from \"./components/ContactForm/ContactForm\";\nexport {\n CtaBanner,\n type CtaBannerAction,\n type CtaBannerProps,\n} from \"./components/CtaBanner/CtaBanner\";\nexport {\n type FaqItem,\n FaqSection,\n type FaqSectionProps,\n} from \"./components/FaqSection/FaqSection\";\nexport {\n FeatureGrid,\n type FeatureGridItem,\n type FeatureGridProps,\n} from \"./components/FeatureGrid/FeatureGrid\";\nexport {\n IntegrationsFinder,\n type IntegrationsFinderItem,\n type IntegrationsFinderProps,\n} from \"./components/IntegrationsFinder/IntegrationsFinder\";\nexport {\n IntegrationsWall,\n type IntegrationsWallCategory,\n type IntegrationsWallItem,\n type IntegrationsWallProps,\n} from \"./components/IntegrationsWall/IntegrationsWall\";\nexport {\n LiveConsole,\n type LiveConsoleLine,\n type LiveConsoleProps,\n type LiveConsoleState,\n} from \"./components/LiveConsole/LiveConsole\";\nexport {\n LogoMarquee,\n type LogoMarqueeItem,\n type LogoMarqueeProps,\n} from \"./components/LogoMarquee/LogoMarquee\";\nexport {\n MarketingFooter,\n type MarketingFooterColumn,\n type MarketingFooterLink,\n type MarketingFooterProps,\n} from \"./components/MarketingFooter/MarketingFooter\";\nexport {\n MarketingHero,\n type MarketingHeroProps,\n} from \"./components/MarketingHero/MarketingHero\";\nexport {\n MarketingNav,\n type MarketingNavLink,\n type MarketingNavProps,\n} from \"./components/MarketingNav/MarketingNav\";\nexport {\n MarketingSection,\n type MarketingSectionProps,\n} from \"./components/MarketingSection/MarketingSection\";\nexport {\n PageHero,\n type PageHeroProps,\n} from \"./components/PageHero/PageHero\";\nexport {\n type PricingTier,\n type PricingTierCta,\n PricingTiers,\n type PricingTiersProps,\n} from \"./components/PricingTiers/PricingTiers\";\nexport {\n StatBand,\n type StatBandItem,\n type StatBandProps,\n} from \"./components/StatBand/StatBand\";\nexport {\n TestimonialStrip,\n type TestimonialStripItem,\n type TestimonialStripProps,\n} from \"./components/TestimonialStrip/TestimonialStrip\";\nexport {\n WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n WORKFLOW_SHOWCASE_DEFAULT_TILES,\n WORKFLOW_SHOWCASE_SCHEDULES,\n WorkflowShowcase,\n type WorkflowShowcaseBuildDetail,\n type WorkflowShowcaseConnector,\n type WorkflowShowcaseExample,\n type WorkflowShowcaseMetric,\n type WorkflowShowcasePhase,\n type WorkflowShowcaseProps,\n type WorkflowShowcaseRole,\n type WorkflowShowcaseSignupValues,\n} from \"./components/WorkflowShowcase\";\nexport {\n ActionGlyph,\n BrandMark,\n ConnectorGlyph,\n DestinationGlyph,\n NotifyGlyph,\n roleGlyph,\n SourceGlyph,\n} from \"./glyphs\";\n","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * AssistantTranscript — a compact \"you → / octavia →\" exchange card showing\n * the natural-language-to-workflow moment in one glance.\n * ------------------------------------------------------------------------- */\n\nexport interface AssistantTranscriptTurn {\n id: string;\n speaker: \"user\" | \"assistant\";\n content: ReactNode;\n}\n\nexport interface AssistantTranscriptProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> {\n /** Header label. Defaults to \"OctaviaFlow AI Assistant\". */\n title?: ReactNode;\n turns: AssistantTranscriptTurn[];\n userLabel?: string;\n assistantLabel?: string;\n}\n\nexport function AssistantTranscript({\n title = \"OctaviaFlow AI Assistant\",\n turns,\n userLabel = \"you\",\n assistantLabel = \"octavia\",\n className,\n ...rest\n}: AssistantTranscriptProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-transcript\", className)}>\n <div className=\"ods-mkt-transcript__head\">{title}</div>\n <div className=\"ods-mkt-transcript__body\">\n {turns.map((turn) => (\n <div key={turn.id} className=\"ods-mkt-transcript__turn\">\n <span\n className={cn(\n \"ods-mkt-transcript__speaker\",\n `ods-mkt-transcript__speaker--${turn.speaker}`,\n )}\n >\n {turn.speaker === \"user\" ? userLabel : assistantLabel} →\n </span>{\" \"}\n <span className=\"ods-mkt-transcript__content\">{turn.content}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * BackedBy — the investors/backers strip. Unlike LogoMarquee (volume social\n * proof, scrolling), this is a static, prestigious row: a few marks with\n * generous spacing and an optional note underneath (\"$4.2M seed · operators\n * from …\"). The site passes real investor logos via `icon`; plain names\n * render as serif wordmarks.\n * ------------------------------------------------------------------------- */\n\nexport interface BackedByItem {\n id: string;\n name: string;\n /** Investor logo. Omit for a serif wordmark. */\n icon?: ReactNode;\n}\n\nexport interface BackedByProps extends ComponentPropsWithoutRef<\"div\"> {\n items: BackedByItem[];\n /** Mono eyebrow. Default \"BACKED BY\". */\n label?: ReactNode;\n /** Microcopy under the marks — round, notable angels, etc. */\n note?: ReactNode;\n align?: \"center\" | \"start\";\n}\n\nexport function BackedBy({\n items,\n label = \"Backed by\",\n note,\n align = \"center\",\n className,\n ...rest\n}: BackedByProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-backedby\", align === \"start\" && \"ods-mkt-backedby--start\", className)}\n >\n {label && <p className=\"ods-mkt-backedby__label\">{label}</p>}\n <div className=\"ods-mkt-backedby__row\">\n {items.map((item) => (\n <span key={item.id} className=\"ods-mkt-backedby__mark\" title={item.name}>\n {item.icon ?? <span className=\"ods-mkt-backedby__wordmark\">{item.name}</span>}\n </span>\n ))}\n </div>\n {note && <p className=\"ods-mkt-backedby__note\">{note}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { type FormEvent, type ReactNode, useId, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport { Textarea } from \"../../../components/Textarea/Textarea\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * BetaAccessForm — the \"request early access\" conversion band for marketing\n * pages outside the hero funnel. Email-only by default (lowest friction), or\n * `fields=\"full\"` for name + email + company. The consuming site wires\n * `onSubmit` to its real endpoint; resolve → success card, throw → inline\n * error with the form intact.\n * ------------------------------------------------------------------------- */\n\nexport interface BetaAccessValues {\n email: string;\n name?: string;\n /** Present when `nameLayout=\"split\"`. */\n firstName?: string;\n /** Present when `nameLayout=\"split\"`. */\n lastName?: string;\n company?: string;\n /** Present when `teamSizes` are configured. */\n teamSize?: string;\n /** Present when `plans` are configured (e.g. preselected from ?plan=). */\n plan?: string;\n /** Present when `useCases` are configured. */\n useCase?: string;\n /** Free-text details (present when `showDetails` is set). */\n details?: string;\n}\n\nexport interface BetaAccessFormProps {\n title?: ReactNode;\n /** Mono microcopy under the title. */\n subtitle?: ReactNode;\n /** \"email\" = single-field band (default). \"full\" = name + email + company. */\n fields?: \"email\" | \"full\";\n /** \"single\" (default) = one Full-name field; \"split\" = First + Last name. */\n nameLayout?: \"single\" | \"split\";\n /** \"card\" (default) = bordered band. \"inline\" = chromeless, for footers. */\n appearance?: \"card\" | \"inline\";\n /** Team-size choices (full mode). Required when provided. */\n teamSizes?: string[];\n /** Plan choices (full mode), e.g. from the pricing tiers. Optional pick. */\n plans?: string[];\n /** Preselected plan (e.g. from a ?plan= query param). */\n defaultPlan?: string;\n /** Primary use-case choices (full mode). Required when provided. */\n useCases?: string[];\n /** Show an optional free-text details textarea (full mode). */\n showDetails?: boolean;\n detailsLabel?: ReactNode;\n detailsPlaceholder?: string;\n submitLabel?: ReactNode;\n /** Mono microcopy under the form. */\n footnote?: ReactNode;\n /** Resolve → success state; throw → inline error, form kept. */\n onSubmit?: (values: BetaAccessValues) => Promise<void> | void;\n successTitle?: ReactNode;\n successBody?: ReactNode;\n disabled?: boolean;\n className?: string;\n}\n\ntype Phase = \"idle\" | \"submitting\" | \"success\";\n\nexport function BetaAccessForm({\n title = \"Request early access\",\n subtitle = \"CURRENTLY IN PRIVATE BETA — WE REVIEW ACCESS REQUESTS WEEKLY\",\n fields = \"email\",\n nameLayout = \"single\",\n appearance = \"card\",\n teamSizes,\n plans,\n defaultPlan,\n useCases,\n showDetails = false,\n detailsLabel = \"Anything else we should know?\",\n detailsPlaceholder = \"Current stack, timelines, must-have connectors…\",\n submitLabel = \"Request access →\",\n footnote = \"NO CREDIT CARD · SSO & SELF-HOSTING AVAILABLE\",\n onSubmit,\n successTitle = \"Request received.\",\n successBody = \"We review access requests weekly — you'll hear from us by email.\",\n disabled = false,\n className,\n}: BetaAccessFormProps) {\n const uid = useId();\n const [values, setValues] = useState<BetaAccessValues>({\n email: \"\",\n name: \"\",\n firstName: \"\",\n lastName: \"\",\n company: \"\",\n teamSize: \"\",\n plan: defaultPlan ?? \"\",\n useCase: \"\",\n details: \"\",\n });\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (phase === \"submitting\") return;\n if (!isValidEmail(values.email)) {\n setError(\"Please enter a valid work email.\");\n return;\n }\n if (fields === \"full\" && nameLayout === \"single\" && !values.name?.trim()) {\n setError(\"Please enter your name.\");\n return;\n }\n if (fields === \"full\" && nameLayout === \"split\" && !values.firstName?.trim()) {\n setError(\"Please enter your first name.\");\n return;\n }\n if (fields === \"full\" && teamSizes?.length && !values.teamSize) {\n setError(\"Please select your team size.\");\n return;\n }\n if (fields === \"full\" && useCases?.length && !values.useCase) {\n setError(\"Please select your primary use case.\");\n return;\n }\n setError(null);\n setPhase(\"submitting\");\n try {\n await onSubmit?.(values);\n setPhase(\"success\");\n } catch {\n setError(\"Something went wrong — please try again.\");\n setPhase(\"idle\");\n }\n };\n\n const inline = appearance === \"inline\";\n\n if (phase === \"success\") {\n return (\n <div\n className={cn(\n \"ods-mkt-access\",\n \"ods-mkt-access--success\",\n inline && \"ods-mkt-access--inline\",\n className,\n )}\n role=\"status\"\n >\n <p className=\"ods-mkt-access__success-mark\">✓ {successTitle}</p>\n <p className=\"ods-mkt-access__success-body\">{successBody}</p>\n </div>\n );\n }\n\n const busy = disabled || phase === \"submitting\";\n\n return (\n <form\n className={cn(\"ods-mkt-access\", inline && \"ods-mkt-access--inline\", className)}\n onSubmit={handleSubmit}\n noValidate\n >\n <div className=\"ods-mkt-access__head\">\n <h3 className=\"ods-mkt-access__title\">{title}</h3>\n {subtitle && <p className=\"ods-mkt-access__subtitle\">{subtitle}</p>}\n </div>\n\n <div\n className={cn(\n \"ods-mkt-access__fields\",\n fields === \"full\" && \"ods-mkt-access__fields--full\",\n )}\n >\n {fields === \"full\" && nameLayout === \"single\" && (\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-name`}>\n Full name\n </label>\n <Input\n id={`${uid}-name`}\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && nameLayout === \"split\" && (\n <>\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-firstname`}>\n First name\n </label>\n <Input\n id={`${uid}-firstname`}\n autoComplete=\"given-name\"\n placeholder=\"Ada\"\n value={values.firstName ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, firstName: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-lastname`}>\n Last name\n </label>\n <Input\n id={`${uid}-lastname`}\n autoComplete=\"family-name\"\n placeholder=\"Lovelace\"\n value={values.lastName ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, lastName: e.target.value }))}\n disabled={busy}\n />\n </div>\n </>\n )}\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-email`}>\n Work email\n </label>\n <Input\n id={`${uid}-email`}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n disabled={busy}\n />\n </div>\n {fields === \"full\" && (\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-company`}>\n Company\n </label>\n <Input\n id={`${uid}-company`}\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && teamSizes && teamSizes.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-teamsize-label`}>\n Team size\n </span>\n <Select\n aria-labelledby={`${uid}-teamsize-label`}\n placeholder=\"Select team size…\"\n options={teamSizes.map((size) => ({ value: size, label: size }))}\n value={values.teamSize ?? \"\"}\n onChange={(teamSize) => setValues((v) => ({ ...v, teamSize }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && plans && plans.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-plan-label`}>\n Plan (optional)\n </span>\n <Select\n aria-labelledby={`${uid}-plan-label`}\n placeholder=\"Not sure yet\"\n options={plans.map((plan) => ({ value: plan, label: plan }))}\n value={values.plan ?? \"\"}\n onChange={(plan) => setValues((v) => ({ ...v, plan }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && useCases && useCases.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-usecase-label`}>\n Primary use case\n </span>\n <Select\n aria-labelledby={`${uid}-usecase-label`}\n placeholder=\"Select a use case…\"\n options={useCases.map((useCase) => ({ value: useCase, label: useCase }))}\n value={values.useCase ?? \"\"}\n onChange={(useCase) => setValues((v) => ({ ...v, useCase }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && showDetails && (\n <div className=\"ods-mkt-access__field ods-mkt-access__field--wide\">\n <label\n className=\"ods-mkt-access__label\"\n id={`${uid}-details-label`}\n htmlFor={`${uid}-details`}\n >\n {detailsLabel}\n </label>\n <Textarea\n id={`${uid}-details`}\n aria-labelledby={`${uid}-details-label`}\n placeholder={detailsPlaceholder}\n rows={3}\n value={values.details ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, details: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={phase === \"submitting\"}\n disabled={disabled}\n >\n {submitLabel}\n </Button>\n </div>\n\n {error && (\n <p className=\"ods-mkt-access__error\" role=\"alert\">\n {error}\n </p>\n )}\n {footnote && <p className=\"ods-mkt-access__footnote\">{footnote}</p>}\n </form>\n );\n}\n","\"use client\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n forwardRef,\n type ReactElement,\n type ReactNode,\n type Ref,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { useButton } from \"react-aria\";\nimport { resolveAccessibleName, hasRenderableText } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\nimport { Slot } from \"../../utils/Slot\";\n\nexport interface ButtonProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"icon\";\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n /** Override the rendered label while loading. Useful for action verbs that\n * change form mid-request — e.g. `\"Sign in\"` → `\"Signing in…\"`. */\n loadingText?: ReactNode;\n /** Accessible label for the spinner (announced by AT during loading).\n * Defaults to `\"Loading\"`. Customize for localization or context. */\n loadingLabel?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n /** Toggle-button state. When defined, the button advertises\n * `aria-pressed` and adds `--pressed` styling. */\n pressed?: boolean;\n children?: ReactNode;\n /**\n * Override the cursor shown on hover. When omitted, the cursor auto-resolves:\n * - `not-allowed` when disabled (CSS handles this — see Button.module.scss)\n * - `progress` when loading (request in flight)\n * - `pointer` when the button has an action (onClick, type=\"submit\",\n * or type=\"reset\"). Anchors (href) get pointer too.\n * - `default` otherwise (decorative / placeholder buttons)\n * Pass an explicit value (e.g. `\"text\"`, `\"grab\"`) to override the\n * auto-resolve for the specific story / use case.\n */\n cursor?: CSSProperties[\"cursor\"];\n /** Render Button's styling onto a custom child element (Radix-style Slot).\n *\n * <Button asChild variant=\"primary\">\n * <NextLink href=\"/checkout\">Continue</NextLink>\n * </Button>\n *\n * When `asChild` is true, Button does NOT render its internal icon /\n * label / spinner slots — the consumer's element fully owns content. Use\n * the regular form (without `asChild`) when you want the built-in\n * slots / loading spinner / size-scaled icons. */\n asChild?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n loadingText,\n loadingLabel = \"Loading\",\n disabled = false,\n leftIcon,\n rightIcon,\n fullWidth = false,\n pressed,\n asChild = false,\n className,\n children,\n type,\n cursor,\n style,\n ...props\n },\n forwardedRef,\n) {\n const ref = useRef<HTMLButtonElement>(null);\n useImperativeHandle(forwardedRef, () => ref.current as HTMLButtonElement);\n const isDisabled = disabled || loading;\n // Respect users who've asked for reduced motion (OS-level a11y setting).\n // When true we skip the whileTap scale animation entirely — Framer's own\n // hook reads `prefers-reduced-motion: reduce` and stays reactive.\n const prefersReducedMotion = useReducedMotion();\n\n // Cursor resolution (centralised in JS so inline-style specificity wins\n // over any CSS cursor rule). Order of precedence:\n // 1. Caller's explicit `cursor` prop.\n // 2. `not-allowed` when disabled (and not also loading — see below).\n // 3. `progress` when loading (button is intentionally non-interactive\n // but the user should see we're working on it).\n // 4. `pointer` when the button has an action.\n // 5. `default` for decorative buttons.\n // Disabled takes precedence over loading when BOTH are set: explicit\n // disabled is a stronger intent than \"currently busy\".\n // Button always renders a native <button>; anchor semantics live on\n // LinkButton. No href branch needed here.\n const hasAction = Boolean(props.onClick) || type === \"submit\" || type === \"reset\";\n const resolvedCursor: string =\n cursor ?? (disabled ? \"not-allowed\" : loading ? \"progress\" : hasAction ? \"pointer\" : \"default\");\n // Forms rely on `type=\"submit\"` to trigger submission. React Aria's useButton\n // defaults type to \"button\" when omitted, so we always pass the caller's type\n // through (defaulting to \"button\" only when truly unspecified).\n const resolvedType: \"button\" | \"submit\" | \"reset\" = type ?? \"button\";\n\n // Buttons get their accessible name from children. Icon-only buttons\n // (variant=\"icon\" or empty children + iconLeft/Right) MUST provide\n // aria-label or aria-labelledby — we resolve it here so react-aria's\n // useButton receives a guaranteed string-or-id, and dev-mode console.error\n // surfaces the missing-name case.\n //\n // `hasVisibleText` counts any renderable TEXT in children — including text\n // inside arrays/fragments/elements (e.g. `{cond && \"Connect\"}` which React\n // passes as an array, or `<span>Save</span>`). SVG/icon-only subtrees carry\n // no readable text, so genuinely icon-only buttons still require an explicit\n // aria-label. (A glyph string like \"×\" counts — announced verbatim.) This\n // must NOT be a bare `typeof children === \"string\"` check: conditional or\n // interpolated text children are arrays, and missing them here forces a\n // bogus `aria-label=\"Unlabeled Button\"` that overrides the real label.\n const hasVisibleText = hasRenderableText(children);\n // In `asChild` mode the consumer's element owns its own accessible name\n // (e.g., the anchor's text content). Suppress Button's own a11y check\n // to avoid false-positive dev warnings.\n const needsAriaName = !hasVisibleText && !asChild;\n const ariaNameProps = needsAriaName\n ? resolveAccessibleName({\n ariaLabel: (props as any)[\"aria-label\"],\n ariaLabelledby: (props as any)[\"aria-labelledby\"],\n componentName: \"Button\",\n })\n : undefined;\n\n const { buttonProps } = useButton(\n {\n isDisabled,\n onPress: props.onClick as any,\n type: resolvedType,\n ...(ariaNameProps ?? {}),\n },\n ref,\n );\n\n // Strip Framer-conflicting props from React Aria output\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeButtonProps } =\n buttonProps as any;\n\n // Native HTML button attributes the caller passed (form, name, value,\n // aria-*, data-*, etc.) must reach the DOM. We strip the ones React Aria\n // already manages from buttonProps to avoid double-binding event handlers.\n const {\n onClick: _onClick,\n onKeyDown: _onKeyDown,\n onKeyUp: _onKeyUp,\n onMouseDown: _onMouseDown,\n onPointerDown: _onPointerDown,\n onPointerUp: _onPointerUp,\n onFocus: _onFocus,\n onBlur: _onBlur,\n ...passthroughProps\n } = props as Record<string, unknown>;\n\n const rootClassName = cn(\n \"ods-btn\",\n `ods-btn--${variant}`,\n `ods-btn--${size}`,\n loading && \"ods-btn--loading\",\n fullWidth && \"ods-btn--full\",\n pressed && \"ods-btn--pressed\",\n className,\n );\n\n // asChild mode — project Button's chrome onto the consumer's element.\n // Internal slots (icons, spinner, label) are NOT rendered — consumer\n // owns the content. react-aria event wiring is also skipped because\n // the consumer's element handles its own activation semantics.\n if (asChild) {\n return (\n <Slot\n {...(passthroughProps as Record<string, unknown>)}\n ref={forwardedRef as unknown as Ref<HTMLElement>}\n className={rootClassName}\n style={{ cursor: resolvedCursor, ...(style as CSSProperties) }}\n aria-pressed={pressed}\n aria-disabled={isDisabled || undefined}\n >\n {children as ReactElement}\n </Slot>\n );\n }\n\n // The visible label — `loadingText` overrides `children` while loading\n // so the in-progress verb form (\"Signing in…\") replaces the idle one.\n const visibleLabel = loading && loadingText !== undefined ? loadingText : children;\n\n return (\n <motion.button\n {...(passthroughProps as any)}\n {...safeButtonProps}\n type={resolvedType}\n ref={ref}\n className={rootClassName}\n // Disabled state CSS rule (cursor: not-allowed) outranks this inline\n // value — see Button.module.scss. So `style.cursor` only applies to\n // idle/loading/active states, exactly what we want.\n style={{ cursor: resolvedCursor, ...(style as any) }}\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n whileTap={isDisabled || prefersReducedMotion ? undefined : { scale: 0.97 }}\n transition={{ duration: 0.1 }}\n >\n {/* Content layer. When loading, the leftIcon slot is replaced by an\n inline spinner — both spinner AND label stay visible so the user\n sees the in-progress text (e.g. \"Signing in…\") next to the\n activity indicator. */}\n <span className=\"ods-btn__content\">\n {loading ? (\n <span\n className=\"ods-btn__icon ods-btn__icon--left ods-btn__icon--spinner\"\n role=\"status\"\n aria-label={loadingLabel}\n >\n {/* viewBox is 1em-scaled by CSS (.ods-btn__icon svg → 1em) so\n the spinner tracks the per-size icon scale (12 / 14 / 16 px)\n without needing per-size width attributes. */}\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"12\"\n />\n </svg>\n </span>\n ) : (\n leftIcon && <span className=\"ods-btn__icon ods-btn__icon--left\">{leftIcon}</span>\n )}\n {visibleLabel != null && visibleLabel !== false && (\n <span className=\"ods-btn__label\">{visibleLabel}</span>\n )}\n {rightIcon && !loading && (\n <span className=\"ods-btn__icon ods-btn__icon--right\">{rightIcon}</span>\n )}\n </span>\n </motion.button>\n );\n});\n\nButton.displayName = \"Button\";\n","/**\n * a11y — shared helpers for resolving an accessible name from the union of\n * props every form/interactive component accepts.\n *\n * Why this exists:\n * react-aria's hooks (useCheckbox, useSwitch, useRadio, useTextField,\n * useButton, etc.) emit a runtime warning to the browser console when\n * none of the following is present on the underlying element:\n * - aria-label\n * - aria-labelledby\n * - a visible <label> with htmlFor pointing to the element id\n *\n * Many of our components accept `label` as `string | ReactNode`. When\n * `label` is a ReactNode (icon + text, custom JSX), react-aria can't see\n * a text label and the warning fires. This helper centralizes the\n * derivation: it returns a single { 'aria-label' or 'aria-labelledby' }\n * shape that react-aria will accept, and — in development only — it\n * surfaces a focused console.error pointing the developer at the prop\n * they're missing instead of the generic react-aria warning.\n *\n * Usage:\n * const ariaProps = resolveAccessibleName({\n * label,\n * ariaLabel: props['aria-label'],\n * ariaLabelledby: props['aria-labelledby'],\n * componentName: 'Checkbox',\n * });\n * // → { 'aria-label': string } | { 'aria-labelledby': string } | { 'aria-label': string }\n *\n * useCheckbox({ ...otherProps, ...ariaProps }, state, ref);\n */\n\nimport { isValidElement, type ReactNode } from \"react\";\n\n/**\n * True when a ReactNode renders any non-empty, human-readable text.\n *\n * Used by controls whose accessible name comes from their CHILDREN (e.g.\n * Button). Recurses through arrays, fragments, and element children so that\n * conditionally-rendered or wrapped text is detected — e.g.\n * `{cond && \"Save\"}`, `[\"Connect with \", name]`, or `<span>Save</span>`.\n *\n * Returns false for icon/SVG-only subtrees (no string content), so genuinely\n * icon-only controls still trip the missing-accessible-name check. Numbers\n * count (they render as announced text, including 0); booleans / null /\n * undefined do not render and so don't count.\n */\nexport function hasRenderableText(node: ReactNode): boolean {\n if (node === null || node === undefined || typeof node === \"boolean\") return false;\n if (typeof node === \"string\") return node.trim().length > 0;\n if (typeof node === \"number\") return true;\n if (Array.isArray(node)) return node.some(hasRenderableText);\n if (isValidElement(node)) {\n return hasRenderableText((node.props as { children?: ReactNode }).children);\n }\n return false;\n}\n\n/**\n * Extract the concatenated visible text from a ReactNode — used to derive an\n * accessible name when a control accepts a rich `label` (icon + text, custom\n * JSX). Mirrors `hasRenderableText`'s traversal: strings/numbers contribute,\n * arrays/fragments/elements recurse into their children, and\n * booleans/null/undefined contribute nothing. Returns '' when there is no text.\n */\nexport function getRenderableText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(getRenderableText).join(\"\");\n if (isValidElement(node)) {\n return getRenderableText((node.props as { children?: ReactNode }).children);\n }\n return \"\";\n}\n\nexport interface ResolveAccessibleNameInput {\n /** The visible label, if any. Strings are auto-used as aria-label. */\n label?: ReactNode;\n /** Caller-provided aria-label override. Highest priority when present. */\n ariaLabel?: string;\n /** Caller-provided aria-labelledby. Wins over label-derived values. */\n ariaLabelledby?: string;\n /**\n * Component name used in dev-mode error messages. Helps the developer\n * locate which usage needs a label.\n */\n componentName: string;\n /**\n * Optional secondary fallbacks the component knows about — e.g. a Radio\n * can fall back to its `value` so radios in a group are at least\n * distinguishable. The first non-empty string is used.\n */\n fallbacks?: Array<string | undefined>;\n}\n\nexport type ResolvedAccessibleName = { \"aria-label\": string } | { \"aria-labelledby\": string };\n\n/**\n * Resolve the accessible-name props that should be spread onto the\n * underlying element. Guarantees at least one of aria-label / aria-labelledby\n * is present so react-aria won't warn at runtime.\n *\n * Priority order:\n * 1. aria-labelledby (caller-provided)\n * 2. aria-label (caller-provided)\n * 3. label (when string)\n * 4. fallbacks (when string)\n * 5. component-name placeholder + dev-mode console.error\n */\nexport function resolveAccessibleName(input: ResolveAccessibleNameInput): ResolvedAccessibleName {\n if (input.ariaLabelledby) {\n return { \"aria-labelledby\": input.ariaLabelledby };\n }\n if (input.ariaLabel) {\n return { \"aria-label\": input.ariaLabel };\n }\n if (typeof input.label === \"string\" && input.label.trim().length > 0) {\n return { \"aria-label\": input.label };\n }\n for (const candidate of input.fallbacks ?? []) {\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return { \"aria-label\": candidate };\n }\n }\n\n // Last resort — emit a placeholder so react-aria stays quiet in\n // production, but loudly point at the missing prop in development so the\n // developer fixes the real bug rather than ignoring a global warning.\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.error(\n `[@octaviaflow/core ${input.componentName}] No accessible name. ` +\n `Pass a string \\`label\\`, or \\`aria-label\\`, or \\`aria-labelledby\\` ` +\n `so screen readers can announce this control.`,\n );\n }\n return { \"aria-label\": `Unlabeled ${input.componentName}` };\n}\n","\"use client\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type Ref,\n} from \"react\";\nimport { composeRefs } from \"./composeRefs\";\n\n/* ---------------------------------------------------------------------------\n * Slot — the `asChild` primitive\n *\n * Takes exactly one React element child and clones it, merging the Slot's\n * own props onto the child:\n * - `className` concatenates (slot's classes follow child's)\n * - `style` merges (child's keys win on overlap)\n * - Event handlers chain (slot's handler runs first; if it calls\n * `event.preventDefault()` the child's handler is short-circuited —\n * matching React's own synthetic-event default-handling convention)\n * - Refs compose so both the forwarded ref and the child's own ref point\n * at the rendered DOM node.\n *\n * This is what powers `asChild` across our primitives: it lets consumers\n * swap the rendered element (e.g., to a router Link) without losing the\n * component's styling, accessibility, or behavioural contract.\n * ------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, unknown>;\n\ninterface SlotProps extends HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nexport const Slot = forwardRef<HTMLElement, SlotProps>(function Slot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!isValidElement(children)) {\n // Slot requires exactly one React element child. Returning null is\n // safer than throwing — callers that conditionally use `asChild` are\n // common, and we don't want stories / SSR to crash on an empty pass.\n return null;\n }\n const child = Children.only(children) as ReactElement<AnyProps>;\n const childProps = child.props ?? {};\n const childRef = (child as unknown as { ref?: Ref<HTMLElement> }).ref;\n\n return cloneElement(child, {\n ...mergeProps(slotProps as AnyProps, childProps),\n ref: forwardedRef ? composeRefs(forwardedRef, childRef) : childRef,\n });\n});\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n // Start with the slot's props, then layer the child's on top. We then\n // walk back over the overlapping keys to apply per-key merge rules.\n const merged: AnyProps = { ...slotProps, ...childProps };\n\n for (const key of Object.keys(slotProps)) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Event handlers — chain. Slot's handler runs first; if it invokes\n // event.preventDefault() the child's is skipped, matching the React\n // norm. Both being functions is the trigger.\n if (\n /^on[A-Z]/.test(key) &&\n typeof slotValue === \"function\" &&\n typeof childValue === \"function\"\n ) {\n merged[key] = (...args: unknown[]) => {\n (slotValue as (...a: unknown[]) => void)(...args);\n const event = args[0] as { defaultPrevented?: boolean } | undefined;\n if (event?.defaultPrevented) return;\n (childValue as (...a: unknown[]) => void)(...args);\n };\n continue;\n }\n\n // className — concatenate (slot's classes come first so child's can\n // visually override on direct conflict, which matches authoring intent).\n if (key === \"className\") {\n merged.className = [slotValue, childValue].filter(Boolean).join(\" \");\n continue;\n }\n\n // style — merge; child's keys win on overlap so consumers' inline\n // styles can override our defaults.\n if (key === \"style\") {\n merged.style = {\n ...(slotValue as CSSProperties | undefined),\n ...(childValue as CSSProperties | undefined),\n };\n continue;\n }\n }\n\n return merged;\n}\n","import type { MutableRefObject, Ref, RefCallback } from \"react\";\n\n/** Compose any number of refs (callback or object) into a single ref-callback.\n * Each underlying ref receives the node when React assigns it. Useful for the\n * `asChild` pattern where both the forwarded ref and the child's own ref need\n * to point at the same DOM node. */\nexport function composeRefs<T>(...refs: Array<Ref<T> | undefined | null>): RefCallback<T> {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n","\"use client\";\nimport { CloseIcon } from \"@octaviaflow/icons\";\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useId,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n type?:\n | \"text\"\n | \"email\"\n | \"password\"\n | \"search\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"color\"\n | \"date\"\n | \"datetime-local\"\n | \"month\"\n | \"time\"\n | \"week\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n errorMessage?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n /**\n * Show a clear button on the right while the input has a value.\n * Auto-enabled when `type=\"search\"`; explicitly toggle for other types.\n */\n clearable?: boolean;\n onClear?: () => void;\n /**\n * Right-side keyboard shortcut hint (e.g. \"⌘K\"). Rendered as a kbd-style chip.\n * Hidden while a clear button is showing (clear takes precedence).\n */\n shortcutHint?: ReactNode;\n}\n\nconst CLEAR_GLYPH = <CloseIcon width={12} height={12} aria-hidden=\"true\" />;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = \"text\",\n size = \"md\",\n error = false,\n errorMessage,\n label,\n helperText,\n leftIcon,\n rightIcon,\n clearable,\n onClear,\n shortcutHint,\n disabled = false,\n required,\n id,\n className,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(forwardedRef, () => innerRef.current as HTMLInputElement);\n\n const reactId = useId();\n const inputId = id ?? `${reactId}-input`;\n const errorId = `${reactId}-err`;\n const helperId = `${reactId}-help`;\n\n const isControlled = value !== undefined;\n const isClearable = (clearable ?? type === \"search\") && !disabled;\n const isSearch = type === \"search\";\n\n const currentValue = isControlled\n ? String(value ?? \"\")\n : (innerRef.current?.value ?? String(defaultValue ?? \"\"));\n const showClear = isClearable && currentValue.length > 0;\n\n const clearValue = () => {\n const el = innerRef.current;\n if (el && !isControlled) {\n const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \"value\")?.set;\n setter?.call(el, \"\");\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n onClear?.();\n el?.focus();\n };\n\n const handleClear = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n };\n\n // Esc clears the value for search inputs — standard browser-search UX.\n // Consumer's own onKeyDown still runs first; preventDefault from theirs\n // short-circuits ours.\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isClearable && isSearch && e.key === \"Escape\" && currentValue) {\n e.preventDefault();\n clearValue();\n }\n };\n\n const describedBy = error && errorMessage ? errorId : helperText ? helperId : undefined;\n\n return (\n <div\n className={cn(\n \"ods-input\",\n `ods-input--${size}`,\n error && \"ods-input--error\",\n disabled && \"ods-input--disabled\",\n isSearch && \"ods-input--search\",\n className,\n )}\n >\n {label && (\n <label htmlFor={inputId} className=\"ods-input__label\">\n {label}\n {required && (\n <span className=\"ods-input__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <div className=\"ods-input__wrapper\">\n {leftIcon && (\n <span className=\"ods-input__icon--left\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <input\n {...props}\n id={inputId}\n ref={innerRef}\n type={type}\n disabled={disabled}\n required={required}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n className={cn(\n \"ods-input__field\",\n leftIcon && \"ods-input__field--with-left-icon\",\n (rightIcon || showClear || shortcutHint) && \"ods-input__field--with-right-icon\",\n showClear && shortcutHint && \"ods-input__field--with-right-actions\",\n )}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n <span className=\"ods-input__right\">\n {showClear && (\n <button\n type=\"button\"\n className=\"ods-input__clear\"\n onClick={handleClear}\n aria-label=\"Clear\"\n tabIndex={-1}\n >\n {CLEAR_GLYPH}\n </button>\n )}\n {shortcutHint && !showClear && (\n <span className=\"ods-input__kbd\" aria-hidden=\"true\">\n {shortcutHint}\n </span>\n )}\n {rightIcon && !showClear && !shortcutHint && (\n <span className=\"ods-input__icon--right\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </span>\n </div>\n {error && errorMessage && (\n <div id={errorId} className=\"ods-input__error-message\" role=\"alert\">\n {errorMessage}\n </div>\n )}\n {!error && helperText && (\n <div id={helperId} className=\"ods-input__helper\">\n {helperText}\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n forwardRef,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { HiddenSelect, useButton, useListBox, useOption, useSelect } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useSelectState } from \"react-stately\";\nimport { CheckmarkIcon, ChevronDownIcon } from \"@octaviaflow/icons\";\nimport { resolveAccessibleName } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n searchable?: boolean;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Name for form submission (forwarded to the HiddenSelect element). */\n name?: string;\n /** Required flag for form submission (forwarded to HiddenSelect). */\n required?: boolean;\n /** Stable id for the trigger button (and the source for label htmlFor). */\n id?: string;\n /** Associate this control with an external <form id=\"...\"> element. */\n form?: string;\n /** Auto-focus the trigger on mount. */\n autoFocus?: boolean;\n /** Optional aria-label when no visible label is provided. */\n \"aria-label\"?: string;\n /** Optional aria-labelledby override. */\n \"aria-labelledby\"?: string;\n /** Optional aria-describedby (e.g. for helper text outside the component). */\n \"aria-describedby\"?: string;\n /** Helper text rendered below the trigger. Suppressed when `error`\n * is set (the error message takes the slot). */\n helperText?: ReactNode;\n /**\n * Render a check-mark glyph next to the currently selected option in\n * the dropdown. Defaults to `false` — the highlighted background is\n * already a strong visual cue, so doubling up reads as visual noise\n * in dense menus. Re-enable when the menu sits in a context where the\n * highlight isn't enough (e.g. extremely tall menus).\n */\n showCheckmark?: boolean;\n /**\n * Close the popover when the user clicks anywhere outside the trigger\n * + menu. Defaults to `true` — set to `false` for cases where the\n * caller manages dismissal explicitly (e.g. a modal that wraps the\n * select and owns its own close logic).\n */\n closeOnOutsideClick?: boolean;\n /** Show our design-system `<Tooltip>` on hover over options whose\n * label may be truncated. Default `false` — opt-in via this flag per\n * the platform's \"chrome stays quiet unless explicitly enabled\"\n * convention. The popover surfaces the full label plus the\n * description on a second line when present. */\n showOverflowTooltips?: boolean;\n /**\n * Floor for the dropdown popover width in pixels. The popover is\n * normally pinned to the trigger's width (visual alignment); pass\n * a number here when the trigger is narrow but option labels are\n * long — e.g. Calendar's compact `size=\"sm\"` month/year caption\n * where the trigger is ~70 px but month names like \"September\"\n * need ~110 px. Defaults to the trigger width (no override).\n */\n dropdownMinWidth?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* OverflowTooltip helper */\n/* ------------------------------------------------------------------ */\n\n/** Wraps `children` in our design-system Tooltip only when the flag is\n * on AND there's content to surface. Mirrors the MultiSelect pattern\n * so both pickers stay consistent. */\nfunction OverflowTooltip({\n enabled,\n content,\n children,\n}: {\n enabled: boolean;\n content: ReactNode;\n children: React.ReactElement;\n}) {\n if (!enabled || content == null || content === \"\") return children;\n return <Tooltip content={content}>{children}</Tooltip>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internal ListBox rendered inside the dropdown */\n/* ------------------------------------------------------------------ */\n\nfunction ListBox(props: any) {\n const ref = useRef<HTMLUListElement>(null);\n const {\n listBoxRef = ref,\n state,\n showCheckmark,\n showOverflowTooltips,\n } = props;\n const { listBoxProps } = useListBox(props, state, listBoxRef);\n\n return (\n <ul {...listBoxProps} ref={listBoxRef} className={\"ods-select__options\"}>\n {[...state.collection].map((item: any) => (\n <Option\n key={item.key}\n item={item}\n state={state}\n showCheckmark={showCheckmark}\n showOverflowTooltips={showOverflowTooltips}\n />\n ))}\n </ul>\n );\n}\n\nfunction Option({\n item,\n state,\n showCheckmark,\n showOverflowTooltips,\n}: {\n item: any;\n state: any;\n showCheckmark?: boolean;\n showOverflowTooltips?: boolean;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const { optionProps, isSelected, isFocused, isDisabled } = useOption(\n { key: item.key },\n state,\n ref,\n );\n\n // item.value is the items-array object; the actual SelectOption is nested inside\n const raw = item.value;\n const option: SelectOption | undefined = raw?.value ?? raw;\n\n // Tooltip content — label by itself, OR label + description on two\n // lines so the popover surfaces everything the row contains.\n const tooltipContent: ReactNode = option?.description ? (\n <>\n <span>{option.label}</span>\n <br />\n <span style={{ opacity: 0.75 }}>{option.description}</span>\n </>\n ) : (\n option?.label\n );\n\n return (\n <OverflowTooltip\n enabled={!!showOverflowTooltips}\n content={tooltipContent}\n >\n <li\n {...optionProps}\n ref={ref}\n className={cn(\n \"ods-select__option\",\n isFocused && \"ods-select__option--highlighted\",\n isSelected && \"ods-select__option--selected\",\n isDisabled && \"ods-select__option--disabled\",\n )}\n >\n {option?.icon && <span className={\"ods-select__option-icon\"}>{option.icon}</span>}\n <span className={\"ods-select__option-text\"}>\n <span className={\"ods-select__option-label\"}>{item.rendered}</span>\n {option?.description && (\n <span className={\"ods-select__option-desc\"}>{option.description}</span>\n )}\n </span>\n {isSelected && showCheckmark && (\n <span className={\"ods-select__check\"} aria-hidden=\"true\">\n <CheckmarkIcon size=\"xs\" tone=\"accent\" />\n </span>\n )}\n </li>\n </OverflowTooltip>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main Select component */\n/* ------------------------------------------------------------------ */\n\n// Generic default placeholder. A select left on THIS placeholder with no\n// label is a genuine a11y gap (we still warn). But a CUSTOM placeholder\n// (e.g. \"Search channels and people…\") describes the control's purpose, so\n// it's used as the accessible-name fallback — see ariaNameProps below.\nconst DEFAULT_SELECT_PLACEHOLDER = \"Select an option...\";\n\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value,\n defaultValue,\n onChange,\n placeholder = DEFAULT_SELECT_PLACEHOLDER,\n searchable = false,\n label,\n error = false,\n errorMessage,\n helperText,\n disabled = false,\n size = \"md\",\n className,\n name,\n required,\n id: providedId,\n form,\n autoFocus,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": consumerDescribedBy,\n showCheckmark = false,\n closeOnOutsideClick = true,\n showOverflowTooltips = false,\n dropdownMinWidth,\n },\n forwardedRef,\n) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listBoxRef = useRef<HTMLUListElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [dropdownPos, setDropdownPos] = useState<{\n top?: number;\n bottom?: number;\n left: number;\n width: number;\n maxHeight: number;\n /** \"down\" = popover hangs below the trigger; \"up\" = it stacks above. */\n direction: \"down\" | \"up\";\n }>({ left: 0, width: 0, maxHeight: 240, direction: \"down\" });\n\n // Compose the forwarded ref with our internal trigger ref so consumers\n // can `.focus()` the button while react-aria's internal needs still work.\n const setTriggerRef = (node: HTMLButtonElement | null) => {\n (triggerRef as { current: HTMLButtonElement | null }).current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as { current: HTMLButtonElement | null }).current = node;\n };\n\n const reactId = useId();\n const baseId = providedId ?? `ods-select-${reactId}`;\n const hintId = error || helperText ? `${baseId}-hint` : undefined;\n const describedBy =\n [consumerDescribedBy, hintId].filter(Boolean).join(\" \") || undefined;\n\n // Build react-stately items from options, applying search filter\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchQuery) return options;\n const q = searchQuery.toLowerCase();\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.description?.toLowerCase().includes(q),\n );\n }, [options, searchQuery, searchable]);\n\n // Build collection props for useSelectState\n // Resolve accessible name from {label, aria-label, aria-labelledby}. Removes\n // the literal \"Select\" fallback that was masking the real \"no label\" bug.\n // A CUSTOM placeholder is accepted as a last-resort accessible name (a\n // placeholder like \"Search channels and people…\" is a meaningful control\n // description); the generic default placeholder is NOT, so a truly\n // unlabeled select still trips the dev warning.\n const ariaNameProps = useMemo(\n () =>\n resolveAccessibleName({\n label,\n ariaLabel,\n ariaLabelledby: ariaLabelledBy,\n componentName: \"Select\",\n fallbacks: [\n placeholder && placeholder !== DEFAULT_SELECT_PLACEHOLDER ? placeholder : undefined,\n ],\n }),\n [label, ariaLabel, ariaLabelledBy, placeholder],\n );\n\n const ariaProps = useMemo(() => {\n const items = filteredOptions.map((o) => ({\n key: o.value,\n label: o.label,\n value: o,\n isDisabled: o.disabled,\n }));\n\n const props: any = {\n // Visible string label when present; otherwise rely on the aria-*\n // props for screen-reader name.\n label: typeof label === \"string\" ? label : undefined,\n ...ariaNameProps,\n items,\n children: (item: any) => (\n <Item key={item.key} textValue={item.label}>\n {item.label}\n </Item>\n ),\n isDisabled: disabled,\n onSelectionChange: (key: any) => {\n onChange?.(String(key));\n setSearchQuery(\"\");\n },\n };\n\n if (value !== undefined) {\n props.selectedKey = value;\n }\n if (defaultValue !== undefined) {\n props.defaultSelectedKey = defaultValue;\n }\n\n return props;\n }, [filteredOptions, label, disabled, value, defaultValue, onChange, ariaNameProps]);\n\n const state = useSelectState(ariaProps);\n\n const { triggerProps, menuProps } = useSelect(ariaProps, state, triggerRef);\n const { buttonProps } = useButton(triggerProps, triggerRef);\n\n // Position dropdown using getBoundingClientRect (fixed positioning to\n // escape stacking contexts). Now viewport-aware: when the trigger sits\n // near the bottom of the screen we flip the popover upward; either\n // way we cap its height to what's actually available so option lists\n // never spill off-screen (the prior behavior on tall pages).\n const updatePosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n const viewportH = window.innerHeight;\n const margin = 8; // breathing room at the viewport edge\n const gap = 4; // gap between trigger and popover\n const spaceBelow = viewportH - rect.bottom - gap - margin;\n const spaceAbove = rect.top - gap - margin;\n // Prefer downward; flip up when below is cramped AND above has more\n // room. Falls back to whichever side has more space if both are tight.\n const PREFERRED_MIN = 200;\n const openUp =\n spaceBelow < PREFERRED_MIN && spaceAbove > spaceBelow;\n setDropdownPos({\n ...(openUp\n ? { bottom: viewportH - rect.top + gap }\n : { top: rect.bottom + gap }),\n left: rect.left,\n width: rect.width,\n maxHeight: Math.max(120, openUp ? spaceAbove : spaceBelow),\n direction: openUp ? \"up\" : \"down\",\n });\n }, []);\n\n useEffect(() => {\n if (state.isOpen) {\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [state.isOpen, updatePosition]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (state.isOpen && searchable && searchRef.current) {\n // Small delay to allow animation frame\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [state.isOpen, searchable]);\n\n // Outside-click + Escape close. react-aria's `useSelect` wires Escape\n // when the trigger keeps focus, but because the dropdown is portaled\n // to <body> and we move focus into the search input on open, the\n // built-in dismiss does not fire on document-level outside clicks.\n // Wire it here ourselves; the `closeOnOutsideClick` prop lets a\n // consumer opt out for modal-managed selects.\n useEffect(() => {\n if (!state.isOpen || !closeOnOutsideClick) return;\n const onPointer = (e: MouseEvent) => {\n const target = e.target as Node;\n if (dropdownRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n state.close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") state.close();\n };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointer);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [state.isOpen, state.close, closeOnOutsideClick]);\n\n // Find currently selected option for display\n const selectedOption = options.find((o) => o.value === String(state.selectedKey ?? \"\"));\n\n // ── Close-on-re-click ──────────────────────────────────────────────\n // react-aria's `useSelect` opens on press but does NOT toggle when\n // the trigger is pressed again with the menu open — that's the\n // \"click trigger again\" close pattern users expect from every other\n // select on the web. We restore it here: stash the open state right\n // before the press, and on the trailing click, if it was open AND\n // still is open (meaning react-aria didn't auto-close), force close.\n const wasOpenBeforePressRef = useRef(false);\n const handleTriggerPointerDown = (e: ReactPointerEvent<HTMLButtonElement>) => {\n wasOpenBeforePressRef.current = state.isOpen;\n // Forward to react-aria's own handler if present.\n const baseHandler = (buttonProps as { onPointerDown?: (e: ReactPointerEvent<HTMLButtonElement>) => void }).onPointerDown;\n baseHandler?.(e);\n };\n const handleTriggerClick = (e: ReactMouseEvent<HTMLButtonElement>) => {\n const baseHandler = (buttonProps as { onClick?: (e: ReactMouseEvent<HTMLButtonElement>) => void }).onClick;\n baseHandler?.(e);\n if (wasOpenBeforePressRef.current && state.isOpen) {\n state.close();\n }\n wasOpenBeforePressRef.current = false;\n };\n\n return (\n <div\n className={cn(\n \"ods-select\",\n `ods-select--${size}`,\n error && \"ods-select--error\",\n disabled && \"ods-select--disabled\",\n className,\n )}\n >\n {label && (\n <label className={\"ods-select__label\"} htmlFor={baseId}>\n {label}\n </label>\n )}\n\n <HiddenSelect state={state} triggerRef={triggerRef} label={label} name={name} />\n\n <button\n {...buttonProps}\n onPointerDown={handleTriggerPointerDown}\n onClick={handleTriggerClick}\n ref={setTriggerRef}\n id={baseId}\n form={form}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={describedBy}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n className={cn(\"ods-select__trigger\", state.isOpen && \"ods-select__trigger--open\")}\n >\n <span className={\"ods-select__value\"}>\n {selectedOption ? (\n <>\n {selectedOption.icon && (\n <span className={\"ods-select__value-icon\"}>{selectedOption.icon}</span>\n )}\n {selectedOption.label}\n </>\n ) : (\n <span className={\"ods-select__placeholder\"}>{placeholder}</span>\n )}\n </span>\n <span\n className={cn(\n \"ods-select__chevron\",\n state.isOpen && \"ods-select__chevron--open\",\n )}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon size=\"xs\" />\n </span>\n </button>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {state.isOpen && (\n <motion.div\n ref={dropdownRef}\n className={\"ods-select__dropdown\"}\n style={{\n position: \"fixed\",\n ...(dropdownPos.top !== undefined && { top: dropdownPos.top }),\n ...(dropdownPos.bottom !== undefined && { bottom: dropdownPos.bottom }),\n left: dropdownPos.left,\n // `minWidth` (not `width`) keeps the popover at\n // least as wide as the trigger — preserves visual\n // alignment — but allows the consumer to widen it\n // explicitly when option labels demand more room\n // (pass `dropdownMinWidth` to set a higher floor).\n // Avoids the previous `max-content` recipe which\n // made the popover grow uncomfortably wide on\n // searchable / long-option menus.\n minWidth: Math.max(dropdownPos.width, dropdownMinWidth ?? 0),\n // Bound the popover to the available viewport edge so\n // it never spills off-screen on tall pages. Pairs with\n // `overflow-y: auto` from the .ods-select__dropdown\n // SCSS so long option lists scroll internally.\n maxHeight: dropdownPos.maxHeight,\n }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n >\n {searchable && (\n <div className={\"ods-select__search-wrap\"}>\n <input\n ref={searchRef}\n className={\"ods-select__search\"}\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n aria-label=\"Search options\"\n onKeyDown={(e) => {\n // Allow Escape to close the dropdown\n if (e.key === \"Escape\") {\n state.close();\n }\n }}\n />\n </div>\n )}\n <ListBox\n {...menuProps}\n listBoxRef={listBoxRef}\n state={state}\n showCheckmark={showCheckmark}\n showOverflowTooltips={showOverflowTooltips}\n />\n {filteredOptions.length === 0 && (\n <div className={\"ods-select__empty\"}>No results found</div>\n )}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage ? (\n <span\n id={hintId}\n className={\"ods-select__error\"}\n role=\"alert\"\n >\n {errorMessage}\n </span>\n ) : helperText ? (\n <span id={hintId} className={\"ods-select__hint\"}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n});\n\nSelect.displayName = \"Select\";\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport React, {SetStateAction, useCallback, useEffect, useReducer, useRef, useState} from 'react';\n\n// Use the earliest effect possible to reset the ref below.\nconst useEarlyEffect: typeof React.useLayoutEffect = typeof document !== 'undefined'\n ? React['useInsertionEffect'] ?? React.useLayoutEffect\n : () => {};\n\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined>, defaultValue: Exclude<T, undefined> | undefined, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined> | undefined, defaultValue: Exclude<T, undefined>, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: T, defaultValue: T, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void] {\n // Store the value in both state and a ref. The state value will only be used when uncontrolled.\n // The ref is used to track the most current value, which is passed to the function setState callback.\n let [stateValue, setStateValue] = useState(value || defaultValue);\n let valueRef = useRef(stateValue);\n\n let isControlledRef = useRef(value !== undefined);\n let isControlled = value !== undefined;\n useEffect(() => {\n let wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled && process.env.NODE_ENV !== 'production') {\n console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);\n }\n isControlledRef.current = isControlled;\n }, [isControlled]);\n\n // After each render, update the ref to the current value.\n // This ensures that the setState callback argument is reset.\n // Note: the effect should not have any dependencies so that controlled values always reset.\n let currentValue = isControlled ? value : stateValue;\n useEarlyEffect(() => {\n valueRef.current = currentValue;\n });\n\n let [, forceUpdate] = useReducer(() => ({}), {});\n let setValue = useCallback((value: SetStateAction<T>, ...args: any[]) => {\n // @ts-ignore - TS doesn't know that T cannot be a function.\n let newValue = typeof value === 'function' ? value(valueRef.current) : value;\n if (!Object.is(valueRef.current, newValue)) {\n // Update the ref so that the next setState callback has the most recent value.\n valueRef.current = newValue;\n\n setStateValue(newValue);\n\n // Always trigger a re-render, even when controlled, so that the layout effect above runs to reset the value.\n forceUpdate();\n\n // Trigger onChange. Note that if setState is called multiple times in a single event,\n // onChange will be called for each one instead of only once.\n onChange?.(newValue, ...args);\n }\n }, [onChange]);\n\n return [currentValue, setValue];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Context, createContext, useContext, useEffect, useMemo, useRef, useState} from 'react';\nimport {Validation, ValidationErrors, ValidationFunction, ValidationResult} from '@react-types/shared';\n\nexport const VALID_VALIDITY_STATE: ValidityState = {\n badInput: false,\n customError: false,\n patternMismatch: false,\n rangeOverflow: false,\n rangeUnderflow: false,\n stepMismatch: false,\n tooLong: false,\n tooShort: false,\n typeMismatch: false,\n valueMissing: false,\n valid: true\n};\n\nconst CUSTOM_VALIDITY_STATE: ValidityState = {\n ...VALID_VALIDITY_STATE,\n customError: true,\n valid: false\n};\n\nexport const DEFAULT_VALIDATION_RESULT: ValidationResult = {\n isInvalid: false,\n validationDetails: VALID_VALIDITY_STATE,\n validationErrors: []\n};\n\nexport const FormValidationContext: Context<ValidationErrors> = createContext<ValidationErrors>({});\n\n// Private props that we pass from useFormValidationState to children.\n// Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552\n// This needs to be stable across server and client module evaluation for SSR hydration.\nexport const privateValidationStateProp: string = '__reactAriaFormValidationState';\n\ninterface FormValidationProps<T> extends Validation<T> {\n builtinValidation?: ValidationResult,\n name?: string | string[],\n value: T | null\n}\n\nexport interface FormValidationState {\n /** Realtime validation results, updated as the user edits the value. */\n realtimeValidation: ValidationResult,\n /** Currently displayed validation results, updated when the user commits their changes. */\n displayValidation: ValidationResult,\n /** Updates the current validation result. Not displayed to the user until `commitValidation` is called. */\n updateValidation(result: ValidationResult): void,\n /** Resets the displayed validation state to valid when the user resets the form. */\n resetValidation(): void,\n /** Commits the realtime validation so it is displayed to the user. */\n commitValidation(): void\n}\n\nexport function useFormValidationState<T>(props: FormValidationProps<T>): FormValidationState {\n // Private prop for parent components to pass state to children.\n if (props[privateValidationStateProp]) {\n let {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation} = props[privateValidationStateProp] as FormValidationState;\n return {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation};\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFormValidationStateImpl(props);\n}\n\nfunction useFormValidationStateImpl<T>(props: FormValidationProps<T>): FormValidationState {\n let {isInvalid, validationState, name, value, builtinValidation, validate, validationBehavior = 'aria'} = props;\n\n // backward compatibility.\n if (validationState) {\n isInvalid ||= validationState === 'invalid';\n }\n\n // If the isInvalid prop is controlled, update validation result in realtime.\n let controlledError: ValidationResult | null = isInvalid !== undefined ? {\n isInvalid,\n validationErrors: [],\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n\n // Perform custom client side validation.\n let clientError: ValidationResult | null = useMemo(() => {\n if (!validate || value == null) {\n return null;\n }\n let validateErrors = runValidate(validate, value);\n return getValidationResult(validateErrors);\n }, [validate, value]);\n\n if (builtinValidation?.validationDetails.valid) {\n builtinValidation = undefined;\n }\n\n // Get relevant server errors from the form.\n let serverErrors = useContext(FormValidationContext);\n let serverErrorMessages = useMemo(() => {\n if (name) {\n return Array.isArray(name) ? name.flatMap(name => asArray(serverErrors[name])) : asArray(serverErrors[name]);\n }\n return [];\n }, [serverErrors, name]);\n\n // Show server errors when the form gets a new value, and clear when the user changes the value.\n let [lastServerErrors, setLastServerErrors] = useState(serverErrors);\n let [isServerErrorCleared, setServerErrorCleared] = useState(false);\n if (serverErrors !== lastServerErrors) {\n setLastServerErrors(serverErrors);\n setServerErrorCleared(false);\n }\n\n let serverError: ValidationResult | null = useMemo(() =>\n getValidationResult(isServerErrorCleared ? [] : serverErrorMessages),\n [isServerErrorCleared, serverErrorMessages]\n );\n\n // Track the next validation state in a ref until commitValidation is called.\n let nextValidation = useRef(DEFAULT_VALIDATION_RESULT);\n let [currentValidity, setCurrentValidity] = useState(DEFAULT_VALIDATION_RESULT);\n\n let lastError = useRef(DEFAULT_VALIDATION_RESULT);\n let commitValidation = () => {\n if (!commitQueued) {\n return;\n }\n\n setCommitQueued(false);\n let error = clientError || builtinValidation || nextValidation.current;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n };\n\n let [commitQueued, setCommitQueued] = useState(false);\n useEffect(commitValidation);\n\n // realtimeValidation is used to update the native input element's state based on custom validation logic.\n // displayValidation is the currently displayed validation state that the user sees (e.g. on input change/form submit).\n // With validationBehavior=\"aria\", all errors are displayed in realtime rather than on submit.\n let realtimeValidation = controlledError || serverError || clientError || builtinValidation || DEFAULT_VALIDATION_RESULT;\n let displayValidation = validationBehavior === 'native'\n ? controlledError || serverError || currentValidity\n : controlledError || serverError || clientError || builtinValidation || currentValidity;\n\n return {\n realtimeValidation,\n displayValidation,\n updateValidation(value) {\n // If validationBehavior is 'aria', update in realtime. Otherwise, store in a ref until commit.\n if (validationBehavior === 'aria' && !isEqualValidation(currentValidity, value)) {\n setCurrentValidity(value);\n } else {\n nextValidation.current = value;\n }\n },\n resetValidation() {\n // Update the currently displayed validation state to valid on form reset,\n // even if the native validity says it isn't. It'll show again on the next form submit.\n let error = DEFAULT_VALIDATION_RESULT;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n\n // Do not commit validation after the next render. This avoids a condition where\n // useSelect calls commitValidation inside an onReset handler.\n if (validationBehavior === 'native') {\n setCommitQueued(false);\n }\n\n setServerErrorCleared(true);\n },\n commitValidation() {\n // Commit validation state so the user sees it on blur/change/submit. Also clear any server errors.\n // Wait until after the next render to commit so that the latest value has been validated.\n if (validationBehavior === 'native') {\n setCommitQueued(true);\n }\n setServerErrorCleared(true);\n }\n };\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n if (!v) {\n return [];\n }\n\n return Array.isArray(v) ? v : [v];\n}\n\nfunction runValidate<T>(validate: ValidationFunction<T>, value: T): string[] {\n if (typeof validate === 'function') {\n let e = validate(value);\n if (e && typeof e !== 'boolean') {\n return asArray(e);\n }\n }\n\n return [];\n}\n\nfunction getValidationResult(errors: string[]): ValidationResult | null {\n return errors.length ? {\n isInvalid: true,\n validationErrors: errors,\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n}\n\nfunction isEqualValidation(a: ValidationResult | null, b: ValidationResult | null): boolean {\n if (a === b) {\n return true;\n }\n\n return !!a && !!b\n && a.isInvalid === b.isInvalid\n && a.validationErrors.length === b.validationErrors.length\n && a.validationErrors.every((a, i) => a === b.validationErrors[i])\n && Object.entries(a.validationDetails).every(([k, v]) => b.validationDetails[k] === v);\n}\n\nexport function mergeValidation(...results: ValidationResult[]): ValidationResult {\n let errors = new Set<string>();\n let isInvalid = false;\n let validationDetails = {\n ...VALID_VALIDITY_STATE\n };\n\n for (let v of results) {\n for (let e of v.validationErrors) {\n errors.add(e);\n }\n\n // Only these properties apply for checkboxes.\n isInvalid ||= v.isInvalid;\n for (let key in validationDetails) {\n validationDetails[key] ||= v.validationDetails[key];\n }\n }\n\n validationDetails.valid = !isInvalid;\n return {\n isInvalid,\n validationErrors: [...errors],\n validationDetails\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type {Collection, Node} from '@react-types/shared';\n\nexport function getChildNodes<T>(node: Node<T>, collection: Collection<Node<T>>): Iterable<Node<T>> {\n // New API: call collection.getChildren with the node key.\n if (typeof collection.getChildren === 'function') {\n return collection.getChildren(node.key);\n }\n\n // Old API: access childNodes directly.\n return node.childNodes;\n}\n\nexport function getFirstItem<T>(iterable: Iterable<T>): T | undefined {\n return getNthItem(iterable, 0);\n}\n\nexport function getNthItem<T>(iterable: Iterable<T>, index: number): T | undefined {\n if (index < 0) {\n return undefined;\n }\n\n let i = 0;\n for (let item of iterable) {\n if (i === index) {\n return item;\n }\n\n i++;\n }\n}\n\nexport function getLastItem<T>(iterable: Iterable<T>): T | undefined {\n let lastItem: T | undefined = undefined;\n for (let value of iterable) {\n lastItem = value;\n }\n\n return lastItem;\n}\n\nexport function compareNodeOrder<T>(collection: Collection<Node<T>>, a: Node<T>, b: Node<T>): number {\n // If the two nodes have the same parent, compare their indices.\n if (a.parentKey === b.parentKey) {\n return a.index - b.index;\n }\n\n // Otherwise, collect all of the ancestors from each node, and find the first one that doesn't match starting from the root.\n // Include the base nodes in case we are comparing nodes of different levels so that we can compare the higher node to the lower level node's\n // ancestor of the same level\n let aAncestors = [...getAncestors(collection, a), a];\n let bAncestors = [...getAncestors(collection, b), b];\n let firstNonMatchingAncestor = aAncestors.slice(0, bAncestors.length).findIndex((a, i) => a !== bAncestors[i]);\n if (firstNonMatchingAncestor !== -1) {\n // Compare the indices of two children within the common ancestor.\n a = aAncestors[firstNonMatchingAncestor];\n b = bAncestors[firstNonMatchingAncestor];\n return a.index - b.index;\n }\n\n // If there isn't a non matching ancestor, we might be in a case where one of the nodes is the ancestor of the other.\n if (aAncestors.findIndex(node => node === b) >= 0) {\n return 1;\n } else if (bAncestors.findIndex(node => node === a) >= 0) {\n return -1;\n }\n\n // 🤷\n return -1;\n}\n\nfunction getAncestors<T>(collection: Collection<Node<T>>, node: Node<T>): Node<T>[] {\n let parents: Node<T>[] = [];\n\n let currNode: Node<T> | null = node;\n while (currNode?.parentKey != null) {\n currNode = collection.getItem(currNode.parentKey);\n if (currNode) {\n parents.unshift(currNode);\n }\n }\n\n return parents;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class ListCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n private _size: number;\n\n constructor(nodes: Iterable<Node<T>>) {\n this.iterable = nodes;\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && node.type === 'section') {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n let size = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n // Only count sections and items when determining size so that\n // loaders and separators in RAC/S2 don't influence the emptyState determination\n if (node.type === 'section' || node.type === 'item') {\n size++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n this._size = size;\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this._size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n\n getChildren(key: Key): Iterable<Node<T>> {\n let node = this.keyMap.get(key);\n return node?.childNodes || [];\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key} from '@react-types/shared';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key | null;\n currentKey: Key | null;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key | null, currentKey?: Key | null) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey ?? keys.anchorKey;\n this.currentKey = currentKey ?? keys.currentKey;\n } else {\n this.anchorKey = anchorKey ?? null;\n this.currentKey = currentKey ?? null;\n }\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {DisabledBehavior, FocusStrategy, Key, MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /**\n * How multiple selection should behave in the collection.\n * @default 'toggle'\n */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean,\n /**\n * Whether `disabledKeys` applies to all interactions, or only selection.\n * @default 'all'\n */\n disabledBehavior?: DisabledBehavior\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection = false,\n allowDuplicateSelectionEvents,\n selectionBehavior: selectionBehaviorProp = 'toggle',\n disabledBehavior = 'all'\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef<Key | null>(null);\n let childFocusStrategyRef = useRef<FocusStrategy | null>(null);\n let [, setFocusedKey] = useState<Key | null>(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys!,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(selectionBehaviorProp);\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n // If the selectionBehavior prop changes, update the state as well.\n let lastSelectionBehavior = useRef(selectionBehaviorProp);\n useEffect(() => {\n if (selectionBehaviorProp !== lastSelectionBehavior.current) {\n setSelectionBehavior(selectionBehaviorProp);\n lastSelectionBehavior.current = selectionBehaviorProp;\n }\n }, [selectionBehaviorProp]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp,\n disabledBehavior\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key> | null | undefined, defaultValue?: Selection): 'all' | Set<Key> | undefined {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LayoutDelegate,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '../collections/getChildNodes';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean,\n layoutDelegate?: LayoutDelegate,\n fullCollection?: Collection<Node<unknown>>\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean | null;\n private layoutDelegate: LayoutDelegate | null;\n private fullCollection: Collection<Node<unknown>> | null;\n\n constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n this.collection = collection;\n this.state = state;\n this.allowsCellSelection = options?.allowsCellSelection ?? false;\n this._isSelectAll = null;\n this.layoutDelegate = options?.layoutDelegate || null;\n this.fullCollection = options?.fullCollection || null;\n }\n\n /**\n * The type of selection that is allowed in the collection.\n */\n get selectionMode(): SelectionMode {\n return this.state.selectionMode;\n }\n\n /**\n * Whether the collection allows empty selection.\n */\n get disallowEmptySelection(): boolean {\n return this.state.disallowEmptySelection;\n }\n\n /**\n * The selection behavior for the collection.\n */\n get selectionBehavior(): SelectionBehavior {\n return this.state.selectionBehavior;\n }\n\n /**\n * Sets the selection behavior for the collection.\n */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void {\n this.state.setSelectionBehavior(selectionBehavior);\n }\n\n /**\n * Whether the collection is currently focused.\n */\n get isFocused(): boolean {\n return this.state.isFocused;\n }\n\n /**\n * Sets whether the collection is focused.\n */\n setFocused(isFocused: boolean): void {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key | null {\n return this.state.focusedKey;\n }\n\n /** Whether the first or last child of the focused key should receive focus. */\n get childFocusStrategy(): FocusStrategy | null {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key | null, childFocusStrategy?: FocusStrategy): void {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key): boolean {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return false;\n }\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(mappedKey)\n : this.state.selectedKeys.has(mappedKey);\n }\n\n /**\n * Whether the selection is empty.\n */\n get isEmpty(): boolean {\n return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n }\n\n /**\n * Whether all items in the collection are selected.\n */\n get isSelectAll(): boolean {\n if (this.isEmpty) {\n return false;\n }\n\n if (this.state.selectedKeys === 'all') {\n return true;\n }\n\n if (this._isSelectAll != null) {\n return this._isSelectAll;\n }\n\n let allKeys = this.getSelectAllKeys();\n let selectedKeys = this.state.selectedKeys;\n this._isSelectAll = allKeys.every(k => selectedKeys.has(k));\n return this._isSelectAll;\n }\n\n get firstSelectedKey(): Key | null {\n let first: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!first || (item && compareNodeOrder(this.collection, item, first) < 0)) {\n first = item;\n }\n }\n\n return first?.key ?? null;\n }\n\n get lastSelectedKey(): Key | null {\n let last: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!last || (item && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key ?? null;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.replaceSelection(toKey);\n return;\n }\n\n let mappedToKey = this.getKey(toKey);\n if (mappedToKey == null) {\n return;\n }\n\n let selection: Selection;\n\n // Only select the one key if coming from a select all.\n if (this.state.selectedKeys === 'all') {\n selection = new Selection([mappedToKey], mappedToKey, mappedToKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey ?? mappedToKey;\n selection = new Selection(selectedKeys, anchorKey, mappedToKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey ?? mappedToKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(mappedToKey, anchorKey)) {\n if (this.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n if (this.layoutDelegate?.getKeyRange) {\n return this.layoutDelegate.getKeyRange(from, to);\n }\n\n let keys: Key[] = [];\n let key: Key | null = from;\n while (key != null) {\n let item = this.collection.getItem(key);\n if (item && (item.type === 'item' || (item.type === 'cell' && this.allowsCellSelection))) {\n keys.push(key);\n }\n\n if (key === to) {\n return keys;\n }\n\n key = this.collection.getKeyAfter(key);\n }\n\n return [];\n }\n\n private getKey(key: Key) {\n let item = this.collection.getItem(key);\n if (!item) {\n // ¯\\_(ツ)_/¯\n return key;\n }\n\n // If cell selection is allowed, just return the key.\n if (item.type === 'cell' && this.allowsCellSelection) {\n return key;\n }\n\n // Find a parent item to select\n while (item && item.type !== 'item' && item.parentKey != null) {\n item = this.collection.getItem(item.parentKey);\n }\n\n if (!item || item.type !== 'item') {\n return null;\n }\n\n return item.key;\n }\n\n /**\n * Toggles whether the given key is selected.\n */\n toggleSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single' && !this.isSelected(key)) {\n this.replaceSelection(key);\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(mappedKey)) {\n keys.delete(mappedKey);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else if (this.canSelectItem(mappedKey)) {\n keys.add(mappedKey);\n keys.anchorKey = mappedKey;\n keys.currentKey = mappedKey;\n }\n\n if (this.disallowEmptySelection && keys.size === 0) {\n return;\n }\n\n this.state.setSelectedKeys(keys);\n }\n\n /**\n * Replaces the selection with only the given key.\n */\n replaceSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let selection = this.canSelectItem(mappedKey)\n ? new Selection([mappedKey], mappedKey, mappedKey)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n let mappedKey = this.getKey(key);\n if (mappedKey != null) {\n selection.add(mappedKey);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n // Use the full (unfiltered) collection when available so that materializing\n // the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).\n let collection = this.fullCollection ?? this.collection;\n let keys: Key[] = [];\n let addKeys = (key: Key | null) => {\n while (key != null) {\n if (this.canSelectItemIn(key, collection)) {\n let item = collection.getItem(key);\n if (item?.type === 'item') {\n keys.push(key);\n }\n\n // Add child keys. If cell selection is allowed, then include item children too.\n if (item?.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) {\n addKeys(getFirstItem(getChildNodes(item, collection))?.key ?? null);\n }\n }\n\n key = collection.getKeyAfter(key);\n }\n };\n\n addKeys(collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll(): void {\n if (!this.isSelectAll && this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection(): void {\n if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {\n this.state.setSelectedKeys(new Selection());\n }\n }\n\n /**\n * Toggles between select all and an empty selection.\n */\n toggleSelectAll(): void {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n if (this.isSelected(key) && !this.disallowEmptySelection) {\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {\n // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n }\n\n /**\n * Returns whether the current selection is equal to the given selection.\n */\n isSelectionEqual(selection: Set<Key>): boolean {\n if (selection === this.state.selectedKeys) {\n return true;\n }\n\n // Check if the set of keys match.\n let selectedKeys = this.selectedKeys;\n if (selection.size !== selectedKeys.size) {\n return false;\n }\n\n for (let key of selection) {\n if (!selectedKeys.has(key)) {\n return false;\n }\n }\n\n for (let key of selectedKeys) {\n if (!selection.has(key)) {\n return false;\n }\n }\n\n return true;\n }\n\n canSelectItem(key: Key): boolean {\n return this.canSelectItemIn(key, this.collection);\n }\n\n private canSelectItemIn(key: Key, collection: Collection<Node<unknown>>): boolean {\n if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n return false;\n }\n\n let item = collection.getItem(key);\n if (!item || item?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key): boolean {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key): boolean {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key): any {\n return this.collection.getItem(key)?.props;\n }\n\n withCollection(collection: Collection<Node<unknown>>): SelectionManager {\n return new SelectionManager(collection, this.state, {\n allowsCellSelection: this.allowsCellSelection,\n layoutDelegate: this.layoutDelegate || undefined,\n fullCollection: this.fullCollection ?? this.collection\n });\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionElement, Key, Node} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {ReactElement} from 'react';\n\ninterface CollectionBuilderState {\n renderer?: (value: any) => ReactElement | null\n}\n\ninterface CollectReactElement<T> extends ReactElement {\n getCollectionNode(props: any, context: any): Generator<PartialNode<T>, void, Node<T>[]>\n}\n\nexport class CollectionBuilder<T extends object> {\n private context?: unknown;\n private cache: WeakMap<T, Node<T>> = new WeakMap();\n\n build(props: Partial<CollectionBase<T>>, context?: unknown): Iterable<Node<T>> {\n this.context = context;\n return iterable(() => this.iterateCollection(props));\n }\n\n private *iterateCollection(props: Partial<CollectionBase<T>>): Generator<Node<T>> {\n let {children, items} = props;\n\n if (React.isValidElement<{children: CollectionElement<T>}>(children) && children.type === React.Fragment) {\n yield* this.iterateCollection({\n children: children.props.children,\n items\n });\n } else if (typeof children === 'function') {\n if (!items) {\n throw new Error('props.children was a function but props.items is missing');\n }\n\n let index = 0;\n for (let item of items) {\n yield* this.getFullNode({\n value: item,\n index\n }, {renderer: children});\n index++;\n }\n } else {\n let items: CollectionElement<T>[] = [];\n React.Children.forEach(children, child => {\n if (child) {\n items.push(child);\n }\n });\n\n let index = 0;\n for (let item of items) {\n let nodes = this.getFullNode({\n element: item,\n index: index\n }, {});\n\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n }\n }\n\n private getKey(item: NonNullable<CollectionElement<T>>, partialNode: PartialNode<T>, state: CollectionBuilderState, parentKey?: Key | null): Key {\n if (item.key != null) {\n return item.key;\n }\n\n if (partialNode.type === 'cell' && partialNode.key != null) {\n return `${parentKey}${partialNode.key}`;\n }\n\n let v = partialNode.value as any;\n if (v != null) {\n let key = v.key ?? v.id;\n if (key == null) {\n throw new Error('No key found for item');\n }\n\n return key;\n }\n\n return parentKey ? `${parentKey}.${partialNode.index}` : `$.${partialNode.index}`;\n }\n\n private getChildState(state: CollectionBuilderState, partialNode: PartialNode<T>) {\n return {\n renderer: partialNode.renderer || state.renderer\n };\n }\n\n private *getFullNode(partialNode: PartialNode<T> & {index: number}, state: CollectionBuilderState, parentKey?: Key | null, parentNode?: Node<T>): Generator<Node<T>> {\n if (React.isValidElement<{children: CollectionElement<T>}>(partialNode.element) && partialNode.element.type === React.Fragment) {\n let children: CollectionElement<T>[] = [];\n\n React.Children.forEach(partialNode.element.props.children, child => {\n children.push(child);\n });\n\n let index = partialNode.index ?? 0;\n\n for (const child of children) {\n yield* this.getFullNode({\n element: child,\n index: index++\n }, state, parentKey, parentNode);\n }\n\n return;\n }\n\n // If there's a value instead of an element on the node, and a parent renderer function is available,\n // use it to render an element for the value.\n let element = partialNode.element;\n if (!element && partialNode.value && state && state.renderer) {\n let cached = this.cache.get(partialNode.value);\n if (cached && (!cached.shouldInvalidate || !cached.shouldInvalidate(this.context))) {\n cached.index = partialNode.index;\n cached.parentKey = parentNode ? parentNode.key : null;\n yield cached;\n return;\n }\n\n element = state.renderer(partialNode.value);\n }\n\n // If there's an element with a getCollectionNode function on its type, then it's a supported component.\n // Call this function to get a partial node, and recursively build a full node from there.\n if (React.isValidElement(element)) {\n let type = element.type as unknown as CollectReactElement<T>;\n if (typeof type !== 'function' && typeof type.getCollectionNode !== 'function') {\n let name = element.type;\n throw new Error(`Unknown element <${name}> in collection.`);\n }\n\n let childNodes = type.getCollectionNode(element.props, this.context) as Generator<PartialNode<T>, void, Node<T>[]>;\n let index = partialNode.index ?? 0;\n let result = childNodes.next();\n while (!result.done && result.value) {\n let childNode = result.value;\n\n partialNode.index = index;\n\n let nodeKey = childNode.key ?? null;\n if (nodeKey == null) {\n nodeKey = childNode.element ? null : this.getKey(element as NonNullable<CollectionElement<T>>, partialNode, state, parentKey);\n }\n\n let nodes = this.getFullNode({\n ...childNode,\n key: nodeKey,\n index,\n wrapper: compose(partialNode.wrapper, childNode.wrapper)\n }, this.getChildState(state, childNode), parentKey ? `${parentKey}${element.key}` : element.key, parentNode);\n\n let children = [...nodes];\n for (let node of children) {\n // Cache the node based on its value\n node.value = childNode.value ?? partialNode.value ?? null;\n if (node.value) {\n this.cache.set(node.value, node);\n }\n\n // The partial node may have specified a type for the child in order to specify a constraint.\n // Verify that the full node that was built recursively matches this type.\n if (partialNode.type && node.type !== partialNode.type) {\n throw new Error(`Unsupported type <${capitalize(node.type)}> in <${capitalize(parentNode?.type ?? 'unknown parent type')}>. Only <${capitalize(partialNode.type)}> is supported.`);\n }\n\n index++;\n yield node;\n }\n\n result = childNodes.next(children);\n }\n\n return;\n }\n\n // Ignore invalid elements\n if (partialNode.key == null || partialNode.type == null) {\n return;\n }\n\n // Create full node\n let builder = this;\n let node: Node<T> = {\n type: partialNode.type,\n props: partialNode.props,\n key: partialNode.key,\n parentKey: parentNode ? parentNode.key : null,\n value: partialNode.value ?? null,\n level: (parentNode?.level ?? 0) + (parentNode?.type === 'item' ? 1 : 0),\n index: partialNode.index,\n rendered: partialNode.rendered,\n textValue: partialNode.textValue ?? '',\n 'aria-label': partialNode['aria-label'],\n wrapper: partialNode.wrapper,\n shouldInvalidate: partialNode.shouldInvalidate,\n hasChildNodes: partialNode.hasChildNodes || false,\n childNodes: iterable(function *() {\n if (!partialNode.hasChildNodes || !partialNode.childNodes) {\n return;\n }\n\n let index = 0;\n for (let child of partialNode.childNodes()) {\n // Ensure child keys are globally unique by prepending the parent node's key\n if (child.key != null) {\n // TODO: Remove this line entirely and enforce that users always provide unique keys.\n // Currently this line will have issues when a parent has a key `a` and a child with key `bc`\n // but another parent has key `ab` and its child has a key `c`. The combined keys would result in both\n // children having a key of `abc`.\n child.key = `${node.key}${child.key}`;\n }\n\n let nodes = builder.getFullNode({...child, index}, builder.getChildState(state, child), node.key, node);\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n })\n };\n\n yield node;\n }\n}\n\n// Wraps an iterator function as an iterable object, and caches the results.\nfunction iterable<T>(iterator: () => IterableIterator<Node<T>>): Iterable<Node<T>> {\n let cache: Array<Node<T>> = [];\n let iterable: null | IterableIterator<Node<T>> = null;\n return {\n *[Symbol.iterator]() {\n for (let item of cache) {\n yield item;\n }\n\n if (!iterable) {\n iterable = iterator();\n }\n\n for (let item of iterable) {\n cache.push(item);\n yield item;\n }\n }\n };\n}\n\ntype Wrapper = (element: ReactElement) => ReactElement;\nfunction compose(outer: Wrapper | void, inner: Wrapper | void): Wrapper | undefined {\n if (outer && inner) {\n return (element) => outer(inner(element));\n }\n\n if (outer) {\n return outer;\n }\n\n if (inner) {\n return inner;\n }\n}\n\nfunction capitalize(str: string) {\n return str[0].toUpperCase() + str.slice(1);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Node} from '@react-types/shared';\nimport {CollectionBuilder} from './CollectionBuilder';\nimport {ReactElement, useMemo} from 'react';\n\ninterface CollectionOptions<T, C extends Collection<Node<T>>> extends Omit<CollectionStateBase<T, C>, 'children'> {\n children?: ReactElement<any> | null | (ReactElement<any> | null)[] | ((item: T) => ReactElement<any> | null)\n}\n\ntype CollectionFactory<T, C extends Collection<Node<T>>> = (node: Iterable<Node<T>>) => C;\n\nexport function useCollection<T extends object, C extends Collection<Node<T>> = Collection<Node<T>>>(props: CollectionOptions<T, C>, factory: CollectionFactory<T, C>, context?: unknown): C {\n let builder = useMemo(() => new CollectionBuilder<T>(), []);\n let {children, items, collection} = props;\n let result = useMemo(() => {\n if (collection) {\n return collection;\n }\n let nodes = builder.build({children, items}, context);\n return factory(nodes);\n }, [builder, children, items, collection, context, factory]);\n return result;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {ListCollection} from './ListCollection';\nimport {MultipleSelectionStateProps, useMultipleSelectionState} from '../selection/useMultipleSelectionState';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {useCollection} from '../collections/useCollection';\n\nexport interface ListProps<T> extends CollectionStateBase<T>, MultipleSelectionStateProps {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean,\n /**\n * A delegate object that provides layout information for items in the collection.\n * This can be used to override the behavior of shift selection.\n */\n layoutDelegate?: LayoutDelegate\n}\n\nexport interface ListState<T> {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>,\n\n /** A set of items that are disabled. */\n disabledKeys: Set<Key>,\n\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for list-like components. Handles building a collection\n * of items from props, and manages multiple selection state.\n */\nexport function useListState<T extends object>(props: ListProps<T>): ListState<T> {\n let {filter, layoutDelegate} = props;\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let factory = useCallback(nodes => filter ? new ListCollection(filter(nodes)) : new ListCollection(nodes as Iterable<Node<T>>), [filter]);\n let context = useMemo(() => ({suppressTextValueWarning: props.suppressTextValueWarning}), [props.suppressTextValueWarning]);\n\n let collection = useCollection(props, factory, context);\n\n let selectionManager = useMemo(() =>\n new SelectionManager(collection, selectionState, {layoutDelegate})\n , [collection, selectionState, layoutDelegate]\n );\n\n useFocusedKeyReset(collection, selectionManager);\n\n return {\n collection,\n disabledKeys,\n selectionManager\n };\n}\n\n/**\n * Filters a collection using the provided filter function and returns a new ListState.\n */\nexport function UNSTABLE_useFilteredListState<T extends object>(state: ListState<T>, filterFn: ((nodeValue: string, node: Node<T>) => boolean) | null | undefined): ListState<T> {\n let collection = useMemo(() => filterFn ? state.collection.filter!(filterFn) : state.collection, [state.collection, filterFn]);\n let selectionManager = state.selectionManager.withCollection(collection);\n useFocusedKeyReset(collection, selectionManager);\n return {\n collection,\n selectionManager,\n disabledKeys: state.disabledKeys\n };\n}\n\nfunction useFocusedKeyReset<T>(collection: Collection<Node<T>>, selectionManager: SelectionManager) {\n // Reset focused key if that item is deleted from the collection.\n const cachedCollection = useRef<Collection<Node<T>> | null>(null);\n useEffect(() => {\n if (selectionManager.focusedKey != null && !collection.getItem(selectionManager.focusedKey) && cachedCollection.current) {\n // Walk forward in the old collection to find the next key that still exists in the new collection.\n let key = cachedCollection.current.getKeyAfter(selectionManager.focusedKey);\n let nextFocusedKey: Key | null = null;\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyAfter(key);\n }\n\n // If no such key exists, walk backward.\n if (nextFocusedKey == null) {\n key = cachedCollection.current.getKeyBefore(selectionManager.focusedKey);\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyBefore(key);\n }\n }\n\n selectionManager.setFocusedKey(nextFocusedKey);\n }\n cachedCollection.current = collection;\n }, [collection, selectionManager]);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface OverlayTriggerProps {\n /** Whether the overlay is open by default (controlled). */\n isOpen?: boolean,\n /** Whether the overlay is open by default (uncontrolled). */\n defaultOpen?: boolean,\n /** Handler that is called when the overlay's open state changes. */\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport interface OverlayTriggerState {\n /** Whether the overlay is currently open. */\n readonly isOpen: boolean,\n /** Sets whether the overlay is open. */\n setOpen(isOpen: boolean): void,\n /** Opens the overlay. */\n open(): void,\n /** Closes the overlay. */\n close(): void,\n /** Toggles the overlay's visibility. */\n toggle(): void\n}\n\n/**\n * Manages state for an overlay trigger. Tracks whether the overlay is open, and provides\n * methods to toggle this state.\n */\nexport function useOverlayTriggerState(props: OverlayTriggerProps): OverlayTriggerState {\n let [isOpen, setOpen] = useControlledState(props.isOpen, props.defaultOpen || false, props.onOpenChange);\n\n const open = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [setOpen, isOpen]);\n\n return {\n isOpen,\n setOpen,\n open,\n close,\n toggle\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ItemElement, ItemProps} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {JSX, ReactElement} from 'react';\n\nfunction Item<T>(props: ItemProps<T>): ReactElement | null { // eslint-disable-line @typescript-eslint/no-unused-vars\n return null;\n}\n\nItem.getCollectionNode = function* getCollectionNode<T>(props: ItemProps<T>, context: any): Generator<PartialNode<T>> {\n let {childItems, title, children} = props;\n\n let rendered = props.title || props.children;\n let textValue = props.textValue || (typeof rendered === 'string' ? rendered : '') || props['aria-label'] || '';\n\n // suppressTextValueWarning is used in components like Tabs, which don't have type to select support.\n if (!textValue && !context?.suppressTextValueWarning && process.env.NODE_ENV !== 'production') {\n console.warn('<Item> with non-plain text contents is unsupported by type to select for accessibility. Please add a `textValue` prop.');\n }\n\n yield {\n type: 'item',\n props: props,\n rendered,\n textValue,\n 'aria-label': props['aria-label'],\n hasChildNodes: hasChildItems(props),\n *childNodes() {\n if (childItems) {\n for (let child of childItems) {\n yield {\n type: 'item',\n value: child\n };\n }\n } else if (title) {\n let items: PartialNode<T>[] = [];\n React.Children.forEach(children, child => {\n items.push({\n type: 'item',\n element: child as ItemElement<T>\n });\n });\n\n yield* items;\n }\n }\n };\n};\n\nfunction hasChildItems<T>(props: ItemProps<T>) {\n if (props.hasChildItems != null) {\n return props.hasChildItems;\n }\n\n if (props.childItems) {\n return true;\n }\n\n if (props.title && React.Children.count(props.children) > 0) {\n return true;\n }\n\n return false;\n}\n\n// We don't want getCollectionNode to show up in the type definition\nlet _Item = Item as <T>(props: ItemProps<T>) => JSX.Element;\nexport {_Item as Item};\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionStateBase, FocusableProps, FocusStrategy, HelpTextProps, InputBase, Key, LabelableProps, Node, Selection, TextInputBase, Validation, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {ListState, useListState} from '../list/useListState';\nimport {OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport type SelectionMode = 'single' | 'multiple';\nexport type ValueType<M extends SelectionMode> = M extends 'single' ? Key | null : readonly Key[];\nexport type ChangeValueType<M extends SelectionMode> = M extends 'single' ? Key | null : Key[];\ntype ValidationType<M extends SelectionMode> = M extends 'single' ? Key : Key[];\n\nexport interface SelectProps<T, M extends SelectionMode = 'single'> extends CollectionBase<T>, Omit<InputBase, 'isReadOnly'>, ValueBase<ValueType<M>, ChangeValueType<M>>, Validation<ValidationType<M>>, HelpTextProps, LabelableProps, TextInputBase, FocusableProps {\n /**\n * Whether single or multiple selection is enabled.\n * @default 'single'\n */\n selectionMode?: M,\n /**\n * The currently selected key in the collection (controlled).\n * @deprecated\n */\n selectedKey?: Key | null,\n /**\n * The initial selected key in the collection (uncontrolled).\n * @deprecated\n */\n defaultSelectedKey?: Key | null,\n /**\n * Handler that is called when the selection changes.\n * @deprecated\n */\n onSelectionChange?: (key: Key | null) => void,\n /** Sets the open state of the menu. */\n isOpen?: boolean,\n /** Sets the default open state of the menu. */\n defaultOpen?: boolean,\n /** Method that is called when the open state of the menu changes. */\n onOpenChange?: (isOpen: boolean) => void,\n /** Whether the Select should close when an item is selected. Defaults to true if selectionMode is single, false otherwise. */\n shouldCloseOnSelect?: boolean,\n /** Whether the select should be allowed to be open when the collection is empty. */\n allowsEmptyCollection?: boolean\n}\n\nexport interface SelectStateOptions<T, M extends SelectionMode = 'single'> extends Omit<SelectProps<T, M>, 'children'>, CollectionStateBase<T> {}\n\nexport interface SelectState<T, M extends SelectionMode = 'single'> extends ListState<T>, OverlayTriggerState, FormValidationState {\n /**\n * The key for the first selected item.\n * @deprecated\n */\n readonly selectedKey: Key | null,\n\n /**\n * The default selected key.\n * @deprecated\n */\n readonly defaultSelectedKey: Key | null,\n\n /**\n * Sets the selected key.\n * @deprecated\n */\n setSelectedKey(key: Key | null): void,\n\n /** The current select value. */\n readonly value: ValueType<M>,\n\n /** The default select value. */\n readonly defaultValue: ValueType<M>,\n\n /** Sets the select value. */\n setValue(value: Key | readonly Key[] | null): void,\n\n /**\n * The value of the first selected item.\n * @deprecated\n */\n readonly selectedItem: Node<T> | null,\n\n /** The value of the selected items. */\n readonly selectedItems: Node<T>[],\n\n /** Whether the select is currently focused. */\n readonly isFocused: boolean,\n\n /** Sets whether the select is focused. */\n setFocused(isFocused: boolean): void,\n\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\n/**\n * Provides state management for a select component. Handles building a collection\n * of items from props, handles the open state for the popup menu, and manages\n * multiple selection state.\n */\nexport function useSelectState<T extends object, M extends SelectionMode = 'single'>(props: SelectStateOptions<T, M>): SelectState<T, M> {\n let {\n selectionMode = 'single' as M,\n shouldCloseOnSelect = selectionMode === 'single'\n } = props;\n let triggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let defaultValue = useMemo(() => {\n return props.defaultValue !== undefined ? props.defaultValue : (selectionMode === 'single' ? props.defaultSelectedKey ?? null : []) as ValueType<M>;\n }, [props.defaultValue, props.defaultSelectedKey, selectionMode]);\n let value = useMemo(() => {\n return props.value !== undefined ? props.value : (selectionMode === 'single' ? props.selectedKey : undefined) as ValueType<M>;\n }, [props.value, props.selectedKey, selectionMode]);\n let [controlledValue, setControlledValue] = useControlledState<Key | readonly Key[] | null>(value, defaultValue, props.onChange as any);\n // Only display the first selected item if in single selection mode but the value is an array.\n let displayValue = selectionMode === 'single' && Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;\n let setValue = (value: Key | Key[] | null) => {\n if (selectionMode === 'single') {\n let key = Array.isArray(value) ? value[0] ?? null : value;\n setControlledValue(key);\n if (key !== displayValue) {\n props.onSelectionChange?.(key);\n }\n } else {\n let keys: Key[] = [];\n if (Array.isArray(value)) {\n keys = value;\n } else if (value != null) {\n keys = [value];\n }\n\n setControlledValue(keys);\n }\n };\n\n let listState = useListState({\n ...props,\n selectionMode,\n disallowEmptySelection: selectionMode === 'single',\n allowDuplicateSelectionEvents: true,\n selectedKeys: useMemo(() => convertValue(displayValue), [displayValue]),\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n\n if (selectionMode === 'single') {\n let key = keys.values().next().value ?? null;\n setValue(key);\n } else {\n setValue([...keys]);\n }\n if (shouldCloseOnSelect) {\n triggerState.close();\n }\n\n validationState.commitValidation();\n }\n });\n\n let selectedKey = listState.selectionManager.firstSelectedKey;\n let selectedItems = useMemo(() => {\n return [...listState.selectionManager.selectedKeys].map(key => listState.collection.getItem(key)).filter(item => item != null);\n }, [listState.selectionManager.selectedKeys, listState.collection]);\n\n let validationState = useFormValidationState({\n ...props,\n value: Array.isArray(displayValue) && displayValue.length === 0 ? null : displayValue as any\n });\n\n let [isFocused, setFocused] = useState(false);\n let [initialValue] = useState(displayValue);\n\n return {\n ...validationState,\n ...listState,\n ...triggerState,\n value: displayValue as ValueType<M>,\n defaultValue: defaultValue ?? initialValue as ValueType<M>,\n setValue,\n selectedKey,\n setSelectedKey: setValue,\n selectedItem: selectedItems[0] ?? null,\n selectedItems,\n defaultSelectedKey: props.defaultSelectedKey ?? (props.selectionMode === 'single' ? initialValue as Key : null),\n focusStrategy,\n open(focusStrategy: FocusStrategy | null = null) {\n // Don't open if the collection is empty.\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.open();\n }\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.toggle();\n }\n },\n isFocused,\n setFocused\n };\n}\n\nfunction convertValue(value: Key | Key[] | null | undefined) {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {OverlayTriggerProps, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useEffect, useMemo, useRef} from 'react';\n\nexport interface TooltipTriggerProps extends OverlayTriggerProps {\n /**\n * Whether the tooltip should be disabled, independent from the trigger.\n */\n isDisabled?: boolean,\n\n /**\n * The delay time for the tooltip to show up. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Immediate-or-delayed-appearance).\n * @default 1500\n */\n delay?: number,\n\n /**\n * The delay time for the tooltip to close. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Warmup-and-cooldown).\n * @default 500\n */\n closeDelay?: number,\n\n /**\n * By default, opens for both focus and hover. Can be made to open only for focus.\n * @default 'hover'\n */\n trigger?: 'hover' | 'focus',\n\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean\n}\n\nconst TOOLTIP_DELAY = 1500; // this seems to be a 1.5 second delay, check with design\nconst TOOLTIP_COOLDOWN = 500;\n\nexport interface TooltipTriggerState {\n /** Whether the tooltip is currently showing. */\n isOpen: boolean,\n /**\n * Shows the tooltip. By default, the tooltip becomes visible after a delay\n * depending on a global warmup timer. The `immediate` option shows the\n * tooltip immediately instead.\n */\n open(immediate?: boolean): void,\n /** Hides the tooltip. */\n close(immediate?: boolean): void\n}\n\nlet tooltips = {};\nlet tooltipId = 0;\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Manages state for a tooltip trigger. Tracks whether the tooltip is open, and provides\n * methods to toggle this state. Ensures only one tooltip is open at a time and controls\n * the delay for showing a tooltip.\n */\nexport function useTooltipTriggerState(props: TooltipTriggerProps = {}): TooltipTriggerState {\n let {delay = TOOLTIP_DELAY, closeDelay = TOOLTIP_COOLDOWN} = props;\n let {isOpen, open, close} = useOverlayTriggerState(props);\n let id = useMemo(() => `${++tooltipId}`, []);\n let closeTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n let closeCallback = useRef<() => void>(close);\n\n let ensureTooltipEntry = () => {\n tooltips[id] = hideTooltip;\n };\n\n let closeOpenTooltips = () => {\n for (let hideTooltipId in tooltips) {\n if (hideTooltipId !== id) {\n tooltips[hideTooltipId](true);\n delete tooltips[hideTooltipId];\n }\n }\n };\n\n let showTooltip = () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeOpenTooltips();\n ensureTooltipEntry();\n globalWarmedUp = true;\n open();\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n let hideTooltip = (immediate?: boolean) => {\n if (immediate || closeDelay <= 0) {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeCallback.current();\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = null;\n closeCallback.current();\n }, closeDelay);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[id];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, Math.max(TOOLTIP_COOLDOWN, closeDelay));\n }\n };\n\n let warmupTooltip = () => {\n closeOpenTooltips();\n ensureTooltipEntry();\n if (!isOpen && !globalWarmedUp) {\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n }\n\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n useEffect(() => {\n closeCallback.current = close;\n }, [close]);\n\n\n useEffect(() => {\n return () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n let tooltip = tooltips[id];\n if (tooltip) {\n delete tooltips[id];\n }\n };\n }, [id]);\n\n return {\n isOpen,\n open: (immediate) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n },\n close: hideTooltip\n };\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n cloneElement,\n type ComponentPropsWithRef,\n type DOMAttributes,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useTooltip, useTooltipTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n content: ReactNode;\n /** Preferred position. May flip to the opposite side if it would overflow. */\n position?: TooltipPosition;\n /** Open-delay in milliseconds (react-aria's warmup). Defaults to 200. */\n delay?: number;\n /** Pixel gap between trigger and tooltip. Defaults to 8. */\n offset?: number;\n /** Suppress the tooltip entirely without removing the trigger from the tree. */\n disabled?: boolean;\n /** Stable id for the tooltip DOM node — useful for aria-describedby tests. */\n id?: string;\n children: ReactElement;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n /** The actual side the tooltip ended up on after any flip. */\n position: TooltipPosition;\n}\n\nconst FLIP: Record<TooltipPosition, TooltipPosition> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction placeOn(\n rect: DOMRect,\n tipRect: DOMRect,\n position: TooltipPosition,\n offset: number,\n): { top: number; left: number } {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (position) {\n case \"top\":\n return {\n top: rect.top - tipRect.height - offset,\n left: cx - tipRect.width / 2,\n };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - tipRect.width / 2 };\n case \"left\":\n return {\n top: cy - tipRect.height / 2,\n left: rect.left - tipRect.width - offset,\n };\n case \"right\":\n return { top: cy - tipRect.height / 2, left: rect.right + offset };\n }\n}\n\n/** Resolve the final placement: flip if the preferred side overflows. */\nfunction computePosition(\n rect: DOMRect,\n tipRect: DOMRect,\n position: TooltipPosition,\n offset: number,\n viewport: { width: number; height: number },\n): Coords {\n const tryAt = (p: TooltipPosition) => {\n const c = placeOn(rect, tipRect, p, offset);\n const fits =\n c.top >= 0 &&\n c.left >= 0 &&\n c.top + tipRect.height <= viewport.height &&\n c.left + tipRect.width <= viewport.width;\n return { ...c, position: p, fits };\n };\n\n const preferred = tryAt(position);\n if (preferred.fits) return preferred;\n const flipped = tryAt(FLIP[position]);\n if (flipped.fits) return flipped;\n\n // Neither fits cleanly — fall back to the preferred side but clamp into\n // the viewport so the arrow target is still close to the trigger.\n const fallback = preferred;\n const clampedLeft = Math.max(\n 4,\n Math.min(fallback.left, viewport.width - tipRect.width - 4),\n );\n const clampedTop = Math.max(\n 4,\n Math.min(fallback.top, viewport.height - tipRect.height - 4),\n );\n return { top: clampedTop, left: clampedLeft, position: fallback.position };\n}\n\n// Framer-motion's `initial` / `animate` accept rich variant types we\n// don't need to spell out — plain objects with `opacity` + `x`/`y` are\n// the documented shorthand and avoid pulling in the library's union.\ntype MotionFrame = Record<string, number | string>;\nconst animVariants: Record<\n TooltipPosition,\n { initial: MotionFrame; animate: MotionFrame }\n> = {\n top: { initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 } },\n bottom: { initial: { opacity: 0, y: -4 }, animate: { opacity: 1, y: 0 } },\n left: { initial: { opacity: 0, x: 4 }, animate: { opacity: 1, x: 0 } },\n right: { initial: { opacity: 0, x: -4 }, animate: { opacity: 1, x: 0 } },\n};\n\ninterface ContentProps {\n state: ReturnType<typeof useTooltipTriggerState>;\n content: ReactNode;\n position: TooltipPosition;\n triggerRef: RefObject<HTMLElement | null>;\n className?: string;\n offset: number;\n tooltipId: string;\n}\n\nfunction TooltipContent({\n state,\n content,\n position,\n triggerRef,\n className,\n offset,\n tooltipId,\n}: ContentProps) {\n const { tooltipProps } = useTooltip({ isOpen: state.isOpen }, state);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !tipRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const tipRect = tipRef.current.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight,\n };\n setCoords(computePosition(trigRect, tipRect, position, offset, viewport));\n }, [triggerRef, position, offset]);\n\n // The first measure happens before the tip has rendered its content, so\n // its rect is empty. Measure again on the next frame for accurate placement.\n useLayoutEffect(() => {\n if (!state.isOpen) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [state.isOpen, reposition]);\n\n useEffect(() => {\n if (!state.isOpen) return;\n const handler = () => reposition();\n window.addEventListener(\"scroll\", handler, true);\n window.addEventListener(\"resize\", handler);\n return () => {\n window.removeEventListener(\"scroll\", handler, true);\n window.removeEventListener(\"resize\", handler);\n };\n }, [state.isOpen, reposition]);\n\n const resolvedPos = coords?.position ?? position;\n const variants = animVariants[resolvedPos];\n\n // react-aria's tooltip props include onMouseEnter/onMouseLeave for the\n // tooltip itself plus drag-related handlers that conflict with framer-\n // motion's prop signatures. Strip the ones framer-motion claims so the\n // intersection is type-clean.\n const {\n onDrag: _onDrag,\n onDragStart: _onDragStart,\n onDragEnd: _onDragEnd,\n onAnimationStart: _onAnimationStart,\n ...safeTipProps\n } = tooltipProps as DOMAttributes<HTMLDivElement> & Record<string, unknown>;\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n <div\n className=\"ods-tooltip__wrapper\"\n style={{\n position: \"fixed\",\n zIndex: 1500,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n <motion.div\n ref={tipRef}\n {...safeTipProps}\n id={tooltipId}\n role=\"tooltip\"\n data-position={resolvedPos}\n className={cn(\"ods-tooltip\", className)}\n initial={variants.initial}\n animate={variants.animate}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {content}\n <span className=\"ods-tooltip__arrow\" aria-hidden=\"true\" />\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(portalContent, document.body);\n}\n\n/** Compose two refs into one — preserves the child's existing ref. */\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): (node: T | null) => void {\n return (node) => {\n for (const r of refs) {\n if (!r) continue;\n if (typeof r === \"function\") r(node);\n else (r as { current: T | null }).current = node;\n }\n };\n}\n\n/** Compose a child handler with one from react-aria — both fire, child first. */\nfunction mergeHandler<E extends React.SyntheticEvent>(\n childHandler: ((e: E) => void) | undefined,\n ariaHandler: ((e: E) => void) | undefined,\n): ((e: E) => void) | undefined {\n if (!childHandler && !ariaHandler) return undefined;\n return (e: E) => {\n childHandler?.(e);\n if (!e.defaultPrevented) ariaHandler?.(e);\n };\n}\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n offset = 8,\n disabled = false,\n id: providedId,\n children,\n className,\n}: TooltipProps) {\n const reactId = useId();\n const tooltipId = providedId ?? `ods-tooltip-${reactId}`;\n const triggerRef = useRef<HTMLElement>(null);\n const state = useTooltipTriggerState({ delay });\n const { triggerProps } = useTooltipTrigger(\n { delay, isDisabled: disabled },\n state,\n triggerRef,\n );\n\n if (!isValidElement(children)) {\n // Bail out gracefully — without a valid element child there's nothing\n // to clone props onto. Render the children as-is so we don't crash\n // consumer trees that pass a string by mistake.\n return <>{children}</>;\n }\n\n // Pull the existing ref + handlers off the child so we can compose them\n // with react-aria's. Without this merge the child loses its ref\n // (e.g. ref forwarding in a wrapped Button) and any user-supplied\n // onMouseEnter / onFocus etc. is silently overwritten.\n const childProps = children.props as ComponentPropsWithRef<\"button\"> &\n Record<string, unknown>;\n // React 19: `ref` is a regular prop on the child's props. We still\n // fall back to the legacy `element.ref` to support intermediates that\n // re-emit the older shape.\n const childRef =\n (childProps as { ref?: Ref<HTMLElement> }).ref ??\n (children as unknown as { ref?: Ref<HTMLElement> }).ref;\n\n // Merge every handler prop from react-aria with whatever the child\n // already had, so a child that passes its own onFocus/onMouseEnter\n // doesn't lose them when we attach the trigger props.\n const merged: Record<string, unknown> = { ...childProps };\n for (const [key, value] of Object.entries(\n triggerProps as Record<string, unknown>,\n )) {\n if (key.startsWith(\"on\") && typeof value === \"function\") {\n merged[key] = mergeHandler(\n childProps[key] as never,\n value as never,\n );\n } else {\n merged[key] = value;\n }\n }\n merged.ref = mergeRefs<HTMLElement>(triggerRef, childRef);\n merged[\"aria-describedby\"] =\n [childProps[\"aria-describedby\"], tooltipId].filter(Boolean).join(\" \");\n\n return (\n <>\n {cloneElement(children, merged)}\n {!disabled && (\n <TooltipContent\n state={state}\n content={content}\n position={position}\n triggerRef={triggerRef}\n offset={offset}\n className={className}\n tooltipId={tooltipId}\n />\n )}\n </>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n forwardRef,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { CopyIcon, CutIcon } from \"@octaviaflow/icons\";\nimport {\n type TextareaCommand,\n useTextareaCommands,\n} from \"../../hooks/useTextareaCommands\";\nimport { useTextareaSelection } from \"../../hooks/useTextareaSelection\";\nimport {\n type TextareaTool,\n useTextareaTools,\n} from \"../../hooks/useTextareaTools\";\nimport { resolveAccessibleName } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type TextareaSize = \"sm\" | \"md\" | \"lg\";\n\n/** User-resize handle direction. Mirrors the native CSS `resize`\n * property. Pass `false` (legacy) and we map it to `\"none\"`. */\nexport type TextareaResize =\n | \"vertical\"\n | \"horizontal\"\n | \"both\"\n | \"none\"\n | boolean;\n\ntype TextareaPropsBase = Omit<\n ComponentPropsWithoutRef<\"textarea\">,\n \"size\" | \"prefix\"\n>;\n\nexport interface TextareaProps extends TextareaPropsBase {\n /** Visible label — accepts rich content. */\n label?: ReactNode;\n /** Boolean error flag — pairs with `errorMessage`. (Back-compat with v1.) */\n error?: boolean;\n /** Error message. When set with `error={true}` renders below the input\n * with `role=\"alert\"` and tints the border. */\n errorMessage?: ReactNode;\n /** Helper text rendered below the field when no error is set. */\n helperText?: ReactNode;\n /** User-drag resize handle direction. Default `\"vertical\"`.\n *\n * - `\"vertical\"` — only the bottom edge is draggable (most common).\n * - `\"horizontal\"` — only the right edge.\n * - `\"both\"` — corner handle, both axes.\n * - `\"none\"` — no user resize (auto-grow still works if enabled).\n * - Legacy `boolean` — `true` ≡ `\"vertical\"`, `false` ≡ `\"none\"`.\n */\n resize?: TextareaResize;\n /** Auto-grow the textarea as the user types, capped at `maxRows`.\n * Default `false`. When enabled the user-drag `resize` handle is\n * typically set to `\"none\"` so the two systems don't fight. */\n autoResize?: boolean;\n /** Minimum visible rows (only when `autoResize` is on). Default `rows`. */\n minRows?: number;\n /** Maximum visible rows before the textarea scrolls (only when\n * `autoResize` is on). Default `Infinity`. */\n maxRows?: number;\n /** Hard pixel ceiling on the textarea's height — applied as inline\n * `max-height`. Pair with `autoResize` to cap the auto-grow OR use\n * alone to limit how tall the user can drag the resize handle. */\n maxHeight?: number | string;\n /** Hard pixel ceiling on the textarea's width — applied as inline\n * `max-width`. Useful when `resize=\"horizontal\"` or `\"both\"`. */\n maxWidth?: number | string;\n /** Minimum pixel floor for the textarea's height. */\n minHeight?: number | string;\n /** Minimum pixel floor for the textarea's width. */\n minWidth?: number | string;\n maxLength?: number;\n size?: TextareaSize;\n rows?: number;\n\n /* ─── Inline command palette + selection toolbar ─────────────────\n *\n * These two opt-in sections live below / above the textarea while\n * the user is editing, giving the field a \"rich editor\" feel without\n * pulling in a contenteditable + range library:\n *\n * - `commands` → typing the trigger (default `/`) opens an\n * inline popover with the supplied commands. Arrow keys + Enter\n * commit. Each command's `insert` is appended at the caret with\n * the trigger + query removed automatically.\n *\n * - `selectionToolbar` → selecting text reveals a floating\n * toolbar with Copy / Cut / wrap buttons; consumers can extend\n * with custom actions.\n *\n * Both are powered by the `useTextareaCommands` and\n * `useTextareaSelection` hooks, which are also exported standalone\n * for consumers who want to roll their own UI.\n */\n commands?: TextareaCommand[];\n /** Trigger character for the command palette. Default `\"/\"`. */\n commandTrigger?: string;\n /** Show a floating Copy / Cut toolbar over a non-empty selection.\n * Default `false`. */\n selectionToolbar?: boolean;\n /** Custom actions appended to the selection toolbar's built-in\n * Copy / Cut. Each action receives the live selected text and the\n * selection helpers from `useTextareaSelection`. */\n selectionActions?: TextareaSelectionAction[];\n /** Always-visible toolbar of tools that act on the textarea content.\n * Compose from the `textareaTools` factory (bold, italic, code,\n * heading, link, undo, …) and / or pass custom `TextareaTool`\n * objects. The toolbar uses `useTextareaTools` under the hood —\n * consumers can also call the hook directly to roll their own UI. */\n tools?: TextareaTool[];\n /** Where the tools toolbar sits relative to the field. Default\n * `\"top\"`. */\n toolbarPosition?: \"top\" | \"bottom\";\n}\n\n/* ---------------------------------------------------------------------------\n * Selection toolbar action\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaSelectionAction {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n /** Called when the user clicks the action. Receives the live\n * selection text and the helpers from `useTextareaSelection`. */\n onAction: (\n selection: string,\n helpers: {\n replace: (s: string) => void;\n wrap: (open: string, close?: string) => void;\n copy: () => Promise<boolean>;\n cut: () => Promise<boolean>;\n },\n ) => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea(\n {\n label,\n error = false,\n errorMessage,\n helperText,\n resize = \"vertical\",\n autoResize = false,\n minRows,\n maxRows,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n maxLength,\n size = \"md\",\n rows = 3,\n disabled = false,\n className,\n style: consumerStyle,\n defaultValue,\n value,\n onChange,\n id: providedId,\n commands,\n commandTrigger = \"/\",\n selectionToolbar = false,\n selectionActions,\n tools,\n toolbarPosition = \"top\",\n ...props\n },\n forwardedRef,\n ) {\n const innerRef = useRef<HTMLTextAreaElement>(null);\n // Compose forwarded + internal ref.\n const setRef = (node: HTMLTextAreaElement | null) => {\n (innerRef as { current: HTMLTextAreaElement | null }).current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as { current: HTMLTextAreaElement | null }).current = node;\n };\n\n const reactId = useId();\n const baseId = providedId ?? `ods-textarea-${reactId}`;\n const hintId =\n (error && errorMessage) || helperText ? `${baseId}-hint` : undefined;\n const [charCount, setCharCount] = useState(\n () => String(value ?? defaultValue ?? \"\").length,\n );\n\n const ariaNameProps = resolveAccessibleName({\n label: typeof label === \"string\" ? label : undefined,\n ariaLabel: props[\"aria-label\"],\n ariaLabelledby: (props as Record<string, unknown>)[\n \"aria-labelledby\"\n ] as string | undefined,\n componentName: \"Textarea\",\n });\n\n const { labelProps, inputProps } = useTextField(\n {\n label: typeof label === \"string\" ? label : undefined,\n ...ariaNameProps,\n isDisabled: disabled,\n errorMessage:\n typeof errorMessage === \"string\" ? errorMessage : undefined,\n validationState: error ? \"invalid\" : undefined,\n inputElementType: \"textarea\",\n value: value as string | undefined,\n defaultValue: defaultValue as string | undefined,\n },\n innerRef,\n );\n\n const describedBy =\n [\n (props as Record<string, unknown>)[\"aria-describedby\"] as\n | string\n | undefined,\n hintId,\n ]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n /* ── Inline command palette ───────────────────────────────────── */\n // The hooks need a `(value, onChange(string))` pair. Controlled\n // textareas already have a `value` prop; uncontrolled ones don't.\n // We mirror the current DOM value via `liveValue` so the hooks see\n // the same string regardless of which mode the consumer chose.\n const [liveValue, setLiveValue] = useState<string>(\n String(value ?? defaultValue ?? \"\"),\n );\n useEffect(() => {\n // Keep liveValue in sync with the controlled prop when present.\n if (value != null) setLiveValue(String(value));\n }, [value]);\n const handleChangeWithMirror = (\n e: React.ChangeEvent<HTMLTextAreaElement>,\n ) => {\n setLiveValue(e.target.value);\n handleChange(e);\n };\n const setLiveAndCommit = (next: string) => {\n setLiveValue(next);\n // Synthesize an event-like change so the consumer's `onChange`\n // receives the updated value via the same path.\n if (innerRef.current) innerRef.current.value = next;\n onChange?.({\n target: innerRef.current as HTMLTextAreaElement,\n currentTarget: innerRef.current as HTMLTextAreaElement,\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n setCharCount(next.length);\n };\n\n const cmdPalette = useTextareaCommands({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n commands: commands ?? [],\n trigger: commandTrigger,\n });\n const cmdEnabled = (commands?.length ?? 0) > 0;\n\n const sel = useTextareaSelection({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n });\n\n // Always-visible toolbar — driven by the `useTextareaTools` hook.\n // Stays empty when no `tools` array is provided so the toolbar\n // section never renders.\n const toolbar = useTextareaTools({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n tools: tools ?? [],\n });\n const toolbarEnabled = (tools?.length ?? 0) > 0;\n\n const handleKeyDownWithCommands = (\n e: React.KeyboardEvent<HTMLTextAreaElement>,\n ) => {\n if (cmdEnabled) {\n const consumed = cmdPalette.onKeyDown(e);\n if (consumed) return;\n }\n (props as { onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement> })\n .onKeyDown?.(e);\n };\n\n // ── Auto-grow textarea (height) ───────────────────────────────────\n //\n // Mirrors the line-height-aware sizing we use in PromptInput. We\n // detect three line-height forms (`\"normal\"`, unitless like `\"1.5\"`,\n // or px like `\"24px\"`) so a unitless multiplier doesn't end up\n // being treated as 1.5 PIXELS — a real bug we hit in v1.\n //\n // Effective max comes from `maxHeight` (explicit px ceiling) OR the\n // computed line-height × `maxRows` cap, whichever is smaller. When\n // neither is set, the textarea grows freely (no cap).\n useEffect(() => {\n if (!autoResize) return;\n const el = innerRef.current;\n if (!el) return;\n const computed = window.getComputedStyle(el);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const lhRaw = computed.lineHeight;\n const lh =\n lhRaw === \"normal\"\n ? fontSize * 1.2\n : lhRaw.endsWith(\"px\")\n ? parseFloat(lhRaw)\n : parseFloat(lhRaw) * fontSize;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n\n const rowCap =\n maxRows != null && Number.isFinite(maxRows)\n ? lh * maxRows + padding\n : Number.POSITIVE_INFINITY;\n const pixelCap =\n typeof maxHeight === \"number\"\n ? maxHeight\n : Number.POSITIVE_INFINITY;\n const effectiveMax = Math.min(rowCap, pixelCap);\n\n const rowFloor = lh * (minRows ?? rows) + padding;\n\n // Reset to natural height then clamp.\n el.style.height = \"auto\";\n const target = Math.max(\n rowFloor,\n Math.min(effectiveMax, el.scrollHeight),\n );\n el.style.height = `${target}px`;\n el.style.overflowY = el.scrollHeight > effectiveMax ? \"auto\" : \"hidden\";\n }, [autoResize, value, defaultValue, minRows, maxRows, maxHeight, rows]);\n\n const resolvedResize: \"vertical\" | \"horizontal\" | \"both\" | \"none\" =\n typeof resize === \"boolean\"\n ? resize\n ? \"vertical\"\n : \"none\"\n : resize;\n\n const toCss = (v: number | string | undefined): string | undefined =>\n v == null ? undefined : typeof v === \"number\" ? `${v}px` : v;\n\n // Apply the constraint CSS inline so it survives consumer overrides\n // and works regardless of class-bundling order. `resize` becomes a\n // CSS variable consumed by the field rule so the class can read it.\n const fieldStyle: CSSProperties = {\n maxHeight: toCss(maxHeight),\n maxWidth: toCss(maxWidth),\n minHeight: toCss(minHeight),\n minWidth: toCss(minWidth),\n resize: resolvedResize,\n };\n\n return (\n <div\n className={cn(\n \"ods-textarea\",\n `ods-textarea--${size}`,\n `ods-textarea--resize-${resolvedResize}`,\n autoResize && \"ods-textarea--auto-resize\",\n error && \"ods-textarea--error\",\n disabled && \"ods-textarea--disabled\",\n className,\n )}\n style={consumerStyle}\n >\n {label && (\n <label\n {...labelProps}\n htmlFor={baseId}\n className=\"ods-textarea__label\"\n >\n {label}\n </label>\n )}\n {toolbarEnabled && toolbarPosition === \"top\" && (\n <TextareaToolbar\n tools={toolbar.tools}\n onRun={toolbar.runTool}\n />\n )}\n <div className=\"ods-textarea__wrapper\">\n <textarea\n {...(props as ComponentPropsWithoutRef<\"textarea\">)}\n {...inputProps}\n ref={setRef}\n id={baseId}\n rows={autoResize ? (minRows ?? rows) : rows}\n disabled={disabled}\n maxLength={maxLength}\n defaultValue={defaultValue}\n value={value}\n onChange={handleChangeWithMirror}\n onKeyDown={handleKeyDownWithCommands}\n className=\"ods-textarea__field\"\n style={fieldStyle}\n aria-invalid={error || undefined}\n aria-describedby={describedBy}\n // When the command palette is open, expose it as the\n // companion combobox so AT users hear the active option.\n aria-autocomplete={cmdEnabled ? \"list\" : undefined}\n aria-expanded={cmdEnabled ? cmdPalette.isOpen : undefined}\n aria-controls={\n cmdEnabled && cmdPalette.isOpen\n ? `${baseId}-cmd-list`\n : undefined\n }\n aria-activedescendant={\n cmdEnabled && cmdPalette.isOpen && cmdPalette.items[\n cmdPalette.activeIndex\n ]\n ? `${baseId}-cmd-${cmdPalette.items[cmdPalette.activeIndex].id}`\n : undefined\n }\n />\n\n {/* ── Inline command palette ─────────────────────────── */}\n {cmdEnabled && cmdPalette.isOpen && cmdPalette.items.length > 0 &&\n typeof document !== \"undefined\" &&\n createPortal(\n <ul\n id={`${baseId}-cmd-list`}\n role=\"listbox\"\n aria-label=\"Inline commands\"\n className=\"ods-textarea__cmd-popover\"\n style={{\n position: \"fixed\",\n top: (cmdPalette.caretRect?.bottom ?? 0) + 6,\n left: cmdPalette.caretRect?.left ?? 0,\n }}\n >\n {cmdPalette.items.map((c, i) => (\n <li\n key={c.id}\n id={`${baseId}-cmd-${c.id}`}\n role=\"option\"\n aria-selected={i === cmdPalette.activeIndex}\n className={cn(\n \"ods-textarea__cmd-item\",\n i === cmdPalette.activeIndex &&\n \"ods-textarea__cmd-item--active\",\n )}\n onMouseDown={(e) => {\n // mousedown + preventDefault so the textarea\n // doesn't lose focus before commit fires.\n e.preventDefault();\n cmdPalette.commit(c);\n }}\n onMouseEnter={() => {\n // No public hover-state setter — close + reopen\n // pattern would be heavy. Skipping hover-to-\n // highlight for now; ArrowUp/Down nav covers it.\n }}\n >\n {c.icon && (\n <span className=\"ods-textarea__cmd-icon\">{c.icon}</span>\n )}\n <span className=\"ods-textarea__cmd-text\">\n <span className=\"ods-textarea__cmd-label\">\n {c.label}\n </span>\n {c.description && (\n <span className=\"ods-textarea__cmd-desc\">\n {c.description}\n </span>\n )}\n </span>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n\n {/* ── Selection toolbar ──────────────────────────────── */}\n {selectionToolbar && sel.active && sel.rect &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n className=\"ods-textarea__sel-toolbar\"\n style={{\n position: \"fixed\",\n top: sel.rect.top - 36,\n left: sel.rect.left,\n }}\n // mousedown + preventDefault keeps the textarea\n // selection alive while the user clicks a button.\n onMouseDown={(e) => e.preventDefault()}\n >\n <button\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() => sel.copy()}\n aria-label=\"Copy selection\"\n title=\"Copy\"\n >\n <CopyIcon size=\"xs\" />\n </button>\n <button\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() => sel.cut()}\n aria-label=\"Cut selection\"\n title=\"Cut\"\n >\n <CutIcon size=\"xs\" />\n </button>\n {selectionActions?.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() =>\n a.onAction(sel.text, {\n replace: sel.replace,\n wrap: sel.wrap,\n copy: sel.copy,\n cut: sel.cut,\n })\n }\n title={typeof a.label === \"string\" ? a.label : undefined}\n >\n {a.icon}\n {a.label && (\n <span className=\"ods-textarea__sel-btn-label\">\n {a.label}\n </span>\n )}\n </button>\n ))}\n </div>,\n document.body,\n )}\n {maxLength != null && (\n <span\n className=\"ods-textarea__count\"\n aria-live={charCount > maxLength ? \"polite\" : \"off\"}\n >\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n {toolbarEnabled && toolbarPosition === \"bottom\" && (\n <TextareaToolbar\n tools={toolbar.tools}\n onRun={toolbar.runTool}\n />\n )}\n {error && errorMessage ? (\n <div\n id={hintId}\n className=\"ods-textarea__error-message\"\n role=\"alert\"\n >\n {errorMessage}\n </div>\n ) : helperText ? (\n <div id={hintId} className=\"ods-textarea__hint\">\n {helperText}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\n/* ---------------------------------------------------------------------------\n * Internal — toolbar renderer\n *\n * Stays internal because consumers who want a custom UI should call\n * `useTextareaTools` directly. The toolbar's only job here is to map\n * the resolved tools array to clickable buttons / dividers using the\n * same chrome as the rest of the textarea section.\n * ------------------------------------------------------------------------- */\nfunction TextareaToolbar({\n tools,\n onRun,\n}: {\n tools: TextareaTool[];\n onRun: (id: string) => void | Promise<void>;\n}) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Formatting\"\n className=\"ods-textarea__toolbar\"\n // mousedown + preventDefault keeps the textarea's selection /\n // caret alive while a button is clicked.\n onMouseDown={(e) => {\n if (\n (e.target as HTMLElement).closest(\".ods-textarea__toolbar-btn\")\n ) {\n e.preventDefault();\n }\n }}\n >\n {tools.map((t) => {\n if (t.kind === \"divider\") {\n return (\n <span\n key={t.id}\n className=\"ods-textarea__toolbar-divider\"\n aria-hidden=\"true\"\n />\n );\n }\n return (\n <button\n key={t.id}\n type=\"button\"\n className=\"ods-textarea__toolbar-btn\"\n title={t.title ?? (typeof t.label === \"string\" ? t.label : undefined)}\n aria-label={typeof t.label === \"string\" ? t.label : t.id}\n onClick={() => onRun(t.id)}\n >\n {t.icon ? (\n <span className=\"ods-textarea__toolbar-icon\">{t.icon}</span>\n ) : (\n <span className=\"ods-textarea__toolbar-text\">{t.label}</span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\nimport type { RefObject } from \"react\";\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaCommands — inline `/command` palette for a textarea.\n *\n * const cmd = useTextareaCommands({\n * textareaRef,\n * value,\n * onChange,\n * commands: [\n * { id: \"today\", label: \"Today\", insert: () => new Date().toDateString() },\n * { id: \"summary\", label: \"AI Summary\", insert: \"{{ai.summary}}\" },\n * ],\n * trigger: \"/\", // default\n * openOnEmptyTrigger: true,\n * });\n *\n * <Textarea ... commands={cmd.props} /> // or wire manually\n *\n * The hook owns: trigger detection, filtering, keyboard nav, caret-aware\n * insertion. The consumer / Textarea owns rendering the popover.\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaCommand {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Text to insert at the caret. Can be a string OR a function that\n * receives the live query and returns the string — useful for\n * commands that consume the typed query (e.g. `/mention bob` →\n * `@bob`). */\n insert: string | ((query: string) => string);\n /** Extra keywords to match against the typed query in addition to\n * the rendered `label` (when label is a string) and `description`. */\n keywords?: string[];\n}\n\nexport interface UseTextareaCommandsOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n /** Controlled value — pass the same string you pass to the textarea. */\n value: string;\n /** Setter — receives the new full value after insertion. */\n onChange: (next: string) => void;\n commands: TextareaCommand[];\n /** Trigger character. Default `\"/\"`. */\n trigger?: string;\n /** Open the palette as soon as the trigger is typed (even with no\n * query). Default `true`. Set `false` if you want consumers to type\n * at least one character to open. */\n openOnEmptyTrigger?: boolean;\n /** Maximum visible items in the filtered result list. Default 8. */\n maxItems?: number;\n}\n\nexport interface UseTextareaCommandsReturn {\n /** Whether the palette is currently open. */\n isOpen: boolean;\n /** Query typed after the trigger (without the trigger character). */\n query: string;\n /** Highlighted item index (0-based). */\n activeIndex: number;\n /** Filtered + capped list of matching commands. */\n items: TextareaCommand[];\n\n /** Keydown handler — wire to the textarea's `onKeyDown`. Returns\n * `true` if the key was consumed (so the consumer can stop). */\n onKeyDown: (e: ReactKeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** Force-close the palette (e.g. on textarea blur). */\n dismiss: () => void;\n /** Commit the supplied command — inserts its text at the trigger\n * position and consumes the trigger + query. */\n commit: (cmd: TextareaCommand) => void;\n\n /** Pixel position of the caret at the moment the palette opened.\n * Use to anchor the popover in your own UI. */\n caretRect: DOMRect | null;\n}\n\n/* ---------------------------------------------------------------------------\n * Helpers\n * ------------------------------------------------------------------------- */\n\n/** Find the nearest trigger character behind the caret (within the\n * current line) and return the index + query string. Returns `null`\n * when no open trigger is in scope (e.g. there's whitespace between\n * the trigger and the caret, or the caret is mid-word that doesn't\n * start with the trigger). */\nfunction findOpenTrigger(\n value: string,\n caret: number,\n trigger: string,\n): { triggerIndex: number; query: string } | null {\n // Walk backwards from the caret looking for the trigger char OR a\n // whitespace boundary. Whitespace closes the trigger window.\n let i = caret - 1;\n while (i >= 0) {\n const ch = value[i];\n if (ch === \"\\n\" || ch === \" \" || ch === \"\\t\") return null;\n if (value.startsWith(trigger, i)) {\n // Trigger must be at the start of input OR preceded by whitespace\n // / newline. Stops \"https://\" from opening a command palette.\n const before = i === 0 ? \"\" : value[i - 1];\n if (\n i === 0 ||\n before === \" \" ||\n before === \"\\n\" ||\n before === \"\\t\"\n ) {\n return {\n triggerIndex: i,\n query: value.slice(i + trigger.length, caret),\n };\n }\n return null;\n }\n i--;\n }\n return null;\n}\n\n/** Approximate caret-pixel-rect for a textarea using a mirror div.\n * Browsers don't expose the caret position natively for textareas. */\nfunction getCaretRect(\n textarea: HTMLTextAreaElement,\n caret: number,\n): DOMRect | null {\n if (typeof document === \"undefined\") return null;\n const mirror = document.createElement(\"div\");\n const styles = window.getComputedStyle(textarea);\n // Copy the visual properties that affect line-wrapping + glyph metrics.\n for (const prop of [\n \"boxSizing\",\n \"width\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"fontStyle\",\n \"letterSpacing\",\n \"lineHeight\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"textTransform\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n ] as const) {\n (mirror.style as unknown as Record<string, string>)[prop] = styles[prop];\n }\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.overflow = \"hidden\";\n mirror.style.top = \"0\";\n mirror.style.left = \"0\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.wordWrap = \"break-word\";\n mirror.textContent = textarea.value.slice(0, caret);\n const marker = document.createElement(\"span\");\n marker.textContent = \"\"; // zero-width space → measurable\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n\n const taRect = textarea.getBoundingClientRect();\n const markerRect = marker.getBoundingClientRect();\n const mirrorRect = mirror.getBoundingClientRect();\n const x = taRect.left + (markerRect.left - mirrorRect.left) -\n textarea.scrollLeft;\n const y = taRect.top + (markerRect.top - mirrorRect.top) -\n textarea.scrollTop;\n const out = new DOMRect(x, y, 0, markerRect.height || 16);\n document.body.removeChild(mirror);\n return out;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaCommands({\n textareaRef,\n value,\n onChange,\n commands,\n trigger = \"/\",\n openOnEmptyTrigger = true,\n maxItems = 8,\n}: UseTextareaCommandsOptions): UseTextareaCommandsReturn {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const [triggerIndex, setTriggerIndex] = useState<number | null>(null);\n const [caretRect, setCaretRect] = useState<DOMRect | null>(null);\n // Tracks the (value, caret) snapshot at the moment the user dismissed\n // the palette. The trigger-detect effect skips re-opening when the\n // current state still matches — without this guard, Escape would\n // dismiss but the very next effect run would re-open the palette\n // because the trigger char is still in scope.\n const dismissedAtRef = useRef<{ value: string; caret: number } | null>(\n null,\n );\n\n /* ── Filter the command list against the current query ── */\n const items = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return commands.slice(0, maxItems);\n return commands\n .filter((c) => {\n const hay = [\n typeof c.label === \"string\" ? c.label : \"\",\n typeof c.description === \"string\" ? c.description : \"\",\n c.id,\n ...(c.keywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return hay.includes(q);\n })\n .slice(0, maxItems);\n }, [commands, query, maxItems]);\n\n /* ── Re-evaluate the trigger window on every value or caret change ── */\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n const caret = ta.selectionStart ?? 0;\n // If the user dismissed at this exact (value, caret), don't reopen.\n const dismissedAt = dismissedAtRef.current;\n if (\n dismissedAt &&\n dismissedAt.value === value &&\n dismissedAt.caret === caret\n ) {\n return;\n }\n const found = findOpenTrigger(value, caret, trigger);\n if (!found) {\n if (isOpen) setIsOpen(false);\n setTriggerIndex(null);\n return;\n }\n // Clear the dismissed snapshot once the user moves out of it —\n // future trigger events are real, not stale.\n if (dismissedAt) dismissedAtRef.current = null;\n // Open if the trigger is in scope AND either we already have a\n // query OR `openOnEmptyTrigger` allows opening on the bare trigger.\n if (found.query.length > 0 || openOnEmptyTrigger) {\n setQuery(found.query);\n setTriggerIndex(found.triggerIndex);\n setIsOpen(true);\n // Reset highlight when the query changes — keeps it pinned to\n // the top match.\n setActiveIndex(0);\n setCaretRect(getCaretRect(ta, caret));\n }\n }, [value, trigger, openOnEmptyTrigger, isOpen, textareaRef]);\n\n /* ── Commit a chosen command ── */\n const commit = useCallback(\n (cmd: TextareaCommand) => {\n const ta = textareaRef.current;\n if (!ta || triggerIndex == null) return;\n const insertText =\n typeof cmd.insert === \"function\" ? cmd.insert(query) : cmd.insert;\n const caret = ta.selectionStart ?? value.length;\n const before = value.slice(0, triggerIndex);\n const after = value.slice(caret);\n const next = `${before}${insertText}${after}`;\n // Snapshot the post-commit caret position so the trigger-detect\n // effect doesn't immediately reopen against the original\n // (unchanged) value when the consumer's onChange is async or\n // a no-op (e.g. in tests).\n dismissedAtRef.current = {\n value,\n caret,\n };\n onChange(next);\n setIsOpen(false);\n setTriggerIndex(null);\n // Restore caret to the end of the inserted text on the next frame.\n requestAnimationFrame(() => {\n const pos = before.length + insertText.length;\n ta.focus();\n ta.setSelectionRange(pos, pos);\n });\n },\n [textareaRef, triggerIndex, query, value, onChange],\n );\n\n const dismiss = useCallback(() => {\n const ta = textareaRef.current;\n dismissedAtRef.current = {\n value,\n caret: ta?.selectionStart ?? value.length,\n };\n setIsOpen(false);\n setTriggerIndex(null);\n }, [textareaRef, value]);\n\n /* ── Keyboard nav while the palette is open ── */\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!isOpen) return false;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(items.length - 1, i + 1));\n return true;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(0, i - 1));\n return true;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n const pick = items[activeIndex];\n if (pick) {\n e.preventDefault();\n commit(pick);\n return true;\n }\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n dismiss();\n return true;\n }\n return false;\n },\n [isOpen, items, activeIndex, commit, dismiss],\n );\n\n return {\n isOpen,\n query,\n activeIndex,\n items,\n onKeyDown,\n dismiss,\n commit,\n caretRect,\n };\n}\n","\"use client\";\nimport type { RefObject } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaSelection — selection state + clipboard / wrap helpers.\n *\n * const sel = useTextareaSelection({ textareaRef, value, onChange });\n *\n * if (sel.active) {\n * // user has highlighted text — render a floating toolbar\n * sel.copy(); // copies selection to clipboard\n * sel.cut(); // copies + deletes\n * sel.wrap(\"**\",\"**\"); // selection becomes **selection**\n * sel.replace(\"...\"); // replace the selection with a literal string\n * }\n *\n * The hook tracks the selection across `selectionchange` events (more\n * reliable than `select` for shift-arrow nav). Returns a pixel rect for\n * the SELECTION so callers can anchor a floating toolbar above it.\n * ------------------------------------------------------------------------- */\n\nexport interface UseTextareaSelectionOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n /** Current textarea value. */\n value: string;\n /** Setter — called when `cut`/`wrap`/`replace` mutate the text. */\n onChange: (next: string) => void;\n}\n\nexport interface UseTextareaSelectionReturn {\n /** True when there's a non-empty selection in the focused textarea. */\n active: boolean;\n /** Selected text. Empty string when `active` is false. */\n text: string;\n /** Character offsets. */\n start: number;\n end: number;\n /** Approximate pixel rect of the selection — anchor a floating\n * toolbar above this (`top - toolbar.height - 4`). Null when no\n * active selection. */\n rect: DOMRect | null;\n\n /** Copy the current selection to the clipboard. Resolves with `true`\n * on success. */\n copy: () => Promise<boolean>;\n /** Copy + delete (= cut). Resolves `true` on success. */\n cut: () => Promise<boolean>;\n /** Wrap the selection with `open` / `close` strings. Selection\n * expands to include the wrappers. */\n wrap: (open: string, close?: string) => void;\n /** Replace the selection with a literal string. Caret lands at the\n * end of the inserted text. */\n replace: (text: string) => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Helpers — selection-rect via a measured mirror div (same recipe as\n * useTextareaCommands' caret-rect helper, expanded to cover a range).\n * ------------------------------------------------------------------------- */\n\nfunction getSelectionRect(\n textarea: HTMLTextAreaElement,\n start: number,\n end: number,\n): DOMRect | null {\n if (typeof document === \"undefined\") return null;\n if (start === end) return null;\n const mirror = document.createElement(\"div\");\n const styles = window.getComputedStyle(textarea);\n for (const prop of [\n \"boxSizing\",\n \"width\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"fontStyle\",\n \"letterSpacing\",\n \"lineHeight\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"textTransform\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n ] as const) {\n (mirror.style as unknown as Record<string, string>)[prop] = styles[prop];\n }\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.overflow = \"hidden\";\n mirror.style.top = \"0\";\n mirror.style.left = \"0\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.wordWrap = \"break-word\";\n\n const pre = document.createTextNode(textarea.value.slice(0, start));\n const range = document.createElement(\"span\");\n range.textContent = textarea.value.slice(start, end) || \"\";\n const post = document.createTextNode(textarea.value.slice(end));\n\n mirror.appendChild(pre);\n mirror.appendChild(range);\n mirror.appendChild(post);\n document.body.appendChild(mirror);\n\n const taRect = textarea.getBoundingClientRect();\n const rangeRect = range.getBoundingClientRect();\n const mirrorRect = mirror.getBoundingClientRect();\n const out = new DOMRect(\n taRect.left + (rangeRect.left - mirrorRect.left) - textarea.scrollLeft,\n taRect.top + (rangeRect.top - mirrorRect.top) - textarea.scrollTop,\n rangeRect.width,\n rangeRect.height,\n );\n document.body.removeChild(mirror);\n return out;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaSelection({\n textareaRef,\n value,\n onChange,\n}: UseTextareaSelectionOptions): UseTextareaSelectionReturn {\n const [start, setStart] = useState(0);\n const [end, setEnd] = useState(0);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n /* ── Subscribe to selectionchange (fires on caret moves + drags) ── */\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const handler = () => {\n const ta = textareaRef.current;\n if (!ta || document.activeElement !== ta) {\n setStart(0);\n setEnd(0);\n setRect(null);\n return;\n }\n const s = ta.selectionStart ?? 0;\n const e = ta.selectionEnd ?? 0;\n setStart(s);\n setEnd(e);\n setRect(s !== e ? getSelectionRect(ta, s, e) : null);\n };\n document.addEventListener(\"selectionchange\", handler);\n return () => document.removeEventListener(\"selectionchange\", handler);\n }, [textareaRef]);\n\n const active = start !== end;\n const text = active ? value.slice(start, end) : \"\";\n\n const writeToClipboard = useCallback(\n async (str: string): Promise<boolean> => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard?.writeText\n ) {\n await navigator.clipboard.writeText(str);\n return true;\n }\n } catch {\n /* fall through to execCommand fallback */\n }\n // Legacy fallback for permission-denied environments. Uses an\n // off-screen textarea so we don't disturb the user's selection.\n try {\n const tmp = document.createElement(\"textarea\");\n tmp.value = str;\n tmp.style.position = \"fixed\";\n tmp.style.left = \"-9999px\";\n document.body.appendChild(tmp);\n tmp.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(tmp);\n return ok;\n } catch {\n return false;\n }\n },\n [],\n );\n\n const copy = useCallback(async () => {\n if (!active) return false;\n return writeToClipboard(text);\n }, [active, text, writeToClipboard]);\n\n const replace = useCallback(\n (str: string) => {\n const ta = textareaRef.current;\n if (!ta) return;\n const next = value.slice(0, start) + str + value.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n const caret = start + str.length;\n ta.setSelectionRange(caret, caret);\n });\n },\n [textareaRef, value, start, end, onChange],\n );\n\n const cut = useCallback(async () => {\n if (!active) return false;\n const ok = await writeToClipboard(text);\n if (ok) replace(\"\");\n return ok;\n }, [active, text, writeToClipboard, replace]);\n\n const wrap = useCallback(\n (open: string, close?: string) => {\n const ta = textareaRef.current;\n if (!ta) return;\n const closing = close ?? open;\n const before = value.slice(0, start);\n const sel = value.slice(start, end);\n const after = value.slice(end);\n const next = `${before}${open}${sel}${closing}${after}`;\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n // Re-select the wrapped content (including the wrappers) so\n // the user sees the result and can keep working.\n const newStart = start;\n const newEnd = end + open.length + closing.length;\n ta.setSelectionRange(newStart, newEnd);\n });\n },\n [textareaRef, value, start, end, onChange],\n );\n\n return {\n active,\n text,\n start,\n end,\n rect,\n copy,\n cut,\n wrap,\n replace,\n };\n}\n","\"use client\";\nimport {\n CodeIcon,\n HeadingIcon,\n ListBulletedIcon,\n ListNumberedIcon,\n QuotesIcon,\n RedoIcon,\n TextBoldIcon,\n TextItalicIcon,\n TextLinkIcon,\n TextStrikethroughIcon,\n UndoIcon,\n} from \"@octaviaflow/icons\";\nimport type { RefObject } from \"react\";\nimport { type ReactNode, useCallback, useMemo, useRef } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaTools — toolbar tools + always-on editor helpers.\n *\n * The \"third tier\" of the textarea editor section, sitting alongside:\n * - `useTextareaCommands` (inline `/command` palette)\n * - `useTextareaSelection` (selection-only toolbar)\n *\n * Tools are always-visible buttons rendered in a toolbar above/below the\n * textarea (think Markdown editor chrome: B / I / Code / Link / Quote).\n * Each tool receives a `helpers` bundle that exposes the underlying\n * editing primitives (selection, caret, line-aware mutations, undo).\n *\n * Consumers can:\n * - Compose any combination of built-in tools from the\n * `textareaTools` factory\n * - Mix in fully custom tools (`{ id, label, icon, onAction }`)\n * - Drive the hook directly to build their own toolbar UI\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaToolHelpers {\n /** Current full text. */\n value: string;\n /** Current selection / caret state. */\n selection: {\n text: string;\n start: number;\n end: number;\n active: boolean;\n };\n /** Replace the entire textarea content. */\n setValue: (next: string) => void;\n /** Replace the selection with `text` (inserts at caret when no\n * selection is active). Caret lands after the inserted text. */\n replace: (text: string) => void;\n /** Insert `text` at the caret without disturbing the selection's\n * surrounding content. Identical to `replace` when nothing is\n * selected. */\n insert: (text: string) => void;\n /** Wrap the selection with `open` / `close` strings. When no\n * selection is active, drops the markers around an empty span at\n * the caret. Caret ends up between them so the user can type. */\n wrap: (open: string, close?: string) => void;\n /** Prepend `prefix` to the start of every line that overlaps the\n * selection (or just the caret's line when no selection). Useful for\n * list / quote / heading tools. */\n prependLines: (prefix: string) => void;\n /** Programmatic undo / redo via the native execCommand bridge.\n * Falls back silently when the browser doesn't expose it. */\n undo: () => void;\n redo: () => void;\n /** Direct access to the underlying DOM node for cases the abstraction\n * doesn't cover. */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\nexport interface TextareaTool {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n /** Title attribute for the toolbar button. Defaults to the `label`\n * when it's a string. */\n title?: string;\n /** Visual treatment — `\"divider\"` renders a vertical separator\n * instead of a button. Otherwise `\"button\"`. */\n kind?: \"button\" | \"divider\";\n /** Fires when the toolbar button is clicked. Receives a helpers\n * bundle that proxies the editing primitives. Can be async. */\n onAction?: (helpers: TextareaToolHelpers) => void | Promise<void>;\n /** Hide the button when this predicate returns false. Re-evaluated\n * on every value / selection change. Useful for \"only show Link\n * when something is selected\" patterns. */\n isVisible?: (helpers: TextareaToolHelpers) => boolean;\n}\n\nexport interface UseTextareaToolsOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n value: string;\n onChange: (next: string) => void;\n tools: TextareaTool[];\n}\n\nexport interface UseTextareaToolsReturn {\n /** Filtered + ready-to-render tools (visibility predicates applied). */\n tools: TextareaTool[];\n /** Invoke a tool by id. */\n runTool: (id: string) => Promise<void>;\n /** Snapshot helpers — same object passed into `onAction` so consumers\n * can call them outside the toolbar (e.g. from a keyboard shortcut). */\n helpers: TextareaToolHelpers;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaTools({\n textareaRef,\n value,\n onChange,\n tools,\n}: UseTextareaToolsOptions): UseTextareaToolsReturn {\n // Keep latest value in a ref so tool callbacks always see the\n // up-to-date string, even when chained synchronously.\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const helpers = useMemo<TextareaToolHelpers>(() => {\n const getTa = () => textareaRef.current;\n\n const getSelection = () => {\n const ta = getTa();\n const s = ta?.selectionStart ?? 0;\n const e = ta?.selectionEnd ?? 0;\n return {\n text: valueRef.current.slice(s, e),\n start: s,\n end: e,\n active: s !== e,\n };\n };\n\n const setValue = (next: string) => onChange(next);\n\n const replace = (text: string) => {\n const ta = getTa();\n if (!ta) return;\n const { start, end } = getSelection();\n const next =\n valueRef.current.slice(0, start) + text + valueRef.current.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n const caret = start + text.length;\n ta.setSelectionRange(caret, caret);\n });\n };\n\n const insert = (text: string) => replace(text);\n\n const wrap = (open: string, close?: string) => {\n const ta = getTa();\n if (!ta) return;\n const closing = close ?? open;\n const { start, end } = getSelection();\n const sel = valueRef.current.slice(start, end);\n const next =\n valueRef.current.slice(0, start) +\n open +\n sel +\n closing +\n valueRef.current.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n if (start === end) {\n // Empty selection — drop the caret between the wrappers so\n // the user can type the body content right away.\n const caret = start + open.length;\n ta.setSelectionRange(caret, caret);\n } else {\n ta.setSelectionRange(start, end + open.length + closing.length);\n }\n });\n };\n\n const prependLines = (prefix: string) => {\n const ta = getTa();\n if (!ta) return;\n const { start, end } = getSelection();\n // Expand selection to whole lines so prefixes land at line starts.\n const v = valueRef.current;\n const lineStart = v.lastIndexOf(\"\\n\", start - 1) + 1;\n const lineEnd = (() => {\n const idx = v.indexOf(\"\\n\", end);\n return idx === -1 ? v.length : idx;\n })();\n const block = v.slice(lineStart, lineEnd);\n const updated = block\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n const next = v.slice(0, lineStart) + updated + v.slice(lineEnd);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n ta.setSelectionRange(\n lineStart,\n lineStart + updated.length,\n );\n });\n };\n\n const undo = () => {\n try {\n getTa()?.focus();\n document.execCommand(\"undo\");\n } catch {\n /* not all browsers expose undo via execCommand */\n }\n };\n const redo = () => {\n try {\n getTa()?.focus();\n document.execCommand(\"redo\");\n } catch {\n /* same */\n }\n };\n\n return {\n get value() {\n return valueRef.current;\n },\n get selection() {\n return getSelection();\n },\n setValue,\n replace,\n insert,\n wrap,\n prependLines,\n undo,\n redo,\n getTextarea: getTa,\n };\n }, [textareaRef, onChange]);\n\n // Visibility filter — re-evaluated each render so predicates that\n // depend on the current selection update naturally.\n const visibleTools = useMemo(\n () => tools.filter((t) => (t.isVisible ? t.isVisible(helpers) : true)),\n [tools, helpers],\n );\n\n const runTool = useCallback(\n async (id: string) => {\n const tool = tools.find((t) => t.id === id);\n if (!tool || tool.kind === \"divider\") return;\n await tool.onAction?.(helpers);\n },\n [tools, helpers],\n );\n\n return { tools: visibleTools, runTool, helpers };\n}\n\n/* ---------------------------------------------------------------------------\n * `textareaTools` — factory for the built-in Markdown/editor tools.\n *\n * Each factory returns a `TextareaTool`. Consumers compose them freely:\n *\n * tools={[\n * textareaTools.bold(),\n * textareaTools.italic(),\n * textareaTools.divider(),\n * textareaTools.bulletList(),\n * textareaTools.numberedList(),\n * textareaTools.divider(),\n * textareaTools.link(),\n * myCustomTool,\n * ]}\n * ------------------------------------------------------------------------- */\n\nconst wrapTool = (\n id: string,\n open: string,\n close: string,\n label: ReactNode,\n icon: ReactNode,\n title?: string,\n): TextareaTool => ({\n id,\n label,\n icon,\n title,\n onAction: (h) => h.wrap(open, close),\n});\n\nconst prependLineTool = (\n id: string,\n prefix: string,\n label: ReactNode,\n icon: ReactNode,\n title?: string,\n): TextareaTool => ({\n id,\n label,\n icon,\n title,\n onAction: (h) => h.prependLines(prefix),\n});\n\nexport const textareaTools = {\n bold: (): TextareaTool =>\n wrapTool(\"bold\", \"**\", \"**\", \"Bold\", <TextBoldIcon />, \"Bold (⌘B)\"),\n\n italic: (): TextareaTool =>\n wrapTool(\"italic\", \"*\", \"*\", \"Italic\", <TextItalicIcon />, \"Italic (⌘I)\"),\n\n strikethrough: (): TextareaTool =>\n wrapTool(\n \"strike\",\n \"~~\",\n \"~~\",\n \"Strikethrough\",\n <TextStrikethroughIcon />,\n \"Strikethrough\",\n ),\n\n code: (): TextareaTool =>\n wrapTool(\"code\", \"`\", \"`\", \"Code\", <CodeIcon />, \"Inline code\"),\n\n codeBlock: (): TextareaTool => ({\n id: \"code-block\",\n label: \"Code block\",\n icon: <CodeIcon />,\n title: \"Code block\",\n onAction: (h) => h.wrap(\"```\\n\", \"\\n```\"),\n }),\n\n link: (): TextareaTool => ({\n id: \"link\",\n label: \"Link\",\n icon: <TextLinkIcon />,\n title: \"Insert link\",\n onAction: (h) => {\n const sel = h.selection;\n const text = sel.active ? sel.text : \"link text\";\n h.replace(`[${text}](https://)`);\n },\n }),\n\n /** Heading. Defaults to H2. Pass a `level` (1–6) to override. */\n heading: (level: 1 | 2 | 3 | 4 | 5 | 6 = 2): TextareaTool =>\n prependLineTool(\n `heading-${level}`,\n `${\"#\".repeat(level)} `,\n `H${level}`,\n <HeadingIcon />,\n `Heading ${level}`,\n ),\n\n bulletList: (): TextareaTool =>\n prependLineTool(\n \"ul\",\n \"- \",\n \"Bullet list\",\n <ListBulletedIcon />,\n \"Bullet list\",\n ),\n\n numberedList: (): TextareaTool =>\n prependLineTool(\n \"ol\",\n \"1. \",\n \"Numbered list\",\n <ListNumberedIcon />,\n \"Numbered list\",\n ),\n\n quote: (): TextareaTool =>\n prependLineTool(\n \"quote\",\n \"> \",\n \"Quote\",\n <QuotesIcon />,\n \"Quote\",\n ),\n\n undo: (): TextareaTool => ({\n id: \"undo\",\n label: \"Undo\",\n icon: <UndoIcon />,\n title: \"Undo (⌘Z)\",\n onAction: (h) => h.undo(),\n }),\n\n redo: (): TextareaTool => ({\n id: \"redo\",\n label: \"Redo\",\n icon: <RedoIcon />,\n title: \"Redo (⌘⇧Z)\",\n onAction: (h) => h.redo(),\n }),\n\n divider: (id = \"divider\"): TextareaTool => ({\n id: `${id}-${Math.random().toString(36).slice(2, 8)}`,\n label: \"\",\n kind: \"divider\",\n }),\n};\n","import type { ReactNode } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * WorkflowShowcase engine — pure data + logic, no React rendering.\n *\n * Everything the marketing funnel needs to \"think\" lives here so it can be\n * unit-tested without mounting the (heavily animated) component tree:\n * connector recognition, schedule inference, plan resolution, activity-rail\n * script and prompt segmentation for the live-highlight overlay.\n * ------------------------------------------------------------------------- */\n\nexport type WorkflowShowcaseRole = \"source\" | \"destination\" | \"action\" | \"notify\";\n\nexport interface WorkflowShowcaseConnector {\n /** Canonical display name — matched case-insensitively inside the prompt. */\n name: string;\n role: WorkflowShowcaseRole;\n /** Extra strings that also count as a mention of this connector. */\n aliases?: string[];\n /** Optional icon tile. Defaults to a two-letter monogram. */\n icon?: ReactNode;\n}\n\nexport interface WorkflowShowcaseExample {\n id: string;\n /** Chip label, e.g. \"Storefront orders → Warehouse, hourly\". */\n label: string;\n /** Prompt inserted (and auto-built) when the chip is clicked. */\n prompt: string;\n}\n\nexport interface WorkflowShowcaseMetric {\n id: string;\n /** Final value once the pipeline reads as live. */\n value: number;\n /** Interim value while the workflow is still assembling. Omit → \"—\". */\n buildingValue?: number;\n decimals?: number;\n /** Small unit text after the value, e.g. \"rows/min\". */\n unit?: string;\n /** Rendered before the number, e.g. \"−\". */\n prefix?: string;\n /** Rendered flush after the number, e.g. \"%\". */\n suffix?: string;\n /** Mono microcopy under the value, e.g. \"THROUGHPUT\". */\n label: string;\n /** \"success\" tints the final value green (savings, wins). */\n tone?: \"default\" | \"success\";\n}\n\nexport type WorkflowShowcasePhase =\n | \"idle\"\n | \"analyzing\"\n | \"building\"\n | \"done\"\n | \"signup\"\n | \"creating\"\n | \"welcome\";\n\n/** Phases in which the generated workflow reads as complete. */\nexport const SETTLED_PHASES: readonly WorkflowShowcasePhase[] = [\n \"done\",\n \"signup\",\n \"creating\",\n \"welcome\",\n];\n\nexport interface WorkflowShowcasePlan {\n /** Sources, in catalog order. */\n left: WorkflowShowcaseConnector[];\n /** Destination → action → notify, in that order. */\n right: WorkflowShowcaseConnector[];\n /** Every connector in the plan (left + right). */\n all: WorkflowShowcaseConnector[];\n /** Total assemble steps: each source + schema map + each right-side node. */\n totalSteps: number;\n}\n\nexport interface WorkflowShowcaseSignupValues {\n name: string;\n email: string;\n company: string;\n teamSize: string;\n}\n\nexport interface ShowcaseActivityLine {\n id: string;\n text: string;\n tone: \"muted\" | \"faint\" | \"active\" | \"done\" | \"plain\";\n}\n\nexport interface ShowcasePromptSegment {\n text: string;\n /** Set when this segment is a recognized connector mention. */\n connector?: WorkflowShowcaseConnector;\n}\n\n/* ---------------------------------------------------------------------------\n * Defaults — deliberately vendor-neutral. The consuming site passes its real\n * connector catalog; the design system itself stays name-free.\n * ------------------------------------------------------------------------- */\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS: WorkflowShowcaseConnector[] = [\n { name: \"Storefront\", role: \"source\", aliases: [\"store\", \"shop orders\"] },\n { name: \"Payments\", role: \"source\", aliases: [\"payouts\"] },\n { name: \"Orders DB\", role: \"source\", aliases: [\"orders database\"] },\n { name: \"CRM\", role: \"source\", aliases: [\"crm leads\"] },\n { name: \"Warehouse\", role: \"destination\" },\n { name: \"Lakehouse\", role: \"destination\" },\n { name: \"Campaigns\", role: \"action\", aliases: [\"campaign\"] },\n { name: \"Team Chat\", role: \"notify\", aliases: [\"chat\", \"alert the team\"] },\n];\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES: WorkflowShowcaseExample[] = [\n {\n id: \"hourly-sync\",\n label: \"Storefront orders → Warehouse, hourly\",\n prompt: \"Sync Storefront orders to Warehouse every hour, alert sales in Team Chat\",\n },\n {\n id: \"daily-load\",\n label: \"Payments payouts → Lakehouse, daily\",\n prompt: \"Load Payments payouts into Lakehouse daily\",\n },\n {\n id: \"realtime-stream\",\n label: \"Orders DB changes → Warehouse + Team Chat\",\n prompt: \"Stream Orders DB changes to Warehouse in real-time and notify Team Chat\",\n },\n];\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_METRICS: WorkflowShowcaseMetric[] = [\n { id: \"throughput\", value: 2341, buildingValue: 842, unit: \"rows/min\", label: \"THROUGHPUT\" },\n {\n id: \"latency\",\n value: 0.8,\n buildingValue: 1.1,\n decimals: 1,\n unit: \"s latency\",\n label: \"SYNC SPEED\",\n },\n { id: \"cost\", value: 43, suffix: \"%\", label: \"SAVED VS BASELINE\", tone: \"success\" },\n];\n\nexport const WORKFLOW_SHOWCASE_SCHEDULES = [\"AUTO\", \"HOURLY\", \"DAILY\", \"REAL-TIME\"] as const;\n\n/** Trigger modes the platform supports — mirrors real workflow capability. */\nexport const WORKFLOW_SHOWCASE_TRIGGERS = [\"SCHEDULE\", \"WEBHOOK\", \"APP EVENT\", \"MANUAL\"] as const;\n\n// Platform capability tiles — AI/data jobs the engine actually runs.\nexport const WORKFLOW_SHOWCASE_DEFAULT_TILES = [\n \"ELT\",\n \"CDC\",\n \"LLM\",\n \"RAG\",\n \"HEAL\",\n \"COST\",\n \"IDP\",\n \"VEC\",\n] as const;\n\n/* ---------------------------------------------------------------------------\n * Recognition\n * ------------------------------------------------------------------------- */\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ninterface Mention {\n connector: WorkflowShowcaseConnector;\n pattern: string;\n}\n\n/** Every (connector, matchable-string) pair, longest pattern first so\n * overlapping names (\"Orders DB\" vs \"Orders\") resolve to the longest hit. */\nfunction mentionsOf(catalog: WorkflowShowcaseConnector[]): Mention[] {\n const out: Mention[] = [];\n for (const connector of catalog) {\n out.push({ connector, pattern: connector.name });\n for (const alias of connector.aliases ?? []) out.push({ connector, pattern: alias });\n }\n return out.sort((a, b) => b.pattern.length - a.pattern.length);\n}\n\n/** Connector names mentioned in the prompt, in catalog order, deduped. */\nexport function detectConnectors(prompt: string, catalog: WorkflowShowcaseConnector[]): string[] {\n const lower = prompt.toLowerCase();\n return catalog\n .filter((c) => [c.name, ...(c.aliases ?? [])].some((p) => lower.includes(p.toLowerCase())))\n .map((c) => c.name);\n}\n\n/** Split the prompt into plain / recognized-connector segments, preserving\n * the user's exact text. Powers the live-highlight overlay. */\nexport function segmentPrompt(\n prompt: string,\n catalog: WorkflowShowcaseConnector[],\n): ShowcasePromptSegment[] {\n if (!prompt) return [];\n const mentions = mentionsOf(catalog);\n if (!mentions.length) return [{ text: prompt }];\n const re = new RegExp(`(${mentions.map((m) => escapeRegExp(m.pattern)).join(\"|\")})`, \"gi\");\n const byPattern = new Map(mentions.map((m) => [m.pattern.toLowerCase(), m.connector]));\n return prompt\n .split(re)\n .filter((part) => part !== \"\")\n .map((part) => {\n const connector = byPattern.get(part.toLowerCase());\n return connector ? { text: part, connector } : { text: part };\n });\n}\n\n/** Infer a schedule from natural language; null when nothing matches. */\nexport function scheduleFromPrompt(prompt: string): string | null {\n const t = prompt.toLowerCase();\n if (/stream|real.?time|cdc/.test(t)) return \"REAL-TIME\";\n if (/hour/.test(t)) return \"HOURLY\";\n if (/dail|every day|nightly/.test(t)) return \"DAILY\";\n return null;\n}\n\n/** Two-letter monogram for the default icon tile: \"Team Chat\" → \"TC\". */\nexport function monogram(name: string): string {\n const words = name.trim().split(/\\s+/);\n const raw = words.length >= 2 ? `${words[0][0]}${words[1][0]}` : name.slice(0, 2);\n return raw.toUpperCase();\n}\n\n/* ---------------------------------------------------------------------------\n * Plan resolution\n * ------------------------------------------------------------------------- */\n\nconst RIGHT_ORDER: Record<WorkflowShowcaseRole, number> = {\n source: -1,\n destination: 0,\n action: 1,\n notify: 2,\n};\n\n/**\n * Resolve the workflow plan from explicit picks + prompt mentions. A viable\n * demo always has at least one source and one non-source, so missing sides\n * are backfilled from the catalog (first source / first notify-or-destination).\n */\nexport function resolvePlan(\n selected: string[],\n detected: string[],\n catalog: WorkflowShowcaseConnector[],\n): WorkflowShowcasePlan {\n const byName = new Map(catalog.map((c) => [c.name, c]));\n let names = [...new Set([...selected, ...detected])].filter((n) => byName.has(n));\n if (!names.length) {\n const fallback = [\n catalog.find((c) => c.role === \"source\"),\n catalog.find((c) => c.role === \"destination\"),\n catalog.find((c) => c.role === \"notify\"),\n ].filter((c): c is WorkflowShowcaseConnector => Boolean(c));\n names = fallback.map((c) => c.name);\n }\n const has = (predicate: (c: WorkflowShowcaseConnector) => boolean) =>\n names.some((n) => {\n const c = byName.get(n);\n return Boolean(c && predicate(c));\n });\n if (!has((c) => c.role === \"source\")) {\n const source = catalog.find((c) => c.role === \"source\");\n if (source) names = [source.name, ...names];\n }\n if (!has((c) => c.role !== \"source\")) {\n const sink =\n catalog.find((c) => c.role === \"notify\") ?? catalog.find((c) => c.role !== \"source\");\n if (sink) names = [...names, sink.name];\n }\n const picked = catalog.filter((c) => names.includes(c.name));\n const left = picked.filter((c) => c.role === \"source\");\n const right = picked\n .filter((c) => c.role !== \"source\")\n .sort((a, b) => RIGHT_ORDER[a.role] - RIGHT_ORDER[b.role]);\n const all = [...left, ...right];\n return { left, right, all, totalSteps: all.length + 1 };\n}\n\n/* ---------------------------------------------------------------------------\n * Activity rail script\n * ------------------------------------------------------------------------- */\n\nfunction stepVerb(role: WorkflowShowcaseRole): string {\n if (role === \"notify\") return \"alert\";\n if (role === \"action\") return \"trigger\";\n return \"load\";\n}\n\n/** Ordered assemble steps for the rail + canvas (\"storefront extract\", …). */\nexport function assembleSteps(plan: WorkflowShowcasePlan): string[] {\n return [\n ...plan.left.map((c) => `${c.name.toLowerCase()} extract`),\n \"schema map · 14 fields\",\n ...plan.right.map((c) => `${c.name.toLowerCase()} ${stepVerb(c.role)}`),\n ];\n}\n\n/**\n * Script the \"OCTAVIA IS DOING\" rail for the current moment.\n * `shown` = number of assemble steps already completed while building.\n */\nexport function buildActivity(args: {\n phase: WorkflowShowcasePhase;\n shown: number;\n plan: WorkflowShowcasePlan;\n selected: string[];\n status: string;\n}): ShowcaseActivityLine[] {\n const { phase, shown, plan, selected, status } = args;\n const settled = SETTLED_PHASES.includes(phase);\n const lines: ShowcaseActivityLine[] = [];\n if (phase === \"idle\") {\n if (!selected.length) {\n lines.push({ id: \"wait\", text: \"▸ waiting for instructions…\", tone: \"muted\" });\n lines.push({ id: \"hint\", text: \"· type a request or pick apps\", tone: \"faint\" });\n }\n for (const name of selected.slice(-6)) {\n lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: \"plain\" });\n }\n return lines;\n }\n if (phase === \"analyzing\") {\n for (const name of selected.slice(-4)) {\n lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: \"muted\" });\n }\n lines.push({ id: \"status\", text: `⟳ ${status}`, tone: \"active\" });\n return lines;\n }\n assembleSteps(plan).forEach((step, i) => {\n if (settled || shown > i) lines.push({ id: `step-${i}`, text: `✓ ${step}`, tone: \"done\" });\n else if (shown === i) lines.push({ id: `step-${i}`, text: `⟳ ${step}…`, tone: \"active\" });\n else lines.push({ id: `step-${i}`, text: `· ${step} queued`, tone: \"muted\" });\n });\n if (settled) lines.push({ id: \"errors\", text: \"✓ error handling attached\", tone: \"done\" });\n return lines.slice(-8);\n}\n\n/* ---------------------------------------------------------------------------\n * Misc\n * ------------------------------------------------------------------------- */\n\n/** \"Acme Inc.\" → \"acme-inc\" (workspace slug preview in the welcome card). */\nexport function slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"your-team\"\n );\n}\n\nexport function isValidEmail(value: string): boolean {\n return /^\\S+@\\S+\\.\\S+$/.test(value.trim());\n}\n","\"use client\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, type AvatarProps } from \"../Avatar\";\nimport { Card, type CardRadius } from \"../Card\";\n\n/* ---------------------------------------------------------------------------\n * BlogCard — composes on the polished `Card` primitive so it inherits\n * `forwardRef`, native prop spread, keyboard activation, hover/tap\n * microinteractions, and `prefers-reduced-motion` support for free.\n *\n * Adds blog-specific slots on top: cover image with configurable aspect\n * ratio, category chips, author row, reading-time + date meta. Renders\n * as a real `<a>` when `href` is given (via Card.asChild) so the link\n * gets browser semantics (open-in-new-tab, middle-click, etc.).\n * ------------------------------------------------------------------------- */\n\nexport type BlogCardOrientation = \"vertical\" | \"horizontal\";\nexport type BlogCardCoverAspect = \"16/9\" | \"4/3\" | \"1/1\" | \"3/4\" | \"21/9\";\n\nexport interface BlogCardAuthor {\n name: ReactNode;\n /** Optional avatar — passed through to the polished `Avatar` primitive. */\n avatar?: Pick<AvatarProps, \"src\" | \"initials\" | \"alt\" | \"seed\" | \"palette\">;\n /** Optional role / handle / etc. */\n byline?: ReactNode;\n}\n\nexport interface BlogCardProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"title\" | \"onChange\" | \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n /** Cover artwork — usually an `<img>` element, but accepts any node. */\n cover?: ReactNode;\n /**\n * Cover aspect ratio. Lets a grid of cards stay visually consistent\n * regardless of source image dimensions. Default `\"16/9\"`.\n */\n coverAspect?: BlogCardCoverAspect;\n /** Single category chip (legacy — prefer `tags`). */\n category?: ReactNode;\n /** Multiple category chips. Rendered before the title. */\n tags?: ReactNode[];\n /** Date / publish info — inline meta. */\n meta?: ReactNode;\n /** Structured reading-time slot. Renders alongside `meta`. */\n readingTime?: ReactNode;\n /** Required title — drives `aria-labelledby` on the card. */\n title: ReactNode;\n /** Heading level for the title. Default `\"h3\"`. */\n titleAs?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n description?: ReactNode;\n /** Structured author block — avatar + name + optional byline. */\n author?: BlogCardAuthor;\n /** Right-aligned footer content (call-to-action / \"Read more\" link). */\n footer?: ReactNode;\n /** Card corner radius. */\n radius?: CardRadius;\n /** Cover on top (default) or cover on left. */\n orientation?: BlogCardOrientation;\n /** When set, the card renders as an `<a>` element. */\n href?: string;\n /** Click handler. Pairing with `href` is fine; both fire. */\n onClick?: () => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const BlogCard = forwardRef<HTMLDivElement, BlogCardProps>(function BlogCard(\n {\n cover,\n coverAspect = \"16/9\",\n category,\n tags,\n meta,\n readingTime,\n title,\n titleAs = \"h3\",\n description,\n author,\n footer,\n radius = \"md\",\n orientation = \"vertical\",\n href,\n onClick,\n id: providedId,\n className,\n ...rest\n },\n ref,\n) {\n const reactId = useId();\n const baseId = providedId ?? `ods-blog-card-${reactId}`;\n const titleId = `${baseId}-title`;\n const descId = description ? `${baseId}-desc` : undefined;\n\n // Resolve the tag list — a single `category` is treated as a one-tag\n // list for back-compat with the v1 API.\n const tagList: ReactNode[] = tags ?? (category ? [category] : []);\n\n const body = (\n <>\n {cover && (\n <div\n className={cn(\n \"ods-blog-card__cover\",\n `ods-blog-card__cover--aspect-${coverAspect.replace(\"/\", \"-\")}`,\n )}\n aria-hidden=\"true\"\n >\n {cover}\n </div>\n )}\n\n <div className=\"ods-blog-card__body\">\n {(tagList.length > 0 || meta || readingTime) && (\n <div className=\"ods-blog-card__meta\">\n {tagList.length > 0 && (\n <span className=\"ods-blog-card__tags\">\n {tagList.map((t, i) => (\n <span key={i} className=\"ods-blog-card__tag\">\n {t}\n </span>\n ))}\n </span>\n )}\n {meta && <span className=\"ods-blog-card__date\">{meta}</span>}\n {readingTime && <span className=\"ods-blog-card__reading\">{readingTime}</span>}\n </div>\n )}\n\n <Card.Title as={titleAs} id={titleId} className=\"ods-blog-card__title\">\n {title}\n </Card.Title>\n\n {description && (\n <Card.Description id={descId} className=\"ods-blog-card__desc\">\n {description}\n </Card.Description>\n )}\n\n {(author || footer) && (\n <div className=\"ods-blog-card__footer\">\n {author && (\n <div className=\"ods-blog-card__author\">\n {author.avatar && (\n <Avatar\n size=\"sm\"\n src={author.avatar.src}\n initials={author.avatar.initials}\n seed={author.avatar.seed}\n palette={author.avatar.palette}\n alt={\n author.avatar.alt ??\n (typeof author.name === \"string\" ? author.name : undefined)\n }\n />\n )}\n <div className=\"ods-blog-card__author-text\">\n <span className=\"ods-blog-card__author-name\">{author.name}</span>\n {author.byline && (\n <span className=\"ods-blog-card__author-byline\">{author.byline}</span>\n )}\n </div>\n </div>\n )}\n {footer && <div className=\"ods-blog-card__action\">{footer}</div>}\n </div>\n )}\n </div>\n </>\n );\n\n // `href` → render as a real <a> via Card.asChild for browser-native\n // link semantics (open-in-new-tab, middle-click, copy-link, etc.).\n if (href) {\n return (\n <Card\n asChild\n radius={radius}\n padding=\"none\"\n className={cn(\n \"ods-blog-card\",\n `ods-blog-card--${orientation}`,\n \"ods-blog-card--interactive\",\n className,\n )}\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <a\n // `rest` is typed against HTMLDivElement handlers (BlogCardProps\n // extends div). The anchor accepts the same attributes\n // structurally at runtime, but TS sees\n // KeyboardEventHandler<HTMLDivElement> ≠ <HTMLAnchorElement>.\n // Route through `unknown` — TS's recommended escape hatch\n // when we know the runtime is safe.\n {...(rest as unknown as ComponentPropsWithoutRef<\"a\">)}\n ref={ref as unknown as React.Ref<HTMLAnchorElement>}\n href={href}\n id={baseId}\n onClick={onClick}\n >\n {body}\n </a>\n </Card>\n );\n }\n\n return (\n <Card\n {...rest}\n ref={ref}\n id={baseId}\n radius={radius}\n padding=\"none\"\n onClick={onClick}\n className={cn(\n \"ods-blog-card\",\n `ods-blog-card--${orientation}`,\n onClick && \"ods-blog-card--interactive\",\n className,\n )}\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n {body}\n </Card>\n );\n});\n\nBlogCard.displayName = \"BlogCard\";\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarShape = \"circle\" | \"square\";\n/** Presence indicator. `online` pulses gently; reduced-motion is respected. */\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\n\nexport interface AvatarProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"color\" | \"children\" | \"onClick\" | \"onKeyDown\"> {\n /** Image URL. If loading fails, falls back to `initials` (then `icon`, then `?`). */\n src?: string;\n /** Accessible name for the avatar. Used as the `<img>` alt AND as the\n * wrapping element's accessible name. If you only pass `initials`,\n * this is recommended so AT announces \"Jane Doe avatar\" not \"J D\". */\n alt?: string;\n /** Initials to render when there is no image. Auto-uppercased and\n * truncated to 2 characters so passing a full name stays sane. */\n initials?: string;\n /** Optional icon slot — rendered when neither `src` nor `initials` is\n * available (or used directly when you want a system/bot avatar). */\n icon?: ReactNode;\n /** Override the default `?` fallback content. */\n fallback?: ReactNode;\n /** Stable seed for the persistent palette — canonically the user's\n * NAME. Falls back to `alt` (usually the person's name) before\n * `initials`, so every surface that renders the same person derives\n * the same color even when `seed` isn't passed explicitly. */\n seed?: string;\n /** Explicit palette index (0–11) — wins over seed hashing. Pair with a\n * host-persisted value (e.g. `user.profile.avatarPalette` computed once\n * via `avatarPaletteIndex(name)`) to guarantee the identical color on\n * every surface, including non-DS ones like transactional emails. */\n palette?: number;\n /** Pixel/font size variant. */\n size?: AvatarSize;\n /** Shape — `circle` (people, default) or `square` (teams, bots, brands). */\n shape?: AvatarShape;\n /** Presence indicator dot. */\n status?: AvatarStatus;\n /** Human-readable status label folded into the accessible name. Defaults\n * to the capitalized `status` value. */\n statusLabel?: string;\n /** When set, the avatar becomes a button (Enter/Space activated). */\n onClick?: () => void;\n /** Native image attributes — set `loading=\"eager\"` for above-the-fold avatars\n * if you've measured CLS regressions. Defaults to `lazy`. */\n imgLoading?: \"eager\" | \"lazy\";\n /** Native referrerPolicy for cross-origin avatar hosts (Gravatar, etc.). */\n referrerPolicy?: ComponentPropsWithoutRef<\"img\">[\"referrerPolicy\"];\n}\n\n/* ---------------------------------------------------------------------------\n * Persistent palette\n *\n * 12 gradients exposed as CSS custom properties so consumers can theme them\n * (or replace the whole palette) without touching the component. We do NOT\n * hit localStorage — a deterministic djb2 hash gives stable assignment\n * across renders, machines, and SSR/CSR boundaries.\n * ------------------------------------------------------------------------- */\n\nconst PALETTE_SIZE = 12;\n\nfunction djb2(str: string): number {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction paletteIndexFor(seed: string): number {\n return djb2(seed) % PALETTE_SIZE;\n}\n\n/** Number of persistent avatar palettes. */\nexport const AVATAR_PALETTE_SIZE = PALETTE_SIZE;\n\n/**\n * Deterministic palette index for a seed (canonically the user's name).\n * Exposed so hosts can compute the value ONCE, persist it on the user\n * record, and pass it back via the `palette` prop everywhere.\n */\nexport function avatarPaletteIndex(seed: string): number {\n return paletteIndexFor(seed);\n}\n\nfunction normalizeInitials(raw: string): string {\n // Take the first character of up to two whitespace-separated tokens —\n // \"Jane Doe\" → \"JD\", \"Postgres\" → \"P\", \"schema-drift\" → \"S\". Falls\n // back to the first two characters of a contiguous run.\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n const tokens = trimmed.split(/\\s+/).filter(Boolean);\n if (tokens.length >= 2) {\n return (tokens[0]!.charAt(0) + tokens[1]!.charAt(0)).toUpperCase();\n }\n return trimmed.slice(0, 2).toUpperCase();\n}\n\nconst STATUS_DEFAULT_LABEL: Record<AvatarStatus, string> = {\n online: \"Online\",\n offline: \"Offline\",\n busy: \"Busy\",\n away: \"Away\",\n};\n\n/* ---------------------------------------------------------------------------\n * Avatar\n * ------------------------------------------------------------------------- */\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n {\n src,\n alt,\n initials,\n icon,\n fallback,\n seed,\n palette,\n size = \"md\",\n shape = \"circle\",\n status,\n statusLabel,\n onClick,\n imgLoading = \"lazy\",\n referrerPolicy,\n className,\n ...rest\n },\n ref,\n) {\n // Image failure is tracked locally so the next render swaps to the\n // initials fallback transparently. Reset key change resets state.\n const [imgFailed, setImgFailed] = useState(false);\n const handleImgError = useCallback(() => setImgFailed(true), []);\n\n const showImage = Boolean(src) && !imgFailed;\n\n const normalizedInitials = useMemo(\n () => (initials ? normalizeInitials(initials) : \"\"),\n [initials],\n );\n\n // Resolve palette once. Stable across renders. Precedence: explicit\n // saved `palette` > `seed` > `alt` (usually the person's NAME — shared\n // by every surface) > `initials` (2 chars, least unique — last resort).\n const paletteIdx = useMemo(() => {\n if (palette !== undefined) {\n return ((Math.trunc(palette) % PALETTE_SIZE) + PALETTE_SIZE) % PALETTE_SIZE;\n }\n const resolved = seed ?? alt ?? initials ?? \"?\";\n return paletteIndexFor(resolved);\n }, [palette, seed, alt, initials]);\n\n // Accessible name — fold status into the label so AT announces\n // \"Jane Doe, online\" as a single coherent label, not two separate nodes.\n const baseName = alt || normalizedInitials || \"Avatar\";\n const announcedStatus = status ? (statusLabel ?? STATUS_DEFAULT_LABEL[status]) : \"\";\n const accessibleName = announcedStatus ? `${baseName}, ${announcedStatus}` : baseName;\n\n const isClickable = Boolean(onClick);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isClickable) return;\n if ((e.key === \"Enter\" || e.key === \" \") && !e.repeat) {\n e.preventDefault();\n onClick?.();\n }\n };\n\n const rootClassName = cn(\n \"ods-avatar\",\n `ods-avatar--${size}`,\n `ods-avatar--${shape}`,\n isClickable && \"ods-avatar--clickable\",\n className,\n );\n\n return (\n <div\n {...rest}\n ref={ref}\n className={rootClassName}\n // Only the outer wrapper carries `role=\"img\"` + the merged label. The\n // inner <img> drops out of the AT tree (alt=\"\") so AT doesn't double-\n // announce \"Jane Doe avatar / Jane Doe\".\n role={isClickable ? \"button\" : \"img\"}\n aria-label={accessibleName}\n tabIndex={isClickable ? 0 : undefined}\n onClick={onClick}\n onKeyDown={isClickable ? handleKeyDown : undefined}\n data-status={status}\n >\n <span className=\"ods-avatar__inner\" data-palette={paletteIdx}>\n {showImage ? (\n <img\n src={src}\n alt=\"\"\n className=\"ods-avatar__image\"\n loading={imgLoading}\n decoding=\"async\"\n referrerPolicy={referrerPolicy}\n onError={handleImgError}\n draggable={false}\n />\n ) : icon ? (\n <span className=\"ods-avatar__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : normalizedInitials ? (\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n {normalizedInitials}\n </span>\n ) : (\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n {fallback ?? \"?\"}\n </span>\n )}\n </span>\n {status && (\n // Decorative — the textual status is folded into the wrapper's\n // aria-label above. `aria-hidden` keeps AT from double-announcing.\n <span\n className={cn(\"ods-avatar__status\", `ods-avatar__status--${status}`)}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n});\n\nAvatar.displayName = \"Avatar\";\n\n/* ---------------------------------------------------------------------------\n * AvatarStack\n * ------------------------------------------------------------------------- */\n\nexport interface AvatarStackProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** Avatars to display (in left-to-right stacking order). */\n children: ReactNode;\n /** Max avatars to show before collapsing the surplus into `+N`. */\n max?: number;\n /** Size applied to the overflow chip. Defaults to `md`. */\n size?: AvatarSize;\n /** Replace the default `+N` overflow chip. Receives the hidden count. */\n renderOverflow?: (count: number) => ReactNode;\n /** Stacking direction. `ltr` (default) overlaps each successive avatar to\n * the right of the previous one; `rtl` mirrors. */\n direction?: \"ltr\" | \"rtl\";\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n { children, max, size = \"md\", renderOverflow, direction = \"ltr\", className, ...rest },\n ref,\n) {\n const arr = Array.isArray(children) ? children : [children];\n const visible = max && arr.length > max ? arr.slice(0, max) : arr;\n const overflow = max && arr.length > max ? arr.length - max : 0;\n\n return (\n <div\n {...rest}\n ref={ref}\n className={cn(\"ods-avatar-stack\", `ods-avatar-stack--${direction}`, className)}\n >\n {visible}\n {overflow > 0 &&\n (renderOverflow ? (\n renderOverflow(overflow)\n ) : (\n <div\n className={cn(\n \"ods-avatar\",\n `ods-avatar--${size}`,\n \"ods-avatar--circle\",\n \"ods-avatar-stack__overflow\",\n )}\n role=\"img\"\n aria-label={`${overflow} more`}\n >\n <span className=\"ods-avatar__inner\">\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n +{overflow}\n </span>\n </span>\n </div>\n ))}\n </div>\n );\n});\n\nAvatarStack.displayName = \"AvatarStack\";\n","\"use client\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n type ElementType,\n forwardRef,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Slot } from \"../../utils/Slot\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type CardVariant = \"default\" | \"elevated\" | \"outlined\" | \"subtle\" | \"selected\";\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type CardRadius = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface CardProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: CardVariant;\n padding?: CardPadding;\n radius?: CardRadius;\n /** Apply hover affordance (lift + tint) without making the card clickable.\n * For purely-visual surfaces that respond to mouse-over. */\n hoverable?: boolean;\n /** Disable a clickable card. Adds `aria-disabled` and suppresses interaction. */\n disabled?: boolean;\n /** Loading skeleton — replaces the card chrome with a shimmer block of\n * the same height. */\n loading?: boolean;\n /** Render Card's styling onto a custom child element (Radix-style Slot).\n *\n * <Card asChild variant=\"elevated\">\n * <NextLink href=\"/blog/post-1\">{...}</NextLink>\n * </Card>\n *\n * When set, Card does NOT wrap the child in motion.div — the consumer's\n * element fully owns content. Use without asChild for the built-in\n * hover / tap motion + keyboard activation. */\n asChild?: boolean;\n children?: ReactNode;\n}\n\n/* ---------------------------------------------------------------------------\n * Card root\n * ------------------------------------------------------------------------- */\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant = \"default\",\n padding = \"md\",\n radius = \"md\",\n hoverable = false,\n disabled = false,\n loading = false,\n asChild = false,\n onClick,\n onKeyDown,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const reducedMotion = useReducedMotion();\n const isInteractive = Boolean(onClick) && !disabled && !loading;\n\n // Keyboard activation for clickable cards. Without this, Enter/Space on a\n // focused card-as-button does nothing — a broken a11y contract that the\n // previous shape silently shipped.\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (!isInteractive) return;\n if ((e.key === \"Enter\" || e.key === \" \") && !e.repeat) {\n e.preventDefault();\n onClick?.(e as unknown as Parameters<NonNullable<typeof onClick>>[0]);\n }\n };\n\n const rootClassName = cn(\n \"ods-card\",\n `ods-card--${variant}`,\n `ods-card--pad-${padding}`,\n `ods-card--radius-${radius}`,\n (hoverable || isInteractive) && !loading && !disabled && \"ods-card--hoverable\",\n isInteractive && \"ods-card--clickable\",\n disabled && \"ods-card--disabled\",\n loading && \"ods-card--loading\",\n className,\n );\n\n // asChild — project Card's chrome onto the consumer's element.\n if (asChild) {\n return (\n <Slot\n {...(rest as ComponentPropsWithoutRef<ElementType>)}\n ref={ref as Ref<HTMLElement>}\n className={rootClassName}\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? handleKeyDown : onKeyDown}\n aria-disabled={disabled || undefined}\n >\n {children as ReactElement}\n </Slot>\n );\n }\n\n // Loading skeleton — same height-ish slot so layout doesn't jump.\n if (loading) {\n return (\n <div\n {...rest}\n ref={ref}\n className={rootClassName}\n aria-busy=\"true\"\n aria-label=\"Loading\"\n >\n <div className=\"ods-card__skeleton\" data-ods-animate=\"shimmer\" />\n </div>\n );\n }\n\n return (\n <motion.div\n {...(rest as any)}\n ref={ref}\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? handleKeyDown : onKeyDown}\n className={rootClassName}\n whileHover={\n (hoverable || isInteractive) && !reducedMotion\n ? { y: -2, transition: { duration: 0.15 } }\n : undefined\n }\n whileTap={isInteractive && !reducedMotion ? { scale: 0.99 } : undefined}\n role={isInteractive ? \"button\" : rest.role}\n tabIndex={isInteractive ? (rest.tabIndex ?? 0) : rest.tabIndex}\n aria-disabled={disabled || undefined}\n >\n {children}\n </motion.div>\n );\n}) as React.ForwardRefExoticComponent<\n CardProps & React.RefAttributes<HTMLDivElement>\n> & {\n Header: typeof CardHeader;\n Body: typeof CardBody;\n Footer: typeof CardFooter;\n Title: typeof CardTitle;\n Description: typeof CardDescription;\n};\n\nCard.displayName = \"Card\";\n\n/* ---------------------------------------------------------------------------\n * Subcomponents — `Card.Header`, `Card.Body`, `Card.Footer`, `Card.Title`,\n * `Card.Description`. Optional building blocks for the \"title + content +\n * actions\" pattern. Compose freely — none of them are required.\n * ------------------------------------------------------------------------- */\n\nexport interface CardSectionProps extends ComponentPropsWithoutRef<\"div\"> {\n children?: ReactNode;\n}\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardHeader({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__header\", className)}>\n {children}\n </div>\n );\n },\n);\nCardHeader.displayName = \"Card.Header\";\n\nexport const CardBody = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardBody({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__body\", className)}>\n {children}\n </div>\n );\n },\n);\nCardBody.displayName = \"Card.Body\";\n\nexport const CardFooter = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardFooter({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__footer\", className)}>\n {children}\n </div>\n );\n },\n);\nCardFooter.displayName = \"Card.Footer\";\n\nexport interface CardTitleProps extends ComponentPropsWithoutRef<\"h3\"> {\n /** Override the heading level. Defaults to `<h3>`. */\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n children?: ReactNode;\n}\n\nexport const CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps>(\n function CardTitle({ as: Comp = \"h3\", className, children, ...rest }, ref) {\n return (\n <Comp\n {...(rest as ComponentPropsWithoutRef<typeof Comp>)}\n ref={ref}\n className={cn(\"ods-card__title\", className)}\n >\n {children}\n </Comp>\n );\n },\n);\nCardTitle.displayName = \"Card.Title\";\n\nexport interface CardDescriptionProps extends ComponentPropsWithoutRef<\"p\"> {\n children?: ReactNode;\n}\n\nexport const CardDescription = forwardRef<\n HTMLParagraphElement,\n CardDescriptionProps\n>(function CardDescription({ className, children, ...rest }, ref) {\n return (\n <p {...rest} ref={ref} className={cn(\"ods-card__description\", className)}>\n {children}\n </p>\n );\n});\nCardDescription.displayName = \"Card.Description\";\n\n// Dot-notation API: `Card.Header`, `Card.Body`, etc.\nCard.Header = CardHeader;\nCard.Body = CardBody;\nCard.Footer = CardFooter;\nCard.Title = CardTitle;\nCard.Description = CardDescription;\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { BlogCard } from \"../../../components/BlogCard/BlogCard\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * BlogGrid — the marketing blog/changelog teaser section body. Composes the\n * DS BlogCard into a responsive grid with an optional \"view all\" link.\n * Pair with MarketingSection for the kicker/title band.\n * ------------------------------------------------------------------------- */\n\nexport interface BlogGridPost {\n id: string;\n title: ReactNode;\n href: string;\n excerpt?: ReactNode;\n /** Publish date / meta line, e.g. \"Jul 12, 2026\". */\n date?: ReactNode;\n /** Reading-time chip, e.g. \"6 min read\". */\n readTime?: ReactNode;\n tags?: ReactNode[];\n /** Cover artwork (usually an <img>). */\n cover?: ReactNode;\n author?: {\n name: string;\n /** Avatar spec forwarded to the DS Avatar primitive. */\n avatar?: { src?: string; initials?: string; alt?: string };\n byline?: ReactNode;\n };\n}\n\nexport interface BlogGridProps extends ComponentPropsWithoutRef<\"div\"> {\n posts: BlogGridPost[];\n columns?: 2 | 3;\n viewAllHref?: string;\n viewAllLabel?: ReactNode;\n}\n\nexport function BlogGrid({\n posts,\n columns = 3,\n viewAllHref,\n viewAllLabel = \"View all posts →\",\n className,\n ...rest\n}: BlogGridProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-blog\", className)}>\n <div className={cn(\"ods-mkt-blog__grid\", `ods-mkt-blog__grid--${columns}`)}>\n {posts.map((post) => (\n <BlogCard\n key={post.id}\n title={post.title}\n description={post.excerpt}\n href={post.href}\n meta={post.date}\n readingTime={post.readTime}\n tags={post.tags}\n cover={post.cover}\n author={post.author}\n />\n ))}\n </div>\n {viewAllHref && (\n <div className=\"ods-mkt-blog__more\">\n <a className=\"ods-mkt-blog__more-link\" href={viewAllHref}>\n {viewAllLabel}\n </a>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { type FormEvent, type ReactNode, useId, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport { Textarea } from \"../../../components/Textarea/Textarea\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ContactForm — \"talk to us\" form for the contact page / sales section.\n * Same interaction contract as BetaAccessForm: async `onSubmit`, success\n * card on resolve, inline error with the form intact on failure.\n * ------------------------------------------------------------------------- */\n\nexport interface ContactFormValues {\n name: string;\n email: string;\n company?: string;\n /** Selected topic value (present when `topics` are configured). */\n topic?: string;\n message: string;\n}\n\nexport interface ContactFormTopic {\n value: string;\n label: string;\n /** Contextual hint shown under the select when this topic is chosen. */\n hint?: ReactNode;\n /** Message-textarea placeholder while this topic is selected. */\n messagePlaceholder?: string;\n}\n\nexport interface ContactFormProps {\n title?: ReactNode;\n subtitle?: ReactNode;\n /** Topic choices (sales, partnership, support…). Required when provided. */\n topics?: ContactFormTopic[];\n submitLabel?: ReactNode;\n footnote?: ReactNode;\n /** Resolve → success state; throw → inline error, form kept. */\n onSubmit?: (values: ContactFormValues) => Promise<void> | void;\n successTitle?: ReactNode;\n successBody?: ReactNode;\n disabled?: boolean;\n className?: string;\n}\n\ntype Phase = \"idle\" | \"submitting\" | \"success\";\n\nexport function ContactForm({\n title = \"Talk to us\",\n subtitle = \"SALES · PARTNERSHIPS · ANYTHING ELSE — WE READ EVERYTHING\",\n topics,\n submitLabel = \"Send message →\",\n footnote = \"WE USUALLY REPLY WITHIN ONE BUSINESS DAY\",\n onSubmit,\n successTitle = \"Message sent.\",\n successBody = \"Thanks for reaching out — we'll get back to you by email.\",\n disabled = false,\n className,\n}: ContactFormProps) {\n const uid = useId();\n const [values, setValues] = useState<ContactFormValues>({\n name: \"\",\n email: \"\",\n company: \"\",\n topic: \"\",\n message: \"\",\n });\n const selectedTopic = topics?.find((t) => t.value === values.topic);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (phase === \"submitting\") return;\n if (!values.name.trim()) {\n setError(\"Please enter your name.\");\n return;\n }\n if (!isValidEmail(values.email)) {\n setError(\"Please enter a valid work email.\");\n return;\n }\n if (topics?.length && !values.topic) {\n setError(\"Please choose a topic.\");\n return;\n }\n if (!values.message.trim()) {\n setError(\"Please write a short message.\");\n return;\n }\n setError(null);\n setPhase(\"submitting\");\n try {\n await onSubmit?.(values);\n setPhase(\"success\");\n } catch {\n setError(\"Something went wrong — please try again.\");\n setPhase(\"idle\");\n }\n };\n\n if (phase === \"success\") {\n return (\n <div className={cn(\"ods-mkt-contact\", \"ods-mkt-contact--success\", className)} role=\"status\">\n <p className=\"ods-mkt-contact__success-mark\">✓ {successTitle}</p>\n <p className=\"ods-mkt-contact__success-body\">{successBody}</p>\n </div>\n );\n }\n\n const busy = disabled || phase === \"submitting\";\n\n return (\n <form className={cn(\"ods-mkt-contact\", className)} onSubmit={handleSubmit} noValidate>\n <div className=\"ods-mkt-contact__head\">\n <h3 className=\"ods-mkt-contact__title\">{title}</h3>\n {subtitle && <p className=\"ods-mkt-contact__subtitle\">{subtitle}</p>}\n </div>\n\n <div className=\"ods-mkt-contact__grid\">\n <div className=\"ods-mkt-contact__field\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-name`}>\n Full name\n </label>\n <Input\n id={`${uid}-name`}\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-contact__field\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-email`}>\n Work email\n </label>\n <Input\n id={`${uid}-email`}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-company`}>\n Company <span className=\"ods-mkt-contact__optional\">(optional)</span>\n </label>\n <Input\n id={`${uid}-company`}\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n disabled={busy}\n />\n </div>\n {topics && topics.length > 0 && (\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n <span className=\"ods-mkt-contact__label\" id={`${uid}-topic-label`}>\n Topic\n </span>\n <Select\n aria-labelledby={`${uid}-topic-label`}\n placeholder=\"Choose a topic…\"\n options={topics.map((t) => ({ value: t.value, label: t.label }))}\n value={values.topic ?? \"\"}\n onChange={(topic) => setValues((v) => ({ ...v, topic }))}\n disabled={busy}\n />\n {selectedTopic?.hint && (\n <p className=\"ods-mkt-contact__topic-hint\">{selectedTopic.hint}</p>\n )}\n </div>\n )}\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n {/* Textarea's react-aria field wiring owns the name computation —\n associate the external label explicitly via aria-labelledby. */}\n <label\n className=\"ods-mkt-contact__label\"\n id={`${uid}-message-label`}\n htmlFor={`${uid}-message`}\n >\n Message\n </label>\n <Textarea\n id={`${uid}-message`}\n aria-labelledby={`${uid}-message-label`}\n placeholder={selectedTopic?.messagePlaceholder ?? \"What are you trying to build?\"}\n rows={4}\n value={values.message}\n onChange={(e) => setValues((v) => ({ ...v, message: e.target.value }))}\n disabled={busy}\n />\n </div>\n </div>\n\n {error && (\n <p className=\"ods-mkt-contact__error\" role=\"alert\">\n {error}\n </p>\n )}\n\n <div className=\"ods-mkt-contact__foot\">\n {footnote && <p className=\"ods-mkt-contact__footnote\">{footnote}</p>}\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={phase === \"submitting\"}\n disabled={disabled}\n >\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * CtaBanner — the closing conversion band: display headline, lede, primary +\n * secondary calls to action, mono footnote.\n * ------------------------------------------------------------------------- */\n\nexport interface CtaBannerAction {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface CtaBannerProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n title: ReactNode;\n lede?: ReactNode;\n primary: CtaBannerAction;\n secondary?: CtaBannerAction;\n /** Mono microcopy under the actions, e.g. beta-review cadence. */\n footnote?: ReactNode;\n}\n\nfunction Action({\n action,\n variant,\n}: {\n action: CtaBannerAction;\n variant: \"primary\" | \"secondary\";\n}) {\n if (action.href) {\n return (\n <a\n className={cn(\"ods-mkt-cta__link\", `ods-mkt-cta__link--${variant}`)}\n href={action.href}\n onClick={action.onClick}\n >\n {action.label}\n </a>\n );\n }\n return (\n <Button variant={variant} onClick={action.onClick}>\n {action.label}\n </Button>\n );\n}\n\nexport function CtaBanner({\n title,\n lede,\n primary,\n secondary,\n footnote,\n className,\n ...rest\n}: CtaBannerProps) {\n return (\n <section {...rest} className={cn(\"ods-mkt-cta\", className)}>\n <h2 className=\"ods-mkt-cta__title\">{title}</h2>\n {lede && <p className=\"ods-mkt-cta__lede\">{lede}</p>}\n <div className=\"ods-mkt-cta__actions\">\n <Action action={primary} variant=\"primary\" />\n {secondary && <Action action={secondary} variant=\"secondary\" />}\n </div>\n {footnote && <p className=\"ods-mkt-cta__footnote\">{footnote}</p>}\n </section>\n );\n}\n","\"use client\";\nimport { ChevronDownIcon } from \"@octaviaflow/icons\";\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useId,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Accordion — collapsible content sections.\n *\n * Used in ConfigPanel-style settings surfaces, FAQ blocks, runbook\n * docs, advanced-options sections. Two selection modes:\n * - `single` (default): only one item open at a time\n * - `multiple`: any combination of items can be open\n *\n * Controlled OR uncontrolled. Animated expand/collapse via\n * framer-motion (respects reduced-motion). Keyboard nav follows the\n * WAI-ARIA accordion pattern: ↑↓ moves between triggers, Home/End\n * jump to first/last, Enter/Space toggles.\n *\n * A11y: each item is `<div>` with a `<button aria-expanded>` header\n * and a `<div role=\"region\" aria-labelledby>` content panel.\n * ------------------------------------------------------------------------- */\n\nexport type AccordionMode = \"single\" | \"multiple\";\nexport type AccordionVariant = \"default\" | \"bordered\" | \"separated\";\n\nexport interface AccordionItem {\n /** Stable identifier. */\n id: string;\n /** Header label. */\n label: ReactNode;\n /** Optional secondary line below the label. */\n description?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional trailing slot in the header (badge, count, action). */\n trailing?: ReactNode;\n /** Panel content. */\n content: ReactNode;\n /** Disable interaction for this item. */\n disabled?: boolean;\n}\n\nexport interface AccordionProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n | \"onChange\"\n | \"defaultValue\"\n | \"children\"\n | \"onDrag\"\n | \"onDragStart\"\n | \"onDragEnd\"\n | \"onAnimationStart\"\n > {\n /** Items to render. */\n items: AccordionItem[];\n /** Single vs multiple expansion. Default `\"single\"`. */\n mode?: AccordionMode;\n /** Controlled expanded item ids. */\n value?: string[];\n /** Uncontrolled initial expanded ids. */\n defaultValue?: string[];\n /** Fires when the expanded set changes. */\n onValueChange?: (value: string[]) => void;\n /**\n * Allow the last open item to be closed (single mode). Default\n * `true`. When `false`, one item is always open — useful for tabbed-\n * like surfaces.\n */\n collapsible?: boolean;\n /** Visual variant. Default `\"default\"`. */\n variant?: AccordionVariant;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the entire accordion. */\n disabled?: boolean;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(\n {\n items,\n mode = \"single\",\n value: controlledValue,\n defaultValue,\n onValueChange,\n collapsible = true,\n variant = \"default\",\n size = \"md\",\n disabled = false,\n id: providedId,\n className,\n ...rest\n },\n ref,\n ) {\n const reactId = useId();\n const baseId = providedId ?? `ods-accordion-${reactId}`;\n const reducedMotion = useReducedMotion();\n\n const [internalValue, setInternalValue] = useState<string[]>(\n defaultValue ?? [],\n );\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n const valueSet = new Set(value);\n\n const setValue = useCallback(\n (next: string[]) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n const isOpen = valueSet.has(id);\n if (mode === \"multiple\") {\n const next = isOpen\n ? value.filter((v) => v !== id)\n : [...value, id];\n setValue(next);\n return;\n }\n // single\n if (isOpen) {\n // Only close if collapsible — otherwise no-op.\n if (collapsible) setValue([]);\n return;\n }\n setValue([id]);\n },\n [collapsible, mode, setValue, value, valueSet],\n );\n\n const handleKeyDown = (\n e: KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n const enabledIdx = items\n .map((it, i) => (it.disabled ? -1 : i))\n .filter((i) => i !== -1);\n const curr = enabledIdx.indexOf(index);\n const focusIdx = (i: number) => {\n const target = enabledIdx[i];\n if (target === undefined) return;\n const btn = document.getElementById(\n `${baseId}-trigger-${items[target]!.id}`,\n );\n (btn as HTMLButtonElement | null)?.focus();\n };\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n focusIdx((curr + 1) % enabledIdx.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusIdx((curr - 1 + enabledIdx.length) % enabledIdx.length);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n focusIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n focusIdx(enabledIdx.length - 1);\n }\n };\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={cn(\n \"ods-accordion\",\n `ods-accordion--${variant}`,\n `ods-accordion--${size}`,\n disabled && \"ods-accordion--disabled\",\n className,\n )}\n >\n {items.map((item, i) => {\n const isOpen = valueSet.has(item.id);\n const itemDisabled = item.disabled || disabled;\n const triggerId = `${baseId}-trigger-${item.id}`;\n const panelId = `${baseId}-panel-${item.id}`;\n return (\n <div\n key={item.id}\n className={cn(\n \"ods-accordion__item\",\n isOpen && \"ods-accordion__item--open\",\n itemDisabled && \"ods-accordion__item--disabled\",\n )}\n >\n <button\n id={triggerId}\n type=\"button\"\n className=\"ods-accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={itemDisabled}\n onClick={() => toggleItem(item.id)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n >\n {item.icon && (\n <span\n className=\"ods-accordion__icon\"\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"ods-accordion__label-wrap\">\n <span className=\"ods-accordion__label\">{item.label}</span>\n {item.description && (\n <span className=\"ods-accordion__description\">\n {item.description}\n </span>\n )}\n </span>\n {item.trailing && (\n <span\n className=\"ods-accordion__trailing\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.trailing}\n </span>\n )}\n <span\n className={cn(\n \"ods-accordion__chevron\",\n isOpen && \"ods-accordion__chevron--open\",\n )}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon size=\"sm\" aria-hidden />\n </span>\n </button>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n role=\"region\"\n id={panelId}\n aria-labelledby={triggerId}\n className=\"ods-accordion__panel\"\n initial={\n reducedMotion\n ? false\n : { height: 0, opacity: 0 }\n }\n animate={\n reducedMotion\n ? undefined\n : { height: \"auto\", opacity: 1 }\n }\n exit={\n reducedMotion\n ? undefined\n : { height: 0, opacity: 0 }\n }\n transition={\n reducedMotion\n ? { duration: 0 }\n : { duration: 0.18 }\n }\n style={{ overflow: \"hidden\" }}\n >\n <div className=\"ods-accordion__content\">\n {item.content}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nAccordion.displayName = \"Accordion\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Accordion } from \"../../../components/Accordion/Accordion\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * FaqSection — marketing Q&A built on the DS Accordion. One or two columns;\n * pass `defaultOpenIds` to pre-expand the questions that answer objections.\n * ------------------------------------------------------------------------- */\n\nexport interface FaqItem {\n id: string;\n question: ReactNode;\n answer: ReactNode;\n}\n\nexport interface FaqSectionProps extends ComponentPropsWithoutRef<\"div\"> {\n items: FaqItem[];\n columns?: 1 | 2;\n defaultOpenIds?: string[];\n}\n\nexport function FaqSection({\n items,\n columns = 1,\n defaultOpenIds = [],\n className,\n ...rest\n}: FaqSectionProps) {\n const half = Math.ceil(items.length / 2);\n const columnItems = columns === 2 ? [items.slice(0, half), items.slice(half)] : [items];\n\n return (\n <div {...rest} className={cn(\"ods-mkt-faq\", columns === 2 && \"ods-mkt-faq--2\", className)}>\n {columnItems.map((column, i) => (\n <Accordion\n // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional\n key={i}\n mode=\"multiple\"\n defaultValue={defaultOpenIds}\n items={column.map((item) => ({\n id: item.id,\n label: item.question,\n content: <div className=\"ods-mkt-faq__answer\">{item.answer}</div>,\n }))}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * FeatureGrid — hairline-bordered capability grid (the \"Everything you need\"\n * and AI-capability sections). Cells share borders like a table of features.\n * ------------------------------------------------------------------------- */\n\nexport interface FeatureGridItem {\n id: string;\n title: ReactNode;\n body: ReactNode;\n icon?: ReactNode;\n}\n\nexport interface FeatureGridProps extends ComponentPropsWithoutRef<\"div\"> {\n items: FeatureGridItem[];\n columns?: 2 | 3 | 4;\n /** Tighter cells for dense capability lists. */\n dense?: boolean;\n}\n\nexport function FeatureGrid({\n items,\n columns = 3,\n dense = false,\n className,\n ...rest\n}: FeatureGridProps) {\n return (\n <div\n {...rest}\n className={cn(\n \"ods-mkt-features\",\n `ods-mkt-features--${columns}`,\n dense && \"ods-mkt-features--dense\",\n className,\n )}\n >\n {items.map((item) => (\n <article key={item.id} className=\"ods-mkt-features__cell\">\n {item.icon && (\n <span className=\"ods-mkt-features__icon\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <h3 className=\"ods-mkt-features__title\">{item.title}</h3>\n <p className=\"ods-mkt-features__body\">{item.body}</p>\n </article>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon, SearchIcon } from \"@octaviaflow/icons\";\nimport { type FormEvent, type ReactNode, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * IntegrationsFinder — the /integrations page section: searchable connector\n * gallery with category pills (+ counts), native-first ordering, a\n * \"universal\" badge for tools reachable through the open connectors (never\n * overclaim), and a request-a-connector form when the search misses.\n *\n * Data, brand icons and the request transport come from the consuming site;\n * items without an icon fall back to a neutral letter tile.\n * ------------------------------------------------------------------------- */\n\nexport interface IntegrationsFinderItem {\n name: string;\n category: string;\n /** \"native\" (real template, default) or \"universal\" (via open connectors). */\n kind?: \"native\" | \"universal\";\n /** Extra search terms. */\n aliases?: string[];\n /** Brand icon node. Omit for a letter tile. */\n icon?: ReactNode;\n}\n\nexport interface IntegrationsFinderProps {\n items: IntegrationsFinderItem[];\n /** Category pill order. Defaults to first-appearance order in `items`. */\n categories?: string[];\n searchPlaceholder?: string;\n /** Badge on universal entries. Default \"Open API\". */\n universalBadgeLabel?: ReactNode;\n /**\n * Request-a-connector submit ({ query, email }). Resolve → sent state,\n * throw → error hint. Omit to hide the request form on misses.\n */\n onRequestConnector?: (request: { query: string; email: string }) => Promise<void> | void;\n /** Fallback line under a failed request, e.g. a contact address. */\n requestErrorHint?: ReactNode;\n className?: string;\n}\n\nfunction LetterTile({ name }: { name: string }) {\n return (\n <span className=\"ods-mkt-finder__letter\" aria-hidden=\"true\">\n {name.trim().charAt(0).toUpperCase()}\n </span>\n );\n}\n\ntype RequestState = \"idle\" | \"sending\" | \"sent\" | \"error\";\n\nexport function IntegrationsFinder({\n items,\n categories,\n searchPlaceholder = \"Find your connector — search by name or category…\",\n universalBadgeLabel = \"Open API\",\n onRequestConnector,\n requestErrorHint = \"Couldn't send right now — please try again in a moment.\",\n className,\n}: IntegrationsFinderProps) {\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [requestState, setRequestState] = useState<RequestState>(\"idle\");\n const [emailError, setEmailError] = useState(false);\n\n const pillCategories = useMemo(() => {\n if (categories?.length) return categories;\n const seen: string[] = [];\n for (const item of items) {\n if (!seen.includes(item.category)) seen.push(item.category);\n }\n return seen;\n }, [categories, items]);\n\n const counts = useMemo(() => {\n const map = new Map<string, number>();\n for (const item of items) map.set(item.category, (map.get(item.category) ?? 0) + 1);\n return map;\n }, [items]);\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase();\n let list = items;\n if (activeCategory) list = list.filter((c) => c.category === activeCategory);\n if (q) {\n list = list.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.category.toLowerCase().includes(q) ||\n c.aliases?.some((a) => a.toLowerCase().includes(q)),\n );\n }\n // Native connectors first, then alphabetical — the honest ordering.\n return [...list].sort((a, b) => {\n const aKind = a.kind ?? \"native\";\n const bKind = b.kind ?? \"native\";\n if (aKind !== bKind) return aKind === \"native\" ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n }, [items, query, activeCategory]);\n\n const handleRequest = async (event: FormEvent) => {\n event.preventDefault();\n if (!onRequestConnector || requestState === \"sending\") return;\n if (!isValidEmail(email)) {\n setEmailError(true);\n return;\n }\n setEmailError(false);\n setRequestState(\"sending\");\n try {\n await onRequestConnector({ query: query.trim(), email });\n setRequestState(\"sent\");\n } catch {\n setRequestState(\"error\");\n }\n };\n\n return (\n <div className={cn(\"ods-mkt-finder\", className)}>\n <div className=\"ods-mkt-finder__search\">\n <Input\n type=\"search\"\n aria-label=\"Search connectors\"\n placeholder={searchPlaceholder}\n leftIcon={<SearchIcon size=\"sm\" />}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setRequestState(\"idle\");\n }}\n />\n </div>\n\n <fieldset className=\"ods-mkt-finder__pills\" aria-label=\"Connector categories\">\n <button\n type=\"button\"\n className={cn(\n \"ods-mkt-finder__pill\",\n activeCategory === null && \"ods-mkt-finder__pill--active\",\n )}\n onClick={() => setActiveCategory(null)}\n >\n All <span className=\"ods-mkt-finder__count\">{items.length}</span>\n </button>\n {pillCategories.map((category) => (\n <button\n key={category}\n type=\"button\"\n className={cn(\n \"ods-mkt-finder__pill\",\n activeCategory === category && \"ods-mkt-finder__pill--active\",\n )}\n onClick={() => setActiveCategory(activeCategory === category ? null : category)}\n >\n {category} <span className=\"ods-mkt-finder__count\">{counts.get(category) ?? 0}</span>\n </button>\n ))}\n </fieldset>\n\n {results.length > 0 ? (\n <div className=\"ods-mkt-finder__grid\">\n {results.map((item) => (\n <div key={item.name} className=\"ods-mkt-finder__card\">\n <span className=\"ods-mkt-finder__card-icon\" aria-hidden=\"true\">\n {item.icon ?? <LetterTile name={item.name} />}\n </span>\n <span className=\"ods-mkt-finder__card-name\">{item.name}</span>\n {(item.kind ?? \"native\") === \"universal\" && (\n <span className=\"ods-mkt-finder__badge\">{universalBadgeLabel}</span>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"ods-mkt-finder__miss\">\n {requestState === \"sent\" ? (\n <p className=\"ods-mkt-finder__sent\" role=\"status\">\n <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" /> Got it — we'll let you know when a{\" \"}\n <strong>{query.trim()}</strong> connector is available.\n </p>\n ) : (\n <>\n <h3 className=\"ods-mkt-finder__miss-title\">\n No native <strong>{query.trim()}</strong> connector yet\n </h3>\n <p className=\"ods-mkt-finder__miss-body\">\n Our universal open connectors likely cover it today — and we build native connectors\n on request. {onRequestConnector && \"Leave your email and we'll notify you.\"}\n </p>\n {onRequestConnector && (\n <form className=\"ods-mkt-finder__miss-form\" onSubmit={handleRequest} noValidate>\n <Input\n type=\"email\"\n aria-label=\"Work email for connector request\"\n placeholder=\"you@company.com\"\n value={email}\n error={emailError}\n errorMessage={emailError ? \"Please enter a valid work email.\" : undefined}\n onChange={(e) => {\n setEmail(e.target.value);\n setEmailError(false);\n }}\n />\n <Button type=\"submit\" variant=\"primary\" loading={requestState === \"sending\"}>\n Request connector\n </Button>\n </form>\n )}\n {requestState === \"error\" && (\n <p className=\"ods-mkt-finder__miss-error\" role=\"alert\">\n {requestErrorHint}\n </p>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * IntegrationsWall — the homepage integrations section: a grid of category\n * cards (icon + category name + connector name pills) with a footnote.\n * Mirrors the real site's structure; the consuming site passes category\n * icons and real connector names. For the searchable /integrations page,\n * use IntegrationsFinder instead.\n * ------------------------------------------------------------------------- */\n\nexport interface IntegrationsWallItem {\n name: string;\n /** Optional per-pill brand icon. */\n icon?: ReactNode;\n}\n\nexport interface IntegrationsWallCategory {\n id: string;\n label: ReactNode;\n /** Category icon in the card header. */\n icon?: ReactNode;\n items: IntegrationsWallItem[];\n}\n\nexport interface IntegrationsWallProps extends ComponentPropsWithoutRef<\"div\"> {\n categories: IntegrationsWallCategory[];\n /** Mono footnote under the wall. */\n footnote?: ReactNode;\n columns?: 2 | 3;\n}\n\nexport function IntegrationsWall({\n categories,\n footnote,\n columns = 3,\n className,\n ...rest\n}: IntegrationsWallProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-wall\", className)}>\n <div className={cn(\"ods-mkt-wall__grid\", `ods-mkt-wall__grid--${columns}`)}>\n {categories.map((category) => (\n <div key={category.id} className=\"ods-mkt-wall__card\">\n <div className=\"ods-mkt-wall__card-head\">\n {category.icon && (\n <span className=\"ods-mkt-wall__card-icon\" aria-hidden=\"true\">\n {category.icon}\n </span>\n )}\n <h3 className=\"ods-mkt-wall__card-label\">{category.label}</h3>\n </div>\n <div className=\"ods-mkt-wall__pills\">\n {category.items.map((item) => (\n <span key={item.name} className=\"ods-mkt-wall__pill\">\n {item.icon && (\n <span className=\"ods-mkt-wall__pill-icon\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n {item.name}\n </span>\n ))}\n </div>\n </div>\n ))}\n </div>\n {footnote && <p className=\"ods-mkt-wall__footnote\">{footnote}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon, CloseIcon } from \"@octaviaflow/icons\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Spinner } from \"../../../components/Spinner/Spinner\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * LiveConsole — the \"orders_pipeline · production\" terminal card: a mono log\n * of pipeline steps with staggered reveal and per-line state icons.\n *\n * State icons are real DS glyphs, not text characters: check (done), the DS\n * Spinner (running), a dashed pending circle (queued) and a cross (error) —\n * all in a fixed-width rail so labels align like a real console.\n * ------------------------------------------------------------------------- */\n\nexport type LiveConsoleState = \"done\" | \"running\" | \"queued\" | \"error\";\n\nexport interface LiveConsoleLine {\n id: string;\n /** Step label, e.g. \"warehouse.load\". */\n label: ReactNode;\n /** Trailing detail, e.g. \"— 14,204 rows · 1.2s\". */\n detail?: ReactNode;\n state?: LiveConsoleState;\n}\n\nexport interface LiveConsoleProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> {\n /** Header label, e.g. \"orders_pipeline · production\". */\n title: ReactNode;\n /** Header badge. Defaults to \"LIVE\". Pass null to hide. */\n badge?: ReactNode;\n lines: LiveConsoleLine[];\n /** Staggered line reveal (disabled automatically for reduced motion). */\n animated?: boolean;\n}\n\n/** Dashed circle — \"queued/pending\", matching the flow editor's vocabulary. */\nfunction PendingGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"13\"\n height=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.5 3.5\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n </svg>\n );\n}\n\nfunction StateGlyph({ state }: { state: LiveConsoleState }) {\n switch (state) {\n case \"done\":\n return <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" />;\n case \"running\":\n return <Spinner size=\"sm\" />;\n case \"error\":\n return <CloseIcon size=\"sm\" aria-hidden=\"true\" />;\n case \"queued\":\n return <PendingGlyph />;\n }\n}\n\nexport function LiveConsole({\n title,\n badge = \"LIVE\",\n lines,\n animated = true,\n className,\n ...rest\n}: LiveConsoleProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-console\", className)}>\n <div className=\"ods-mkt-console__head\">\n <span className=\"ods-mkt-console__title\">{title}</span>\n {badge != null && (\n <span className=\"ods-mkt-console__badge\">\n <span className=\"ods-mkt-console__dot\" />\n {badge}\n </span>\n )}\n </div>\n <div className=\"ods-mkt-console__body\">\n {lines.map((line, i) => {\n const state = line.state ?? \"done\";\n return (\n <div\n key={line.id}\n className={cn(\"ods-mkt-console__line\", animated && \"ods-mkt-console__line--animated\")}\n style={animated ? { animationDelay: `${0.3 + i * 0.6}s` } : undefined}\n >\n <span\n className={cn(\"ods-mkt-console__glyph\", `ods-mkt-console__glyph--${state}`)}\n aria-hidden=\"true\"\n >\n <StateGlyph state={state} />\n </span>\n <span className=\"ods-mkt-console__text\">\n <span className=\"ods-mkt-console__label\">{line.label}</span>\n {line.detail && (\n <span\n className={cn(\n \"ods-mkt-console__detail\",\n state === \"running\" && \"ods-mkt-console__detail--running\",\n state === \"error\" && \"ods-mkt-console__detail--error\",\n )}\n >\n {\" \"}\n {line.detail}\n </span>\n )}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type SpinnerTone =\n | \"accent\"\n | \"muted\"\n | \"primary\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"inverse\";\n\ntype SvgPropsBase = Omit<\n ComponentPropsWithoutRef<\"svg\">,\n \"color\" | \"viewBox\" | \"fill\" | \"size\"\n>;\n\nexport interface SpinnerProps extends SvgPropsBase {\n /** Keyword size OR custom pixel number. Default `\"md\"`. */\n size?: SpinnerSize | number;\n /** Token-driven colour. Defaults to `\"accent\"`. Consumers can also\n * set `color` directly via `style` if they need a one-off. */\n tone?: SpinnerTone;\n /** Accessible label. Default `\"Loading\"`. */\n label?: string;\n}\n\nconst SIZE_PX: Record<SpinnerSize, number> = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48,\n};\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(function Spinner(\n {\n size = \"md\",\n tone = \"accent\",\n label = \"Loading\",\n className,\n style,\n ...rest\n },\n ref,\n) {\n const px = typeof size === \"number\" ? size : SIZE_PX[size];\n const isKeyword = typeof size === \"string\";\n\n return (\n <svg\n {...rest}\n ref={ref}\n className={cn(\n \"ods-spinner\",\n isKeyword && `ods-spinner--${size}`,\n `ods-spinner--${tone}`,\n className,\n )}\n width={px}\n height={px}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role=\"status\"\n aria-label={label}\n style={style}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 31.4\"\n className=\"ods-spinner__circle\"\n />\n </svg>\n );\n});\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * LogoMarquee — social-proof strip. Logos (or text wordmarks) scroll in a\n * seamless loop; the track is duplicated once (second copy aria-hidden) so\n * the animation wraps without a gap. Reduced-motion visitors get a static\n * wrapped row. The consuming site passes real logos via `icon`.\n * ------------------------------------------------------------------------- */\n\nexport interface LogoMarqueeItem {\n id: string;\n label: string;\n /** Logo mark. Omit for a plain text wordmark chip. */\n icon?: ReactNode;\n}\n\nexport interface LogoMarqueeProps extends ComponentPropsWithoutRef<\"div\"> {\n items: LogoMarqueeItem[];\n /** Mono microcopy above the strip, e.g. \"TRUSTED BY DATA TEAMS AT\". */\n label?: ReactNode;\n /** Seconds per full loop. Default 30. */\n speed?: number;\n /** Desaturate logos until hover. Default true. */\n grayscale?: boolean;\n}\n\nfunction Track({ items, hidden }: { items: LogoMarqueeItem[]; hidden?: boolean }) {\n return (\n <div className=\"ods-mkt-marquee__track\" aria-hidden={hidden || undefined}>\n {items.map((item) => (\n <span key={item.id} className=\"ods-mkt-marquee__logo\" title={item.label}>\n {item.icon ?? <span className=\"ods-mkt-marquee__wordmark\">{item.label}</span>}\n </span>\n ))}\n </div>\n );\n}\n\nexport function LogoMarquee({\n items,\n label,\n speed = 30,\n grayscale = true,\n className,\n ...rest\n}: LogoMarqueeProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-marquee\", grayscale && \"ods-mkt-marquee--gray\", className)}\n >\n {label && <p className=\"ods-mkt-marquee__label\">{label}</p>}\n <div className=\"ods-mkt-marquee__viewport\">\n <div className=\"ods-mkt-marquee__rail\" style={{ animationDuration: `${speed}s` }}>\n <Track items={items} />\n <Track items={items} hidden />\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkflowShowcaseRole } from \"./components/WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * Marketing glyphs — small stroke icons used as default \"app icon\" tiles\n * across the marketing subsystem (showcase cubes/chips, integration walls).\n *\n * Kept lucide-compatible (24×24 viewBox, stroke-based, currentColor) for\n * visual harmony with the rest of the design system. Consumers pass real\n * brand icons via each component's `icon` slot; these are the neutral\n * fallbacks so nothing ever renders as a bare letter pair.\n * ------------------------------------------------------------------------- */\n\ninterface GlyphProps {\n size?: number;\n}\n\nconst base = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n};\n\n/** Database cylinder — data sources. */\nexport function SourceGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14a9 3 0 0 0 18 0V5\" />\n <path d=\"M3 12a9 3 0 0 0 18 0\" />\n </svg>\n );\n}\n\n/** Archive box — warehouses / destinations. */\nexport function DestinationGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"5\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** Bolt — downstream actions / triggers. */\nexport function ActionGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M13 2 3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\n/** Chat bubble — notification targets. */\nexport function NotifyGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\n/** Plug — generic integration/connector mark (integration walls). */\nexport function ConnectorGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 22v-5\" />\n <path d=\"M9 8V2M15 8V2\" />\n <path d=\"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8h12z\" />\n </svg>\n );\n}\n\n/** OctaviaFlow brand mark — square with a forward arrow. */\nexport function BrandMark({ size = 18 }: GlyphProps) {\n return (\n <svg viewBox=\"0 0 18 18\" width={size} height={size} aria-hidden=\"true\">\n <rect width=\"18\" height=\"18\" fill=\"var(--ods-accent)\" />\n <path d=\"M4 9h8.5M9.5 5.5 13 9l-3.5 3.5\" stroke=\"#fff\" strokeWidth=\"1.6\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function roleGlyph(role: WorkflowShowcaseRole, size = 12): ReactNode {\n switch (role) {\n case \"source\":\n return <SourceGlyph size={size} />;\n case \"destination\":\n return <DestinationGlyph size={size} />;\n case \"action\":\n return <ActionGlyph size={size} />;\n case \"notify\":\n return <NotifyGlyph size={size} />;\n }\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { BrandMark } from \"../../glyphs\";\n\n/* ---------------------------------------------------------------------------\n * MarketingFooter — brand column + link columns + legal bar.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingFooterLink {\n label: ReactNode;\n href: string;\n}\n\nexport interface MarketingFooterColumn {\n id: string;\n label: ReactNode;\n links: MarketingFooterLink[];\n}\n\nexport interface MarketingFooterProps extends ComponentPropsWithoutRef<\"footer\"> {\n /** Brand slot. Defaults to the OctaviaFlow mark + wordmark. */\n brand?: ReactNode;\n /** Short positioning line under the brand. */\n tagline?: ReactNode;\n /** Extra brand-column content (contact email, status link…). */\n meta?: ReactNode;\n columns?: MarketingFooterColumn[];\n /**\n * Newsletter / stay-in-the-loop slot rendered in the brand column —\n * typically `<BetaAccessForm appearance=\"inline\" …/>`.\n */\n newsletter?: ReactNode;\n /** Left side of the bottom bar, e.g. \"© 2026 OctaviaFlow\". */\n legal?: ReactNode;\n /** Right side of the bottom bar, e.g. social handles. */\n social?: ReactNode;\n}\n\nexport function MarketingFooter({\n brand,\n tagline,\n meta,\n columns = [],\n newsletter,\n legal,\n social,\n className,\n ...rest\n}: MarketingFooterProps) {\n return (\n <footer {...rest} className={cn(\"ods-mkt-footer\", className)}>\n <div className=\"ods-mkt-footer__grid\">\n <div className=\"ods-mkt-footer__brand-col\">\n <div className=\"ods-mkt-footer__brand\">\n {brand ?? (\n <>\n <BrandMark size={16} />\n <span>OctaviaFlow</span>\n </>\n )}\n </div>\n {tagline && <p className=\"ods-mkt-footer__tagline\">{tagline}</p>}\n {meta && <div className=\"ods-mkt-footer__meta\">{meta}</div>}\n {newsletter && <div className=\"ods-mkt-footer__newsletter\">{newsletter}</div>}\n </div>\n {columns.map((column) => (\n <nav key={column.id} className=\"ods-mkt-footer__col\" aria-label={String(column.id)}>\n <span className=\"ods-mkt-footer__col-label\">{column.label}</span>\n {column.links.map((link) => (\n <a key={link.href} className=\"ods-mkt-footer__link\" href={link.href}>\n {link.label}\n </a>\n ))}\n </nav>\n ))}\n </div>\n {(legal || social) && (\n <div className=\"ods-mkt-footer__bar\">\n <span>{legal}</span>\n <span>{social}</span>\n </div>\n )}\n </footer>\n );\n}\n","\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * MarketingHero — the opening band: kicker, word-by-word animated display\n * headline, lede, then a free slot (typically the WorkflowShowcase).\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingHeroProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n /** Mono eyebrow, e.g. \"AI-NATIVE PLATFORM — PRIVATE BETA\". */\n kicker?: ReactNode;\n /** Plain-string headline — split into words for the rise animation. */\n title: string;\n lede?: ReactNode;\n align?: \"start\" | \"center\";\n}\n\nexport function MarketingHero({\n kicker,\n title,\n lede,\n align = \"center\",\n className,\n children,\n ...rest\n}: MarketingHeroProps) {\n const reducedMotion = useReducedMotion();\n const words = title.split(/\\s+/).filter(Boolean);\n\n return (\n <section\n {...rest}\n className={cn(\"ods-mkt-hero\", align === \"center\" && \"ods-mkt-hero--center\", className)}\n >\n {kicker && <p className=\"ods-mkt-hero__kicker\">{kicker}</p>}\n <h1 className=\"ods-mkt-hero__title\">\n {words.map((word, i) => (\n <span\n className=\"ods-mkt-hero__word-clip\"\n // biome-ignore lint/suspicious/noArrayIndexKey: words are positional\n key={i}\n >\n <motion.span\n className=\"ods-mkt-hero__word\"\n initial={reducedMotion ? false : { opacity: 0, y: \"100%\" }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n duration: 0.7,\n delay: 0.05 + i * 0.08,\n ease: [0.2, 0.7, 0.2, 1],\n }}\n >\n {word}\n </motion.span>{\" \"}\n </span>\n ))}\n </h1>\n {lede && (\n <motion.p\n className=\"ods-mkt-hero__lede\"\n initial={reducedMotion ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.8, delay: 0.6, ease: [0.2, 0.7, 0.2, 1] }}\n >\n {lede}\n </motion.p>\n )}\n {children && (\n <motion.div\n className=\"ods-mkt-hero__body\"\n initial={reducedMotion ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.8, delay: 0.75, ease: [0.2, 0.7, 0.2, 1] }}\n >\n {children}\n </motion.div>\n )}\n </section>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { BrandMark } from \"../../glyphs\";\n\n/* ---------------------------------------------------------------------------\n * MarketingNav — sticky top navigation for the marketing site.\n * Brand · links · right-aligned actions, with a hamburger + slide-down panel\n * on small screens so mobile visitors keep full navigation.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingNavLink {\n label: ReactNode;\n href: string;\n active?: boolean;\n}\n\nexport interface MarketingNavProps extends ComponentPropsWithoutRef<\"header\"> {\n /** Brand slot. Defaults to the OctaviaFlow mark + wordmark. */\n brand?: ReactNode;\n brandHref?: string;\n links?: MarketingNavLink[];\n /** Right side: login links, CTA buttons — consumer-provided. */\n actions?: ReactNode;\n sticky?: boolean;\n}\n\nfunction BurgerGlyph({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n {open ? <path d=\"M6 6l12 12M18 6 6 18\" /> : <path d=\"M4 7h16M4 12h16M4 17h16\" />}\n </svg>\n );\n}\n\nexport function MarketingNav({\n brand,\n brandHref = \"/\",\n links = [],\n actions,\n sticky = true,\n className,\n ...rest\n}: MarketingNavProps) {\n const [mobileOpen, setMobileOpen] = useState(false);\n\n return (\n <header {...rest} className={cn(\"ods-mkt-nav\", sticky && \"ods-mkt-nav--sticky\", className)}>\n <a className=\"ods-mkt-nav__brand\" href={brandHref}>\n {brand ?? (\n <>\n <BrandMark />\n <span>OctaviaFlow</span>\n </>\n )}\n </a>\n {links.length > 0 && (\n <nav className=\"ods-mkt-nav__links\" aria-label=\"Main\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className={cn(\"ods-mkt-nav__link\", link.active && \"ods-mkt-nav__link--active\")}\n aria-current={link.active ? \"page\" : undefined}\n >\n {link.label}\n </a>\n ))}\n </nav>\n )}\n {actions && <div className=\"ods-mkt-nav__actions\">{actions}</div>}\n\n {(links.length > 0 || actions) && (\n <button\n type=\"button\"\n className=\"ods-mkt-nav__toggle\"\n aria-expanded={mobileOpen}\n aria-label=\"Toggle menu\"\n onClick={() => setMobileOpen((open) => !open)}\n >\n <BurgerGlyph open={mobileOpen} />\n </button>\n )}\n\n {mobileOpen && (\n <nav className=\"ods-mkt-nav__mobile\" aria-label=\"Main\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className={cn(\n \"ods-mkt-nav__mobile-link\",\n link.active && \"ods-mkt-nav__mobile-link--active\",\n )}\n aria-current={link.active ? \"page\" : undefined}\n onClick={() => setMobileOpen(false)}\n >\n {link.label}\n </a>\n ))}\n {actions && <div className=\"ods-mkt-nav__mobile-actions\">{actions}</div>}\n </nav>\n )}\n </header>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * MarketingSection — the page-band primitive every marketing section sits in.\n * Kicker (mono microcopy) → display title → lede, then arbitrary children.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingSectionProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n /** Mono eyebrow above the title, e.g. \"PLATFORM\". */\n kicker?: ReactNode;\n title?: ReactNode;\n /** Lede paragraph under the title. */\n lede?: ReactNode;\n align?: \"start\" | \"center\";\n /** \"subtle\" gives the band a muted background. */\n tone?: \"default\" | \"subtle\";\n /** Remove the default top hairline (e.g. for the first section). */\n flushTop?: boolean;\n}\n\nexport function MarketingSection({\n kicker,\n title,\n lede,\n align = \"start\",\n tone = \"default\",\n flushTop = false,\n className,\n children,\n ...rest\n}: MarketingSectionProps) {\n return (\n <section\n {...rest}\n className={cn(\n \"ods-mkt-section\",\n align === \"center\" && \"ods-mkt-section--center\",\n tone === \"subtle\" && \"ods-mkt-section--subtle\",\n flushTop && \"ods-mkt-section--flush\",\n className,\n )}\n >\n {(kicker || title || lede) && (\n <header className=\"ods-mkt-section__head\">\n {kicker && <p className=\"ods-mkt-section__kicker\">{kicker}</p>}\n {title && <h2 className=\"ods-mkt-section__title\">{title}</h2>}\n {lede && <p className=\"ods-mkt-section__lede\">{lede}</p>}\n </header>\n )}\n {children}\n </section>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * PageHero — the inner-page opening shell (pricing, features, AI platform,\n * about…): kicker pill → h1 → subtitle, optionally a row of actions.\n * MarketingHero is the animated homepage opener; this is its calmer inner-\n * page counterpart.\n * ------------------------------------------------------------------------- */\n\nexport interface PageHeroProps extends Omit<ComponentPropsWithoutRef<\"header\">, \"title\"> {\n /** Kicker pill above the title, e.g. \"Pricing\". */\n kicker?: ReactNode;\n title: ReactNode;\n subtitle?: ReactNode;\n /** Optional action row under the subtitle. */\n actions?: ReactNode;\n align?: \"center\" | \"start\";\n}\n\nexport function PageHero({\n kicker,\n title,\n subtitle,\n actions,\n align = \"center\",\n className,\n ...rest\n}: PageHeroProps) {\n return (\n <header\n {...rest}\n className={cn(\"ods-mkt-pagehero\", align === \"start\" && \"ods-mkt-pagehero--start\", className)}\n >\n {kicker && <span className=\"ods-mkt-pagehero__kicker\">{kicker}</span>}\n <h1 className=\"ods-mkt-pagehero__title\">{title}</h1>\n {subtitle && <p className=\"ods-mkt-pagehero__subtitle\">{subtitle}</p>}\n {actions && <div className=\"ods-mkt-pagehero__actions\">{actions}</div>}\n </header>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon } from \"@octaviaflow/icons\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * PricingTiers — the /pricing plan grid: tier cards with price, period,\n * annual note, feature checklist and per-tier CTA; the featured tier gets a\n * highlight ring and badge. Prices and copy come entirely from the consumer\n * (pricing is site policy, not design-system content).\n * ------------------------------------------------------------------------- */\n\nexport interface PricingTierCta {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface PricingTier {\n id: string;\n name: ReactNode;\n /** Display price, e.g. \"$300\", \"Free\", \"Custom\". */\n price: ReactNode;\n /** Under the price, e.g. \"per month\", \"14-day trial\". */\n period?: ReactNode;\n /** e.g. \"Save 10% with annual billing\". */\n annualNote?: ReactNode;\n description?: ReactNode;\n features: ReactNode[];\n cta: PricingTierCta;\n featured?: boolean;\n /** Badge on the featured card. Default \"Recommended\". */\n badge?: ReactNode;\n}\n\nexport interface PricingTiersProps extends ComponentPropsWithoutRef<\"div\"> {\n tiers: PricingTier[];\n /** Footnote under the grid, e.g. the private-beta note. */\n note?: ReactNode;\n}\n\nfunction TierCta({ cta, featured }: { cta: PricingTierCta; featured: boolean }) {\n if (cta.href) {\n return (\n <a\n className={cn(\n \"ods-mkt-pricing__cta\",\n featured ? \"ods-mkt-pricing__cta--primary\" : \"ods-mkt-pricing__cta--secondary\",\n )}\n href={cta.href}\n onClick={cta.onClick}\n >\n {cta.label}\n </a>\n );\n }\n return (\n <Button variant={featured ? \"primary\" : \"secondary\"} fullWidth onClick={cta.onClick}>\n {cta.label}\n </Button>\n );\n}\n\nexport function PricingTiers({ tiers, note, className, ...rest }: PricingTiersProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-pricing\", className)}>\n <div className=\"ods-mkt-pricing__grid\">\n {tiers.map((tier) => (\n <article\n key={tier.id}\n className={cn(\n \"ods-mkt-pricing__card\",\n tier.featured && \"ods-mkt-pricing__card--featured\",\n )}\n >\n {tier.featured && (\n <span className=\"ods-mkt-pricing__badge\">{tier.badge ?? \"Recommended\"}</span>\n )}\n <h3 className=\"ods-mkt-pricing__name\">{tier.name}</h3>\n <div className=\"ods-mkt-pricing__price-row\">\n <span className=\"ods-mkt-pricing__price\">{tier.price}</span>\n {tier.period && <span className=\"ods-mkt-pricing__period\">{tier.period}</span>}\n </div>\n {tier.annualNote && <span className=\"ods-mkt-pricing__annual\">{tier.annualNote}</span>}\n {tier.description && <p className=\"ods-mkt-pricing__desc\">{tier.description}</p>}\n <ul className=\"ods-mkt-pricing__features\">\n {tier.features.map((feature, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: features are positional copy\n <li key={i} className=\"ods-mkt-pricing__feature\">\n <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" />\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n <TierCta cta={tier.cta} featured={Boolean(tier.featured)} />\n </article>\n ))}\n </div>\n {note && <p className=\"ods-mkt-pricing__note\">{note}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useReducedMotion } from \"framer-motion\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { CountUp } from \"../../../components/CountUp/CountUp\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * StatBand — big proof numbers (\"600+ CONNECTORS · 10× FASTER SETUP …\").\n * Numeric values count up on mount; strings render as-is.\n * ------------------------------------------------------------------------- */\n\nexport interface StatBandItem {\n id: string;\n /** Number → animated count-up; string → rendered verbatim (\"10×\"). */\n value: number | string;\n label: ReactNode;\n prefix?: string;\n suffix?: string;\n}\n\nexport interface StatBandProps extends ComponentPropsWithoutRef<\"div\"> {\n items: StatBandItem[];\n /** \"row\" = horizontal band; \"column\" = stacked rail (default). */\n orientation?: \"column\" | \"row\";\n}\n\nexport function StatBand({ items, orientation = \"column\", className, ...rest }: StatBandProps) {\n const reducedMotion = useReducedMotion();\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-statband\", `ods-mkt-statband--${orientation}`, className)}\n >\n {items.map((item) => (\n <div key={item.id} className=\"ods-mkt-statband__item\">\n <div className=\"ods-mkt-statband__value\">\n {typeof item.value === \"number\" ? (\n <CountUp\n value={item.value}\n duration={900}\n disableAnimation={Boolean(reducedMotion)}\n prefix={item.prefix}\n suffix={item.suffix}\n formatValue={(v) => Math.round(v).toLocaleString(\"en-US\")}\n />\n ) : (\n <>\n {item.prefix}\n {item.value}\n {item.suffix}\n </>\n )}\n </div>\n <div className=\"ods-mkt-statband__label\">{item.label}</div>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * CountUp — animated numeric counter.\n *\n * For ETL / orchestration dashboards: rows processed, runs completed,\n * MRR, throughput totals. Pairs naturally with `Sparkline` and `Stat`.\n *\n * The animation is implementation-light — a `requestAnimationFrame` loop\n * with a configurable easing function. Skips entirely when the user has\n * `prefers-reduced-motion` enabled or `disableAnimation` is true.\n *\n * Re-runs the tween whenever `value` changes, starting from the previous\n * displayed value (so consecutive updates flow smoothly without a reset\n * to 0).\n * ------------------------------------------------------------------------- */\n\nexport type Easing = (t: number) => number;\n\nexport interface CountUpProps\n extends Omit<\n ComponentPropsWithoutRef<\"span\">,\n // HTMLSpanElement carries a native `prefix` attribute (string) — omit\n // it so our `ReactNode` prefix slot can coexist.\n \"children\" | \"onChange\" | \"prefix\"\n > {\n /** Target value. */\n value: number;\n /** Starting value on FIRST mount. Default 0. */\n from?: number;\n /** Tween duration in ms. Default 800. */\n duration?: number;\n /** Easing function. Default `easeOutCubic`. */\n easing?: Easing;\n /** Decimal places when no `formatValue` is supplied. Default 0. */\n decimals?: number;\n /** Custom formatter — wins over `decimals`. */\n formatValue?: (value: number) => ReactNode;\n /** Inline content before the number. */\n prefix?: ReactNode;\n /** Inline content after the number (e.g. \"%\"). */\n suffix?: ReactNode;\n /** Delay the tween start in ms. */\n delay?: number;\n /**\n * Skip the animation and render `value` immediately. Reads as a\n * \"static mode\" — useful for SSR snapshots or print views.\n */\n disableAnimation?: boolean;\n /** Fires once when the tween settles on the target value. */\n onComplete?: () => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Easings\n * ------------------------------------------------------------------------- */\n\nexport const easeLinear: Easing = (t) => t;\nexport const easeOutCubic: Easing = (t) => 1 - Math.pow(1 - t, 3);\nexport const easeOutQuart: Easing = (t) => 1 - Math.pow(1 - t, 4);\nexport const easeOutExpo: Easing = (t) =>\n t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const CountUp = forwardRef<HTMLSpanElement, CountUpProps>(\n function CountUp(\n {\n value,\n from = 0,\n duration = 800,\n easing = easeOutCubic,\n decimals = 0,\n formatValue,\n prefix,\n suffix,\n delay = 0,\n disableAnimation = false,\n onComplete,\n className,\n ...rest\n },\n ref,\n ) {\n // The current rendered number. Initialise to `from` on first mount;\n // subsequent renders tween from the previous displayed value.\n const [n, setN] = useState<number>(disableAnimation ? value : from);\n const lastRendered = useRef<number>(disableAnimation ? value : from);\n\n useEffect(() => {\n // Respect prefers-reduced-motion — snap to target without animation.\n const reduced =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")\n .matches;\n\n if (disableAnimation || reduced) {\n setN(value);\n lastRendered.current = value;\n onComplete?.();\n return;\n }\n\n const startValue = lastRendered.current;\n const delta = value - startValue;\n if (delta === 0) return;\n\n let raf: number | null = null;\n let timeoutId: number | null = null;\n let startTime: number | null = null;\n let cancelled = false;\n\n const tick = (ts: number) => {\n if (cancelled) return;\n if (startTime === null) startTime = ts;\n const t = Math.min(1, (ts - startTime) / Math.max(1, duration));\n const eased = easing(t);\n const current = startValue + delta * eased;\n setN(current);\n lastRendered.current = current;\n if (t < 1) {\n raf = requestAnimationFrame(tick);\n } else {\n lastRendered.current = value;\n setN(value);\n onComplete?.();\n }\n };\n\n const start = () => {\n raf = requestAnimationFrame(tick);\n };\n\n if (delay > 0) {\n timeoutId = window.setTimeout(start, delay);\n } else {\n start();\n }\n\n return () => {\n cancelled = true;\n if (raf !== null) cancelAnimationFrame(raf);\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n };\n // We intentionally exclude `easing` from deps — it should be a\n // stable function reference. If the consumer changes easing\n // mid-flight, we just pick it up on the next value change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, duration, delay, disableAnimation]);\n\n const display = formatValue ? formatValue(n) : n.toFixed(decimals);\n\n return (\n <span\n {...rest}\n ref={ref}\n className={cn(\"ods-count-up\", className)}\n // aria-live so screen readers announce updates without a stale\n // value lingering. Polite (default for \"status\") avoids\n // interrupting other announcements.\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {prefix}\n {display}\n {suffix}\n </span>\n );\n },\n);\n\nCountUp.displayName = \"CountUp\";\n","\"use client\";\nimport { QuotesIcon, StarFilledIcon, StarIcon } from \"@octaviaflow/icons\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, type AvatarProps } from \"../Avatar\";\nimport { Card, type CardRadius } from \"../Card\";\n\n/* ---------------------------------------------------------------------------\n * TestimonialCard — pull-quote card with author + optional rating.\n *\n * Composes on the polished `Card` primitive (forwardRef, native props,\n * focus rings, radius). Uses the polished `Avatar` primitive for the\n * author photo and `@octaviaflow/icons` for the quote glyph + star\n * rating.\n * ------------------------------------------------------------------------- */\n\nexport type TestimonialCardSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TestimonialCardAuthor {\n /** Display name. */\n name: ReactNode;\n /** Avatar — forwarded to the polished Avatar primitive. */\n avatar?: Pick<AvatarProps, \"src\" | \"initials\" | \"alt\" | \"seed\" | \"palette\">;\n /** Job title / role / handle. */\n role?: ReactNode;\n}\n\nexport interface TestimonialCardProps\n extends Omit<\n ComponentPropsWithoutRef<\"figure\">,\n // Native `role` is an AriaRole string; our legacy `role` prop is a\n // ReactNode (author's job title). Omit so they don't collide.\n \"role\" | \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n /** The testimonial body. */\n quote: ReactNode;\n /**\n * Author — accepts either a plain ReactNode (legacy: name only) or a\n * structured `{ name, role?, avatar? }` object (preferred).\n */\n author: ReactNode | TestimonialCardAuthor;\n /** Legacy: author role rendered below the name. Use `author.role` instead. */\n role?: ReactNode;\n /** Legacy: raw avatar slot (e.g. <img />). Use `author.avatar` instead. */\n avatar?: ReactNode;\n /** Legacy: initial character to render in the avatar circle. */\n initial?: ReactNode;\n /** 0–5 star rating. */\n rating?: number;\n /** Optional company logo node — rendered top-right (e.g. customer logo). */\n logo?: ReactNode;\n /** Size variant — drives quote-text size + padding. */\n size?: TestimonialCardSize;\n /** Card corner radius (passes through). */\n radius?: CardRadius;\n}\n\nfunction isAuthorObject(v: TestimonialCardProps[\"author\"]): v is TestimonialCardAuthor {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !(\"type\" in (v as object)) && // exclude React elements\n \"name\" in (v as unknown as Record<string, unknown>)\n );\n}\n\nexport const TestimonialCard = forwardRef<HTMLElement, TestimonialCardProps>(\n function TestimonialCard(\n {\n quote,\n author,\n role: legacyRole,\n avatar: legacyAvatar,\n initial: legacyInitial,\n rating,\n logo,\n size = \"md\",\n radius = \"md\",\n id: providedId,\n className,\n ...rest\n },\n ref,\n ) {\n const reactId = useId();\n const baseId = providedId ?? `ods-testimonial-${reactId}`;\n const quoteId = `${baseId}-quote`;\n const authorId = `${baseId}-author`;\n\n // Resolve the author shape — structured wins, legacy props fill in.\n const resolved: TestimonialCardAuthor = isAuthorObject(author)\n ? author\n : {\n name: author,\n role: legacyRole,\n avatar: legacyAvatar\n ? undefined // legacy raw-node path handled below\n : {\n initials:\n typeof legacyInitial === \"string\"\n ? legacyInitial\n : typeof author === \"string\"\n ? author.charAt(0).toUpperCase()\n : undefined,\n },\n };\n\n const renderAvatar = () => {\n // Legacy raw `avatar` node (e.g. <img />) — preserve back-compat.\n if (!isAuthorObject(author) && legacyAvatar) {\n return (\n <span\n className=\"ods-testimonial__avatar ods-testimonial__avatar--legacy\"\n aria-hidden=\"true\"\n >\n {legacyAvatar}\n </span>\n );\n }\n return (\n <Avatar\n size={size === \"sm\" ? \"xs\" : size === \"lg\" ? \"md\" : \"sm\"}\n src={resolved.avatar?.src}\n initials={resolved.avatar?.initials}\n seed={resolved.avatar?.seed}\n palette={resolved.avatar?.palette}\n alt={\n resolved.avatar?.alt ?? (typeof resolved.name === \"string\" ? resolved.name : undefined)\n }\n className=\"ods-testimonial__avatar\"\n />\n );\n };\n\n return (\n <Card\n // Card forwards refs to a div; figure is a different element so we\n // render the figure semantics in our children and let Card own\n // the focusable surface as a generic block. The forwardRef on\n // TestimonialCard's outer type is `HTMLElement` so consumers\n // can still attach a ref without TS friction.\n {...(rest as unknown as ComponentPropsWithoutRef<\"div\">)}\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n id={baseId}\n radius={radius}\n padding=\"none\"\n variant=\"subtle\"\n className={cn(\"ods-testimonial\", `ods-testimonial--${size}`, className)}\n aria-labelledby={authorId}\n aria-describedby={quoteId}\n >\n <div className=\"ods-testimonial__head\">\n <span className=\"ods-testimonial__quote\" aria-hidden=\"true\">\n <QuotesIcon size=\"md\" />\n </span>\n {logo && (\n <span className=\"ods-testimonial__logo\" aria-hidden=\"true\">\n {logo}\n </span>\n )}\n </div>\n\n <blockquote id={quoteId} className=\"ods-testimonial__text\">\n {quote}\n </blockquote>\n\n {typeof rating === \"number\" && (\n <div\n className=\"ods-testimonial__rating\"\n role=\"img\"\n aria-label={`${rating} out of 5 stars`}\n >\n {Array.from({ length: 5 }).map((_, i) =>\n i < Math.round(rating) ? (\n <StarFilledIcon\n key={i}\n size=\"xs\"\n className=\"ods-testimonial__star ods-testimonial__star--on\"\n />\n ) : (\n <StarIcon key={i} size=\"xs\" className=\"ods-testimonial__star\" />\n ),\n )}\n </div>\n )}\n\n <figcaption className=\"ods-testimonial__author\" id={authorId}>\n {renderAvatar()}\n <span className=\"ods-testimonial__author-info\">\n <span className=\"ods-testimonial__author-name\">{resolved.name}</span>\n {resolved.role && <span className=\"ods-testimonial__author-role\">{resolved.role}</span>}\n </span>\n </figcaption>\n </Card>\n );\n },\n);\n\nTestimonialCard.displayName = \"TestimonialCard\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { TestimonialCard } from \"../../../components/TestimonialCard/TestimonialCard\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * TestimonialStrip — customer-proof grid composing the DS TestimonialCard.\n * Pair with MarketingSection for the kicker/title band.\n * ------------------------------------------------------------------------- */\n\nexport interface TestimonialStripItem {\n id: string;\n quote: ReactNode;\n author: {\n name: string;\n role?: ReactNode;\n /** Avatar spec forwarded to the DS Avatar primitive. */\n avatar?: { src?: string; initials?: string; alt?: string };\n };\n rating?: number;\n /** Customer company logo (top-right of the card). */\n logo?: ReactNode;\n}\n\nexport interface TestimonialStripProps extends ComponentPropsWithoutRef<\"div\"> {\n items: TestimonialStripItem[];\n columns?: 2 | 3;\n}\n\nexport function TestimonialStrip({\n items,\n columns = 3,\n className,\n ...rest\n}: TestimonialStripProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-testimonials\", `ods-mkt-testimonials--${columns}`, className)}\n >\n {items.map((item) => (\n <TestimonialCard\n key={item.id}\n quote={item.quote}\n author={item.author}\n rating={item.rating}\n logo={item.logo}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { CountUp } from \"../../../components/CountUp/CountUp\";\nimport { cn } from \"../../../utils/cn\";\nimport { roleGlyph } from \"../../glyphs\";\nimport { ShowcaseScene } from \"./ShowcaseScene\";\nimport { ShowcaseSignup } from \"./ShowcaseSignup\";\nimport {\n buildActivity,\n detectConnectors,\n isValidEmail,\n resolvePlan,\n SETTLED_PHASES,\n scheduleFromPrompt,\n segmentPrompt,\n WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n WORKFLOW_SHOWCASE_DEFAULT_TILES,\n WORKFLOW_SHOWCASE_SCHEDULES,\n WORKFLOW_SHOWCASE_TRIGGERS,\n type WorkflowShowcaseConnector,\n type WorkflowShowcaseExample,\n type WorkflowShowcaseMetric,\n type WorkflowShowcasePhase,\n type WorkflowShowcasePlan,\n type WorkflowShowcaseSignupValues,\n} from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * WorkflowShowcase — the marketing-site \"prompt → live pipeline → signup\"\n * funnel, as one self-driving composition.\n *\n * A visitor types (or taps an example), watches Octavia recognize connectors\n * live, builds the workflow on an isometric canvas with real-feeling\n * telemetry, and converts through an in-canvas workspace form — without ever\n * leaving the hero. All product copy (connector catalog, examples, metrics)\n * is prop-driven; the defaults are deliberately vendor-neutral.\n * ------------------------------------------------------------------------- */\n\nexport interface WorkflowShowcaseBuildDetail {\n prompt: string;\n connectors: string[];\n schedule: string;\n /** Trigger mode at build time: SCHEDULE / WEBHOOK / APP EVENT / MANUAL. */\n trigger: string;\n}\n\nexport interface WorkflowShowcaseProps\n extends Omit<ComponentPropsWithoutRef<\"section\">, \"onSubmit\"> {\n /** Connector catalog to recognize/pick from. Vendor-neutral by default. */\n connectors?: WorkflowShowcaseConnector[];\n /** \"TRY:\" example chips. */\n examples?: WorkflowShowcaseExample[];\n /** Right-rail metric cards. */\n metrics?: WorkflowShowcaseMetric[];\n /** Pre-filled prompt text. */\n defaultPrompt?: string;\n /**\n * Auto-rotate through the example prompts while the visitor hasn't\n * engaged (idle phase, not hovering/focusing/edited). Ignored when\n * `defaultPrompt` is set. Default true.\n */\n rotatePrompts?: boolean;\n /** Mono label at the right edge of the toolbar. */\n modelLabel?: string;\n /** Mono label in the canvas header. */\n canvasLabel?: string;\n /** Header of the live activity rail. */\n railLabel?: string;\n /** Labels for the 8 platform tiles in the scene. */\n platformTiles?: readonly string[];\n /** Icon on the core cube. */\n coreIcon?: ReactNode;\n /** Catalog-size figure used in coach copy, e.g. \"600+\". */\n catalogNote?: string;\n /** Team-size choices in the signup form. */\n teamSizes?: string[];\n /** Domain used for the workspace-slug preview in the welcome card. */\n workspaceDomain?: string;\n dashboardHref?: string;\n onboardingHref?: string;\n /** Accessible label for the prompt textarea. */\n promptAriaLabel?: string;\n /** Fires when a build kicks off (analytics hook). */\n onBuild?: (detail: WorkflowShowcaseBuildDetail) => void;\n /** Fires on every phase transition (analytics hook). */\n onPhaseChange?: (phase: WorkflowShowcasePhase) => void;\n /**\n * Real signup handler. Resolve → welcome card; throw → inline error and\n * back to the form. Omit to simulate provisioning (pure demo mode).\n */\n onSignup?: (values: WorkflowShowcaseSignupValues) => Promise<void> | void;\n}\n\ninterface SwapState {\n name: string;\n /** Exact text the visitor typed (may be an alias) — what gets replaced. */\n text: string;\n x: number;\n y: number;\n}\n\nconst EMPTY_PLAN: WorkflowShowcasePlan = { left: [], right: [], all: [], totalSteps: 1 };\n\nfunction ConnectorTile({ connector }: { connector: WorkflowShowcaseConnector }) {\n // Decorative app tile — hidden so button names stay clean for AT.\n // Consumers pass real brand icons via `icon`; the fallback is a role glyph.\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"ods-showcase__apptile\", `ods-showcase__apptile--${connector.role}`)}\n >\n {connector.icon ?? roleGlyph(connector.role)}\n </span>\n );\n}\n\nexport function WorkflowShowcase({\n connectors = WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n examples = WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n metrics = WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n defaultPrompt = \"\",\n rotatePrompts = true,\n modelLabel = \"octavia-core-1\",\n canvasLabel = \"workflow_canvas\",\n railLabel = \"OCTAVIA IS DOING\",\n platformTiles = WORKFLOW_SHOWCASE_DEFAULT_TILES,\n coreIcon,\n catalogNote = \"600+\",\n teamSizes = [\"1–10\", \"11–50\", \"51–200\", \"200+\"],\n workspaceDomain = \"octaviaflow.com\",\n dashboardHref,\n onboardingHref = \"#\",\n promptAriaLabel = \"Describe your pipeline\",\n onBuild,\n onPhaseChange,\n onSignup,\n className,\n ...rest\n}: WorkflowShowcaseProps) {\n const reducedMotion = useReducedMotion();\n // Prefill with the first example so the hero never opens on an empty box;\n // rotation cycles through the rest until the visitor engages.\n const rotationActive = rotatePrompts && !defaultPrompt && examples.length > 0;\n const [prompt, setPrompt] = useState(\n defaultPrompt || (rotationActive ? (examples[0]?.prompt ?? \"\") : \"\"),\n );\n const [engagedWithPrompt, setEngagedWithPrompt] = useState(false);\n const [promptHovered, setPromptHovered] = useState(false);\n const [promptFocused, setPromptFocused] = useState(false);\n const rotateIdx = useRef(0);\n const [selected, setSelected] = useState<string[]>([]);\n const [phase, setPhase] = useState<WorkflowShowcasePhase>(\"idle\");\n const [shown, setShown] = useState(0);\n const [status, setStatus] = useState(\"\");\n const [pickerOpen, setPickerOpen] = useState(false);\n const [schedIdx, setSchedIdx] = useState(0);\n const [swap, setSwap] = useState<SwapState | null>(null);\n const [signupError, setSignupError] = useState<string | null>(null);\n // Where Back returns to — signup can open from the done CTA or the core.\n const signupReturnPhase = useRef<WorkflowShowcasePhase>(\"done\");\n\n const cardRef = useRef<HTMLDivElement>(null);\n const timers = useRef<ReturnType<typeof setTimeout>[]>([]);\n const clearTimers = useCallback(() => {\n for (const t of timers.current) clearTimeout(t);\n timers.current = [];\n }, []);\n useEffect(() => clearTimers, [clearTimers]);\n // Compress the choreography (not the content) when the visitor prefers\n // reduced motion — they still see every step, just sooner.\n const tempo = reducedMotion ? 0.35 : 1;\n const at = useCallback(\n (ms: number, fn: () => void) => {\n timers.current.push(setTimeout(fn, ms * tempo));\n },\n [tempo],\n );\n\n const firstPhase = useRef(true);\n useEffect(() => {\n if (firstPhase.current) {\n firstPhase.current = false;\n return;\n }\n onPhaseChange?.(phase);\n }, [phase, onPhaseChange]);\n\n // Render-time mirror of `phase` so callbacks that reset + immediately\n // rebuild (example chips) never read a stale \"building\" and bail out.\n const phaseRef = useRef(phase);\n phaseRef.current = phase;\n\n const byName = useMemo(() => new Map(connectors.map((c) => [c.name, c])), [connectors]);\n const detected = useMemo(() => detectConnectors(prompt, connectors), [prompt, connectors]);\n const union = useMemo(() => [...new Set([...selected, ...detected])], [selected, detected]);\n const settled = SETTLED_PHASES.includes(phase);\n const engaged = phase !== \"idle\";\n const buildingNow = phase === \"analyzing\" || phase === \"building\";\n\n /** Partition currently-selected connectors into scene sides (no backfill). */\n const plan = useMemo<WorkflowShowcasePlan>(() => {\n if (!selected.length) return EMPTY_PLAN;\n return resolvePlan(selected, [], connectors);\n }, [selected, connectors]);\n\n /* ── schedule ──────────────────────────────────────────────────────── */\n const schedules = WORKFLOW_SHOWCASE_SCHEDULES;\n const inferredSchedule = scheduleFromPrompt(prompt);\n const manualSchedule = schedules[schedIdx];\n const scheduleShown = inferredSchedule ?? (manualSchedule === \"AUTO\" ? \"HOURLY\" : manualSchedule);\n\n /* ── trigger mode (schedule / webhook / app event / manual) ────────── */\n const triggers = WORKFLOW_SHOWCASE_TRIGGERS;\n const [triggerIdx, setTriggerIdx] = useState(0);\n const manualTrigger = triggers[triggerIdx];\n // What the coach line shows as the cadence: the schedule when the trigger\n // is time-based, otherwise the trigger mode itself.\n const cadenceShown = manualTrigger === \"SCHEDULE\" ? scheduleShown : manualTrigger;\n\n /* ── idle prompt rotation ──────────────────────────────────────────── */\n // Rotate example prompts while nobody is engaging; stop the instant the\n // visitor hovers, focuses, or edits — the box is theirs from then on.\n useEffect(() => {\n if (\n !rotationActive ||\n engagedWithPrompt ||\n promptHovered ||\n promptFocused ||\n phase !== \"idle\"\n ) {\n return;\n }\n const timer = setInterval(() => {\n rotateIdx.current = (rotateIdx.current + 1) % examples.length;\n setPrompt(examples[rotateIdx.current].prompt);\n }, 4200);\n return () => clearInterval(timer);\n }, [rotationActive, engagedWithPrompt, promptHovered, promptFocused, phase, examples]);\n\n /* ── build choreography ────────────────────────────────────────────── */\n const startBuild = useCallback(\n (text: string, baseSelected: string[]) => {\n if (phaseRef.current === \"analyzing\" || phaseRef.current === \"building\") return;\n phaseRef.current = \"analyzing\";\n clearTimers();\n const resolved = resolvePlan(baseSelected, detectConnectors(text, connectors), connectors);\n const target = resolved.all.map((c) => c.name);\n const additions = target.filter((n) => !baseSelected.includes(n));\n setPrompt(text);\n setSelected(baseSelected);\n setPhase(\"analyzing\");\n setShown(0);\n setStatus(\"analyzing request · matching connectors\");\n setPickerOpen(false);\n setSwap(null);\n onBuild?.({\n prompt: text,\n connectors: target,\n schedule: scheduleShown,\n trigger: manualTrigger,\n });\n additions.forEach((name, i) => {\n at(250 + i * 200, () => setSelected((s) => (s.includes(name) ? s : [...s, name])));\n });\n const t0 = 250 + additions.length * 200;\n at(t0 + 750, () => setStatus(\"wiring transforms · adding error handling\"));\n at(t0 + 1500, () => {\n setPhase(\"building\");\n setStatus(\"assembling workflow · optimizing plan\");\n });\n for (let i = 0; i < resolved.totalSteps; i++) {\n at(t0 + 1600 + i * 380, () => setShown(i + 1));\n }\n at(t0 + 1600 + resolved.totalSteps * 380 + 350, () => setPhase(\"done\"));\n },\n [clearTimers, connectors, onBuild, scheduleShown, manualTrigger, at],\n );\n\n const resetToIdle = useCallback(() => {\n clearTimers();\n phaseRef.current = \"idle\";\n setPhase(\"idle\");\n setShown(0);\n setStatus(\"\");\n setSwap(null);\n }, [clearTimers]);\n\n const toggleConnector = (name: string) => {\n resetToIdle();\n setSelected((s) => (s.includes(name) ? s.filter((n) => n !== name) : [...s, name]));\n };\n\n const runExample = (example: WorkflowShowcaseExample) => {\n resetToIdle();\n startBuild(example.prompt, []);\n };\n\n /* ── swap menu ─────────────────────────────────────────────────────── */\n const openSwap = (name: string, text: string, anchor: HTMLElement) => {\n const card = cardRef.current;\n if (!card) return;\n const r = anchor.getBoundingClientRect();\n const cr = card.getBoundingClientRect();\n const x = Math.max(8, Math.min(r.left - cr.left, cr.width - 264));\n setSwap({ name, text, x, y: r.bottom - cr.top + 6 });\n };\n const doSwap = (current: SwapState, next: string) => {\n resetToIdle();\n const re = new RegExp(current.text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"i\");\n setPrompt((p) => p.replace(re, next));\n setSelected((s) => s.map((n) => (n === current.name ? next : n)));\n };\n const swapRole = swap ? byName.get(swap.name)?.role : undefined;\n const swapItems = swapRole ? connectors.filter((c) => c.role === swapRole) : [];\n\n /* ── coach line ────────────────────────────────────────────────────── */\n const roles = union.map((n) => byName.get(n)?.role);\n const hasSource = roles.includes(\"source\");\n const hasSink = roles.some((r) => r && r !== \"source\");\n const hasNotify = roles.includes(\"notify\");\n let coachLine: string;\n let coachAdds: WorkflowShowcaseConnector[] = [];\n const notIn = (c: WorkflowShowcaseConnector) => !union.includes(c.name);\n if (!union.length) {\n coachLine = prompt\n ? \"LISTENING… CONNECTOR NAMES LIGHT UP AS OCTAVIA RECOGNIZES THEM\"\n : `OCTAVIA MATCHES CONNECTORS LIVE AS YOU TYPE — OR PICK FROM ${catalogNote}`;\n } else if (union.length >= connectors.length) {\n coachLine =\n \"FULL STACK — OCTAVIA SPLITS THIS INTO PARALLEL INGEST → AI TRANSFORM → SEQUENCED ACTIONS\";\n } else if (union.length >= 6) {\n coachLine = `BIG STACK — ${union.length} CONNECTORS FAN OUT ACROSS PARALLEL BRANCHES · COST OPTIMIZER ON`;\n } else if (hasSource && !hasSink) {\n coachLine = \"SOURCES WIRED — WHERE SHOULD THE DATA LAND?\";\n coachAdds = connectors.filter((c) => c.role === \"destination\" && notIn(c)).slice(0, 2);\n } else if (!hasSource && hasSink) {\n coachLine = \"DESTINATION SET — WHAT SHOULD OCTAVIA PULL FROM?\";\n coachAdds = connectors.filter((c) => c.role === \"source\" && notIn(c)).slice(0, 2);\n } else if (!hasNotify) {\n coachLine = `✓ ${union.length} CONNECTORS · ${cadenceShown} · TIP: ALERT YOUR TEAM WHEN RUNS FINISH`;\n coachAdds = connectors.filter((c) => c.role === \"notify\" && notIn(c)).slice(0, 1);\n } else {\n coachLine = `✓ ${union.length} CONNECTORS · ${cadenceShown} · CLICK A HIGHLIGHTED NAME TO SWAP IT`;\n }\n const coachTone = union.length ? (hasSource && hasSink ? \"success\" : \"accent\") : \"muted\";\n\n /* ── canvas derived state ──────────────────────────────────────────── */\n const badge = settled\n ? { label: \"LIVE\", tone: \"success\" as const, pulse: true }\n : buildingNow\n ? {\n label: phase === \"analyzing\" ? \"ANALYZING\" : \"BUILDING\",\n tone: \"accent\" as const,\n pulse: true,\n }\n : { label: \"IDLE\", tone: \"muted\" as const, pulse: false };\n const canvasSub = settled ? \"production\" : buildingNow ? \"generating\" : \"draft\";\n const sceneCaption = settled\n ? \"PIPELINE LIVE · SQUARES = ROWS IN FLIGHT\"\n : phase === \"building\"\n ? \"ASSEMBLING WORKFLOW…\"\n : phase === \"analyzing\"\n ? \"ANALYZING REQUEST…\"\n : \"CLICK THE CORE · CONNECTORS LAND AS CUBES\";\n\n const activity = buildActivity({ phase, shown, plan, selected, status });\n const costMetric = metrics.find((m) => m.tone === \"success\");\n const costLabel = costMetric\n ? `${costMetric.prefix ?? \"\"}${costMetric.value}${costMetric.suffix ?? \"\"}`\n : \"\";\n const railFoot =\n phase === \"idle\"\n ? `${catalogNote} CONNECTORS · FREE IN PRIVATE BETA`\n : settled\n ? `COST PLAN SELECTED · ${costLabel} SAVED`\n : \"COST OPTIMIZER RUNNING…\";\n\n const nLeft = plan.left.length;\n const sceneLeft = plan.left.map((c, i) => ({\n connector: c,\n active: engaged && (settled || shown > i),\n }));\n const sceneRight = plan.right.map((c, j) => ({\n connector: c,\n active: engaged && (settled || shown > nLeft + 1 + j),\n }));\n\n const stepCount = (selected.length || 3) + 1;\n const doneNote = costMetric\n ? `${stepCount}-step workflow generated · cost optimizer: ${costMetric.value}% below baseline`\n : `${stepCount}-step workflow generated`;\n\n /* ── signup ────────────────────────────────────────────────────────── */\n const submitSignup = (values: WorkflowShowcaseSignupValues) => {\n if (!values.name.trim() || !isValidEmail(values.email)) {\n setSignupError(\"Please enter your name and a valid work email.\");\n return;\n }\n setSignupError(null);\n setPhase(\"creating\");\n const finish = () => setPhase(\"welcome\");\n const fail = () => {\n setSignupError(\"Something went wrong — please try again.\");\n setPhase(\"signup\");\n };\n if (!onSignup) {\n at(1600, finish);\n return;\n }\n try {\n const result = onSignup(values);\n if (result && typeof (result as Promise<void>).then === \"function\") {\n (result as Promise<void>).then(finish, fail);\n } else {\n finish();\n }\n } catch {\n fail();\n }\n };\n\n /* ── prompt rendering ──────────────────────────────────────────────── */\n const segments = segmentPrompt(prompt, connectors);\n const onPromptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n startBuild(prompt, selected);\n }\n };\n\n const rise = (delay = 0) =>\n reducedMotion\n ? {}\n : {\n initial: { opacity: 0, y: 10 },\n animate: { opacity: 1, y: 0 },\n transition: { duration: 0.4, delay, ease: [0.2, 0.7, 0.2, 1] as const },\n };\n\n return (\n <section {...rest} className={cn(\"ods-showcase\", className)}>\n {/* ── prompt card ─────────────────────────────────────────────── */}\n <div\n ref={cardRef}\n className=\"ods-showcase__card\"\n onMouseEnter={() => setPromptHovered(true)}\n onMouseLeave={() => setPromptHovered(false)}\n >\n <div className=\"ods-showcase__prompt\">\n <textarea\n className=\"ods-showcase__prompt-input\"\n value={prompt}\n onChange={(e) => {\n setEngagedWithPrompt(true);\n setPrompt(e.target.value);\n }}\n onKeyDown={onPromptKeyDown}\n onFocus={() => setPromptFocused(true)}\n onBlur={() => setPromptFocused(false)}\n aria-label={promptAriaLabel}\n spellCheck={false}\n rows={2}\n />\n <div className=\"ods-showcase__prompt-render\" aria-hidden=\"true\">\n {prompt ? (\n segments.map((seg, i) =>\n seg.connector ? (\n <button\n // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature\n key={i}\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"ods-showcase__token\",\n `ods-showcase__token--${seg.connector.role}`,\n )}\n onClick={(e) => {\n const name = seg.connector?.name;\n if (name) openSwap(name, seg.text, e.currentTarget);\n }}\n >\n {/* Icon hides while editing so the overlay stays exactly\n caret-aligned with the transparent textarea text. */}\n {!promptFocused && <ConnectorTile connector={seg.connector} />}\n {seg.text}\n </button>\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature\n <span key={i}>{seg.text}</span>\n ),\n )\n ) : (\n <>\n <span className=\"ods-showcase__placeholder\">Describe your pipeline — e.g. </span>\n <span className=\"ods-showcase__placeholder ods-showcase__placeholder--faint\">\n \"Sync Storefront orders to Warehouse hourly, alert sales in Team Chat\"\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"ods-showcase__coach\">\n <span\n className={cn(\"ods-showcase__coach-line\", `ods-showcase__coach-line--${coachTone}`)}\n >\n {coachLine}\n </span>\n {coachAdds.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n className=\"ods-showcase__coach-add\"\n onClick={() => toggleConnector(c.name)}\n >\n <ConnectorTile connector={c} />+ {c.name}\n </button>\n ))}\n </div>\n\n <AnimatePresence initial={false}>\n {pickerOpen && (\n <motion.div\n className=\"ods-showcase__picker\"\n initial={reducedMotion ? false : { opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={reducedMotion ? { opacity: 0 } : { opacity: 0, height: 0 }}\n transition={{ duration: 0.22, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__picker-row\">\n <span className=\"ods-showcase__microcopy\">CONNECTORS</span>\n {connectors.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n className={cn(\n \"ods-showcase__pick\",\n selected.includes(c.name) && \"ods-showcase__pick--on\",\n )}\n aria-pressed={selected.includes(c.name)}\n onClick={() => toggleConnector(c.name)}\n >\n <ConnectorTile connector={c} />\n {c.name}\n </button>\n ))}\n <span className=\"ods-showcase__microcopy ods-showcase__microcopy--faint\">\n + {catalogNote} IN THE APP\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <div className=\"ods-showcase__toolbar\">\n <button\n type=\"button\"\n className={cn(\n \"ods-showcase__tool\",\n (pickerOpen || selected.length > 0) && \"ods-showcase__tool--on\",\n )}\n aria-expanded={pickerOpen}\n onClick={() => setPickerOpen((o) => !o)}\n >\n + Connectors{selected.length ? ` · ${selected.length}` : \"\"}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"ods-showcase__tool\",\n manualTrigger !== \"SCHEDULE\" && \"ods-showcase__tool--on\",\n )}\n onClick={() => setTriggerIdx((i) => (i + 1) % triggers.length)}\n >\n ⚑ {manualTrigger}\n </button>\n {manualTrigger === \"SCHEDULE\" && (\n <button\n type=\"button\"\n className=\"ods-showcase__tool\"\n onClick={() => setSchedIdx((i) => (i + 1) % schedules.length)}\n >\n ◷ {manualSchedule}\n </button>\n )}\n <span className=\"ods-showcase__model\">{modelLabel}</span>\n <Button\n variant=\"primary\"\n onClick={() => startBuild(prompt, selected)}\n disabled={buildingNow}\n >\n {buildingNow ? \"Building…\" : \"Build workflow →\"}\n </Button>\n </div>\n\n {swap && swapRole && (\n <>\n <button\n type=\"button\"\n className=\"ods-showcase__swap-backdrop\"\n aria-label=\"Close swap menu\"\n onClick={() => setSwap(null)}\n />\n <div\n className=\"ods-showcase__swap\"\n role=\"menu\"\n style={{ left: swap.x, top: swap.y }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setSwap(null);\n }}\n >\n <div className=\"ods-showcase__swap-head\">\n SWAP {swapRole.toUpperCase()} — {swap.name.toUpperCase()}\n </div>\n {swapItems.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n role=\"menuitem\"\n className=\"ods-showcase__swap-item\"\n onClick={() => doSwap(swap, c.name)}\n >\n <ConnectorTile connector={c} />\n <span className=\"ods-showcase__swap-name\">{c.name}</span>\n {c.name === swap.name && (\n <span className=\"ods-showcase__swap-mark\">● CURRENT</span>\n )}\n </button>\n ))}\n <div className=\"ods-showcase__swap-foot\">{catalogNote} CONNECTORS IN THE APP</div>\n </div>\n </>\n )}\n </div>\n\n {/* ── example chips ───────────────────────────────────────────── */}\n <div className=\"ods-showcase__examples\">\n <span className=\"ods-showcase__microcopy\">TRY:</span>\n {examples.map((ex) => (\n <button\n key={ex.id}\n type=\"button\"\n className=\"ods-showcase__try\"\n onClick={() => runExample(ex)}\n >\n {ex.label}\n </button>\n ))}\n </div>\n\n {/* ── canvas ──────────────────────────────────────────────────── */}\n <div className=\"ods-showcase__canvas\">\n <div className=\"ods-showcase__canvas-head\">\n <span className=\"ods-showcase__microcopy\">\n {canvasLabel} · {canvasSub}\n </span>\n <span className={cn(\"ods-showcase__badge\", `ods-showcase__badge--${badge.tone}`)}>\n <span className={cn(\"ods-showcase__dot\", badge.pulse && \"ods-showcase__dot--pulse\")} />\n {badge.label}\n </span>\n </div>\n <div className=\"ods-showcase__stage\">\n <div className=\"ods-showcase__rail\">\n <div className=\"ods-showcase__rail-head\">\n <span className=\"ods-showcase__microcopy\">{railLabel}</span>\n <span\n className={cn(\"ods-showcase__dot\", badge.pulse && \"ods-showcase__dot--pulse\")}\n />\n </div>\n <div className=\"ods-showcase__rail-body\">\n <AnimatePresence initial={false}>\n {activity.map((line) => (\n <motion.div\n key={line.id}\n className={cn(\"ods-showcase__act\", `ods-showcase__act--${line.tone}`)}\n initial={reducedMotion ? false : { opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.25 }}\n >\n {line.text}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n <div\n className={cn(\n \"ods-showcase__rail-foot\",\n settled && \"ods-showcase__rail-foot--done\",\n buildingNow && \"ods-showcase__rail-foot--active\",\n )}\n >\n {railFoot}\n </div>\n </div>\n\n <ShowcaseScene\n left={sceneLeft}\n right={sceneRight}\n engaged={engaged}\n tiles={platformTiles}\n coreIcon={coreIcon}\n caption={sceneCaption}\n onCoreClick={() => {\n // Second door into signup: clicking the core opens the same\n // workspace form as the CTA. Blocked mid-build so pending\n // phase timers can't stomp the overlay.\n if (\n buildingNow ||\n phase === \"signup\" ||\n phase === \"creating\" ||\n phase === \"welcome\"\n ) {\n return;\n }\n signupReturnPhase.current = phase;\n setSignupError(null);\n setPhase(\"signup\");\n }}\n />\n\n <div className=\"ods-showcase__metrics\">\n {metrics.map((m, idx) => {\n const revealed = settled || (phase === \"building\" && shown > idx);\n const interim = m.buildingValue != null && !settled && revealed;\n return (\n <div key={m.id} className=\"ods-showcase__metric\">\n <div\n className={cn(\n \"ods-showcase__metric-value\",\n !revealed && \"ods-showcase__metric-value--empty\",\n m.tone === \"success\" && settled && \"ods-showcase__metric-value--success\",\n )}\n >\n {settled ? (\n <CountUp\n value={m.value}\n from={m.buildingValue ?? 0}\n decimals={m.decimals ?? 0}\n duration={reducedMotion ? 0 : 900}\n disableAnimation={Boolean(reducedMotion)}\n prefix={m.prefix}\n formatValue={\n m.decimals ? undefined : (v) => Math.round(v).toLocaleString(\"en-US\")\n }\n />\n ) : interim ? (\n `${m.prefix ?? \"\"}${m.buildingValue}`\n ) : (\n \"—\"\n )}\n {revealed && m.suffix ? m.suffix : null}\n {revealed && m.unit ? (\n <span className=\"ods-showcase__metric-unit\"> {m.unit}</span>\n ) : null}\n </div>\n <div className=\"ods-showcase__microcopy\">{m.label}</div>\n </div>\n );\n })}\n </div>\n\n <ShowcaseSignup\n phase={phase}\n stepCount={stepCount}\n workspaceDomain={workspaceDomain}\n teamSizes={teamSizes}\n error={signupError}\n onSubmit={submitSignup}\n onBack={() => {\n setSignupError(null);\n setPhase(signupReturnPhase.current);\n }}\n dashboardHref={dashboardHref}\n onboardingHref={onboardingHref}\n />\n </div>\n </div>\n\n {/* ── status / CTA band ───────────────────────────────────────── */}\n <div className=\"ods-showcase__outro\" aria-live=\"polite\">\n {buildingNow && (\n <div className=\"ods-showcase__building\">\n <span className=\"ods-showcase__spin\" aria-hidden=\"true\">\n ⟳\n </span>{\" \"}\n {status}\n </div>\n )}\n {phase === \"done\" && (\n <div className=\"ods-showcase__done\">\n <motion.div className=\"ods-showcase__done-note\" {...rise(0)}>\n ✓ {doneNote}\n </motion.div>\n <motion.div className=\"ods-showcase__cta\" {...rise(0.2)}>\n <span className=\"ods-showcase__cta-copy\">\n Deploy it on your own data — takes 2 minutes.\n </span>\n <Button\n variant=\"primary\"\n onClick={() => {\n signupReturnPhase.current = \"done\";\n setSignupError(null);\n setPhase(\"signup\");\n }}\n >\n Create free account →\n </Button>\n <a className=\"ods-showcase__text-link\" href={onboardingHref}>\n Book onboarding →\n </a>\n </motion.div>\n </div>\n )}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { roleGlyph } from \"../../glyphs\";\nimport type { WorkflowShowcaseConnector } from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ShowcaseScene — the isometric \"workflow assembling itself\" illustration.\n *\n * Pure presentation: an isometric platform of capability tiles with the\n * Octavia core at the center, connector cubes landing on each side, and\n * particles tracing the guide paths (\"squares = rows in flight\"). The whole\n * scene is decorative — it's aria-hidden and every fact it communicates is\n * also present in the activity rail + metrics, which are real DOM text.\n * ------------------------------------------------------------------------- */\n\nexport interface ShowcaseSceneNode {\n connector: WorkflowShowcaseConnector;\n /** Whether this node's step has completed (wires + particles light up). */\n active: boolean;\n}\n\nexport interface ShowcaseSceneProps {\n left: ShowcaseSceneNode[];\n right: ShowcaseSceneNode[];\n /** Any build/run motion is happening (analyzing → welcome). */\n engaged: boolean;\n /** Platform tile labels (8). */\n tiles: readonly string[];\n /** Center-of-platform icon — any node: glyph, image, 3D asset embed. */\n coreIcon?: ReactNode;\n caption: string;\n /** Fires alongside the particle pulse when the core is clicked. */\n onCoreClick?: () => void;\n}\n\n/** Vertical slot centers for n cubes on one side (matches guide geometry). */\nfunction slots(n: number): number[] {\n return Array.from({ length: n }, (_, i) => 208 + (i - (n - 1) / 2) * 80);\n}\n\n// Entry/exit lanes across the platform edge — the tile-row centers and the\n// gaps between tiles — so each connector's line routes through its own\n// channel instead of every wire converging on one point.\nconst LANES = [228, 190, 266, 152, 304];\nconst laneFor = (index: number) => LANES[index % LANES.length];\n\nconst leftGuide = (cy: number, lane: number) => `M74 ${cy} H150 V${lane} H193`;\nconst rightGuide = (cy: number, lane: number) => `M263 ${lane} H340 V${cy} H388`;\n\ninterface ParticleSpec {\n key: string;\n path: string;\n size: number;\n duration: string;\n delay: string;\n variant: \"lead\" | \"echo\" | \"spark\";\n}\n\nfunction particlesFor(\n side: \"l\" | \"r\",\n index: number,\n path: string,\n active: boolean,\n fast: boolean,\n): ParticleSpec[] {\n const base = index * 0.4 + (side === \"r\" ? 0.5 : 0);\n const duration = fast ? (active ? \"1.1s\" : \"2.6s\") : active ? \"2.2s\" : \"4.8s\";\n const size = active ? 8 : 6;\n const out: ParticleSpec[] = [\n { key: `${side}${index}-a`, path, size, duration, delay: `${base}s`, variant: \"lead\" },\n {\n key: `${side}${index}-b`,\n path,\n size,\n duration,\n delay: `${base + (active ? 1.1 : 2.4)}s`,\n variant: \"echo\",\n },\n ];\n if (active) {\n out.push({\n key: `${side}${index}-c`,\n path,\n size: 6,\n duration,\n delay: `${base + 0.55}s`,\n variant: \"spark\",\n });\n }\n return out;\n}\n\nfunction DefaultCoreGlyph() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path\n d=\"M7 12h7M11.5 8.5 15 12l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CubeFace({ connector }: { connector: WorkflowShowcaseConnector }) {\n return (\n <span\n className={cn(\n \"ods-showcase__apptile\",\n \"ods-showcase__apptile--lg\",\n `ods-showcase__apptile--${connector.role}`,\n )}\n >\n {connector.icon ?? roleGlyph(connector.role, 18)}\n </span>\n );\n}\n\nexport function ShowcaseScene({\n left,\n right,\n engaged,\n tiles,\n coreIcon,\n caption,\n onCoreClick,\n}: ShowcaseSceneProps) {\n // Clicking the core briefly speeds particles up — a tiny reward that makes\n // the scene feel alive without changing any state that matters.\n const [pulse, setPulse] = useState(false);\n const pulseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (pulseTimer.current) clearTimeout(pulseTimer.current);\n },\n [],\n );\n const firePulse = () => {\n if (pulse) return;\n setPulse(true);\n pulseTimer.current = setTimeout(() => setPulse(false), 1500);\n };\n\n const leftYs = slots(left.length);\n const rightYs = slots(right.length);\n\n const guides: { d: string; on: boolean; delay: string }[] = [];\n const particles: ParticleSpec[] = [];\n\n // Continuous routing: each source line enters the platform, takes a lane,\n // skirts AROUND the core cuboid (bypass channel north or south of it, the\n // core spans x 193–263 / y 193–263), and continues out to its paired\n // destination — one unbroken journey across the board. Sources without a\n // destination exit down through the south pin edge instead.\n const bypassFor = (index: number) => (index % 2 === 0 ? 188 : 268);\n left.forEach((node, i) => {\n const on = engaged && node.active;\n const laneIn = laneFor(i);\n const bypass = bypassFor(i);\n let d: string;\n if (right.length) {\n const pairIdx = i % right.length;\n const laneOut = laneFor(i + 1);\n d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H270 V${laneOut} H340 V${rightYs[pairIdx]} H388`;\n } else {\n d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H${210 + (i % 3) * 40} V372`;\n }\n guides.push({ d, on, delay: `${i * 0.2}s` });\n particles.push(...particlesFor(\"l\", i, d, on, pulse));\n });\n // Destinations beyond the paired sources still get their own feed line.\n right.forEach((node, j) => {\n if (left.length > 0 && j < left.length) return; // already fed by a crossing\n const d = rightGuide(rightYs[j], laneFor(j + 1));\n const on = engaged && node.active;\n guides.push({ d, on, delay: `${j * 0.2 + 0.3}s` });\n particles.push(...particlesFor(\"r\", j, d, on, pulse));\n });\n if (!left.length) guides.push({ d: leftGuide(208, 228), on: false, delay: \"0s\" });\n if (!right.length) guides.push({ d: rightGuide(208, 228), on: false, delay: \"0s\" });\n\n // CPU-style pin traces on all four platform edges, each ending in a small\n // pad square (staggered accent ticks per edge).\n const pins: { d: string; accent: boolean }[] = [];\n const pads: { x: number; y: number; accent: boolean }[] = [];\n for (let x = 118; x <= 338; x += 20) {\n const south = (x / 20) % 4 === 0;\n const north = (x / 20) % 4 === 2;\n pins.push({ d: `M${x} 346 L${x} 366`, accent: south });\n pads.push({ x, y: 369, accent: south });\n pins.push({ d: `M${x} 110 L${x} 90`, accent: north });\n pads.push({ x, y: 87, accent: north });\n }\n for (let y = 118; y <= 338; y += 20) {\n const east = (y / 20) % 4 === 1;\n const west = (y / 20) % 4 === 3;\n pins.push({ d: `M346 ${y} L366 ${y}`, accent: east });\n pads.push({ x: 369, y, accent: east });\n pins.push({ d: `M110 ${y} L90 ${y}`, accent: west });\n pads.push({ x: 87, y, accent: west });\n }\n\n const tilePositions = [\n { left: 8, top: 8 },\n { left: 83, top: 8 },\n { left: 158, top: 8 },\n { left: 8, top: 83 },\n { left: 158, top: 83 },\n { left: 8, top: 158 },\n { left: 83, top: 158 },\n { left: 158, top: 158 },\n ];\n\n return (\n <div className=\"ods-showcase__scene\" aria-hidden=\"true\">\n <div className=\"ods-showcase__scene-stage\">\n <svg className=\"ods-showcase__wires\" width=\"460\" height=\"460\" aria-hidden=\"true\">\n {pins.map((pin) => (\n <path\n key={pin.d}\n d={pin.d}\n className={cn(\"ods-showcase__pin\", pin.accent && \"ods-showcase__pin--accent\")}\n />\n ))}\n {pads.map((pad) => (\n <rect\n key={`${pad.x}-${pad.y}`}\n x={pad.x - 2}\n y={pad.y - 2}\n width={4}\n height={4}\n className={cn(\"ods-showcase__pin-pad\", pad.accent && \"ods-showcase__pin-pad--accent\")}\n />\n ))}\n {guides.map((guide) => (\n <g key={guide.d}>\n <path d={guide.d} className=\"ods-showcase__guide\" />\n <path\n d={guide.d}\n className={cn(\n \"ods-showcase__guide-trace\",\n guide.on && \"ods-showcase__guide-trace--on\",\n )}\n style={{ animationDelay: guide.delay }}\n />\n </g>\n ))}\n </svg>\n\n {particles.map((p) => (\n <span\n key={p.key}\n className={cn(\"ods-showcase__particle\", `ods-showcase__particle--${p.variant}`)}\n style={\n {\n width: p.size,\n height: p.size,\n offsetPath: `path('${p.path}')`,\n animationDuration: p.duration,\n animationDelay: p.delay,\n } as CSSProperties\n }\n />\n ))}\n\n <div className=\"ods-showcase__platform\">\n <span className=\"ods-showcase__platform-south\" />\n <span className=\"ods-showcase__platform-east\" />\n <span className=\"ods-showcase__platform-top\" />\n {/* Capability tiles — flat by default; hovering lifts one into a\n complete mini glass cuboid (face rises, four walls fade in). */}\n {tiles.slice(0, 8).map((label, i) => (\n <span\n key={label}\n className=\"ods-showcase__tile\"\n style={{ left: tilePositions[i].left, top: tilePositions[i].top }}\n >\n <span className=\"ods-showcase__tile-flip\">\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--south\" />\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--east\" />\n </span>\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--south\" />\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--east\" />\n <span className=\"ods-showcase__tile-face\">{label}</span>\n </span>\n ))}\n {pulse && <span className=\"ods-showcase__core-ring\" />}\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"ods-showcase__core\"\n onClick={() => {\n firePulse();\n onCoreClick?.();\n }}\n >\n {/* Glass cuboid: translucent walls so the volume reads as a 3D\n box you can see through; the lid stays solid. The north/west\n walls REUSE the proven south/east transforms inside a 180°-\n rotated wrapper — connection to the lid is guaranteed by\n construction instead of fresh rotation math. */}\n <span className=\"ods-showcase__core-flip\">\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--south ods-showcase__core-wall--back\" />\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--east ods-showcase__core-wall--back\" />\n </span>\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--south\" />\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--east\" />\n <span className=\"ods-showcase__core-top\">{coreIcon ?? <DefaultCoreGlyph />}</span>\n </button>\n </div>\n\n <span className=\"ods-showcase__floater ods-showcase__floater--a\" />\n <span className=\"ods-showcase__floater ods-showcase__floater--b\" />\n <span className=\"ods-showcase__floater ods-showcase__floater--c\" />\n\n {!left.length && (\n <span className=\"ods-showcase__ghost\" style={{ left: 8, top: 178 }}>\n +\n </span>\n )}\n {!right.length && (\n <span className=\"ods-showcase__ghost\" style={{ left: 392, top: 178 }}>\n +\n </span>\n )}\n\n {/* Each cube sits in a STATIC preserve-3d slot with the animated\n element nested inside — the exact layering the core uses\n (platform → animated core → faces). Animating the outermost\n positioned element directly under the stage is what broke the\n cubes' 3D context; don't collapse these two layers. */}\n {left.map((node, i) => (\n <span\n key={node.connector.name}\n className=\"ods-showcase__cube-slot\"\n style={{ left: 8, top: leftYs[i] - 30 }}\n >\n <span\n className={cn(\n \"ods-showcase__cube\",\n node.active && \"ods-showcase__cube--active\",\n i % 2 ? \"ods-showcase__cube--float-b\" : \"ods-showcase__cube--float-a\",\n )}\n style={{ animationDelay: `${i * 0.15}s` }}\n >\n <span className=\"ods-showcase__cube-flip\">\n <span className=\"ods-showcase__cube-south ods-showcase__cube-wall--back\" />\n <span className=\"ods-showcase__cube-east ods-showcase__cube-wall--back\" />\n </span>\n <span className=\"ods-showcase__cube-south\" />\n <span className=\"ods-showcase__cube-east\" />\n <span className=\"ods-showcase__cube-top\">\n <CubeFace connector={node.connector} />\n </span>\n </span>\n </span>\n ))}\n {right.map((node, j) => (\n <span\n key={node.connector.name}\n className=\"ods-showcase__cube-slot\"\n style={{ left: 392, top: rightYs[j] - 30 }}\n >\n <span\n className={cn(\n \"ods-showcase__cube\",\n node.active && \"ods-showcase__cube--active\",\n j % 2 ? \"ods-showcase__cube--float-a\" : \"ods-showcase__cube--float-b\",\n )}\n style={{ animationDelay: `${j * 0.15}s` }}\n >\n <span className=\"ods-showcase__cube-flip\">\n <span className=\"ods-showcase__cube-south ods-showcase__cube-wall--back\" />\n <span className=\"ods-showcase__cube-east ods-showcase__cube-wall--back\" />\n </span>\n <span className=\"ods-showcase__cube-south\" />\n <span className=\"ods-showcase__cube-east\" />\n <span className=\"ods-showcase__cube-top\">\n <CubeFace connector={node.connector} />\n </span>\n </span>\n </span>\n ))}\n </div>\n <span className=\"ods-showcase__scene-caption\">{caption}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { FocusScope } from \"react-aria\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport {\n slugify,\n type WorkflowShowcasePhase,\n type WorkflowShowcaseSignupValues,\n} from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ShowcaseSignup — the conversion overlay that floats over the canvas.\n *\n * Three moments share one glass surface: the workspace form (\"signup\"),\n * the provisioning interstitial (\"creating\") and the welcome card\n * (\"welcome\"). It follows the Dialog accessibility reference: minted ids\n * wired to aria-labelledby/-describedby, focus contained + restored.\n * ------------------------------------------------------------------------- */\n\nexport interface ShowcaseSignupProps {\n phase: WorkflowShowcasePhase;\n stepCount: number;\n workspaceDomain: string;\n teamSizes: string[];\n error: string | null;\n onSubmit: (values: WorkflowShowcaseSignupValues) => void;\n onBack: () => void;\n dashboardHref?: string;\n onboardingHref?: string;\n}\n\nconst OVERLAY_MOTION = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n};\n\nexport function ShowcaseSignup({\n phase,\n stepCount,\n workspaceDomain,\n teamSizes,\n error,\n onSubmit,\n onBack,\n dashboardHref = \"#\",\n onboardingHref = \"#\",\n}: ShowcaseSignupProps) {\n const reducedMotion = useReducedMotion();\n const titleId = useId();\n const subtitleId = useId();\n const [values, setValues] = useState<WorkflowShowcaseSignupValues>({\n name: \"\",\n email: \"\",\n company: \"\",\n teamSize: teamSizes[0] ?? \"1–10\",\n });\n\n const open = phase === \"signup\" || phase === \"creating\" || phase === \"welcome\";\n const cardMotion = reducedMotion\n ? OVERLAY_MOTION\n : {\n initial: { opacity: 0, y: 14, scale: 0.985 },\n animate: { opacity: 1, y: 0, scale: 1 },\n exit: { opacity: 0, y: 8, scale: 0.99 },\n };\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault();\n onSubmit(values);\n };\n\n const firstName = values.name.trim().split(/\\s+/)[0] || \"\";\n const emailShown = values.email.trim() || \"your inbox\";\n const slug = `${slugify(values.company)}.${workspaceDomain}`;\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className=\"ods-showcase__veil\"\n {...OVERLAY_MOTION}\n transition={{ duration: reducedMotion ? 0 : 0.22 }}\n >\n <FocusScope contain restoreFocus autoFocus>\n {phase === \"signup\" && (\n <motion.form\n key=\"signup\"\n className=\"ods-showcase__glass-card\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={subtitleId}\n onSubmit={handleSubmit}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onBack();\n }}\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__glass-head\">\n <h3 id={titleId} className=\"ods-showcase__glass-title\">\n Create your workspace\n </h3>\n <p id={subtitleId} className=\"ods-showcase__microcopy\">\n FREE IN PRIVATE BETA · YOUR {stepCount}-STEP WORKFLOW COMES WITH YOU\n </p>\n </div>\n <div className=\"ods-showcase__form-grid\">\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">FULL NAME</span>\n <Input\n aria-label=\"Full name\"\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">WORK EMAIL</span>\n <Input\n aria-label=\"Work email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">COMPANY</span>\n <Input\n aria-label=\"Company\"\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">TEAM SIZE</span>\n <Select\n aria-label=\"Team size\"\n options={teamSizes.map((size) => ({ value: size, label: size }))}\n value={values.teamSize}\n onChange={(teamSize) => setValues((v) => ({ ...v, teamSize }))}\n />\n </div>\n </div>\n {error && (\n <p className=\"ods-showcase__form-error\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"ods-showcase__glass-foot\">\n <span className=\"ods-showcase__microcopy\">\n NO CREDIT CARD · SSO & SELF-HOSTING LATER\n </span>\n <div className=\"ods-showcase__glass-actions\">\n <Button type=\"button\" variant=\"secondary\" onClick={onBack}>\n Back\n </Button>\n <Button type=\"submit\" variant=\"primary\">\n Create account & deploy →\n </Button>\n </div>\n </div>\n </motion.form>\n )}\n\n {phase === \"creating\" && (\n <motion.div\n key=\"creating\"\n className=\"ods-showcase__glass-card ods-showcase__glass-card--slim\"\n role=\"status\"\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.25 }}\n >\n <span className=\"ods-showcase__spin\" aria-hidden=\"true\">\n ⟳\n </span>\n <span className=\"ods-showcase__creating-line\">\n provisioning workspace · saving draft · inviting {emailShown}\n </span>\n </motion.div>\n )}\n\n {phase === \"welcome\" && (\n <motion.div\n key=\"welcome\"\n className=\"ods-showcase__glass-card ods-showcase__glass-card--welcome\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__glass-head\">\n <p className=\"ods-showcase__microcopy ods-showcase__microcopy--success\">\n ✓ WORKSPACE READY\n </p>\n <h3 id={titleId} className=\"ods-showcase__glass-title\">\n Welcome to OctaviaFlow{firstName ? `, ${firstName}` : \"\"}.\n </h3>\n <p className=\"ods-showcase__welcome-body\">\n We emailed a sign-in link to <strong>{emailShown}</strong>. Your {stepCount}\n -step workflow is saved as a draft in{\" \"}\n <code className=\"ods-showcase__slug\">{slug}</code> — deploy it from the\n dashboard whenever you're ready.\n </p>\n </div>\n <div className=\"ods-showcase__glass-foot\">\n <div className=\"ods-showcase__glass-actions\">\n <a className=\"ods-showcase__solid-link\" href={dashboardHref}>\n Open dashboard →\n </a>\n <a className=\"ods-showcase__text-link\" href={onboardingHref}>\n Book onboarding →\n </a>\n </div>\n <span className=\"ods-showcase__microcopy ods-showcase__microcopy--right\">\n PRIVATE BETA\n <br />\n ONBOARDING INCLUDED\n </span>\n </div>\n </motion.div>\n )}\n </FocusScope>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_react","import_react","import_react","Slot","import_jsx_runtime","Button","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","$1CcWn$react","$1CcWn$useState","$1CcWn$useRef","$1CcWn$useEffect","$1CcWn$useReducer","$1CcWn$useCallback","value","$8AuPP$createContext","$8AuPP$useMemo","$8AuPP$useContext","name","$8AuPP$useState","$8AuPP$useRef","$8AuPP$useEffect","value","a","a","$7w3VE$useRef","$7w3VE$useState","$7w3VE$useMemo","$7w3VE$useEffect","$jO8i1$react","items","node","$emYU7$useMemo","$3yt54$useMemo","$3yt54$useCallback","$3yt54$useRef","$3yt54$useEffect","$kE40A$useCallback","$dJmKC$react","$5t5rb$useState","$5t5rb$useMemo","value","focusStrategy","$auOuY$useMemo","$auOuY$useRef","$auOuY$useEffect","import_icons","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","Select","import_react","import_react_aria","import_react_dom","import_icons","import_react","import_react","import_icons","import_react","import_jsx_runtime","import_jsx_runtime","Textarea","import_jsx_runtime","import_react","import_react","import_jsx_runtime","Avatar","AvatarStack","import_framer_motion","import_react","import_jsx_runtime","Card","CardHeader","CardBody","CardFooter","CardTitle","CardDescription","import_jsx_runtime","BlogCard","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_icons","import_framer_motion","import_react","import_jsx_runtime","Accordion","import_jsx_runtime","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","Spinner","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_icons","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","CountUp","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","TestimonialCard","import_jsx_runtime","import_framer_motion","import_react","import_react","import_jsx_runtime","base","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/marketing/index.ts","../src/utils/cn.ts","../src/marketing/components/AssistantTranscript/AssistantTranscript.tsx","../src/marketing/components/BackedBy/BackedBy.tsx","../src/marketing/components/BetaAccessForm/BetaAccessForm.tsx","../src/components/Button/Button.tsx","../src/utils/a11y.ts","../src/utils/Slot.tsx","../src/utils/composeRefs.ts","../src/components/Input/Input.tsx","../src/components/Select/Select.tsx","../../../node_modules/react-stately/dist/private/utils/packages/react-stately/src/utils/useControlledState.ts","../../../node_modules/react-stately/dist/private/form/packages/react-stately/src/form/useFormValidationState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/getChildNodes.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/ListCollection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/Selection.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/useMultipleSelectionState.ts","../../../node_modules/react-stately/dist/private/selection/packages/react-stately/src/selection/SelectionManager.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/CollectionBuilder.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/useCollection.ts","../../../node_modules/react-stately/dist/private/list/packages/react-stately/src/list/useListState.ts","../../../node_modules/react-stately/dist/private/overlays/packages/react-stately/src/overlays/useOverlayTriggerState.ts","../../../node_modules/react-stately/dist/private/collections/packages/react-stately/src/collections/Item.ts","../../../node_modules/react-stately/dist/private/select/packages/react-stately/src/select/useSelectState.ts","../../../node_modules/react-stately/dist/private/tooltip/packages/react-stately/src/tooltip/useTooltipTriggerState.ts","../src/components/Tooltip/Tooltip.tsx","../src/components/Textarea/Textarea.tsx","../src/hooks/useTextareaCommands.ts","../src/hooks/useTextareaSelection.ts","../src/hooks/useTextareaTools.tsx","../src/marketing/components/WorkflowShowcase/showcaseEngine.ts","../src/components/BlogCard/BlogCard.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Card/Card.tsx","../src/marketing/components/BlogGrid/BlogGrid.tsx","../src/marketing/components/ContactForm/ContactForm.tsx","../src/marketing/components/CtaBanner/CtaBanner.tsx","../src/components/Accordion/Accordion.tsx","../src/marketing/components/FaqSection/FaqSection.tsx","../src/marketing/components/FeatureGrid/FeatureGrid.tsx","../src/marketing/components/IntegrationsFinder/IntegrationsFinder.tsx","../src/marketing/components/IntegrationsWall/IntegrationsWall.tsx","../src/marketing/components/LiveConsole/LiveConsole.tsx","../src/components/Spinner/Spinner.tsx","../src/marketing/components/LogoMarquee/LogoMarquee.tsx","../src/marketing/glyphs.tsx","../src/marketing/components/MarketingFooter/MarketingFooter.tsx","../src/marketing/components/MarketingHero/MarketingHero.tsx","../src/marketing/components/MarketingNav/MarketingNav.tsx","../src/marketing/components/MarketingSection/MarketingSection.tsx","../src/marketing/components/PageHero/PageHero.tsx","../src/marketing/components/PricingTiers/PricingTiers.tsx","../src/marketing/components/StatBand/StatBand.tsx","../src/components/CountUp/CountUp.tsx","../src/components/TestimonialCard/TestimonialCard.tsx","../src/marketing/components/TestimonialStrip/TestimonialStrip.tsx","../src/marketing/components/WorkflowShowcase/WorkflowShowcase.tsx","../src/marketing/components/WorkflowShowcase/ShowcaseScene.tsx","../src/marketing/components/WorkflowShowcase/ShowcaseSignup.tsx"],"sourcesContent":["/* ---------------------------------------------------------------------------\n * @octaviaflow/core/marketing — everything for the marketing site.\n *\n * A dedicated subsystem (like `@octaviaflow/core/workflow`) so marketing\n * surfaces stay clearly separated from product components. Storybook group:\n * `Marketing/`.\n * ------------------------------------------------------------------------- */\n\nexport {\n AssistantTranscript,\n type AssistantTranscriptProps,\n type AssistantTranscriptTurn,\n} from \"./components/AssistantTranscript/AssistantTranscript\";\nexport {\n BackedBy,\n type BackedByItem,\n type BackedByProps,\n} from \"./components/BackedBy/BackedBy\";\nexport {\n BetaAccessForm,\n type BetaAccessFormProps,\n type BetaAccessValues,\n} from \"./components/BetaAccessForm/BetaAccessForm\";\nexport {\n BlogGrid,\n type BlogGridPost,\n type BlogGridProps,\n} from \"./components/BlogGrid/BlogGrid\";\nexport {\n ContactForm,\n type ContactFormProps,\n type ContactFormTopic,\n type ContactFormValues,\n} from \"./components/ContactForm/ContactForm\";\nexport {\n CtaBanner,\n type CtaBannerAction,\n type CtaBannerProps,\n} from \"./components/CtaBanner/CtaBanner\";\nexport {\n type FaqItem,\n FaqSection,\n type FaqSectionProps,\n} from \"./components/FaqSection/FaqSection\";\nexport {\n FeatureGrid,\n type FeatureGridItem,\n type FeatureGridProps,\n} from \"./components/FeatureGrid/FeatureGrid\";\nexport {\n IntegrationsFinder,\n type IntegrationsFinderItem,\n type IntegrationsFinderProps,\n} from \"./components/IntegrationsFinder/IntegrationsFinder\";\nexport {\n IntegrationsWall,\n type IntegrationsWallCategory,\n type IntegrationsWallItem,\n type IntegrationsWallProps,\n} from \"./components/IntegrationsWall/IntegrationsWall\";\nexport {\n LiveConsole,\n type LiveConsoleLine,\n type LiveConsoleProps,\n type LiveConsoleState,\n} from \"./components/LiveConsole/LiveConsole\";\nexport {\n LogoMarquee,\n type LogoMarqueeItem,\n type LogoMarqueeProps,\n} from \"./components/LogoMarquee/LogoMarquee\";\nexport {\n MarketingFooter,\n type MarketingFooterColumn,\n type MarketingFooterLink,\n type MarketingFooterProps,\n} from \"./components/MarketingFooter/MarketingFooter\";\nexport {\n MarketingHero,\n type MarketingHeroProps,\n} from \"./components/MarketingHero/MarketingHero\";\nexport {\n MarketingNav,\n type MarketingNavLink,\n type MarketingNavProps,\n} from \"./components/MarketingNav/MarketingNav\";\nexport {\n MarketingSection,\n type MarketingSectionProps,\n} from \"./components/MarketingSection/MarketingSection\";\nexport {\n PageHero,\n type PageHeroProps,\n} from \"./components/PageHero/PageHero\";\nexport {\n type PricingTier,\n type PricingTierCta,\n PricingTiers,\n type PricingTiersProps,\n} from \"./components/PricingTiers/PricingTiers\";\nexport {\n StatBand,\n type StatBandItem,\n type StatBandProps,\n} from \"./components/StatBand/StatBand\";\nexport {\n TestimonialStrip,\n type TestimonialStripItem,\n type TestimonialStripProps,\n} from \"./components/TestimonialStrip/TestimonialStrip\";\nexport {\n WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n WORKFLOW_SHOWCASE_DEFAULT_TILES,\n WORKFLOW_SHOWCASE_SCHEDULES,\n WorkflowShowcase,\n type WorkflowShowcaseBuildDetail,\n type WorkflowShowcaseConnector,\n type WorkflowShowcaseExample,\n type WorkflowShowcaseMetric,\n type WorkflowShowcasePhase,\n type WorkflowShowcaseProps,\n type WorkflowShowcaseRole,\n type WorkflowShowcaseSignupValues,\n} from \"./components/WorkflowShowcase\";\nexport {\n ActionGlyph,\n BrandMark,\n ConnectorGlyph,\n DestinationGlyph,\n NotifyGlyph,\n roleGlyph,\n SourceGlyph,\n} from \"./glyphs\";\n","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return clsx(inputs);\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * AssistantTranscript — a compact \"you → / octavia →\" exchange card showing\n * the natural-language-to-workflow moment in one glance.\n * ------------------------------------------------------------------------- */\n\nexport interface AssistantTranscriptTurn {\n id: string;\n speaker: \"user\" | \"assistant\";\n content: ReactNode;\n}\n\nexport interface AssistantTranscriptProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> {\n /** Header label. Defaults to \"OctaviaFlow AI Assistant\". */\n title?: ReactNode;\n turns: AssistantTranscriptTurn[];\n userLabel?: string;\n assistantLabel?: string;\n}\n\nexport function AssistantTranscript({\n title = \"OctaviaFlow AI Assistant\",\n turns,\n userLabel = \"you\",\n assistantLabel = \"octavia\",\n className,\n ...rest\n}: AssistantTranscriptProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-transcript\", className)}>\n <div className=\"ods-mkt-transcript__head\">{title}</div>\n <div className=\"ods-mkt-transcript__body\">\n {turns.map((turn) => (\n <div key={turn.id} className=\"ods-mkt-transcript__turn\">\n <span\n className={cn(\n \"ods-mkt-transcript__speaker\",\n `ods-mkt-transcript__speaker--${turn.speaker}`,\n )}\n >\n {turn.speaker === \"user\" ? userLabel : assistantLabel} →\n </span>{\" \"}\n <span className=\"ods-mkt-transcript__content\">{turn.content}</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * BackedBy — the investors/backers strip. Unlike LogoMarquee (volume social\n * proof, scrolling), this is a static, prestigious row: a few marks with\n * generous spacing and an optional note underneath (\"$4.2M seed · operators\n * from …\"). The site passes real investor logos via `icon`; plain names\n * render as serif wordmarks.\n * ------------------------------------------------------------------------- */\n\nexport interface BackedByItem {\n id: string;\n name: string;\n /** Investor logo. Omit for a serif wordmark. */\n icon?: ReactNode;\n}\n\nexport interface BackedByProps extends ComponentPropsWithoutRef<\"div\"> {\n items: BackedByItem[];\n /** Mono eyebrow. Default \"BACKED BY\". */\n label?: ReactNode;\n /** Microcopy under the marks — round, notable angels, etc. */\n note?: ReactNode;\n align?: \"center\" | \"start\";\n}\n\nexport function BackedBy({\n items,\n label = \"Backed by\",\n note,\n align = \"center\",\n className,\n ...rest\n}: BackedByProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-backedby\", align === \"start\" && \"ods-mkt-backedby--start\", className)}\n >\n {label && <p className=\"ods-mkt-backedby__label\">{label}</p>}\n <div className=\"ods-mkt-backedby__row\">\n {items.map((item) => (\n <span key={item.id} className=\"ods-mkt-backedby__mark\" title={item.name}>\n {item.icon ?? <span className=\"ods-mkt-backedby__wordmark\">{item.name}</span>}\n </span>\n ))}\n </div>\n {note && <p className=\"ods-mkt-backedby__note\">{note}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { type FormEvent, type ReactNode, useId, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport { Textarea } from \"../../../components/Textarea/Textarea\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * BetaAccessForm — the \"request early access\" conversion band for marketing\n * pages outside the hero funnel. Email-only by default (lowest friction), or\n * `fields=\"full\"` for name + email + company. The consuming site wires\n * `onSubmit` to its real endpoint; resolve → success card, throw → inline\n * error with the form intact.\n * ------------------------------------------------------------------------- */\n\nexport interface BetaAccessValues {\n email: string;\n name?: string;\n /** Present when `nameLayout=\"split\"`. */\n firstName?: string;\n /** Present when `nameLayout=\"split\"`. */\n lastName?: string;\n company?: string;\n /** Present when `teamSizes` are configured. */\n teamSize?: string;\n /** Present when `plans` are configured (e.g. preselected from ?plan=). */\n plan?: string;\n /** Present when `useCases` are configured. */\n useCase?: string;\n /** Free-text details (present when `showDetails` is set). */\n details?: string;\n}\n\nexport interface BetaAccessFormProps {\n title?: ReactNode;\n /** Mono microcopy under the title. */\n subtitle?: ReactNode;\n /** \"email\" = single-field band (default). \"full\" = name + email + company. */\n fields?: \"email\" | \"full\";\n /** \"single\" (default) = one Full-name field; \"split\" = First + Last name. */\n nameLayout?: \"single\" | \"split\";\n /** \"card\" (default) = bordered band. \"inline\" = chromeless, for footers. */\n appearance?: \"card\" | \"inline\";\n /** Team-size choices (full mode). Required when provided. */\n teamSizes?: string[];\n /** Plan choices (full mode), e.g. from the pricing tiers. Optional pick. */\n plans?: string[];\n /** Preselected plan (e.g. from a ?plan= query param). */\n defaultPlan?: string;\n /** Primary use-case choices (full mode). Required when provided. */\n useCases?: string[];\n /** Show an optional free-text details textarea (full mode). */\n showDetails?: boolean;\n detailsLabel?: ReactNode;\n detailsPlaceholder?: string;\n submitLabel?: ReactNode;\n /** Mono microcopy under the form. */\n footnote?: ReactNode;\n /** Resolve → success state; throw → inline error, form kept. */\n onSubmit?: (values: BetaAccessValues) => Promise<void> | void;\n successTitle?: ReactNode;\n successBody?: ReactNode;\n disabled?: boolean;\n className?: string;\n}\n\ntype Phase = \"idle\" | \"submitting\" | \"success\";\n\nexport function BetaAccessForm({\n title = \"Request early access\",\n subtitle = \"CURRENTLY IN PRIVATE BETA — WE REVIEW ACCESS REQUESTS WEEKLY\",\n fields = \"email\",\n nameLayout = \"single\",\n appearance = \"card\",\n teamSizes,\n plans,\n defaultPlan,\n useCases,\n showDetails = false,\n detailsLabel = \"Anything else we should know?\",\n detailsPlaceholder = \"Current stack, timelines, must-have connectors…\",\n submitLabel = \"Request access →\",\n footnote = \"NO CREDIT CARD · SSO & SELF-HOSTING AVAILABLE\",\n onSubmit,\n successTitle = \"Request received.\",\n successBody = \"We review access requests weekly — you'll hear from us by email.\",\n disabled = false,\n className,\n}: BetaAccessFormProps) {\n const uid = useId();\n const [values, setValues] = useState<BetaAccessValues>({\n email: \"\",\n name: \"\",\n firstName: \"\",\n lastName: \"\",\n company: \"\",\n teamSize: \"\",\n plan: defaultPlan ?? \"\",\n useCase: \"\",\n details: \"\",\n });\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (phase === \"submitting\") return;\n if (!isValidEmail(values.email)) {\n setError(\"Please enter a valid work email.\");\n return;\n }\n if (fields === \"full\" && nameLayout === \"single\" && !values.name?.trim()) {\n setError(\"Please enter your name.\");\n return;\n }\n if (fields === \"full\" && nameLayout === \"split\" && !values.firstName?.trim()) {\n setError(\"Please enter your first name.\");\n return;\n }\n if (fields === \"full\" && teamSizes?.length && !values.teamSize) {\n setError(\"Please select your team size.\");\n return;\n }\n if (fields === \"full\" && useCases?.length && !values.useCase) {\n setError(\"Please select your primary use case.\");\n return;\n }\n setError(null);\n setPhase(\"submitting\");\n try {\n await onSubmit?.(values);\n setPhase(\"success\");\n } catch {\n setError(\"Something went wrong — please try again.\");\n setPhase(\"idle\");\n }\n };\n\n const inline = appearance === \"inline\";\n\n if (phase === \"success\") {\n return (\n <div\n className={cn(\n \"ods-mkt-access\",\n \"ods-mkt-access--success\",\n inline && \"ods-mkt-access--inline\",\n className,\n )}\n role=\"status\"\n >\n <p className=\"ods-mkt-access__success-mark\">✓ {successTitle}</p>\n <p className=\"ods-mkt-access__success-body\">{successBody}</p>\n </div>\n );\n }\n\n const busy = disabled || phase === \"submitting\";\n\n return (\n <form\n className={cn(\"ods-mkt-access\", inline && \"ods-mkt-access--inline\", className)}\n onSubmit={handleSubmit}\n noValidate\n >\n <div className=\"ods-mkt-access__head\">\n <h3 className=\"ods-mkt-access__title\">{title}</h3>\n {subtitle && <p className=\"ods-mkt-access__subtitle\">{subtitle}</p>}\n </div>\n\n <div\n className={cn(\n \"ods-mkt-access__fields\",\n fields === \"full\" && \"ods-mkt-access__fields--full\",\n )}\n >\n {fields === \"full\" && nameLayout === \"single\" && (\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-name`}>\n Full name\n </label>\n <Input\n id={`${uid}-name`}\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && nameLayout === \"split\" && (\n <>\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-firstname`}>\n First name\n </label>\n <Input\n id={`${uid}-firstname`}\n autoComplete=\"given-name\"\n placeholder=\"Ada\"\n value={values.firstName ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, firstName: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-lastname`}>\n Last name\n </label>\n <Input\n id={`${uid}-lastname`}\n autoComplete=\"family-name\"\n placeholder=\"Lovelace\"\n value={values.lastName ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, lastName: e.target.value }))}\n disabled={busy}\n />\n </div>\n </>\n )}\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-email`}>\n Work email\n </label>\n <Input\n id={`${uid}-email`}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n disabled={busy}\n />\n </div>\n {fields === \"full\" && (\n <div className=\"ods-mkt-access__field\">\n <label className=\"ods-mkt-access__label\" htmlFor={`${uid}-company`}>\n Company\n </label>\n <Input\n id={`${uid}-company`}\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && teamSizes && teamSizes.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-teamsize-label`}>\n Team size\n </span>\n <Select\n aria-labelledby={`${uid}-teamsize-label`}\n placeholder=\"Select team size…\"\n options={teamSizes.map((size) => ({ value: size, label: size }))}\n value={values.teamSize ?? \"\"}\n onChange={(teamSize) => setValues((v) => ({ ...v, teamSize }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && plans && plans.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-plan-label`}>\n Plan (optional)\n </span>\n <Select\n aria-labelledby={`${uid}-plan-label`}\n placeholder=\"Not sure yet\"\n options={plans.map((plan) => ({ value: plan, label: plan }))}\n value={values.plan ?? \"\"}\n onChange={(plan) => setValues((v) => ({ ...v, plan }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && useCases && useCases.length > 0 && (\n <div className=\"ods-mkt-access__field\">\n <span className=\"ods-mkt-access__label\" id={`${uid}-usecase-label`}>\n Primary use case\n </span>\n <Select\n aria-labelledby={`${uid}-usecase-label`}\n placeholder=\"Select a use case…\"\n options={useCases.map((useCase) => ({ value: useCase, label: useCase }))}\n value={values.useCase ?? \"\"}\n onChange={(useCase) => setValues((v) => ({ ...v, useCase }))}\n disabled={busy}\n />\n </div>\n )}\n {fields === \"full\" && showDetails && (\n <div className=\"ods-mkt-access__field ods-mkt-access__field--wide\">\n <label\n className=\"ods-mkt-access__label\"\n id={`${uid}-details-label`}\n htmlFor={`${uid}-details`}\n >\n {detailsLabel}\n </label>\n <Textarea\n id={`${uid}-details`}\n aria-labelledby={`${uid}-details-label`}\n placeholder={detailsPlaceholder}\n rows={3}\n value={values.details ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, details: e.target.value }))}\n disabled={busy}\n />\n </div>\n )}\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={phase === \"submitting\"}\n disabled={disabled}\n >\n {submitLabel}\n </Button>\n </div>\n\n {error && (\n <p className=\"ods-mkt-access__error\" role=\"alert\">\n {error}\n </p>\n )}\n {footnote && <p className=\"ods-mkt-access__footnote\">{footnote}</p>}\n </form>\n );\n}\n","\"use client\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n forwardRef,\n type ReactElement,\n type ReactNode,\n type Ref,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { useButton } from \"react-aria\";\nimport { resolveAccessibleName, hasRenderableText } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\nimport { Slot } from \"../../utils/Slot\";\n\nexport interface ButtonProps\n extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"icon\";\n size?: \"sm\" | \"md\" | \"lg\";\n loading?: boolean;\n /** Override the rendered label while loading. Useful for action verbs that\n * change form mid-request — e.g. `\"Sign in\"` → `\"Signing in…\"`. */\n loadingText?: ReactNode;\n /** Accessible label for the spinner (announced by AT during loading).\n * Defaults to `\"Loading\"`. Customize for localization or context. */\n loadingLabel?: string;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n fullWidth?: boolean;\n /** Toggle-button state. When defined, the button advertises\n * `aria-pressed` and adds `--pressed` styling. */\n pressed?: boolean;\n children?: ReactNode;\n /**\n * Override the cursor shown on hover. When omitted, the cursor auto-resolves:\n * - `not-allowed` when disabled (CSS handles this — see Button.module.scss)\n * - `progress` when loading (request in flight)\n * - `pointer` when the button has an action (onClick, type=\"submit\",\n * or type=\"reset\"). Anchors (href) get pointer too.\n * - `default` otherwise (decorative / placeholder buttons)\n * Pass an explicit value (e.g. `\"text\"`, `\"grab\"`) to override the\n * auto-resolve for the specific story / use case.\n */\n cursor?: CSSProperties[\"cursor\"];\n /** Render Button's styling onto a custom child element (Radix-style Slot).\n *\n * <Button asChild variant=\"primary\">\n * <NextLink href=\"/checkout\">Continue</NextLink>\n * </Button>\n *\n * When `asChild` is true, Button does NOT render its internal icon /\n * label / spinner slots — the consumer's element fully owns content. Use\n * the regular form (without `asChild`) when you want the built-in\n * slots / loading spinner / size-scaled icons. */\n asChild?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n loadingText,\n loadingLabel = \"Loading\",\n disabled = false,\n leftIcon,\n rightIcon,\n fullWidth = false,\n pressed,\n asChild = false,\n className,\n children,\n type,\n cursor,\n style,\n ...props\n },\n forwardedRef,\n) {\n const ref = useRef<HTMLButtonElement>(null);\n useImperativeHandle(forwardedRef, () => ref.current as HTMLButtonElement);\n const isDisabled = disabled || loading;\n // Respect users who've asked for reduced motion (OS-level a11y setting).\n // When true we skip the whileTap scale animation entirely — Framer's own\n // hook reads `prefers-reduced-motion: reduce` and stays reactive.\n const prefersReducedMotion = useReducedMotion();\n\n // Cursor resolution (centralised in JS so inline-style specificity wins\n // over any CSS cursor rule). Order of precedence:\n // 1. Caller's explicit `cursor` prop.\n // 2. `not-allowed` when disabled (and not also loading — see below).\n // 3. `progress` when loading (button is intentionally non-interactive\n // but the user should see we're working on it).\n // 4. `pointer` when the button has an action.\n // 5. `default` for decorative buttons.\n // Disabled takes precedence over loading when BOTH are set: explicit\n // disabled is a stronger intent than \"currently busy\".\n // Button always renders a native <button>; anchor semantics live on\n // LinkButton. No href branch needed here.\n const hasAction = Boolean(props.onClick) || type === \"submit\" || type === \"reset\";\n const resolvedCursor: string =\n cursor ?? (disabled ? \"not-allowed\" : loading ? \"progress\" : hasAction ? \"pointer\" : \"default\");\n // Forms rely on `type=\"submit\"` to trigger submission. React Aria's useButton\n // defaults type to \"button\" when omitted, so we always pass the caller's type\n // through (defaulting to \"button\" only when truly unspecified).\n const resolvedType: \"button\" | \"submit\" | \"reset\" = type ?? \"button\";\n\n // Buttons get their accessible name from children. Icon-only buttons\n // (variant=\"icon\" or empty children + iconLeft/Right) MUST provide\n // aria-label or aria-labelledby — we resolve it here so react-aria's\n // useButton receives a guaranteed string-or-id, and dev-mode console.error\n // surfaces the missing-name case.\n //\n // `hasVisibleText` counts any renderable TEXT in children — including text\n // inside arrays/fragments/elements (e.g. `{cond && \"Connect\"}` which React\n // passes as an array, or `<span>Save</span>`). SVG/icon-only subtrees carry\n // no readable text, so genuinely icon-only buttons still require an explicit\n // aria-label. (A glyph string like \"×\" counts — announced verbatim.) This\n // must NOT be a bare `typeof children === \"string\"` check: conditional or\n // interpolated text children are arrays, and missing them here forces a\n // bogus `aria-label=\"Unlabeled Button\"` that overrides the real label.\n const hasVisibleText = hasRenderableText(children);\n // In `asChild` mode the consumer's element owns its own accessible name\n // (e.g., the anchor's text content). Suppress Button's own a11y check\n // to avoid false-positive dev warnings.\n const needsAriaName = !hasVisibleText && !asChild;\n const ariaNameProps = needsAriaName\n ? resolveAccessibleName({\n ariaLabel: (props as any)[\"aria-label\"],\n ariaLabelledby: (props as any)[\"aria-labelledby\"],\n componentName: \"Button\",\n })\n : undefined;\n\n const { buttonProps } = useButton(\n {\n isDisabled,\n onPress: props.onClick as any,\n type: resolvedType,\n ...(ariaNameProps ?? {}),\n },\n ref,\n );\n\n // Strip Framer-conflicting props from React Aria output\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeButtonProps } =\n buttonProps as any;\n\n // Native HTML button attributes the caller passed (form, name, value,\n // aria-*, data-*, etc.) must reach the DOM. We strip the ones React Aria\n // already manages from buttonProps to avoid double-binding event handlers.\n const {\n onClick: _onClick,\n onKeyDown: _onKeyDown,\n onKeyUp: _onKeyUp,\n onMouseDown: _onMouseDown,\n onPointerDown: _onPointerDown,\n onPointerUp: _onPointerUp,\n onFocus: _onFocus,\n onBlur: _onBlur,\n ...passthroughProps\n } = props as Record<string, unknown>;\n\n const rootClassName = cn(\n \"ods-btn\",\n `ods-btn--${variant}`,\n `ods-btn--${size}`,\n loading && \"ods-btn--loading\",\n fullWidth && \"ods-btn--full\",\n pressed && \"ods-btn--pressed\",\n className,\n );\n\n // asChild mode — project Button's chrome onto the consumer's element.\n // Internal slots (icons, spinner, label) are NOT rendered — consumer\n // owns the content. react-aria event wiring is also skipped because\n // the consumer's element handles its own activation semantics.\n if (asChild) {\n return (\n <Slot\n {...(passthroughProps as Record<string, unknown>)}\n ref={forwardedRef as unknown as Ref<HTMLElement>}\n className={rootClassName}\n style={{ cursor: resolvedCursor, ...(style as CSSProperties) }}\n aria-pressed={pressed}\n aria-disabled={isDisabled || undefined}\n >\n {children as ReactElement}\n </Slot>\n );\n }\n\n // The visible label — `loadingText` overrides `children` while loading\n // so the in-progress verb form (\"Signing in…\") replaces the idle one.\n const visibleLabel = loading && loadingText !== undefined ? loadingText : children;\n\n return (\n <motion.button\n {...(passthroughProps as any)}\n {...safeButtonProps}\n type={resolvedType}\n ref={ref}\n className={rootClassName}\n // Disabled state CSS rule (cursor: not-allowed) outranks this inline\n // value — see Button.module.scss. So `style.cursor` only applies to\n // idle/loading/active states, exactly what we want.\n style={{ cursor: resolvedCursor, ...(style as any) }}\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n aria-pressed={pressed}\n whileTap={isDisabled || prefersReducedMotion ? undefined : { scale: 0.97 }}\n transition={{ duration: 0.1 }}\n >\n {/* Content layer. When loading, the leftIcon slot is replaced by an\n inline spinner — both spinner AND label stay visible so the user\n sees the in-progress text (e.g. \"Signing in…\") next to the\n activity indicator. */}\n <span className=\"ods-btn__content\">\n {loading ? (\n <span\n className=\"ods-btn__icon ods-btn__icon--left ods-btn__icon--spinner\"\n role=\"status\"\n aria-label={loadingLabel}\n >\n {/* viewBox is 1em-scaled by CSS (.ods-btn__icon svg → 1em) so\n the spinner tracks the per-size icon scale (12 / 14 / 16 px)\n without needing per-size width attributes. */}\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"32\"\n strokeDashoffset=\"12\"\n />\n </svg>\n </span>\n ) : (\n leftIcon && <span className=\"ods-btn__icon ods-btn__icon--left\">{leftIcon}</span>\n )}\n {visibleLabel != null && visibleLabel !== false && (\n <span className=\"ods-btn__label\">{visibleLabel}</span>\n )}\n {rightIcon && !loading && (\n <span className=\"ods-btn__icon ods-btn__icon--right\">{rightIcon}</span>\n )}\n </span>\n </motion.button>\n );\n});\n\nButton.displayName = \"Button\";\n","/**\n * a11y — shared helpers for resolving an accessible name from the union of\n * props every form/interactive component accepts.\n *\n * Why this exists:\n * react-aria's hooks (useCheckbox, useSwitch, useRadio, useTextField,\n * useButton, etc.) emit a runtime warning to the browser console when\n * none of the following is present on the underlying element:\n * - aria-label\n * - aria-labelledby\n * - a visible <label> with htmlFor pointing to the element id\n *\n * Many of our components accept `label` as `string | ReactNode`. When\n * `label` is a ReactNode (icon + text, custom JSX), react-aria can't see\n * a text label and the warning fires. This helper centralizes the\n * derivation: it returns a single { 'aria-label' or 'aria-labelledby' }\n * shape that react-aria will accept, and — in development only — it\n * surfaces a focused console.error pointing the developer at the prop\n * they're missing instead of the generic react-aria warning.\n *\n * Usage:\n * const ariaProps = resolveAccessibleName({\n * label,\n * ariaLabel: props['aria-label'],\n * ariaLabelledby: props['aria-labelledby'],\n * componentName: 'Checkbox',\n * });\n * // → { 'aria-label': string } | { 'aria-labelledby': string } | { 'aria-label': string }\n *\n * useCheckbox({ ...otherProps, ...ariaProps }, state, ref);\n */\n\nimport { isValidElement, type ReactNode } from \"react\";\n\n/**\n * True when a ReactNode renders any non-empty, human-readable text.\n *\n * Used by controls whose accessible name comes from their CHILDREN (e.g.\n * Button). Recurses through arrays, fragments, and element children so that\n * conditionally-rendered or wrapped text is detected — e.g.\n * `{cond && \"Save\"}`, `[\"Connect with \", name]`, or `<span>Save</span>`.\n *\n * Returns false for icon/SVG-only subtrees (no string content), so genuinely\n * icon-only controls still trip the missing-accessible-name check. Numbers\n * count (they render as announced text, including 0); booleans / null /\n * undefined do not render and so don't count.\n */\nexport function hasRenderableText(node: ReactNode): boolean {\n if (node === null || node === undefined || typeof node === \"boolean\") return false;\n if (typeof node === \"string\") return node.trim().length > 0;\n if (typeof node === \"number\") return true;\n if (Array.isArray(node)) return node.some(hasRenderableText);\n if (isValidElement(node)) {\n return hasRenderableText((node.props as { children?: ReactNode }).children);\n }\n return false;\n}\n\n/**\n * Extract the concatenated visible text from a ReactNode — used to derive an\n * accessible name when a control accepts a rich `label` (icon + text, custom\n * JSX). Mirrors `hasRenderableText`'s traversal: strings/numbers contribute,\n * arrays/fragments/elements recurse into their children, and\n * booleans/null/undefined contribute nothing. Returns '' when there is no text.\n */\nexport function getRenderableText(node: ReactNode): string {\n if (node === null || node === undefined || typeof node === \"boolean\") return \"\";\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(getRenderableText).join(\"\");\n if (isValidElement(node)) {\n return getRenderableText((node.props as { children?: ReactNode }).children);\n }\n return \"\";\n}\n\nexport interface ResolveAccessibleNameInput {\n /** The visible label, if any. Strings are auto-used as aria-label. */\n label?: ReactNode;\n /** Caller-provided aria-label override. Highest priority when present. */\n ariaLabel?: string;\n /** Caller-provided aria-labelledby. Wins over label-derived values. */\n ariaLabelledby?: string;\n /**\n * Component name used in dev-mode error messages. Helps the developer\n * locate which usage needs a label.\n */\n componentName: string;\n /**\n * Optional secondary fallbacks the component knows about — e.g. a Radio\n * can fall back to its `value` so radios in a group are at least\n * distinguishable. The first non-empty string is used.\n */\n fallbacks?: Array<string | undefined>;\n}\n\nexport type ResolvedAccessibleName = { \"aria-label\": string } | { \"aria-labelledby\": string };\n\n/**\n * Resolve the accessible-name props that should be spread onto the\n * underlying element. Guarantees at least one of aria-label / aria-labelledby\n * is present so react-aria won't warn at runtime.\n *\n * Priority order:\n * 1. aria-labelledby (caller-provided)\n * 2. aria-label (caller-provided)\n * 3. label (when string)\n * 4. fallbacks (when string)\n * 5. component-name placeholder + dev-mode console.error\n */\nexport function resolveAccessibleName(input: ResolveAccessibleNameInput): ResolvedAccessibleName {\n if (input.ariaLabelledby) {\n return { \"aria-labelledby\": input.ariaLabelledby };\n }\n if (input.ariaLabel) {\n return { \"aria-label\": input.ariaLabel };\n }\n if (typeof input.label === \"string\" && input.label.trim().length > 0) {\n return { \"aria-label\": input.label };\n }\n for (const candidate of input.fallbacks ?? []) {\n if (typeof candidate === \"string\" && candidate.trim().length > 0) {\n return { \"aria-label\": candidate };\n }\n }\n\n // Last resort — emit a placeholder so react-aria stays quiet in\n // production, but loudly point at the missing prop in development so the\n // developer fixes the real bug rather than ignoring a global warning.\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.error(\n `[@octaviaflow/core ${input.componentName}] No accessible name. ` +\n `Pass a string \\`label\\`, or \\`aria-label\\`, or \\`aria-labelledby\\` ` +\n `so screen readers can announce this control.`,\n );\n }\n return { \"aria-label\": `Unlabeled ${input.componentName}` };\n}\n","\"use client\";\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type Ref,\n} from \"react\";\nimport { composeRefs } from \"./composeRefs\";\n\n/* ---------------------------------------------------------------------------\n * Slot — the `asChild` primitive\n *\n * Takes exactly one React element child and clones it, merging the Slot's\n * own props onto the child:\n * - `className` concatenates (slot's classes follow child's)\n * - `style` merges (child's keys win on overlap)\n * - Event handlers chain (slot's handler runs first; if it calls\n * `event.preventDefault()` the child's handler is short-circuited —\n * matching React's own synthetic-event default-handling convention)\n * - Refs compose so both the forwarded ref and the child's own ref point\n * at the rendered DOM node.\n *\n * This is what powers `asChild` across our primitives: it lets consumers\n * swap the rendered element (e.g., to a router Link) without losing the\n * component's styling, accessibility, or behavioural contract.\n * ------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, unknown>;\n\ninterface SlotProps extends HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nexport const Slot = forwardRef<HTMLElement, SlotProps>(function Slot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!isValidElement(children)) {\n // Slot requires exactly one React element child. Returning null is\n // safer than throwing — callers that conditionally use `asChild` are\n // common, and we don't want stories / SSR to crash on an empty pass.\n return null;\n }\n const child = Children.only(children) as ReactElement<AnyProps>;\n const childProps = child.props ?? {};\n const childRef = (child as unknown as { ref?: Ref<HTMLElement> }).ref;\n\n return cloneElement(child, {\n ...mergeProps(slotProps as AnyProps, childProps),\n ref: forwardedRef ? composeRefs(forwardedRef, childRef) : childRef,\n });\n});\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps): AnyProps {\n // Start with the slot's props, then layer the child's on top. We then\n // walk back over the overlapping keys to apply per-key merge rules.\n const merged: AnyProps = { ...slotProps, ...childProps };\n\n for (const key of Object.keys(slotProps)) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Event handlers — chain. Slot's handler runs first; if it invokes\n // event.preventDefault() the child's is skipped, matching the React\n // norm. Both being functions is the trigger.\n if (\n /^on[A-Z]/.test(key) &&\n typeof slotValue === \"function\" &&\n typeof childValue === \"function\"\n ) {\n merged[key] = (...args: unknown[]) => {\n (slotValue as (...a: unknown[]) => void)(...args);\n const event = args[0] as { defaultPrevented?: boolean } | undefined;\n if (event?.defaultPrevented) return;\n (childValue as (...a: unknown[]) => void)(...args);\n };\n continue;\n }\n\n // className — concatenate (slot's classes come first so child's can\n // visually override on direct conflict, which matches authoring intent).\n if (key === \"className\") {\n merged.className = [slotValue, childValue].filter(Boolean).join(\" \");\n continue;\n }\n\n // style — merge; child's keys win on overlap so consumers' inline\n // styles can override our defaults.\n if (key === \"style\") {\n merged.style = {\n ...(slotValue as CSSProperties | undefined),\n ...(childValue as CSSProperties | undefined),\n };\n continue;\n }\n }\n\n return merged;\n}\n","import type { MutableRefObject, Ref, RefCallback } from \"react\";\n\n/** Compose any number of refs (callback or object) into a single ref-callback.\n * Each underlying ref receives the node when React assigns it. Useful for the\n * `asChild` pattern where both the forwarded ref and the child's own ref need\n * to point at the same DOM node. */\nexport function composeRefs<T>(...refs: Array<Ref<T> | undefined | null>): RefCallback<T> {\n return (node: T) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref != null) {\n (ref as MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n","\"use client\";\nimport { CloseIcon } from \"@octaviaflow/icons\";\nimport {\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useId,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n type?:\n | \"text\"\n | \"email\"\n | \"password\"\n | \"search\"\n | \"number\"\n | \"tel\"\n | \"url\"\n | \"color\"\n | \"date\"\n | \"datetime-local\"\n | \"month\"\n | \"time\"\n | \"week\";\n size?: \"sm\" | \"md\" | \"lg\";\n error?: boolean;\n errorMessage?: string;\n label?: ReactNode;\n helperText?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n /**\n * Show a clear button on the right while the input has a value.\n * Auto-enabled when `type=\"search\"`; explicitly toggle for other types.\n */\n clearable?: boolean;\n onClear?: () => void;\n /**\n * Right-side keyboard shortcut hint (e.g. \"⌘K\"). Rendered as a kbd-style chip.\n * Hidden while a clear button is showing (clear takes precedence).\n */\n shortcutHint?: ReactNode;\n}\n\nconst CLEAR_GLYPH = <CloseIcon width={12} height={12} aria-hidden=\"true\" />;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = \"text\",\n size = \"md\",\n error = false,\n errorMessage,\n label,\n helperText,\n leftIcon,\n rightIcon,\n clearable,\n onClear,\n shortcutHint,\n disabled = false,\n required,\n id,\n className,\n value,\n defaultValue,\n onChange,\n onKeyDown,\n ...props\n },\n forwardedRef,\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(forwardedRef, () => innerRef.current as HTMLInputElement);\n\n const reactId = useId();\n const inputId = id ?? `${reactId}-input`;\n const errorId = `${reactId}-err`;\n const helperId = `${reactId}-help`;\n\n const isControlled = value !== undefined;\n const isClearable = (clearable ?? type === \"search\") && !disabled;\n const isSearch = type === \"search\";\n\n const currentValue = isControlled\n ? String(value ?? \"\")\n : (innerRef.current?.value ?? String(defaultValue ?? \"\"));\n const showClear = isClearable && currentValue.length > 0;\n\n const clearValue = () => {\n const el = innerRef.current;\n if (el && !isControlled) {\n const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, \"value\")?.set;\n setter?.call(el, \"\");\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n }\n onClear?.();\n el?.focus();\n };\n\n const handleClear = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n };\n\n // Esc clears the value for search inputs — standard browser-search UX.\n // Consumer's own onKeyDown still runs first; preventDefault from theirs\n // short-circuits ours.\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (isClearable && isSearch && e.key === \"Escape\" && currentValue) {\n e.preventDefault();\n clearValue();\n }\n };\n\n const describedBy = error && errorMessage ? errorId : helperText ? helperId : undefined;\n\n return (\n <div\n className={cn(\n \"ods-input\",\n `ods-input--${size}`,\n error && \"ods-input--error\",\n disabled && \"ods-input--disabled\",\n isSearch && \"ods-input--search\",\n className,\n )}\n >\n {label && (\n <label htmlFor={inputId} className=\"ods-input__label\">\n {label}\n {required && (\n <span className=\"ods-input__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <div className=\"ods-input__wrapper\">\n {leftIcon && (\n <span className=\"ods-input__icon--left\" aria-hidden=\"true\">\n {leftIcon}\n </span>\n )}\n <input\n {...props}\n id={inputId}\n ref={innerRef}\n type={type}\n disabled={disabled}\n required={required}\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n className={cn(\n \"ods-input__field\",\n leftIcon && \"ods-input__field--with-left-icon\",\n (rightIcon || showClear || shortcutHint) && \"ods-input__field--with-right-icon\",\n showClear && shortcutHint && \"ods-input__field--with-right-actions\",\n )}\n aria-invalid={error || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n <span className=\"ods-input__right\">\n {showClear && (\n <button\n type=\"button\"\n className=\"ods-input__clear\"\n onClick={handleClear}\n aria-label=\"Clear\"\n tabIndex={-1}\n >\n {CLEAR_GLYPH}\n </button>\n )}\n {shortcutHint && !showClear && (\n <span className=\"ods-input__kbd\" aria-hidden=\"true\">\n {shortcutHint}\n </span>\n )}\n {rightIcon && !showClear && !shortcutHint && (\n <span className=\"ods-input__icon--right\" aria-hidden=\"true\">\n {rightIcon}\n </span>\n )}\n </span>\n </div>\n {error && errorMessage && (\n <div id={errorId} className=\"ods-input__error-message\" role=\"alert\">\n {errorMessage}\n </div>\n )}\n {!error && helperText && (\n <div id={helperId} className=\"ods-input__helper\">\n {helperText}\n </div>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = \"Input\";\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n forwardRef,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { HiddenSelect, useButton, useListBox, useOption, useSelect } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { Item, useSelectState } from \"react-stately\";\nimport { CheckmarkIcon, ChevronDownIcon } from \"@octaviaflow/icons\";\nimport { resolveAccessibleName } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n icon?: ReactNode;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n placeholder?: string;\n searchable?: boolean;\n label?: string;\n error?: boolean;\n errorMessage?: string;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Name for form submission (forwarded to the HiddenSelect element). */\n name?: string;\n /** Required flag for form submission (forwarded to HiddenSelect). */\n required?: boolean;\n /** Stable id for the trigger button (and the source for label htmlFor). */\n id?: string;\n /** Associate this control with an external <form id=\"...\"> element. */\n form?: string;\n /** Auto-focus the trigger on mount. */\n autoFocus?: boolean;\n /** Optional aria-label when no visible label is provided. */\n \"aria-label\"?: string;\n /** Optional aria-labelledby override. */\n \"aria-labelledby\"?: string;\n /** Optional aria-describedby (e.g. for helper text outside the component). */\n \"aria-describedby\"?: string;\n /** Helper text rendered below the trigger. Suppressed when `error`\n * is set (the error message takes the slot). */\n helperText?: ReactNode;\n /**\n * Render a check-mark glyph next to the currently selected option in\n * the dropdown. Defaults to `false` — the highlighted background is\n * already a strong visual cue, so doubling up reads as visual noise\n * in dense menus. Re-enable when the menu sits in a context where the\n * highlight isn't enough (e.g. extremely tall menus).\n */\n showCheckmark?: boolean;\n /**\n * Close the popover when the user clicks anywhere outside the trigger\n * + menu. Defaults to `true` — set to `false` for cases where the\n * caller manages dismissal explicitly (e.g. a modal that wraps the\n * select and owns its own close logic).\n */\n closeOnOutsideClick?: boolean;\n /** Show our design-system `<Tooltip>` on hover over options whose\n * label may be truncated. Default `false` — opt-in via this flag per\n * the platform's \"chrome stays quiet unless explicitly enabled\"\n * convention. The popover surfaces the full label plus the\n * description on a second line when present. */\n showOverflowTooltips?: boolean;\n /**\n * Floor for the dropdown popover width in pixels. The popover is\n * normally pinned to the trigger's width (visual alignment); pass\n * a number here when the trigger is narrow but option labels are\n * long — e.g. Calendar's compact `size=\"sm\"` month/year caption\n * where the trigger is ~70 px but month names like \"September\"\n * need ~110 px. Defaults to the trigger width (no override).\n */\n dropdownMinWidth?: number;\n}\n\n/* ------------------------------------------------------------------ */\n/* OverflowTooltip helper */\n/* ------------------------------------------------------------------ */\n\n/** Wraps `children` in our design-system Tooltip only when the flag is\n * on AND there's content to surface. Mirrors the MultiSelect pattern\n * so both pickers stay consistent. */\nfunction OverflowTooltip({\n enabled,\n content,\n children,\n}: {\n enabled: boolean;\n content: ReactNode;\n children: React.ReactElement;\n}) {\n if (!enabled || content == null || content === \"\") return children;\n return <Tooltip content={content}>{children}</Tooltip>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Internal ListBox rendered inside the dropdown */\n/* ------------------------------------------------------------------ */\n\nfunction ListBox(props: any) {\n const ref = useRef<HTMLUListElement>(null);\n const {\n listBoxRef = ref,\n state,\n showCheckmark,\n showOverflowTooltips,\n } = props;\n const { listBoxProps } = useListBox(props, state, listBoxRef);\n\n return (\n <ul {...listBoxProps} ref={listBoxRef} className={\"ods-select__options\"}>\n {[...state.collection].map((item: any) => (\n <Option\n key={item.key}\n item={item}\n state={state}\n showCheckmark={showCheckmark}\n showOverflowTooltips={showOverflowTooltips}\n />\n ))}\n </ul>\n );\n}\n\nfunction Option({\n item,\n state,\n showCheckmark,\n showOverflowTooltips,\n}: {\n item: any;\n state: any;\n showCheckmark?: boolean;\n showOverflowTooltips?: boolean;\n}) {\n const ref = useRef<HTMLLIElement>(null);\n const { optionProps, isSelected, isFocused, isDisabled } = useOption(\n { key: item.key },\n state,\n ref,\n );\n\n // item.value is the items-array object; the actual SelectOption is nested inside\n const raw = item.value;\n const option: SelectOption | undefined = raw?.value ?? raw;\n\n // Tooltip content — label by itself, OR label + description on two\n // lines so the popover surfaces everything the row contains.\n const tooltipContent: ReactNode = option?.description ? (\n <>\n <span>{option.label}</span>\n <br />\n <span style={{ opacity: 0.75 }}>{option.description}</span>\n </>\n ) : (\n option?.label\n );\n\n return (\n <OverflowTooltip\n enabled={!!showOverflowTooltips}\n content={tooltipContent}\n >\n <li\n {...optionProps}\n ref={ref}\n className={cn(\n \"ods-select__option\",\n isFocused && \"ods-select__option--highlighted\",\n isSelected && \"ods-select__option--selected\",\n isDisabled && \"ods-select__option--disabled\",\n )}\n >\n {option?.icon && <span className={\"ods-select__option-icon\"}>{option.icon}</span>}\n <span className={\"ods-select__option-text\"}>\n <span className={\"ods-select__option-label\"}>{item.rendered}</span>\n {option?.description && (\n <span className={\"ods-select__option-desc\"}>{option.description}</span>\n )}\n </span>\n {isSelected && showCheckmark && (\n <span className={\"ods-select__check\"} aria-hidden=\"true\">\n <CheckmarkIcon size=\"xs\" tone=\"accent\" />\n </span>\n )}\n </li>\n </OverflowTooltip>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main Select component */\n/* ------------------------------------------------------------------ */\n\n// Generic default placeholder. A select left on THIS placeholder with no\n// label is a genuine a11y gap (we still warn). But a CUSTOM placeholder\n// (e.g. \"Search channels and people…\") describes the control's purpose, so\n// it's used as the accessible-name fallback — see ariaNameProps below.\nconst DEFAULT_SELECT_PLACEHOLDER = \"Select an option...\";\n\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value,\n defaultValue,\n onChange,\n placeholder = DEFAULT_SELECT_PLACEHOLDER,\n searchable = false,\n label,\n error = false,\n errorMessage,\n helperText,\n disabled = false,\n size = \"md\",\n className,\n name,\n required,\n id: providedId,\n form,\n autoFocus,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": consumerDescribedBy,\n showCheckmark = false,\n closeOnOutsideClick = true,\n showOverflowTooltips = false,\n dropdownMinWidth,\n },\n forwardedRef,\n) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listBoxRef = useRef<HTMLUListElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [dropdownPos, setDropdownPos] = useState<{\n top?: number;\n bottom?: number;\n left: number;\n width: number;\n maxHeight: number;\n /** \"down\" = popover hangs below the trigger; \"up\" = it stacks above. */\n direction: \"down\" | \"up\";\n }>({ left: 0, width: 0, maxHeight: 240, direction: \"down\" });\n\n // Compose the forwarded ref with our internal trigger ref so consumers\n // can `.focus()` the button while react-aria's internal needs still work.\n const setTriggerRef = (node: HTMLButtonElement | null) => {\n (triggerRef as { current: HTMLButtonElement | null }).current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as { current: HTMLButtonElement | null }).current = node;\n };\n\n const reactId = useId();\n const baseId = providedId ?? `ods-select-${reactId}`;\n const hintId = error || helperText ? `${baseId}-hint` : undefined;\n const describedBy =\n [consumerDescribedBy, hintId].filter(Boolean).join(\" \") || undefined;\n\n // Build react-stately items from options, applying search filter\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchQuery) return options;\n const q = searchQuery.toLowerCase();\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.description?.toLowerCase().includes(q),\n );\n }, [options, searchQuery, searchable]);\n\n // Build collection props for useSelectState\n // Resolve accessible name from {label, aria-label, aria-labelledby}. Removes\n // the literal \"Select\" fallback that was masking the real \"no label\" bug.\n // A CUSTOM placeholder is accepted as a last-resort accessible name (a\n // placeholder like \"Search channels and people…\" is a meaningful control\n // description); the generic default placeholder is NOT, so a truly\n // unlabeled select still trips the dev warning.\n const ariaNameProps = useMemo(\n () =>\n resolveAccessibleName({\n label,\n ariaLabel,\n ariaLabelledby: ariaLabelledBy,\n componentName: \"Select\",\n fallbacks: [\n placeholder && placeholder !== DEFAULT_SELECT_PLACEHOLDER ? placeholder : undefined,\n ],\n }),\n [label, ariaLabel, ariaLabelledBy, placeholder],\n );\n\n const ariaProps = useMemo(() => {\n const items = filteredOptions.map((o) => ({\n key: o.value,\n label: o.label,\n value: o,\n isDisabled: o.disabled,\n }));\n\n const props: any = {\n // Visible string label when present; otherwise rely on the aria-*\n // props for screen-reader name.\n label: typeof label === \"string\" ? label : undefined,\n ...ariaNameProps,\n items,\n children: (item: any) => (\n <Item key={item.key} textValue={item.label}>\n {item.label}\n </Item>\n ),\n isDisabled: disabled,\n onSelectionChange: (key: any) => {\n onChange?.(String(key));\n setSearchQuery(\"\");\n },\n };\n\n if (value !== undefined) {\n props.selectedKey = value;\n }\n if (defaultValue !== undefined) {\n props.defaultSelectedKey = defaultValue;\n }\n\n return props;\n }, [filteredOptions, label, disabled, value, defaultValue, onChange, ariaNameProps]);\n\n const state = useSelectState(ariaProps);\n\n const { triggerProps, menuProps } = useSelect(ariaProps, state, triggerRef);\n const { buttonProps } = useButton(triggerProps, triggerRef);\n\n // Position dropdown using getBoundingClientRect (fixed positioning to\n // escape stacking contexts). Now viewport-aware: when the trigger sits\n // near the bottom of the screen we flip the popover upward; either\n // way we cap its height to what's actually available so option lists\n // never spill off-screen (the prior behavior on tall pages).\n const updatePosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n const viewportH = window.innerHeight;\n const margin = 8; // breathing room at the viewport edge\n const gap = 4; // gap between trigger and popover\n const spaceBelow = viewportH - rect.bottom - gap - margin;\n const spaceAbove = rect.top - gap - margin;\n // Prefer downward; flip up when below is cramped AND above has more\n // room. Falls back to whichever side has more space if both are tight.\n const PREFERRED_MIN = 200;\n const openUp =\n spaceBelow < PREFERRED_MIN && spaceAbove > spaceBelow;\n setDropdownPos({\n ...(openUp\n ? { bottom: viewportH - rect.top + gap }\n : { top: rect.bottom + gap }),\n left: rect.left,\n width: rect.width,\n maxHeight: Math.max(120, openUp ? spaceAbove : spaceBelow),\n direction: openUp ? \"up\" : \"down\",\n });\n }, []);\n\n useEffect(() => {\n if (state.isOpen) {\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }\n }, [state.isOpen, updatePosition]);\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (state.isOpen && searchable && searchRef.current) {\n // Small delay to allow animation frame\n requestAnimationFrame(() => searchRef.current?.focus());\n }\n }, [state.isOpen, searchable]);\n\n // Outside-click + Escape close. react-aria's `useSelect` wires Escape\n // when the trigger keeps focus, but because the dropdown is portaled\n // to <body> and we move focus into the search input on open, the\n // built-in dismiss does not fire on document-level outside clicks.\n // Wire it here ourselves; the `closeOnOutsideClick` prop lets a\n // consumer opt out for modal-managed selects.\n useEffect(() => {\n if (!state.isOpen || !closeOnOutsideClick) return;\n const onPointer = (e: MouseEvent) => {\n const target = e.target as Node;\n if (dropdownRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n state.close();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") state.close();\n };\n document.addEventListener(\"mousedown\", onPointer);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointer);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [state.isOpen, state.close, closeOnOutsideClick]);\n\n // Find currently selected option for display\n const selectedOption = options.find((o) => o.value === String(state.selectedKey ?? \"\"));\n\n // ── Close-on-re-click ──────────────────────────────────────────────\n // react-aria's `useSelect` opens on press but does NOT toggle when\n // the trigger is pressed again with the menu open — that's the\n // \"click trigger again\" close pattern users expect from every other\n // select on the web. We restore it here: stash the open state right\n // before the press, and on the trailing click, if it was open AND\n // still is open (meaning react-aria didn't auto-close), force close.\n const wasOpenBeforePressRef = useRef(false);\n const handleTriggerPointerDown = (e: ReactPointerEvent<HTMLButtonElement>) => {\n wasOpenBeforePressRef.current = state.isOpen;\n // Forward to react-aria's own handler if present.\n const baseHandler = (buttonProps as { onPointerDown?: (e: ReactPointerEvent<HTMLButtonElement>) => void }).onPointerDown;\n baseHandler?.(e);\n };\n const handleTriggerClick = (e: ReactMouseEvent<HTMLButtonElement>) => {\n const baseHandler = (buttonProps as { onClick?: (e: ReactMouseEvent<HTMLButtonElement>) => void }).onClick;\n baseHandler?.(e);\n if (wasOpenBeforePressRef.current && state.isOpen) {\n state.close();\n }\n wasOpenBeforePressRef.current = false;\n };\n\n return (\n <div\n className={cn(\n \"ods-select\",\n `ods-select--${size}`,\n error && \"ods-select--error\",\n disabled && \"ods-select--disabled\",\n className,\n )}\n >\n {label && (\n <label className={\"ods-select__label\"} htmlFor={baseId}>\n {label}\n </label>\n )}\n\n <HiddenSelect state={state} triggerRef={triggerRef} label={label} name={name} />\n\n <button\n {...buttonProps}\n onPointerDown={handleTriggerPointerDown}\n onClick={handleTriggerClick}\n ref={setTriggerRef}\n id={baseId}\n form={form}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={describedBy}\n aria-required={required || undefined}\n aria-invalid={error ? true : undefined}\n className={cn(\"ods-select__trigger\", state.isOpen && \"ods-select__trigger--open\")}\n >\n <span className={\"ods-select__value\"}>\n {selectedOption ? (\n <>\n {selectedOption.icon && (\n <span className={\"ods-select__value-icon\"}>{selectedOption.icon}</span>\n )}\n {selectedOption.label}\n </>\n ) : (\n <span className={\"ods-select__placeholder\"}>{placeholder}</span>\n )}\n </span>\n <span\n className={cn(\n \"ods-select__chevron\",\n state.isOpen && \"ods-select__chevron--open\",\n )}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon size=\"xs\" />\n </span>\n </button>\n\n {typeof document !== \"undefined\" &&\n createPortal(\n <AnimatePresence>\n {state.isOpen && (\n <motion.div\n ref={dropdownRef}\n data-ods-floating=\"\"\n className={\"ods-select__dropdown\"}\n style={{\n position: \"fixed\",\n ...(dropdownPos.top !== undefined && { top: dropdownPos.top }),\n ...(dropdownPos.bottom !== undefined && { bottom: dropdownPos.bottom }),\n left: dropdownPos.left,\n // `minWidth` (not `width`) keeps the popover at\n // least as wide as the trigger — preserves visual\n // alignment — but allows the consumer to widen it\n // explicitly when option labels demand more room\n // (pass `dropdownMinWidth` to set a higher floor).\n // Avoids the previous `max-content` recipe which\n // made the popover grow uncomfortably wide on\n // searchable / long-option menus.\n minWidth: Math.max(dropdownPos.width, dropdownMinWidth ?? 0),\n // Bound the popover to the available viewport edge so\n // it never spills off-screen on tall pages. Pairs with\n // `overflow-y: auto` from the .ods-select__dropdown\n // SCSS so long option lists scroll internally.\n maxHeight: dropdownPos.maxHeight,\n }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.2, ease: [0.16, 1, 0.3, 1] }}\n >\n {searchable && (\n <div className={\"ods-select__search-wrap\"}>\n <input\n ref={searchRef}\n className={\"ods-select__search\"}\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n aria-label=\"Search options\"\n onKeyDown={(e) => {\n // Allow Escape to close the dropdown\n if (e.key === \"Escape\") {\n state.close();\n }\n }}\n />\n </div>\n )}\n <ListBox\n {...menuProps}\n listBoxRef={listBoxRef}\n state={state}\n showCheckmark={showCheckmark}\n showOverflowTooltips={showOverflowTooltips}\n />\n {filteredOptions.length === 0 && (\n <div className={\"ods-select__empty\"}>No results found</div>\n )}\n </motion.div>\n )}\n </AnimatePresence>,\n document.body,\n )}\n\n {error && errorMessage ? (\n <span\n id={hintId}\n className={\"ods-select__error\"}\n role=\"alert\"\n >\n {errorMessage}\n </span>\n ) : helperText ? (\n <span id={hintId} className={\"ods-select__hint\"}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n});\n\nSelect.displayName = \"Select\";\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport React, {SetStateAction, useCallback, useEffect, useReducer, useRef, useState} from 'react';\n\n// Use the earliest effect possible to reset the ref below.\nconst useEarlyEffect: typeof React.useLayoutEffect = typeof document !== 'undefined'\n ? React['useInsertionEffect'] ?? React.useLayoutEffect\n : () => {};\n\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined>, defaultValue: Exclude<T, undefined> | undefined, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: Exclude<T, undefined> | undefined, defaultValue: Exclude<T, undefined>, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void];\nexport function useControlledState<T, C = T>(value: T, defaultValue: T, onChange?: (v: C, ...args: any[]) => void): [T, (value: SetStateAction<T>, ...args: any[]) => void] {\n // Store the value in both state and a ref. The state value will only be used when uncontrolled.\n // The ref is used to track the most current value, which is passed to the function setState callback.\n let [stateValue, setStateValue] = useState(value || defaultValue);\n let valueRef = useRef(stateValue);\n\n let isControlledRef = useRef(value !== undefined);\n let isControlled = value !== undefined;\n useEffect(() => {\n let wasControlled = isControlledRef.current;\n if (wasControlled !== isControlled && process.env.NODE_ENV !== 'production') {\n console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);\n }\n isControlledRef.current = isControlled;\n }, [isControlled]);\n\n // After each render, update the ref to the current value.\n // This ensures that the setState callback argument is reset.\n // Note: the effect should not have any dependencies so that controlled values always reset.\n let currentValue = isControlled ? value : stateValue;\n useEarlyEffect(() => {\n valueRef.current = currentValue;\n });\n\n let [, forceUpdate] = useReducer(() => ({}), {});\n let setValue = useCallback((value: SetStateAction<T>, ...args: any[]) => {\n // @ts-ignore - TS doesn't know that T cannot be a function.\n let newValue = typeof value === 'function' ? value(valueRef.current) : value;\n if (!Object.is(valueRef.current, newValue)) {\n // Update the ref so that the next setState callback has the most recent value.\n valueRef.current = newValue;\n\n setStateValue(newValue);\n\n // Always trigger a re-render, even when controlled, so that the layout effect above runs to reset the value.\n forceUpdate();\n\n // Trigger onChange. Note that if setState is called multiple times in a single event,\n // onChange will be called for each one instead of only once.\n onChange?.(newValue, ...args);\n }\n }, [onChange]);\n\n return [currentValue, setValue];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Context, createContext, useContext, useEffect, useMemo, useRef, useState} from 'react';\nimport {Validation, ValidationErrors, ValidationFunction, ValidationResult} from '@react-types/shared';\n\nexport const VALID_VALIDITY_STATE: ValidityState = {\n badInput: false,\n customError: false,\n patternMismatch: false,\n rangeOverflow: false,\n rangeUnderflow: false,\n stepMismatch: false,\n tooLong: false,\n tooShort: false,\n typeMismatch: false,\n valueMissing: false,\n valid: true\n};\n\nconst CUSTOM_VALIDITY_STATE: ValidityState = {\n ...VALID_VALIDITY_STATE,\n customError: true,\n valid: false\n};\n\nexport const DEFAULT_VALIDATION_RESULT: ValidationResult = {\n isInvalid: false,\n validationDetails: VALID_VALIDITY_STATE,\n validationErrors: []\n};\n\nexport const FormValidationContext: Context<ValidationErrors> = createContext<ValidationErrors>({});\n\n// Private props that we pass from useFormValidationState to children.\n// Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552\n// This needs to be stable across server and client module evaluation for SSR hydration.\nexport const privateValidationStateProp: string = '__reactAriaFormValidationState';\n\ninterface FormValidationProps<T> extends Validation<T> {\n builtinValidation?: ValidationResult,\n name?: string | string[],\n value: T | null\n}\n\nexport interface FormValidationState {\n /** Realtime validation results, updated as the user edits the value. */\n realtimeValidation: ValidationResult,\n /** Currently displayed validation results, updated when the user commits their changes. */\n displayValidation: ValidationResult,\n /** Updates the current validation result. Not displayed to the user until `commitValidation` is called. */\n updateValidation(result: ValidationResult): void,\n /** Resets the displayed validation state to valid when the user resets the form. */\n resetValidation(): void,\n /** Commits the realtime validation so it is displayed to the user. */\n commitValidation(): void\n}\n\nexport function useFormValidationState<T>(props: FormValidationProps<T>): FormValidationState {\n // Private prop for parent components to pass state to children.\n if (props[privateValidationStateProp]) {\n let {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation} = props[privateValidationStateProp] as FormValidationState;\n return {realtimeValidation, displayValidation, updateValidation, resetValidation, commitValidation};\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useFormValidationStateImpl(props);\n}\n\nfunction useFormValidationStateImpl<T>(props: FormValidationProps<T>): FormValidationState {\n let {isInvalid, validationState, name, value, builtinValidation, validate, validationBehavior = 'aria'} = props;\n\n // backward compatibility.\n if (validationState) {\n isInvalid ||= validationState === 'invalid';\n }\n\n // If the isInvalid prop is controlled, update validation result in realtime.\n let controlledError: ValidationResult | null = isInvalid !== undefined ? {\n isInvalid,\n validationErrors: [],\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n\n // Perform custom client side validation.\n let clientError: ValidationResult | null = useMemo(() => {\n if (!validate || value == null) {\n return null;\n }\n let validateErrors = runValidate(validate, value);\n return getValidationResult(validateErrors);\n }, [validate, value]);\n\n if (builtinValidation?.validationDetails.valid) {\n builtinValidation = undefined;\n }\n\n // Get relevant server errors from the form.\n let serverErrors = useContext(FormValidationContext);\n let serverErrorMessages = useMemo(() => {\n if (name) {\n return Array.isArray(name) ? name.flatMap(name => asArray(serverErrors[name])) : asArray(serverErrors[name]);\n }\n return [];\n }, [serverErrors, name]);\n\n // Show server errors when the form gets a new value, and clear when the user changes the value.\n let [lastServerErrors, setLastServerErrors] = useState(serverErrors);\n let [isServerErrorCleared, setServerErrorCleared] = useState(false);\n if (serverErrors !== lastServerErrors) {\n setLastServerErrors(serverErrors);\n setServerErrorCleared(false);\n }\n\n let serverError: ValidationResult | null = useMemo(() =>\n getValidationResult(isServerErrorCleared ? [] : serverErrorMessages),\n [isServerErrorCleared, serverErrorMessages]\n );\n\n // Track the next validation state in a ref until commitValidation is called.\n let nextValidation = useRef(DEFAULT_VALIDATION_RESULT);\n let [currentValidity, setCurrentValidity] = useState(DEFAULT_VALIDATION_RESULT);\n\n let lastError = useRef(DEFAULT_VALIDATION_RESULT);\n let commitValidation = () => {\n if (!commitQueued) {\n return;\n }\n\n setCommitQueued(false);\n let error = clientError || builtinValidation || nextValidation.current;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n };\n\n let [commitQueued, setCommitQueued] = useState(false);\n useEffect(commitValidation);\n\n // realtimeValidation is used to update the native input element's state based on custom validation logic.\n // displayValidation is the currently displayed validation state that the user sees (e.g. on input change/form submit).\n // With validationBehavior=\"aria\", all errors are displayed in realtime rather than on submit.\n let realtimeValidation = controlledError || serverError || clientError || builtinValidation || DEFAULT_VALIDATION_RESULT;\n let displayValidation = validationBehavior === 'native'\n ? controlledError || serverError || currentValidity\n : controlledError || serverError || clientError || builtinValidation || currentValidity;\n\n return {\n realtimeValidation,\n displayValidation,\n updateValidation(value) {\n // If validationBehavior is 'aria', update in realtime. Otherwise, store in a ref until commit.\n if (validationBehavior === 'aria' && !isEqualValidation(currentValidity, value)) {\n setCurrentValidity(value);\n } else {\n nextValidation.current = value;\n }\n },\n resetValidation() {\n // Update the currently displayed validation state to valid on form reset,\n // even if the native validity says it isn't. It'll show again on the next form submit.\n let error = DEFAULT_VALIDATION_RESULT;\n if (!isEqualValidation(error, lastError.current)) {\n lastError.current = error;\n setCurrentValidity(error);\n }\n\n // Do not commit validation after the next render. This avoids a condition where\n // useSelect calls commitValidation inside an onReset handler.\n if (validationBehavior === 'native') {\n setCommitQueued(false);\n }\n\n setServerErrorCleared(true);\n },\n commitValidation() {\n // Commit validation state so the user sees it on blur/change/submit. Also clear any server errors.\n // Wait until after the next render to commit so that the latest value has been validated.\n if (validationBehavior === 'native') {\n setCommitQueued(true);\n }\n setServerErrorCleared(true);\n }\n };\n}\n\nfunction asArray<T>(v: T | T[]): T[] {\n if (!v) {\n return [];\n }\n\n return Array.isArray(v) ? v : [v];\n}\n\nfunction runValidate<T>(validate: ValidationFunction<T>, value: T): string[] {\n if (typeof validate === 'function') {\n let e = validate(value);\n if (e && typeof e !== 'boolean') {\n return asArray(e);\n }\n }\n\n return [];\n}\n\nfunction getValidationResult(errors: string[]): ValidationResult | null {\n return errors.length ? {\n isInvalid: true,\n validationErrors: errors,\n validationDetails: CUSTOM_VALIDITY_STATE\n } : null;\n}\n\nfunction isEqualValidation(a: ValidationResult | null, b: ValidationResult | null): boolean {\n if (a === b) {\n return true;\n }\n\n return !!a && !!b\n && a.isInvalid === b.isInvalid\n && a.validationErrors.length === b.validationErrors.length\n && a.validationErrors.every((a, i) => a === b.validationErrors[i])\n && Object.entries(a.validationDetails).every(([k, v]) => b.validationDetails[k] === v);\n}\n\nexport function mergeValidation(...results: ValidationResult[]): ValidationResult {\n let errors = new Set<string>();\n let isInvalid = false;\n let validationDetails = {\n ...VALID_VALIDITY_STATE\n };\n\n for (let v of results) {\n for (let e of v.validationErrors) {\n errors.add(e);\n }\n\n // Only these properties apply for checkboxes.\n isInvalid ||= v.isInvalid;\n for (let key in validationDetails) {\n validationDetails[key] ||= v.validationDetails[key];\n }\n }\n\n validationDetails.valid = !isInvalid;\n return {\n isInvalid,\n validationErrors: [...errors],\n validationDetails\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport type {Collection, Node} from '@react-types/shared';\n\nexport function getChildNodes<T>(node: Node<T>, collection: Collection<Node<T>>): Iterable<Node<T>> {\n // New API: call collection.getChildren with the node key.\n if (typeof collection.getChildren === 'function') {\n return collection.getChildren(node.key);\n }\n\n // Old API: access childNodes directly.\n return node.childNodes;\n}\n\nexport function getFirstItem<T>(iterable: Iterable<T>): T | undefined {\n return getNthItem(iterable, 0);\n}\n\nexport function getNthItem<T>(iterable: Iterable<T>, index: number): T | undefined {\n if (index < 0) {\n return undefined;\n }\n\n let i = 0;\n for (let item of iterable) {\n if (i === index) {\n return item;\n }\n\n i++;\n }\n}\n\nexport function getLastItem<T>(iterable: Iterable<T>): T | undefined {\n let lastItem: T | undefined = undefined;\n for (let value of iterable) {\n lastItem = value;\n }\n\n return lastItem;\n}\n\nexport function compareNodeOrder<T>(collection: Collection<Node<T>>, a: Node<T>, b: Node<T>): number {\n // If the two nodes have the same parent, compare their indices.\n if (a.parentKey === b.parentKey) {\n return a.index - b.index;\n }\n\n // Otherwise, collect all of the ancestors from each node, and find the first one that doesn't match starting from the root.\n // Include the base nodes in case we are comparing nodes of different levels so that we can compare the higher node to the lower level node's\n // ancestor of the same level\n let aAncestors = [...getAncestors(collection, a), a];\n let bAncestors = [...getAncestors(collection, b), b];\n let firstNonMatchingAncestor = aAncestors.slice(0, bAncestors.length).findIndex((a, i) => a !== bAncestors[i]);\n if (firstNonMatchingAncestor !== -1) {\n // Compare the indices of two children within the common ancestor.\n a = aAncestors[firstNonMatchingAncestor];\n b = bAncestors[firstNonMatchingAncestor];\n return a.index - b.index;\n }\n\n // If there isn't a non matching ancestor, we might be in a case where one of the nodes is the ancestor of the other.\n if (aAncestors.findIndex(node => node === b) >= 0) {\n return 1;\n } else if (bAncestors.findIndex(node => node === a) >= 0) {\n return -1;\n }\n\n // 🤷\n return -1;\n}\n\nfunction getAncestors<T>(collection: Collection<Node<T>>, node: Node<T>): Node<T>[] {\n let parents: Node<T>[] = [];\n\n let currNode: Node<T> | null = node;\n while (currNode?.parentKey != null) {\n currNode = collection.getItem(currNode.parentKey);\n if (currNode) {\n parents.unshift(currNode);\n }\n }\n\n return parents;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, Key, Node} from '@react-types/shared';\n\nexport class ListCollection<T> implements Collection<Node<T>> {\n private keyMap: Map<Key, Node<T>> = new Map();\n private iterable: Iterable<Node<T>>;\n private firstKey: Key | null = null;\n private lastKey: Key | null = null;\n private _size: number;\n\n constructor(nodes: Iterable<Node<T>>) {\n this.iterable = nodes;\n\n let visit = (node: Node<T>) => {\n this.keyMap.set(node.key, node);\n\n if (node.childNodes && node.type === 'section') {\n for (let child of node.childNodes) {\n visit(child);\n }\n }\n };\n\n for (let node of nodes) {\n visit(node);\n }\n\n let last: Node<T> | null = null;\n let index = 0;\n let size = 0;\n for (let [key, node] of this.keyMap) {\n if (last) {\n last.nextKey = key;\n node.prevKey = last.key;\n } else {\n this.firstKey = key;\n node.prevKey = undefined;\n }\n\n if (node.type === 'item') {\n node.index = index++;\n }\n\n // Only count sections and items when determining size so that\n // loaders and separators in RAC/S2 don't influence the emptyState determination\n if (node.type === 'section' || node.type === 'item') {\n size++;\n }\n\n last = node;\n\n // Set nextKey as undefined since this might be the last node\n // If it isn't the last node, last.nextKey will properly set at start of new loop\n last.nextKey = undefined;\n }\n this._size = size;\n this.lastKey = last?.key ?? null;\n }\n\n *[Symbol.iterator](): IterableIterator<Node<T>> {\n yield* this.iterable;\n }\n\n get size(): number {\n return this._size;\n }\n\n getKeys(): IterableIterator<Key> {\n return this.keyMap.keys();\n }\n\n getKeyBefore(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.prevKey ?? null : null;\n }\n\n getKeyAfter(key: Key): Key | null {\n let node = this.keyMap.get(key);\n return node ? node.nextKey ?? null : null;\n }\n\n getFirstKey(): Key | null {\n return this.firstKey;\n }\n\n getLastKey(): Key | null {\n return this.lastKey;\n }\n\n getItem(key: Key): Node<T> | null {\n return this.keyMap.get(key) ?? null;\n }\n\n at(idx: number): Node<T> | null {\n const keys = [...this.getKeys()];\n return this.getItem(keys[idx]);\n }\n\n getChildren(key: Key): Iterable<Node<T>> {\n let node = this.keyMap.get(key);\n return node?.childNodes || [];\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Key} from '@react-types/shared';\n\n/**\n * A Selection is a special Set containing Keys, which also has an anchor\n * and current selected key for use when range selecting.\n */\nexport class Selection extends Set<Key> {\n anchorKey: Key | null;\n currentKey: Key | null;\n\n constructor(keys?: Iterable<Key> | Selection, anchorKey?: Key | null, currentKey?: Key | null) {\n super(keys);\n if (keys instanceof Selection) {\n this.anchorKey = anchorKey ?? keys.anchorKey;\n this.currentKey = currentKey ?? keys.currentKey;\n } else {\n this.anchorKey = anchorKey ?? null;\n this.currentKey = currentKey ?? null;\n }\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {DisabledBehavior, FocusStrategy, Key, MultipleSelection, SelectionBehavior, SelectionMode} from '@react-types/shared';\nimport {MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useEffect, useMemo, useRef, useState} from 'react';\n\nfunction equalSets(setA, setB) {\n if (setA.size !== setB.size) {\n return false;\n }\n\n for (let item of setA) {\n if (!setB.has(item)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface MultipleSelectionStateProps extends MultipleSelection {\n /**\n * How multiple selection should behave in the collection.\n * @default 'toggle'\n */\n selectionBehavior?: SelectionBehavior,\n /** Whether onSelectionChange should fire even if the new set of keys is the same as the last. */\n allowDuplicateSelectionEvents?: boolean,\n /**\n * Whether `disabledKeys` applies to all interactions, or only selection.\n * @default 'all'\n */\n disabledBehavior?: DisabledBehavior\n}\n\n/**\n * Manages state for multiple selection and focus in a collection.\n */\nexport function useMultipleSelectionState(props: MultipleSelectionStateProps): MultipleSelectionState {\n let {\n selectionMode = 'none' as SelectionMode,\n disallowEmptySelection = false,\n allowDuplicateSelectionEvents,\n selectionBehavior: selectionBehaviorProp = 'toggle',\n disabledBehavior = 'all'\n } = props;\n\n // We want synchronous updates to `isFocused` and `focusedKey` after their setters are called.\n // But we also need to trigger a react re-render. So, we have both a ref (sync) and state (async).\n let isFocusedRef = useRef(false);\n let [, setFocused] = useState(false);\n let focusedKeyRef = useRef<Key | null>(null);\n let childFocusStrategyRef = useRef<FocusStrategy | null>(null);\n let [, setFocusedKey] = useState<Key | null>(null);\n let selectedKeysProp = useMemo(() => convertSelection(props.selectedKeys), [props.selectedKeys]);\n let defaultSelectedKeys = useMemo(() => convertSelection(props.defaultSelectedKeys, new Selection()), [props.defaultSelectedKeys]);\n let [selectedKeys, setSelectedKeys] = useControlledState(\n selectedKeysProp,\n defaultSelectedKeys!,\n props.onSelectionChange\n );\n let disabledKeysProp = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n let [selectionBehavior, setSelectionBehavior] = useState(selectionBehaviorProp);\n\n // If the selectionBehavior prop is set to replace, but the current state is toggle (e.g. due to long press\n // to enter selection mode on touch), and the selection becomes empty, reset the selection behavior.\n if (selectionBehaviorProp === 'replace' && selectionBehavior === 'toggle' && typeof selectedKeys === 'object' && selectedKeys.size === 0) {\n setSelectionBehavior('replace');\n }\n\n // If the selectionBehavior prop changes, update the state as well.\n let lastSelectionBehavior = useRef(selectionBehaviorProp);\n useEffect(() => {\n if (selectionBehaviorProp !== lastSelectionBehavior.current) {\n setSelectionBehavior(selectionBehaviorProp);\n lastSelectionBehavior.current = selectionBehaviorProp;\n }\n }, [selectionBehaviorProp]);\n\n return {\n selectionMode,\n disallowEmptySelection,\n selectionBehavior,\n setSelectionBehavior,\n get isFocused() {\n return isFocusedRef.current;\n },\n setFocused(f) {\n isFocusedRef.current = f;\n setFocused(f);\n },\n get focusedKey() {\n return focusedKeyRef.current;\n },\n get childFocusStrategy() {\n return childFocusStrategyRef.current;\n },\n setFocusedKey(k, childFocusStrategy = 'first') {\n focusedKeyRef.current = k;\n childFocusStrategyRef.current = childFocusStrategy;\n setFocusedKey(k);\n },\n selectedKeys,\n setSelectedKeys(keys) {\n if (allowDuplicateSelectionEvents || !equalSets(keys, selectedKeys)) {\n setSelectedKeys(keys);\n }\n },\n disabledKeys: disabledKeysProp,\n disabledBehavior\n };\n}\n\nfunction convertSelection(selection: 'all' | Iterable<Key> | null | undefined, defaultValue?: Selection): 'all' | Set<Key> | undefined {\n if (!selection) {\n return defaultValue;\n }\n\n return selection === 'all'\n ? 'all'\n : new Selection(selection);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n Collection, DisabledBehavior,\n FocusStrategy,\n Selection as ISelection,\n Key,\n LayoutDelegate,\n LongPressEvent,\n Node,\n PressEvent,\n SelectionBehavior,\n SelectionMode\n} from '@react-types/shared';\nimport {compareNodeOrder, getChildNodes, getFirstItem} from '../collections/getChildNodes';\nimport {MultipleSelectionManager, MultipleSelectionState} from './types';\nimport {Selection} from './Selection';\n\ninterface SelectionManagerOptions {\n allowsCellSelection?: boolean,\n layoutDelegate?: LayoutDelegate,\n fullCollection?: Collection<Node<unknown>>\n}\n\n/**\n * An interface for reading and updating multiple selection state.\n */\nexport class SelectionManager implements MultipleSelectionManager {\n collection: Collection<Node<unknown>>;\n private state: MultipleSelectionState;\n private allowsCellSelection: boolean;\n private _isSelectAll: boolean | null;\n private layoutDelegate: LayoutDelegate | null;\n private fullCollection: Collection<Node<unknown>> | null;\n\n constructor(collection: Collection<Node<unknown>>, state: MultipleSelectionState, options?: SelectionManagerOptions) {\n this.collection = collection;\n this.state = state;\n this.allowsCellSelection = options?.allowsCellSelection ?? false;\n this._isSelectAll = null;\n this.layoutDelegate = options?.layoutDelegate || null;\n this.fullCollection = options?.fullCollection || null;\n }\n\n /**\n * The type of selection that is allowed in the collection.\n */\n get selectionMode(): SelectionMode {\n return this.state.selectionMode;\n }\n\n /**\n * Whether the collection allows empty selection.\n */\n get disallowEmptySelection(): boolean {\n return this.state.disallowEmptySelection;\n }\n\n /**\n * The selection behavior for the collection.\n */\n get selectionBehavior(): SelectionBehavior {\n return this.state.selectionBehavior;\n }\n\n /**\n * Sets the selection behavior for the collection.\n */\n setSelectionBehavior(selectionBehavior: SelectionBehavior): void {\n this.state.setSelectionBehavior(selectionBehavior);\n }\n\n /**\n * Whether the collection is currently focused.\n */\n get isFocused(): boolean {\n return this.state.isFocused;\n }\n\n /**\n * Sets whether the collection is focused.\n */\n setFocused(isFocused: boolean): void {\n this.state.setFocused(isFocused);\n }\n\n /**\n * The current focused key in the collection.\n */\n get focusedKey(): Key | null {\n return this.state.focusedKey;\n }\n\n /** Whether the first or last child of the focused key should receive focus. */\n get childFocusStrategy(): FocusStrategy | null {\n return this.state.childFocusStrategy;\n }\n\n /**\n * Sets the focused key.\n */\n setFocusedKey(key: Key | null, childFocusStrategy?: FocusStrategy): void {\n if (key == null || this.collection.getItem(key)) {\n this.state.setFocusedKey(key, childFocusStrategy);\n }\n }\n\n /**\n * The currently selected keys in the collection.\n */\n get selectedKeys(): Set<Key> {\n return this.state.selectedKeys === 'all'\n ? new Set(this.getSelectAllKeys())\n : this.state.selectedKeys;\n }\n\n /**\n * The raw selection value for the collection.\n * Either 'all' for select all, or a set of keys.\n */\n get rawSelection(): ISelection {\n return this.state.selectedKeys;\n }\n\n /**\n * Returns whether a key is selected.\n */\n isSelected(key: Key): boolean {\n if (this.state.selectionMode === 'none') {\n return false;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return false;\n }\n return this.state.selectedKeys === 'all'\n ? this.canSelectItem(mappedKey)\n : this.state.selectedKeys.has(mappedKey);\n }\n\n /**\n * Whether the selection is empty.\n */\n get isEmpty(): boolean {\n return this.state.selectedKeys !== 'all' && this.state.selectedKeys.size === 0;\n }\n\n /**\n * Whether all items in the collection are selected.\n */\n get isSelectAll(): boolean {\n if (this.isEmpty) {\n return false;\n }\n\n if (this.state.selectedKeys === 'all') {\n return true;\n }\n\n if (this._isSelectAll != null) {\n return this._isSelectAll;\n }\n\n let allKeys = this.getSelectAllKeys();\n let selectedKeys = this.state.selectedKeys;\n this._isSelectAll = allKeys.every(k => selectedKeys.has(k));\n return this._isSelectAll;\n }\n\n get firstSelectedKey(): Key | null {\n let first: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!first || (item && compareNodeOrder(this.collection, item, first) < 0)) {\n first = item;\n }\n }\n\n return first?.key ?? null;\n }\n\n get lastSelectedKey(): Key | null {\n let last: Node<unknown> | null = null;\n for (let key of this.state.selectedKeys) {\n let item = this.collection.getItem(key);\n if (!last || (item && compareNodeOrder(this.collection, item, last) > 0)) {\n last = item;\n }\n }\n\n return last?.key ?? null;\n }\n\n get disabledKeys(): Set<Key> {\n return this.state.disabledKeys;\n }\n\n get disabledBehavior(): DisabledBehavior {\n return this.state.disabledBehavior;\n }\n\n /**\n * Extends the selection to the given key.\n */\n extendSelection(toKey: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.replaceSelection(toKey);\n return;\n }\n\n let mappedToKey = this.getKey(toKey);\n if (mappedToKey == null) {\n return;\n }\n\n let selection: Selection;\n\n // Only select the one key if coming from a select all.\n if (this.state.selectedKeys === 'all') {\n selection = new Selection([mappedToKey], mappedToKey, mappedToKey);\n } else {\n let selectedKeys = this.state.selectedKeys as Selection;\n let anchorKey = selectedKeys.anchorKey ?? mappedToKey;\n selection = new Selection(selectedKeys, anchorKey, mappedToKey);\n for (let key of this.getKeyRange(anchorKey, selectedKeys.currentKey ?? mappedToKey)) {\n selection.delete(key);\n }\n\n for (let key of this.getKeyRange(mappedToKey, anchorKey)) {\n if (this.canSelectItem(key)) {\n selection.add(key);\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getKeyRange(from: Key, to: Key) {\n let fromItem = this.collection.getItem(from);\n let toItem = this.collection.getItem(to);\n if (fromItem && toItem) {\n if (compareNodeOrder(this.collection, fromItem, toItem) <= 0) {\n return this.getKeyRangeInternal(from, to);\n }\n\n return this.getKeyRangeInternal(to, from);\n }\n\n return [];\n }\n\n private getKeyRangeInternal(from: Key, to: Key) {\n if (this.layoutDelegate?.getKeyRange) {\n return this.layoutDelegate.getKeyRange(from, to);\n }\n\n let keys: Key[] = [];\n let key: Key | null = from;\n while (key != null) {\n let item = this.collection.getItem(key);\n if (item && (item.type === 'item' || (item.type === 'cell' && this.allowsCellSelection))) {\n keys.push(key);\n }\n\n if (key === to) {\n return keys;\n }\n\n key = this.collection.getKeyAfter(key);\n }\n\n return [];\n }\n\n private getKey(key: Key) {\n let item = this.collection.getItem(key);\n if (!item) {\n // ¯\\_(ツ)_/¯\n return key;\n }\n\n // If cell selection is allowed, just return the key.\n if (item.type === 'cell' && this.allowsCellSelection) {\n return key;\n }\n\n // Find a parent item to select\n while (item && item.type !== 'item' && item.parentKey != null) {\n item = this.collection.getItem(item.parentKey);\n }\n\n if (!item || item.type !== 'item') {\n return null;\n }\n\n return item.key;\n }\n\n /**\n * Toggles whether the given key is selected.\n */\n toggleSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single' && !this.isSelected(key)) {\n this.replaceSelection(key);\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let keys = new Selection(this.state.selectedKeys === 'all' ? this.getSelectAllKeys() : this.state.selectedKeys);\n if (keys.has(mappedKey)) {\n keys.delete(mappedKey);\n // TODO: move anchor to last selected key...\n // Does `current` need to move here too?\n } else if (this.canSelectItem(mappedKey)) {\n keys.add(mappedKey);\n keys.anchorKey = mappedKey;\n keys.currentKey = mappedKey;\n }\n\n if (this.disallowEmptySelection && keys.size === 0) {\n return;\n }\n\n this.state.setSelectedKeys(keys);\n }\n\n /**\n * Replaces the selection with only the given key.\n */\n replaceSelection(key: Key): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let mappedKey = this.getKey(key);\n if (mappedKey == null) {\n return;\n }\n\n let selection = this.canSelectItem(mappedKey)\n ? new Selection([mappedKey], mappedKey, mappedKey)\n : new Selection();\n\n this.state.setSelectedKeys(selection);\n }\n\n /**\n * Replaces the selection with the given keys.\n */\n setSelectedKeys(keys: Iterable<Key>): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n let selection = new Selection();\n for (let key of keys) {\n let mappedKey = this.getKey(key);\n if (mappedKey != null) {\n selection.add(mappedKey);\n if (this.selectionMode === 'single') {\n break;\n }\n }\n }\n\n this.state.setSelectedKeys(selection);\n }\n\n private getSelectAllKeys() {\n // Use the full (unfiltered) collection when available so that materializing\n // the 'all' selection includes items that are currently filtered out (e.g. by Autocomplete).\n let collection = this.fullCollection ?? this.collection;\n let keys: Key[] = [];\n let addKeys = (key: Key | null) => {\n while (key != null) {\n if (this.canSelectItemIn(key, collection)) {\n let item = collection.getItem(key);\n if (item?.type === 'item') {\n keys.push(key);\n }\n\n // Add child keys. If cell selection is allowed, then include item children too.\n if (item?.hasChildNodes && (this.allowsCellSelection || item.type !== 'item')) {\n addKeys(getFirstItem(getChildNodes(item, collection))?.key ?? null);\n }\n }\n\n key = collection.getKeyAfter(key);\n }\n };\n\n addKeys(collection.getFirstKey());\n return keys;\n }\n\n /**\n * Selects all items in the collection.\n */\n selectAll(): void {\n if (!this.isSelectAll && this.selectionMode === 'multiple') {\n this.state.setSelectedKeys('all');\n }\n }\n\n /**\n * Removes all keys from the selection.\n */\n clearSelection(): void {\n if (!this.disallowEmptySelection && (this.state.selectedKeys === 'all' || this.state.selectedKeys.size > 0)) {\n this.state.setSelectedKeys(new Selection());\n }\n }\n\n /**\n * Toggles between select all and an empty selection.\n */\n toggleSelectAll(): void {\n if (this.isSelectAll) {\n this.clearSelection();\n } else {\n this.selectAll();\n }\n }\n\n select(key: Key, e?: PressEvent | LongPressEvent | PointerEvent): void {\n if (this.selectionMode === 'none') {\n return;\n }\n\n if (this.selectionMode === 'single') {\n if (this.isSelected(key) && !this.disallowEmptySelection) {\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n } else if (this.selectionBehavior === 'toggle' || (e && (e.pointerType === 'touch' || e.pointerType === 'virtual'))) {\n // if touch or virtual (VO) then we just want to toggle, otherwise it's impossible to multi select because they don't have modifier keys\n this.toggleSelection(key);\n } else {\n this.replaceSelection(key);\n }\n }\n\n /**\n * Returns whether the current selection is equal to the given selection.\n */\n isSelectionEqual(selection: Set<Key>): boolean {\n if (selection === this.state.selectedKeys) {\n return true;\n }\n\n // Check if the set of keys match.\n let selectedKeys = this.selectedKeys;\n if (selection.size !== selectedKeys.size) {\n return false;\n }\n\n for (let key of selection) {\n if (!selectedKeys.has(key)) {\n return false;\n }\n }\n\n for (let key of selectedKeys) {\n if (!selection.has(key)) {\n return false;\n }\n }\n\n return true;\n }\n\n canSelectItem(key: Key): boolean {\n return this.canSelectItemIn(key, this.collection);\n }\n\n private canSelectItemIn(key: Key, collection: Collection<Node<unknown>>): boolean {\n if (this.state.selectionMode === 'none' || this.state.disabledKeys.has(key)) {\n return false;\n }\n\n let item = collection.getItem(key);\n if (!item || item?.props?.isDisabled || (item.type === 'cell' && !this.allowsCellSelection)) {\n return false;\n }\n\n return true;\n }\n\n isDisabled(key: Key): boolean {\n return this.state.disabledBehavior === 'all' && (this.state.disabledKeys.has(key) || !!this.collection.getItem(key)?.props?.isDisabled);\n }\n\n isLink(key: Key): boolean {\n return !!this.collection.getItem(key)?.props?.href;\n }\n\n getItemProps(key: Key): any {\n return this.collection.getItem(key)?.props;\n }\n\n withCollection(collection: Collection<Node<unknown>>): SelectionManager {\n return new SelectionManager(collection, this.state, {\n allowsCellSelection: this.allowsCellSelection,\n layoutDelegate: this.layoutDelegate || undefined,\n fullCollection: this.fullCollection ?? this.collection\n });\n }\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionElement, Key, Node} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {ReactElement} from 'react';\n\ninterface CollectionBuilderState {\n renderer?: (value: any) => ReactElement | null\n}\n\ninterface CollectReactElement<T> extends ReactElement {\n getCollectionNode(props: any, context: any): Generator<PartialNode<T>, void, Node<T>[]>\n}\n\nexport class CollectionBuilder<T extends object> {\n private context?: unknown;\n private cache: WeakMap<T, Node<T>> = new WeakMap();\n\n build(props: Partial<CollectionBase<T>>, context?: unknown): Iterable<Node<T>> {\n this.context = context;\n return iterable(() => this.iterateCollection(props));\n }\n\n private *iterateCollection(props: Partial<CollectionBase<T>>): Generator<Node<T>> {\n let {children, items} = props;\n\n if (React.isValidElement<{children: CollectionElement<T>}>(children) && children.type === React.Fragment) {\n yield* this.iterateCollection({\n children: children.props.children,\n items\n });\n } else if (typeof children === 'function') {\n if (!items) {\n throw new Error('props.children was a function but props.items is missing');\n }\n\n let index = 0;\n for (let item of items) {\n yield* this.getFullNode({\n value: item,\n index\n }, {renderer: children});\n index++;\n }\n } else {\n let items: CollectionElement<T>[] = [];\n React.Children.forEach(children, child => {\n if (child) {\n items.push(child);\n }\n });\n\n let index = 0;\n for (let item of items) {\n let nodes = this.getFullNode({\n element: item,\n index: index\n }, {});\n\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n }\n }\n\n private getKey(item: NonNullable<CollectionElement<T>>, partialNode: PartialNode<T>, state: CollectionBuilderState, parentKey?: Key | null): Key {\n if (item.key != null) {\n return item.key;\n }\n\n if (partialNode.type === 'cell' && partialNode.key != null) {\n return `${parentKey}${partialNode.key}`;\n }\n\n let v = partialNode.value as any;\n if (v != null) {\n let key = v.key ?? v.id;\n if (key == null) {\n throw new Error('No key found for item');\n }\n\n return key;\n }\n\n return parentKey ? `${parentKey}.${partialNode.index}` : `$.${partialNode.index}`;\n }\n\n private getChildState(state: CollectionBuilderState, partialNode: PartialNode<T>) {\n return {\n renderer: partialNode.renderer || state.renderer\n };\n }\n\n private *getFullNode(partialNode: PartialNode<T> & {index: number}, state: CollectionBuilderState, parentKey?: Key | null, parentNode?: Node<T>): Generator<Node<T>> {\n if (React.isValidElement<{children: CollectionElement<T>}>(partialNode.element) && partialNode.element.type === React.Fragment) {\n let children: CollectionElement<T>[] = [];\n\n React.Children.forEach(partialNode.element.props.children, child => {\n children.push(child);\n });\n\n let index = partialNode.index ?? 0;\n\n for (const child of children) {\n yield* this.getFullNode({\n element: child,\n index: index++\n }, state, parentKey, parentNode);\n }\n\n return;\n }\n\n // If there's a value instead of an element on the node, and a parent renderer function is available,\n // use it to render an element for the value.\n let element = partialNode.element;\n if (!element && partialNode.value && state && state.renderer) {\n let cached = this.cache.get(partialNode.value);\n if (cached && (!cached.shouldInvalidate || !cached.shouldInvalidate(this.context))) {\n cached.index = partialNode.index;\n cached.parentKey = parentNode ? parentNode.key : null;\n yield cached;\n return;\n }\n\n element = state.renderer(partialNode.value);\n }\n\n // If there's an element with a getCollectionNode function on its type, then it's a supported component.\n // Call this function to get a partial node, and recursively build a full node from there.\n if (React.isValidElement(element)) {\n let type = element.type as unknown as CollectReactElement<T>;\n if (typeof type !== 'function' && typeof type.getCollectionNode !== 'function') {\n let name = element.type;\n throw new Error(`Unknown element <${name}> in collection.`);\n }\n\n let childNodes = type.getCollectionNode(element.props, this.context) as Generator<PartialNode<T>, void, Node<T>[]>;\n let index = partialNode.index ?? 0;\n let result = childNodes.next();\n while (!result.done && result.value) {\n let childNode = result.value;\n\n partialNode.index = index;\n\n let nodeKey = childNode.key ?? null;\n if (nodeKey == null) {\n nodeKey = childNode.element ? null : this.getKey(element as NonNullable<CollectionElement<T>>, partialNode, state, parentKey);\n }\n\n let nodes = this.getFullNode({\n ...childNode,\n key: nodeKey,\n index,\n wrapper: compose(partialNode.wrapper, childNode.wrapper)\n }, this.getChildState(state, childNode), parentKey ? `${parentKey}${element.key}` : element.key, parentNode);\n\n let children = [...nodes];\n for (let node of children) {\n // Cache the node based on its value\n node.value = childNode.value ?? partialNode.value ?? null;\n if (node.value) {\n this.cache.set(node.value, node);\n }\n\n // The partial node may have specified a type for the child in order to specify a constraint.\n // Verify that the full node that was built recursively matches this type.\n if (partialNode.type && node.type !== partialNode.type) {\n throw new Error(`Unsupported type <${capitalize(node.type)}> in <${capitalize(parentNode?.type ?? 'unknown parent type')}>. Only <${capitalize(partialNode.type)}> is supported.`);\n }\n\n index++;\n yield node;\n }\n\n result = childNodes.next(children);\n }\n\n return;\n }\n\n // Ignore invalid elements\n if (partialNode.key == null || partialNode.type == null) {\n return;\n }\n\n // Create full node\n let builder = this;\n let node: Node<T> = {\n type: partialNode.type,\n props: partialNode.props,\n key: partialNode.key,\n parentKey: parentNode ? parentNode.key : null,\n value: partialNode.value ?? null,\n level: (parentNode?.level ?? 0) + (parentNode?.type === 'item' ? 1 : 0),\n index: partialNode.index,\n rendered: partialNode.rendered,\n textValue: partialNode.textValue ?? '',\n 'aria-label': partialNode['aria-label'],\n wrapper: partialNode.wrapper,\n shouldInvalidate: partialNode.shouldInvalidate,\n hasChildNodes: partialNode.hasChildNodes || false,\n childNodes: iterable(function *() {\n if (!partialNode.hasChildNodes || !partialNode.childNodes) {\n return;\n }\n\n let index = 0;\n for (let child of partialNode.childNodes()) {\n // Ensure child keys are globally unique by prepending the parent node's key\n if (child.key != null) {\n // TODO: Remove this line entirely and enforce that users always provide unique keys.\n // Currently this line will have issues when a parent has a key `a` and a child with key `bc`\n // but another parent has key `ab` and its child has a key `c`. The combined keys would result in both\n // children having a key of `abc`.\n child.key = `${node.key}${child.key}`;\n }\n\n let nodes = builder.getFullNode({...child, index}, builder.getChildState(state, child), node.key, node);\n for (let node of nodes) {\n index++;\n yield node;\n }\n }\n })\n };\n\n yield node;\n }\n}\n\n// Wraps an iterator function as an iterable object, and caches the results.\nfunction iterable<T>(iterator: () => IterableIterator<Node<T>>): Iterable<Node<T>> {\n let cache: Array<Node<T>> = [];\n let iterable: null | IterableIterator<Node<T>> = null;\n return {\n *[Symbol.iterator]() {\n for (let item of cache) {\n yield item;\n }\n\n if (!iterable) {\n iterable = iterator();\n }\n\n for (let item of iterable) {\n cache.push(item);\n yield item;\n }\n }\n };\n}\n\ntype Wrapper = (element: ReactElement) => ReactElement;\nfunction compose(outer: Wrapper | void, inner: Wrapper | void): Wrapper | undefined {\n if (outer && inner) {\n return (element) => outer(inner(element));\n }\n\n if (outer) {\n return outer;\n }\n\n if (inner) {\n return inner;\n }\n}\n\nfunction capitalize(str: string) {\n return str[0].toUpperCase() + str.slice(1);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Node} from '@react-types/shared';\nimport {CollectionBuilder} from './CollectionBuilder';\nimport {ReactElement, useMemo} from 'react';\n\ninterface CollectionOptions<T, C extends Collection<Node<T>>> extends Omit<CollectionStateBase<T, C>, 'children'> {\n children?: ReactElement<any> | null | (ReactElement<any> | null)[] | ((item: T) => ReactElement<any> | null)\n}\n\ntype CollectionFactory<T, C extends Collection<Node<T>>> = (node: Iterable<Node<T>>) => C;\n\nexport function useCollection<T extends object, C extends Collection<Node<T>> = Collection<Node<T>>>(props: CollectionOptions<T, C>, factory: CollectionFactory<T, C>, context?: unknown): C {\n let builder = useMemo(() => new CollectionBuilder<T>(), []);\n let {children, items, collection} = props;\n let result = useMemo(() => {\n if (collection) {\n return collection;\n }\n let nodes = builder.build({children, items}, context);\n return factory(nodes);\n }, [builder, children, items, collection, context, factory]);\n return result;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Collection, CollectionStateBase, Key, LayoutDelegate, Node} from '@react-types/shared';\nimport {ListCollection} from './ListCollection';\nimport {MultipleSelectionStateProps, useMultipleSelectionState} from '../selection/useMultipleSelectionState';\nimport {SelectionManager} from '../selection/SelectionManager';\nimport {useCallback, useEffect, useMemo, useRef} from 'react';\nimport {useCollection} from '../collections/useCollection';\n\nexport interface ListProps<T> extends CollectionStateBase<T>, MultipleSelectionStateProps {\n /** Filter function to generate a filtered list of nodes. */\n filter?: (nodes: Iterable<Node<T>>) => Iterable<Node<T>>,\n /** @private */\n suppressTextValueWarning?: boolean,\n /**\n * A delegate object that provides layout information for items in the collection.\n * This can be used to override the behavior of shift selection.\n */\n layoutDelegate?: LayoutDelegate\n}\n\nexport interface ListState<T> {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>,\n\n /** A set of items that are disabled. */\n disabledKeys: Set<Key>,\n\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager\n}\n\n/**\n * Provides state management for list-like components. Handles building a collection\n * of items from props, and manages multiple selection state.\n */\nexport function useListState<T extends object>(props: ListProps<T>): ListState<T> {\n let {filter, layoutDelegate} = props;\n\n let selectionState = useMultipleSelectionState(props);\n let disabledKeys = useMemo(() =>\n props.disabledKeys ? new Set(props.disabledKeys) : new Set<Key>()\n , [props.disabledKeys]);\n\n let factory = useCallback(nodes => filter ? new ListCollection(filter(nodes)) : new ListCollection(nodes as Iterable<Node<T>>), [filter]);\n let context = useMemo(() => ({suppressTextValueWarning: props.suppressTextValueWarning}), [props.suppressTextValueWarning]);\n\n let collection = useCollection(props, factory, context);\n\n let selectionManager = useMemo(() =>\n new SelectionManager(collection, selectionState, {layoutDelegate})\n , [collection, selectionState, layoutDelegate]\n );\n\n useFocusedKeyReset(collection, selectionManager);\n\n return {\n collection,\n disabledKeys,\n selectionManager\n };\n}\n\n/**\n * Filters a collection using the provided filter function and returns a new ListState.\n */\nexport function UNSTABLE_useFilteredListState<T extends object>(state: ListState<T>, filterFn: ((nodeValue: string, node: Node<T>) => boolean) | null | undefined): ListState<T> {\n let collection = useMemo(() => filterFn ? state.collection.filter!(filterFn) : state.collection, [state.collection, filterFn]);\n let selectionManager = state.selectionManager.withCollection(collection);\n useFocusedKeyReset(collection, selectionManager);\n return {\n collection,\n selectionManager,\n disabledKeys: state.disabledKeys\n };\n}\n\nfunction useFocusedKeyReset<T>(collection: Collection<Node<T>>, selectionManager: SelectionManager) {\n // Reset focused key if that item is deleted from the collection.\n const cachedCollection = useRef<Collection<Node<T>> | null>(null);\n useEffect(() => {\n if (selectionManager.focusedKey != null && !collection.getItem(selectionManager.focusedKey) && cachedCollection.current) {\n // Walk forward in the old collection to find the next key that still exists in the new collection.\n let key = cachedCollection.current.getKeyAfter(selectionManager.focusedKey);\n let nextFocusedKey: Key | null = null;\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyAfter(key);\n }\n\n // If no such key exists, walk backward.\n if (nextFocusedKey == null) {\n key = cachedCollection.current.getKeyBefore(selectionManager.focusedKey);\n while (key != null) {\n let node = collection.getItem(key);\n if (node && node.type === 'item' && !selectionManager.isDisabled(key)) {\n nextFocusedKey = key;\n break;\n }\n\n key = cachedCollection.current.getKeyBefore(key);\n }\n }\n\n selectionManager.setFocusedKey(nextFocusedKey);\n }\n cachedCollection.current = collection;\n }, [collection, selectionManager]);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback} from 'react';\nimport {useControlledState} from '../utils/useControlledState';\n\nexport interface OverlayTriggerProps {\n /** Whether the overlay is open by default (controlled). */\n isOpen?: boolean,\n /** Whether the overlay is open by default (uncontrolled). */\n defaultOpen?: boolean,\n /** Handler that is called when the overlay's open state changes. */\n onOpenChange?: (isOpen: boolean) => void\n}\n\nexport interface OverlayTriggerState {\n /** Whether the overlay is currently open. */\n readonly isOpen: boolean,\n /** Sets whether the overlay is open. */\n setOpen(isOpen: boolean): void,\n /** Opens the overlay. */\n open(): void,\n /** Closes the overlay. */\n close(): void,\n /** Toggles the overlay's visibility. */\n toggle(): void\n}\n\n/**\n * Manages state for an overlay trigger. Tracks whether the overlay is open, and provides\n * methods to toggle this state.\n */\nexport function useOverlayTriggerState(props: OverlayTriggerProps): OverlayTriggerState {\n let [isOpen, setOpen] = useControlledState(props.isOpen, props.defaultOpen || false, props.onOpenChange);\n\n const open = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [setOpen, isOpen]);\n\n return {\n isOpen,\n setOpen,\n open,\n close,\n toggle\n };\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ItemElement, ItemProps} from '@react-types/shared';\nimport {PartialNode} from './types';\nimport React, {JSX, ReactElement} from 'react';\n\nfunction Item<T>(props: ItemProps<T>): ReactElement | null { // eslint-disable-line @typescript-eslint/no-unused-vars\n return null;\n}\n\nItem.getCollectionNode = function* getCollectionNode<T>(props: ItemProps<T>, context: any): Generator<PartialNode<T>> {\n let {childItems, title, children} = props;\n\n let rendered = props.title || props.children;\n let textValue = props.textValue || (typeof rendered === 'string' ? rendered : '') || props['aria-label'] || '';\n\n // suppressTextValueWarning is used in components like Tabs, which don't have type to select support.\n if (!textValue && !context?.suppressTextValueWarning && process.env.NODE_ENV !== 'production') {\n console.warn('<Item> with non-plain text contents is unsupported by type to select for accessibility. Please add a `textValue` prop.');\n }\n\n yield {\n type: 'item',\n props: props,\n rendered,\n textValue,\n 'aria-label': props['aria-label'],\n hasChildNodes: hasChildItems(props),\n *childNodes() {\n if (childItems) {\n for (let child of childItems) {\n yield {\n type: 'item',\n value: child\n };\n }\n } else if (title) {\n let items: PartialNode<T>[] = [];\n React.Children.forEach(children, child => {\n items.push({\n type: 'item',\n element: child as ItemElement<T>\n });\n });\n\n yield* items;\n }\n }\n };\n};\n\nfunction hasChildItems<T>(props: ItemProps<T>) {\n if (props.hasChildItems != null) {\n return props.hasChildItems;\n }\n\n if (props.childItems) {\n return true;\n }\n\n if (props.title && React.Children.count(props.children) > 0) {\n return true;\n }\n\n return false;\n}\n\n// We don't want getCollectionNode to show up in the type definition\nlet _Item = Item as <T>(props: ItemProps<T>) => JSX.Element;\nexport {_Item as Item};\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {CollectionBase, CollectionStateBase, FocusableProps, FocusStrategy, HelpTextProps, InputBase, Key, LabelableProps, Node, Selection, TextInputBase, Validation, ValueBase} from '@react-types/shared';\nimport {FormValidationState, useFormValidationState} from '../form/useFormValidationState';\nimport {ListState, useListState} from '../list/useListState';\nimport {OverlayTriggerState, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useControlledState} from '../utils/useControlledState';\nimport {useMemo, useState} from 'react';\n\nexport type SelectionMode = 'single' | 'multiple';\nexport type ValueType<M extends SelectionMode> = M extends 'single' ? Key | null : readonly Key[];\nexport type ChangeValueType<M extends SelectionMode> = M extends 'single' ? Key | null : Key[];\ntype ValidationType<M extends SelectionMode> = M extends 'single' ? Key : Key[];\n\nexport interface SelectProps<T, M extends SelectionMode = 'single'> extends CollectionBase<T>, Omit<InputBase, 'isReadOnly'>, ValueBase<ValueType<M>, ChangeValueType<M>>, Validation<ValidationType<M>>, HelpTextProps, LabelableProps, TextInputBase, FocusableProps {\n /**\n * Whether single or multiple selection is enabled.\n * @default 'single'\n */\n selectionMode?: M,\n /**\n * The currently selected key in the collection (controlled).\n * @deprecated\n */\n selectedKey?: Key | null,\n /**\n * The initial selected key in the collection (uncontrolled).\n * @deprecated\n */\n defaultSelectedKey?: Key | null,\n /**\n * Handler that is called when the selection changes.\n * @deprecated\n */\n onSelectionChange?: (key: Key | null) => void,\n /** Sets the open state of the menu. */\n isOpen?: boolean,\n /** Sets the default open state of the menu. */\n defaultOpen?: boolean,\n /** Method that is called when the open state of the menu changes. */\n onOpenChange?: (isOpen: boolean) => void,\n /** Whether the Select should close when an item is selected. Defaults to true if selectionMode is single, false otherwise. */\n shouldCloseOnSelect?: boolean,\n /** Whether the select should be allowed to be open when the collection is empty. */\n allowsEmptyCollection?: boolean\n}\n\nexport interface SelectStateOptions<T, M extends SelectionMode = 'single'> extends Omit<SelectProps<T, M>, 'children'>, CollectionStateBase<T> {}\n\nexport interface SelectState<T, M extends SelectionMode = 'single'> extends ListState<T>, OverlayTriggerState, FormValidationState {\n /**\n * The key for the first selected item.\n * @deprecated\n */\n readonly selectedKey: Key | null,\n\n /**\n * The default selected key.\n * @deprecated\n */\n readonly defaultSelectedKey: Key | null,\n\n /**\n * Sets the selected key.\n * @deprecated\n */\n setSelectedKey(key: Key | null): void,\n\n /** The current select value. */\n readonly value: ValueType<M>,\n\n /** The default select value. */\n readonly defaultValue: ValueType<M>,\n\n /** Sets the select value. */\n setValue(value: Key | readonly Key[] | null): void,\n\n /**\n * The value of the first selected item.\n * @deprecated\n */\n readonly selectedItem: Node<T> | null,\n\n /** The value of the selected items. */\n readonly selectedItems: Node<T>[],\n\n /** Whether the select is currently focused. */\n readonly isFocused: boolean,\n\n /** Sets whether the select is focused. */\n setFocused(isFocused: boolean): void,\n\n /** Controls which item will be auto focused when the menu opens. */\n readonly focusStrategy: FocusStrategy | null,\n\n /** Opens the menu. */\n open(focusStrategy?: FocusStrategy | null): void,\n\n /** Toggles the menu. */\n toggle(focusStrategy?: FocusStrategy | null): void\n}\n\n/**\n * Provides state management for a select component. Handles building a collection\n * of items from props, handles the open state for the popup menu, and manages\n * multiple selection state.\n */\nexport function useSelectState<T extends object, M extends SelectionMode = 'single'>(props: SelectStateOptions<T, M>): SelectState<T, M> {\n let {\n selectionMode = 'single' as M,\n shouldCloseOnSelect = selectionMode === 'single'\n } = props;\n let triggerState = useOverlayTriggerState(props);\n let [focusStrategy, setFocusStrategy] = useState<FocusStrategy | null>(null);\n let defaultValue = useMemo(() => {\n return props.defaultValue !== undefined ? props.defaultValue : (selectionMode === 'single' ? props.defaultSelectedKey ?? null : []) as ValueType<M>;\n }, [props.defaultValue, props.defaultSelectedKey, selectionMode]);\n let value = useMemo(() => {\n return props.value !== undefined ? props.value : (selectionMode === 'single' ? props.selectedKey : undefined) as ValueType<M>;\n }, [props.value, props.selectedKey, selectionMode]);\n let [controlledValue, setControlledValue] = useControlledState<Key | readonly Key[] | null>(value, defaultValue, props.onChange as any);\n // Only display the first selected item if in single selection mode but the value is an array.\n let displayValue = selectionMode === 'single' && Array.isArray(controlledValue) ? controlledValue[0] : controlledValue;\n let setValue = (value: Key | Key[] | null) => {\n if (selectionMode === 'single') {\n let key = Array.isArray(value) ? value[0] ?? null : value;\n setControlledValue(key);\n if (key !== displayValue) {\n props.onSelectionChange?.(key);\n }\n } else {\n let keys: Key[] = [];\n if (Array.isArray(value)) {\n keys = value;\n } else if (value != null) {\n keys = [value];\n }\n\n setControlledValue(keys);\n }\n };\n\n let listState = useListState({\n ...props,\n selectionMode,\n disallowEmptySelection: selectionMode === 'single',\n allowDuplicateSelectionEvents: true,\n selectedKeys: useMemo(() => convertValue(displayValue), [displayValue]),\n onSelectionChange: (keys: Selection) => {\n // impossible, but TS doesn't know that\n if (keys === 'all') {\n return;\n }\n\n if (selectionMode === 'single') {\n let key = keys.values().next().value ?? null;\n setValue(key);\n } else {\n setValue([...keys]);\n }\n if (shouldCloseOnSelect) {\n triggerState.close();\n }\n\n validationState.commitValidation();\n }\n });\n\n let selectedKey = listState.selectionManager.firstSelectedKey;\n let selectedItems = useMemo(() => {\n return [...listState.selectionManager.selectedKeys].map(key => listState.collection.getItem(key)).filter(item => item != null);\n }, [listState.selectionManager.selectedKeys, listState.collection]);\n\n let validationState = useFormValidationState({\n ...props,\n value: Array.isArray(displayValue) && displayValue.length === 0 ? null : displayValue as any\n });\n\n let [isFocused, setFocused] = useState(false);\n let [initialValue] = useState(displayValue);\n\n return {\n ...validationState,\n ...listState,\n ...triggerState,\n value: displayValue as ValueType<M>,\n defaultValue: defaultValue ?? initialValue as ValueType<M>,\n setValue,\n selectedKey,\n setSelectedKey: setValue,\n selectedItem: selectedItems[0] ?? null,\n selectedItems,\n defaultSelectedKey: props.defaultSelectedKey ?? (props.selectionMode === 'single' ? initialValue as Key : null),\n focusStrategy,\n open(focusStrategy: FocusStrategy | null = null) {\n // Don't open if the collection is empty.\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.open();\n }\n },\n toggle(focusStrategy: FocusStrategy | null = null) {\n if (listState.collection.size !== 0 || props.allowsEmptyCollection) {\n setFocusStrategy(focusStrategy);\n triggerState.toggle();\n }\n },\n isFocused,\n setFocused\n };\n}\n\nfunction convertValue(value: Key | Key[] | null | undefined) {\n if (value === undefined) {\n return undefined;\n }\n if (value === null) {\n return [];\n }\n return Array.isArray(value) ? value : [value];\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {OverlayTriggerProps, useOverlayTriggerState} from '../overlays/useOverlayTriggerState';\nimport {useEffect, useMemo, useRef} from 'react';\n\nexport interface TooltipTriggerProps extends OverlayTriggerProps {\n /**\n * Whether the tooltip should be disabled, independent from the trigger.\n */\n isDisabled?: boolean,\n\n /**\n * The delay time for the tooltip to show up. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Immediate-or-delayed-appearance).\n * @default 1500\n */\n delay?: number,\n\n /**\n * The delay time for the tooltip to close. [See guidelines](https://spectrum.adobe.com/page/tooltip/#Warmup-and-cooldown).\n * @default 500\n */\n closeDelay?: number,\n\n /**\n * By default, opens for both focus and hover. Can be made to open only for focus.\n * @default 'hover'\n */\n trigger?: 'hover' | 'focus',\n\n /**\n * Whether the tooltip should close when the trigger is pressed.\n * @default true\n */\n shouldCloseOnPress?: boolean\n}\n\nconst TOOLTIP_DELAY = 1500; // this seems to be a 1.5 second delay, check with design\nconst TOOLTIP_COOLDOWN = 500;\n\nexport interface TooltipTriggerState {\n /** Whether the tooltip is currently showing. */\n isOpen: boolean,\n /**\n * Shows the tooltip. By default, the tooltip becomes visible after a delay\n * depending on a global warmup timer. The `immediate` option shows the\n * tooltip immediately instead.\n */\n open(immediate?: boolean): void,\n /** Hides the tooltip. */\n close(immediate?: boolean): void\n}\n\nlet tooltips = {};\nlet tooltipId = 0;\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Manages state for a tooltip trigger. Tracks whether the tooltip is open, and provides\n * methods to toggle this state. Ensures only one tooltip is open at a time and controls\n * the delay for showing a tooltip.\n */\nexport function useTooltipTriggerState(props: TooltipTriggerProps = {}): TooltipTriggerState {\n let {delay = TOOLTIP_DELAY, closeDelay = TOOLTIP_COOLDOWN} = props;\n let {isOpen, open, close} = useOverlayTriggerState(props);\n let id = useMemo(() => `${++tooltipId}`, []);\n let closeTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n let closeCallback = useRef<() => void>(close);\n\n let ensureTooltipEntry = () => {\n tooltips[id] = hideTooltip;\n };\n\n let closeOpenTooltips = () => {\n for (let hideTooltipId in tooltips) {\n if (hideTooltipId !== id) {\n tooltips[hideTooltipId](true);\n delete tooltips[hideTooltipId];\n }\n }\n };\n\n let showTooltip = () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeOpenTooltips();\n ensureTooltipEntry();\n globalWarmedUp = true;\n open();\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n let hideTooltip = (immediate?: boolean) => {\n if (immediate || closeDelay <= 0) {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n closeTimeout.current = null;\n closeCallback.current();\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = null;\n closeCallback.current();\n }, closeDelay);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[id];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, Math.max(TOOLTIP_COOLDOWN, closeDelay));\n }\n };\n\n let warmupTooltip = () => {\n closeOpenTooltips();\n ensureTooltipEntry();\n if (!isOpen && !globalWarmedUp) {\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n }\n\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n useEffect(() => {\n closeCallback.current = close;\n }, [close]);\n\n\n useEffect(() => {\n return () => {\n if (closeTimeout.current) {\n clearTimeout(closeTimeout.current);\n }\n let tooltip = tooltips[id];\n if (tooltip) {\n delete tooltips[id];\n }\n };\n }, [id]);\n\n return {\n isOpen,\n open: (immediate) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n },\n close: hideTooltip\n };\n}\n","\"use client\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n cloneElement,\n type ComponentPropsWithRef,\n type DOMAttributes,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefObject,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useTooltip, useTooltipTrigger } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { useTooltipTriggerState } from \"react-stately\";\nimport { cn } from \"../../utils/cn\";\n\nexport type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipProps {\n content: ReactNode;\n /** Preferred position. May flip to the opposite side if it would overflow. */\n position?: TooltipPosition;\n /** Open-delay in milliseconds (react-aria's warmup). Defaults to 200. */\n delay?: number;\n /** Pixel gap between trigger and tooltip. Defaults to 8. */\n offset?: number;\n /** Suppress the tooltip entirely without removing the trigger from the tree. */\n disabled?: boolean;\n /** Stable id for the tooltip DOM node — useful for aria-describedby tests. */\n id?: string;\n children: ReactElement;\n className?: string;\n}\n\ninterface Coords {\n top: number;\n left: number;\n /** The actual side the tooltip ended up on after any flip. */\n position: TooltipPosition;\n}\n\nconst FLIP: Record<TooltipPosition, TooltipPosition> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\nfunction placeOn(\n rect: DOMRect,\n tipRect: DOMRect,\n position: TooltipPosition,\n offset: number,\n): { top: number; left: number } {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n switch (position) {\n case \"top\":\n return {\n top: rect.top - tipRect.height - offset,\n left: cx - tipRect.width / 2,\n };\n case \"bottom\":\n return { top: rect.bottom + offset, left: cx - tipRect.width / 2 };\n case \"left\":\n return {\n top: cy - tipRect.height / 2,\n left: rect.left - tipRect.width - offset,\n };\n case \"right\":\n return { top: cy - tipRect.height / 2, left: rect.right + offset };\n }\n}\n\n/** Resolve the final placement: flip if the preferred side overflows. */\nfunction computePosition(\n rect: DOMRect,\n tipRect: DOMRect,\n position: TooltipPosition,\n offset: number,\n viewport: { width: number; height: number },\n): Coords {\n const tryAt = (p: TooltipPosition) => {\n const c = placeOn(rect, tipRect, p, offset);\n const fits =\n c.top >= 0 &&\n c.left >= 0 &&\n c.top + tipRect.height <= viewport.height &&\n c.left + tipRect.width <= viewport.width;\n return { ...c, position: p, fits };\n };\n\n const preferred = tryAt(position);\n if (preferred.fits) return preferred;\n const flipped = tryAt(FLIP[position]);\n if (flipped.fits) return flipped;\n\n // Neither fits cleanly — fall back to the preferred side but clamp into\n // the viewport so the arrow target is still close to the trigger.\n const fallback = preferred;\n const clampedLeft = Math.max(\n 4,\n Math.min(fallback.left, viewport.width - tipRect.width - 4),\n );\n const clampedTop = Math.max(\n 4,\n Math.min(fallback.top, viewport.height - tipRect.height - 4),\n );\n return { top: clampedTop, left: clampedLeft, position: fallback.position };\n}\n\n// Framer-motion's `initial` / `animate` accept rich variant types we\n// don't need to spell out — plain objects with `opacity` + `x`/`y` are\n// the documented shorthand and avoid pulling in the library's union.\ntype MotionFrame = Record<string, number | string>;\nconst animVariants: Record<\n TooltipPosition,\n { initial: MotionFrame; animate: MotionFrame }\n> = {\n top: { initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 } },\n bottom: { initial: { opacity: 0, y: -4 }, animate: { opacity: 1, y: 0 } },\n left: { initial: { opacity: 0, x: 4 }, animate: { opacity: 1, x: 0 } },\n right: { initial: { opacity: 0, x: -4 }, animate: { opacity: 1, x: 0 } },\n};\n\ninterface ContentProps {\n state: ReturnType<typeof useTooltipTriggerState>;\n content: ReactNode;\n position: TooltipPosition;\n triggerRef: RefObject<HTMLElement | null>;\n className?: string;\n offset: number;\n tooltipId: string;\n}\n\nfunction TooltipContent({\n state,\n content,\n position,\n triggerRef,\n className,\n offset,\n tooltipId,\n}: ContentProps) {\n const { tooltipProps } = useTooltip({ isOpen: state.isOpen }, state);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const [coords, setCoords] = useState<Coords | null>(null);\n\n const reposition = useCallback(() => {\n if (!triggerRef.current || !tipRef.current) return;\n const trigRect = triggerRef.current.getBoundingClientRect();\n const tipRect = tipRef.current.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight,\n };\n setCoords(computePosition(trigRect, tipRect, position, offset, viewport));\n }, [triggerRef, position, offset]);\n\n // The first measure happens before the tip has rendered its content, so\n // its rect is empty. Measure again on the next frame for accurate placement.\n useLayoutEffect(() => {\n if (!state.isOpen) return;\n reposition();\n const id = requestAnimationFrame(reposition);\n return () => cancelAnimationFrame(id);\n }, [state.isOpen, reposition]);\n\n useEffect(() => {\n if (!state.isOpen) return;\n const handler = () => reposition();\n window.addEventListener(\"scroll\", handler, true);\n window.addEventListener(\"resize\", handler);\n return () => {\n window.removeEventListener(\"scroll\", handler, true);\n window.removeEventListener(\"resize\", handler);\n };\n }, [state.isOpen, reposition]);\n\n const resolvedPos = coords?.position ?? position;\n const variants = animVariants[resolvedPos];\n\n // react-aria's tooltip props include onMouseEnter/onMouseLeave for the\n // tooltip itself plus drag-related handlers that conflict with framer-\n // motion's prop signatures. Strip the ones framer-motion claims so the\n // intersection is type-clean.\n const {\n onDrag: _onDrag,\n onDragStart: _onDragStart,\n onDragEnd: _onDragEnd,\n onAnimationStart: _onAnimationStart,\n ...safeTipProps\n } = tooltipProps as DOMAttributes<HTMLDivElement> & Record<string, unknown>;\n\n const portalContent = (\n <AnimatePresence>\n {state.isOpen && (\n <div\n className=\"ods-tooltip__wrapper\"\n style={{\n position: \"fixed\",\n zIndex: 1500,\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n visibility: coords ? \"visible\" : \"hidden\",\n pointerEvents: \"none\",\n }}\n >\n <motion.div\n ref={tipRef}\n {...safeTipProps}\n id={tooltipId}\n role=\"tooltip\"\n data-position={resolvedPos}\n className={cn(\"ods-tooltip\", className)}\n initial={variants.initial}\n animate={variants.animate}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {content}\n <span className=\"ods-tooltip__arrow\" aria-hidden=\"true\" />\n </motion.div>\n </div>\n )}\n </AnimatePresence>\n );\n\n if (typeof document === \"undefined\") return null;\n return createPortal(portalContent, document.body);\n}\n\n/** Compose two refs into one — preserves the child's existing ref. */\nfunction mergeRefs<T>(...refs: Array<Ref<T> | undefined>): (node: T | null) => void {\n return (node) => {\n for (const r of refs) {\n if (!r) continue;\n if (typeof r === \"function\") r(node);\n else (r as { current: T | null }).current = node;\n }\n };\n}\n\n/** Compose a child handler with one from react-aria — both fire, child first. */\nfunction mergeHandler<E extends React.SyntheticEvent>(\n childHandler: ((e: E) => void) | undefined,\n ariaHandler: ((e: E) => void) | undefined,\n): ((e: E) => void) | undefined {\n if (!childHandler && !ariaHandler) return undefined;\n return (e: E) => {\n childHandler?.(e);\n if (!e.defaultPrevented) ariaHandler?.(e);\n };\n}\n\nexport function Tooltip({\n content,\n position = \"top\",\n delay = 200,\n offset = 8,\n disabled = false,\n id: providedId,\n children,\n className,\n}: TooltipProps) {\n const reactId = useId();\n const tooltipId = providedId ?? `ods-tooltip-${reactId}`;\n const triggerRef = useRef<HTMLElement>(null);\n const state = useTooltipTriggerState({ delay });\n const { triggerProps } = useTooltipTrigger(\n { delay, isDisabled: disabled },\n state,\n triggerRef,\n );\n\n if (!isValidElement(children)) {\n // Bail out gracefully — without a valid element child there's nothing\n // to clone props onto. Render the children as-is so we don't crash\n // consumer trees that pass a string by mistake.\n return <>{children}</>;\n }\n\n // Pull the existing ref + handlers off the child so we can compose them\n // with react-aria's. Without this merge the child loses its ref\n // (e.g. ref forwarding in a wrapped Button) and any user-supplied\n // onMouseEnter / onFocus etc. is silently overwritten.\n const childProps = children.props as ComponentPropsWithRef<\"button\"> &\n Record<string, unknown>;\n // React 19: `ref` is a regular prop on the child's props. We still\n // fall back to the legacy `element.ref` to support intermediates that\n // re-emit the older shape.\n const childRef =\n (childProps as { ref?: Ref<HTMLElement> }).ref ??\n (children as unknown as { ref?: Ref<HTMLElement> }).ref;\n\n // Merge every handler prop from react-aria with whatever the child\n // already had, so a child that passes its own onFocus/onMouseEnter\n // doesn't lose them when we attach the trigger props.\n const merged: Record<string, unknown> = { ...childProps };\n for (const [key, value] of Object.entries(\n triggerProps as Record<string, unknown>,\n )) {\n if (key.startsWith(\"on\") && typeof value === \"function\") {\n merged[key] = mergeHandler(\n childProps[key] as never,\n value as never,\n );\n } else {\n merged[key] = value;\n }\n }\n merged.ref = mergeRefs<HTMLElement>(triggerRef, childRef);\n merged[\"aria-describedby\"] =\n [childProps[\"aria-describedby\"], tooltipId].filter(Boolean).join(\" \");\n\n return (\n <>\n {cloneElement(children, merged)}\n {!disabled && (\n <TooltipContent\n state={state}\n content={content}\n position={position}\n triggerRef={triggerRef}\n offset={offset}\n className={className}\n tooltipId={tooltipId}\n />\n )}\n </>\n );\n}\n\nTooltip.displayName = \"Tooltip\";\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n type CSSProperties,\n forwardRef,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { useTextField } from \"react-aria\";\nimport { createPortal } from \"react-dom\";\nimport { CopyIcon, CutIcon } from \"@octaviaflow/icons\";\nimport {\n type TextareaCommand,\n useTextareaCommands,\n} from \"../../hooks/useTextareaCommands\";\nimport { useTextareaSelection } from \"../../hooks/useTextareaSelection\";\nimport {\n type TextareaTool,\n useTextareaTools,\n} from \"../../hooks/useTextareaTools\";\nimport { resolveAccessibleName } from \"../../utils/a11y\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type TextareaSize = \"sm\" | \"md\" | \"lg\";\n\n/** User-resize handle direction. Mirrors the native CSS `resize`\n * property. Pass `false` (legacy) and we map it to `\"none\"`. */\nexport type TextareaResize =\n | \"vertical\"\n | \"horizontal\"\n | \"both\"\n | \"none\"\n | boolean;\n\ntype TextareaPropsBase = Omit<\n ComponentPropsWithoutRef<\"textarea\">,\n \"size\" | \"prefix\"\n>;\n\nexport interface TextareaProps extends TextareaPropsBase {\n /** Visible label — accepts rich content. */\n label?: ReactNode;\n /** Boolean error flag — pairs with `errorMessage`. (Back-compat with v1.) */\n error?: boolean;\n /** Error message. When set with `error={true}` renders below the input\n * with `role=\"alert\"` and tints the border. */\n errorMessage?: ReactNode;\n /** Helper text rendered below the field when no error is set. */\n helperText?: ReactNode;\n /** User-drag resize handle direction. Default `\"vertical\"`.\n *\n * - `\"vertical\"` — only the bottom edge is draggable (most common).\n * - `\"horizontal\"` — only the right edge.\n * - `\"both\"` — corner handle, both axes.\n * - `\"none\"` — no user resize (auto-grow still works if enabled).\n * - Legacy `boolean` — `true` ≡ `\"vertical\"`, `false` ≡ `\"none\"`.\n */\n resize?: TextareaResize;\n /** Auto-grow the textarea as the user types, capped at `maxRows`.\n * Default `false`. When enabled the user-drag `resize` handle is\n * typically set to `\"none\"` so the two systems don't fight. */\n autoResize?: boolean;\n /** Minimum visible rows (only when `autoResize` is on). Default `rows`. */\n minRows?: number;\n /** Maximum visible rows before the textarea scrolls (only when\n * `autoResize` is on). Default `Infinity`. */\n maxRows?: number;\n /** Hard pixel ceiling on the textarea's height — applied as inline\n * `max-height`. Pair with `autoResize` to cap the auto-grow OR use\n * alone to limit how tall the user can drag the resize handle. */\n maxHeight?: number | string;\n /** Hard pixel ceiling on the textarea's width — applied as inline\n * `max-width`. Useful when `resize=\"horizontal\"` or `\"both\"`. */\n maxWidth?: number | string;\n /** Minimum pixel floor for the textarea's height. */\n minHeight?: number | string;\n /** Minimum pixel floor for the textarea's width. */\n minWidth?: number | string;\n maxLength?: number;\n size?: TextareaSize;\n rows?: number;\n\n /* ─── Inline command palette + selection toolbar ─────────────────\n *\n * These two opt-in sections live below / above the textarea while\n * the user is editing, giving the field a \"rich editor\" feel without\n * pulling in a contenteditable + range library:\n *\n * - `commands` → typing the trigger (default `/`) opens an\n * inline popover with the supplied commands. Arrow keys + Enter\n * commit. Each command's `insert` is appended at the caret with\n * the trigger + query removed automatically.\n *\n * - `selectionToolbar` → selecting text reveals a floating\n * toolbar with Copy / Cut / wrap buttons; consumers can extend\n * with custom actions.\n *\n * Both are powered by the `useTextareaCommands` and\n * `useTextareaSelection` hooks, which are also exported standalone\n * for consumers who want to roll their own UI.\n */\n commands?: TextareaCommand[];\n /** Trigger character for the command palette. Default `\"/\"`. */\n commandTrigger?: string;\n /** Show a floating Copy / Cut toolbar over a non-empty selection.\n * Default `false`. */\n selectionToolbar?: boolean;\n /** Custom actions appended to the selection toolbar's built-in\n * Copy / Cut. Each action receives the live selected text and the\n * selection helpers from `useTextareaSelection`. */\n selectionActions?: TextareaSelectionAction[];\n /** Always-visible toolbar of tools that act on the textarea content.\n * Compose from the `textareaTools` factory (bold, italic, code,\n * heading, link, undo, …) and / or pass custom `TextareaTool`\n * objects. The toolbar uses `useTextareaTools` under the hood —\n * consumers can also call the hook directly to roll their own UI. */\n tools?: TextareaTool[];\n /** Where the tools toolbar sits relative to the field. Default\n * `\"top\"`. */\n toolbarPosition?: \"top\" | \"bottom\";\n}\n\n/* ---------------------------------------------------------------------------\n * Selection toolbar action\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaSelectionAction {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n /** Called when the user clicks the action. Receives the live\n * selection text and the helpers from `useTextareaSelection`. */\n onAction: (\n selection: string,\n helpers: {\n replace: (s: string) => void;\n wrap: (open: string, close?: string) => void;\n copy: () => Promise<boolean>;\n cut: () => Promise<boolean>;\n },\n ) => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea(\n {\n label,\n error = false,\n errorMessage,\n helperText,\n resize = \"vertical\",\n autoResize = false,\n minRows,\n maxRows,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n maxLength,\n size = \"md\",\n rows = 3,\n disabled = false,\n className,\n style: consumerStyle,\n defaultValue,\n value,\n onChange,\n id: providedId,\n commands,\n commandTrigger = \"/\",\n selectionToolbar = false,\n selectionActions,\n tools,\n toolbarPosition = \"top\",\n ...props\n },\n forwardedRef,\n ) {\n const innerRef = useRef<HTMLTextAreaElement>(null);\n // Compose forwarded + internal ref.\n const setRef = (node: HTMLTextAreaElement | null) => {\n (innerRef as { current: HTMLTextAreaElement | null }).current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef)\n (forwardedRef as { current: HTMLTextAreaElement | null }).current = node;\n };\n\n const reactId = useId();\n const baseId = providedId ?? `ods-textarea-${reactId}`;\n const hintId =\n (error && errorMessage) || helperText ? `${baseId}-hint` : undefined;\n const [charCount, setCharCount] = useState(\n () => String(value ?? defaultValue ?? \"\").length,\n );\n\n const ariaNameProps = resolveAccessibleName({\n label: typeof label === \"string\" ? label : undefined,\n ariaLabel: props[\"aria-label\"],\n ariaLabelledby: (props as Record<string, unknown>)[\n \"aria-labelledby\"\n ] as string | undefined,\n componentName: \"Textarea\",\n });\n\n const { labelProps, inputProps } = useTextField(\n {\n label: typeof label === \"string\" ? label : undefined,\n ...ariaNameProps,\n isDisabled: disabled,\n errorMessage:\n typeof errorMessage === \"string\" ? errorMessage : undefined,\n validationState: error ? \"invalid\" : undefined,\n inputElementType: \"textarea\",\n value: value as string | undefined,\n defaultValue: defaultValue as string | undefined,\n },\n innerRef,\n );\n\n const describedBy =\n [\n (props as Record<string, unknown>)[\"aria-describedby\"] as\n | string\n | undefined,\n hintId,\n ]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length);\n onChange?.(e);\n };\n\n /* ── Inline command palette ───────────────────────────────────── */\n // The hooks need a `(value, onChange(string))` pair. Controlled\n // textareas already have a `value` prop; uncontrolled ones don't.\n // We mirror the current DOM value via `liveValue` so the hooks see\n // the same string regardless of which mode the consumer chose.\n const [liveValue, setLiveValue] = useState<string>(\n String(value ?? defaultValue ?? \"\"),\n );\n useEffect(() => {\n // Keep liveValue in sync with the controlled prop when present.\n if (value != null) setLiveValue(String(value));\n }, [value]);\n const handleChangeWithMirror = (\n e: React.ChangeEvent<HTMLTextAreaElement>,\n ) => {\n setLiveValue(e.target.value);\n handleChange(e);\n };\n const setLiveAndCommit = (next: string) => {\n setLiveValue(next);\n // Synthesize an event-like change so the consumer's `onChange`\n // receives the updated value via the same path.\n if (innerRef.current) innerRef.current.value = next;\n onChange?.({\n target: innerRef.current as HTMLTextAreaElement,\n currentTarget: innerRef.current as HTMLTextAreaElement,\n } as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n setCharCount(next.length);\n };\n\n const cmdPalette = useTextareaCommands({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n commands: commands ?? [],\n trigger: commandTrigger,\n });\n const cmdEnabled = (commands?.length ?? 0) > 0;\n\n const sel = useTextareaSelection({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n });\n\n // Always-visible toolbar — driven by the `useTextareaTools` hook.\n // Stays empty when no `tools` array is provided so the toolbar\n // section never renders.\n const toolbar = useTextareaTools({\n textareaRef: innerRef,\n value: liveValue,\n onChange: setLiveAndCommit,\n tools: tools ?? [],\n });\n const toolbarEnabled = (tools?.length ?? 0) > 0;\n\n const handleKeyDownWithCommands = (\n e: React.KeyboardEvent<HTMLTextAreaElement>,\n ) => {\n if (cmdEnabled) {\n const consumed = cmdPalette.onKeyDown(e);\n if (consumed) return;\n }\n (props as { onKeyDown?: React.KeyboardEventHandler<HTMLTextAreaElement> })\n .onKeyDown?.(e);\n };\n\n // ── Auto-grow textarea (height) ───────────────────────────────────\n //\n // Mirrors the line-height-aware sizing we use in PromptInput. We\n // detect three line-height forms (`\"normal\"`, unitless like `\"1.5\"`,\n // or px like `\"24px\"`) so a unitless multiplier doesn't end up\n // being treated as 1.5 PIXELS — a real bug we hit in v1.\n //\n // Effective max comes from `maxHeight` (explicit px ceiling) OR the\n // computed line-height × `maxRows` cap, whichever is smaller. When\n // neither is set, the textarea grows freely (no cap).\n useEffect(() => {\n if (!autoResize) return;\n const el = innerRef.current;\n if (!el) return;\n const computed = window.getComputedStyle(el);\n const fontSize = parseFloat(computed.fontSize) || 16;\n const lhRaw = computed.lineHeight;\n const lh =\n lhRaw === \"normal\"\n ? fontSize * 1.2\n : lhRaw.endsWith(\"px\")\n ? parseFloat(lhRaw)\n : parseFloat(lhRaw) * fontSize;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n\n const rowCap =\n maxRows != null && Number.isFinite(maxRows)\n ? lh * maxRows + padding\n : Number.POSITIVE_INFINITY;\n const pixelCap =\n typeof maxHeight === \"number\"\n ? maxHeight\n : Number.POSITIVE_INFINITY;\n const effectiveMax = Math.min(rowCap, pixelCap);\n\n const rowFloor = lh * (minRows ?? rows) + padding;\n\n // Reset to natural height then clamp.\n el.style.height = \"auto\";\n const target = Math.max(\n rowFloor,\n Math.min(effectiveMax, el.scrollHeight),\n );\n el.style.height = `${target}px`;\n el.style.overflowY = el.scrollHeight > effectiveMax ? \"auto\" : \"hidden\";\n }, [autoResize, value, defaultValue, minRows, maxRows, maxHeight, rows]);\n\n const resolvedResize: \"vertical\" | \"horizontal\" | \"both\" | \"none\" =\n typeof resize === \"boolean\"\n ? resize\n ? \"vertical\"\n : \"none\"\n : resize;\n\n const toCss = (v: number | string | undefined): string | undefined =>\n v == null ? undefined : typeof v === \"number\" ? `${v}px` : v;\n\n // Apply the constraint CSS inline so it survives consumer overrides\n // and works regardless of class-bundling order. `resize` becomes a\n // CSS variable consumed by the field rule so the class can read it.\n const fieldStyle: CSSProperties = {\n maxHeight: toCss(maxHeight),\n maxWidth: toCss(maxWidth),\n minHeight: toCss(minHeight),\n minWidth: toCss(minWidth),\n resize: resolvedResize,\n };\n\n return (\n <div\n className={cn(\n \"ods-textarea\",\n `ods-textarea--${size}`,\n `ods-textarea--resize-${resolvedResize}`,\n autoResize && \"ods-textarea--auto-resize\",\n error && \"ods-textarea--error\",\n disabled && \"ods-textarea--disabled\",\n className,\n )}\n style={consumerStyle}\n >\n {label && (\n <label\n {...labelProps}\n htmlFor={baseId}\n className=\"ods-textarea__label\"\n >\n {label}\n </label>\n )}\n {toolbarEnabled && toolbarPosition === \"top\" && (\n <TextareaToolbar\n tools={toolbar.tools}\n onRun={toolbar.runTool}\n />\n )}\n <div className=\"ods-textarea__wrapper\">\n <textarea\n {...(props as ComponentPropsWithoutRef<\"textarea\">)}\n {...inputProps}\n ref={setRef}\n id={baseId}\n rows={autoResize ? (minRows ?? rows) : rows}\n disabled={disabled}\n maxLength={maxLength}\n defaultValue={defaultValue}\n value={value}\n onChange={handleChangeWithMirror}\n onKeyDown={handleKeyDownWithCommands}\n className=\"ods-textarea__field\"\n style={fieldStyle}\n aria-invalid={error || undefined}\n aria-describedby={describedBy}\n // When the command palette is open, expose it as the\n // companion combobox so AT users hear the active option.\n aria-autocomplete={cmdEnabled ? \"list\" : undefined}\n aria-expanded={cmdEnabled ? cmdPalette.isOpen : undefined}\n aria-controls={\n cmdEnabled && cmdPalette.isOpen\n ? `${baseId}-cmd-list`\n : undefined\n }\n aria-activedescendant={\n cmdEnabled && cmdPalette.isOpen && cmdPalette.items[\n cmdPalette.activeIndex\n ]\n ? `${baseId}-cmd-${cmdPalette.items[cmdPalette.activeIndex].id}`\n : undefined\n }\n />\n\n {/* ── Inline command palette ─────────────────────────── */}\n {cmdEnabled && cmdPalette.isOpen && cmdPalette.items.length > 0 &&\n typeof document !== \"undefined\" &&\n createPortal(\n <ul\n id={`${baseId}-cmd-list`}\n role=\"listbox\"\n aria-label=\"Inline commands\"\n className=\"ods-textarea__cmd-popover\"\n style={{\n position: \"fixed\",\n top: (cmdPalette.caretRect?.bottom ?? 0) + 6,\n left: cmdPalette.caretRect?.left ?? 0,\n }}\n >\n {cmdPalette.items.map((c, i) => (\n <li\n key={c.id}\n id={`${baseId}-cmd-${c.id}`}\n role=\"option\"\n aria-selected={i === cmdPalette.activeIndex}\n className={cn(\n \"ods-textarea__cmd-item\",\n i === cmdPalette.activeIndex &&\n \"ods-textarea__cmd-item--active\",\n )}\n onMouseDown={(e) => {\n // mousedown + preventDefault so the textarea\n // doesn't lose focus before commit fires.\n e.preventDefault();\n cmdPalette.commit(c);\n }}\n onMouseEnter={() => {\n // No public hover-state setter — close + reopen\n // pattern would be heavy. Skipping hover-to-\n // highlight for now; ArrowUp/Down nav covers it.\n }}\n >\n {c.icon && (\n <span className=\"ods-textarea__cmd-icon\">{c.icon}</span>\n )}\n <span className=\"ods-textarea__cmd-text\">\n <span className=\"ods-textarea__cmd-label\">\n {c.label}\n </span>\n {c.description && (\n <span className=\"ods-textarea__cmd-desc\">\n {c.description}\n </span>\n )}\n </span>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n\n {/* ── Selection toolbar ──────────────────────────────── */}\n {selectionToolbar && sel.active && sel.rect &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n className=\"ods-textarea__sel-toolbar\"\n style={{\n position: \"fixed\",\n top: sel.rect.top - 36,\n left: sel.rect.left,\n }}\n // mousedown + preventDefault keeps the textarea\n // selection alive while the user clicks a button.\n onMouseDown={(e) => e.preventDefault()}\n >\n <button\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() => sel.copy()}\n aria-label=\"Copy selection\"\n title=\"Copy\"\n >\n <CopyIcon size=\"xs\" />\n </button>\n <button\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() => sel.cut()}\n aria-label=\"Cut selection\"\n title=\"Cut\"\n >\n <CutIcon size=\"xs\" />\n </button>\n {selectionActions?.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className=\"ods-textarea__sel-btn\"\n onClick={() =>\n a.onAction(sel.text, {\n replace: sel.replace,\n wrap: sel.wrap,\n copy: sel.copy,\n cut: sel.cut,\n })\n }\n title={typeof a.label === \"string\" ? a.label : undefined}\n >\n {a.icon}\n {a.label && (\n <span className=\"ods-textarea__sel-btn-label\">\n {a.label}\n </span>\n )}\n </button>\n ))}\n </div>,\n document.body,\n )}\n {maxLength != null && (\n <span\n className=\"ods-textarea__count\"\n aria-live={charCount > maxLength ? \"polite\" : \"off\"}\n >\n {charCount}/{maxLength}\n </span>\n )}\n </div>\n {toolbarEnabled && toolbarPosition === \"bottom\" && (\n <TextareaToolbar\n tools={toolbar.tools}\n onRun={toolbar.runTool}\n />\n )}\n {error && errorMessage ? (\n <div\n id={hintId}\n className=\"ods-textarea__error-message\"\n role=\"alert\"\n >\n {errorMessage}\n </div>\n ) : helperText ? (\n <div id={hintId} className=\"ods-textarea__hint\">\n {helperText}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\n/* ---------------------------------------------------------------------------\n * Internal — toolbar renderer\n *\n * Stays internal because consumers who want a custom UI should call\n * `useTextareaTools` directly. The toolbar's only job here is to map\n * the resolved tools array to clickable buttons / dividers using the\n * same chrome as the rest of the textarea section.\n * ------------------------------------------------------------------------- */\nfunction TextareaToolbar({\n tools,\n onRun,\n}: {\n tools: TextareaTool[];\n onRun: (id: string) => void | Promise<void>;\n}) {\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Formatting\"\n className=\"ods-textarea__toolbar\"\n // mousedown + preventDefault keeps the textarea's selection /\n // caret alive while a button is clicked.\n onMouseDown={(e) => {\n if (\n (e.target as HTMLElement).closest(\".ods-textarea__toolbar-btn\")\n ) {\n e.preventDefault();\n }\n }}\n >\n {tools.map((t) => {\n if (t.kind === \"divider\") {\n return (\n <span\n key={t.id}\n className=\"ods-textarea__toolbar-divider\"\n aria-hidden=\"true\"\n />\n );\n }\n return (\n <button\n key={t.id}\n type=\"button\"\n className=\"ods-textarea__toolbar-btn\"\n title={t.title ?? (typeof t.label === \"string\" ? t.label : undefined)}\n aria-label={typeof t.label === \"string\" ? t.label : t.id}\n onClick={() => onRun(t.id)}\n >\n {t.icon ? (\n <span className=\"ods-textarea__toolbar-icon\">{t.icon}</span>\n ) : (\n <span className=\"ods-textarea__toolbar-text\">{t.label}</span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\nimport type { RefObject } from \"react\";\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaCommands — inline `/command` palette for a textarea.\n *\n * const cmd = useTextareaCommands({\n * textareaRef,\n * value,\n * onChange,\n * commands: [\n * { id: \"today\", label: \"Today\", insert: () => new Date().toDateString() },\n * { id: \"summary\", label: \"AI Summary\", insert: \"{{ai.summary}}\" },\n * ],\n * trigger: \"/\", // default\n * openOnEmptyTrigger: true,\n * });\n *\n * <Textarea ... commands={cmd.props} /> // or wire manually\n *\n * The hook owns: trigger detection, filtering, keyboard nav, caret-aware\n * insertion. The consumer / Textarea owns rendering the popover.\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaCommand {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n /** Text to insert at the caret. Can be a string OR a function that\n * receives the live query and returns the string — useful for\n * commands that consume the typed query (e.g. `/mention bob` →\n * `@bob`). */\n insert: string | ((query: string) => string);\n /** Extra keywords to match against the typed query in addition to\n * the rendered `label` (when label is a string) and `description`. */\n keywords?: string[];\n}\n\nexport interface UseTextareaCommandsOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n /** Controlled value — pass the same string you pass to the textarea. */\n value: string;\n /** Setter — receives the new full value after insertion. */\n onChange: (next: string) => void;\n commands: TextareaCommand[];\n /** Trigger character. Default `\"/\"`. */\n trigger?: string;\n /** Open the palette as soon as the trigger is typed (even with no\n * query). Default `true`. Set `false` if you want consumers to type\n * at least one character to open. */\n openOnEmptyTrigger?: boolean;\n /** Maximum visible items in the filtered result list. Default 8. */\n maxItems?: number;\n}\n\nexport interface UseTextareaCommandsReturn {\n /** Whether the palette is currently open. */\n isOpen: boolean;\n /** Query typed after the trigger (without the trigger character). */\n query: string;\n /** Highlighted item index (0-based). */\n activeIndex: number;\n /** Filtered + capped list of matching commands. */\n items: TextareaCommand[];\n\n /** Keydown handler — wire to the textarea's `onKeyDown`. Returns\n * `true` if the key was consumed (so the consumer can stop). */\n onKeyDown: (e: ReactKeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** Force-close the palette (e.g. on textarea blur). */\n dismiss: () => void;\n /** Commit the supplied command — inserts its text at the trigger\n * position and consumes the trigger + query. */\n commit: (cmd: TextareaCommand) => void;\n\n /** Pixel position of the caret at the moment the palette opened.\n * Use to anchor the popover in your own UI. */\n caretRect: DOMRect | null;\n}\n\n/* ---------------------------------------------------------------------------\n * Helpers\n * ------------------------------------------------------------------------- */\n\n/** Find the nearest trigger character behind the caret (within the\n * current line) and return the index + query string. Returns `null`\n * when no open trigger is in scope (e.g. there's whitespace between\n * the trigger and the caret, or the caret is mid-word that doesn't\n * start with the trigger). */\nfunction findOpenTrigger(\n value: string,\n caret: number,\n trigger: string,\n): { triggerIndex: number; query: string } | null {\n // Walk backwards from the caret looking for the trigger char OR a\n // whitespace boundary. Whitespace closes the trigger window.\n let i = caret - 1;\n while (i >= 0) {\n const ch = value[i];\n if (ch === \"\\n\" || ch === \" \" || ch === \"\\t\") return null;\n if (value.startsWith(trigger, i)) {\n // Trigger must be at the start of input OR preceded by whitespace\n // / newline. Stops \"https://\" from opening a command palette.\n const before = i === 0 ? \"\" : value[i - 1];\n if (\n i === 0 ||\n before === \" \" ||\n before === \"\\n\" ||\n before === \"\\t\"\n ) {\n return {\n triggerIndex: i,\n query: value.slice(i + trigger.length, caret),\n };\n }\n return null;\n }\n i--;\n }\n return null;\n}\n\n/** Approximate caret-pixel-rect for a textarea using a mirror div.\n * Browsers don't expose the caret position natively for textareas. */\nfunction getCaretRect(\n textarea: HTMLTextAreaElement,\n caret: number,\n): DOMRect | null {\n if (typeof document === \"undefined\") return null;\n const mirror = document.createElement(\"div\");\n const styles = window.getComputedStyle(textarea);\n // Copy the visual properties that affect line-wrapping + glyph metrics.\n for (const prop of [\n \"boxSizing\",\n \"width\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"fontStyle\",\n \"letterSpacing\",\n \"lineHeight\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"textTransform\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n ] as const) {\n (mirror.style as unknown as Record<string, string>)[prop] = styles[prop];\n }\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.overflow = \"hidden\";\n mirror.style.top = \"0\";\n mirror.style.left = \"0\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.wordWrap = \"break-word\";\n mirror.textContent = textarea.value.slice(0, caret);\n const marker = document.createElement(\"span\");\n marker.textContent = \"\"; // zero-width space → measurable\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n\n const taRect = textarea.getBoundingClientRect();\n const markerRect = marker.getBoundingClientRect();\n const mirrorRect = mirror.getBoundingClientRect();\n const x = taRect.left + (markerRect.left - mirrorRect.left) -\n textarea.scrollLeft;\n const y = taRect.top + (markerRect.top - mirrorRect.top) -\n textarea.scrollTop;\n const out = new DOMRect(x, y, 0, markerRect.height || 16);\n document.body.removeChild(mirror);\n return out;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaCommands({\n textareaRef,\n value,\n onChange,\n commands,\n trigger = \"/\",\n openOnEmptyTrigger = true,\n maxItems = 8,\n}: UseTextareaCommandsOptions): UseTextareaCommandsReturn {\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const [triggerIndex, setTriggerIndex] = useState<number | null>(null);\n const [caretRect, setCaretRect] = useState<DOMRect | null>(null);\n // Tracks the (value, caret) snapshot at the moment the user dismissed\n // the palette. The trigger-detect effect skips re-opening when the\n // current state still matches — without this guard, Escape would\n // dismiss but the very next effect run would re-open the palette\n // because the trigger char is still in scope.\n const dismissedAtRef = useRef<{ value: string; caret: number } | null>(\n null,\n );\n\n /* ── Filter the command list against the current query ── */\n const items = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return commands.slice(0, maxItems);\n return commands\n .filter((c) => {\n const hay = [\n typeof c.label === \"string\" ? c.label : \"\",\n typeof c.description === \"string\" ? c.description : \"\",\n c.id,\n ...(c.keywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return hay.includes(q);\n })\n .slice(0, maxItems);\n }, [commands, query, maxItems]);\n\n /* ── Re-evaluate the trigger window on every value or caret change ── */\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n const caret = ta.selectionStart ?? 0;\n // If the user dismissed at this exact (value, caret), don't reopen.\n const dismissedAt = dismissedAtRef.current;\n if (\n dismissedAt &&\n dismissedAt.value === value &&\n dismissedAt.caret === caret\n ) {\n return;\n }\n const found = findOpenTrigger(value, caret, trigger);\n if (!found) {\n if (isOpen) setIsOpen(false);\n setTriggerIndex(null);\n return;\n }\n // Clear the dismissed snapshot once the user moves out of it —\n // future trigger events are real, not stale.\n if (dismissedAt) dismissedAtRef.current = null;\n // Open if the trigger is in scope AND either we already have a\n // query OR `openOnEmptyTrigger` allows opening on the bare trigger.\n if (found.query.length > 0 || openOnEmptyTrigger) {\n setQuery(found.query);\n setTriggerIndex(found.triggerIndex);\n setIsOpen(true);\n // Reset highlight when the query changes — keeps it pinned to\n // the top match.\n setActiveIndex(0);\n setCaretRect(getCaretRect(ta, caret));\n }\n }, [value, trigger, openOnEmptyTrigger, isOpen, textareaRef]);\n\n /* ── Commit a chosen command ── */\n const commit = useCallback(\n (cmd: TextareaCommand) => {\n const ta = textareaRef.current;\n if (!ta || triggerIndex == null) return;\n const insertText =\n typeof cmd.insert === \"function\" ? cmd.insert(query) : cmd.insert;\n const caret = ta.selectionStart ?? value.length;\n const before = value.slice(0, triggerIndex);\n const after = value.slice(caret);\n const next = `${before}${insertText}${after}`;\n // Snapshot the post-commit caret position so the trigger-detect\n // effect doesn't immediately reopen against the original\n // (unchanged) value when the consumer's onChange is async or\n // a no-op (e.g. in tests).\n dismissedAtRef.current = {\n value,\n caret,\n };\n onChange(next);\n setIsOpen(false);\n setTriggerIndex(null);\n // Restore caret to the end of the inserted text on the next frame.\n requestAnimationFrame(() => {\n const pos = before.length + insertText.length;\n ta.focus();\n ta.setSelectionRange(pos, pos);\n });\n },\n [textareaRef, triggerIndex, query, value, onChange],\n );\n\n const dismiss = useCallback(() => {\n const ta = textareaRef.current;\n dismissedAtRef.current = {\n value,\n caret: ta?.selectionStart ?? value.length,\n };\n setIsOpen(false);\n setTriggerIndex(null);\n }, [textareaRef, value]);\n\n /* ── Keyboard nav while the palette is open ── */\n const onKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLTextAreaElement>): boolean => {\n if (!isOpen) return false;\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => Math.min(items.length - 1, i + 1));\n return true;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => Math.max(0, i - 1));\n return true;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n const pick = items[activeIndex];\n if (pick) {\n e.preventDefault();\n commit(pick);\n return true;\n }\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n dismiss();\n return true;\n }\n return false;\n },\n [isOpen, items, activeIndex, commit, dismiss],\n );\n\n return {\n isOpen,\n query,\n activeIndex,\n items,\n onKeyDown,\n dismiss,\n commit,\n caretRect,\n };\n}\n","\"use client\";\nimport type { RefObject } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaSelection — selection state + clipboard / wrap helpers.\n *\n * const sel = useTextareaSelection({ textareaRef, value, onChange });\n *\n * if (sel.active) {\n * // user has highlighted text — render a floating toolbar\n * sel.copy(); // copies selection to clipboard\n * sel.cut(); // copies + deletes\n * sel.wrap(\"**\",\"**\"); // selection becomes **selection**\n * sel.replace(\"...\"); // replace the selection with a literal string\n * }\n *\n * The hook tracks the selection across `selectionchange` events (more\n * reliable than `select` for shift-arrow nav). Returns a pixel rect for\n * the SELECTION so callers can anchor a floating toolbar above it.\n * ------------------------------------------------------------------------- */\n\nexport interface UseTextareaSelectionOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n /** Current textarea value. */\n value: string;\n /** Setter — called when `cut`/`wrap`/`replace` mutate the text. */\n onChange: (next: string) => void;\n}\n\nexport interface UseTextareaSelectionReturn {\n /** True when there's a non-empty selection in the focused textarea. */\n active: boolean;\n /** Selected text. Empty string when `active` is false. */\n text: string;\n /** Character offsets. */\n start: number;\n end: number;\n /** Approximate pixel rect of the selection — anchor a floating\n * toolbar above this (`top - toolbar.height - 4`). Null when no\n * active selection. */\n rect: DOMRect | null;\n\n /** Copy the current selection to the clipboard. Resolves with `true`\n * on success. */\n copy: () => Promise<boolean>;\n /** Copy + delete (= cut). Resolves `true` on success. */\n cut: () => Promise<boolean>;\n /** Wrap the selection with `open` / `close` strings. Selection\n * expands to include the wrappers. */\n wrap: (open: string, close?: string) => void;\n /** Replace the selection with a literal string. Caret lands at the\n * end of the inserted text. */\n replace: (text: string) => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Helpers — selection-rect via a measured mirror div (same recipe as\n * useTextareaCommands' caret-rect helper, expanded to cover a range).\n * ------------------------------------------------------------------------- */\n\nfunction getSelectionRect(\n textarea: HTMLTextAreaElement,\n start: number,\n end: number,\n): DOMRect | null {\n if (typeof document === \"undefined\") return null;\n if (start === end) return null;\n const mirror = document.createElement(\"div\");\n const styles = window.getComputedStyle(textarea);\n for (const prop of [\n \"boxSizing\",\n \"width\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"fontStyle\",\n \"letterSpacing\",\n \"lineHeight\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"textTransform\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n ] as const) {\n (mirror.style as unknown as Record<string, string>)[prop] = styles[prop];\n }\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.overflow = \"hidden\";\n mirror.style.top = \"0\";\n mirror.style.left = \"0\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.wordWrap = \"break-word\";\n\n const pre = document.createTextNode(textarea.value.slice(0, start));\n const range = document.createElement(\"span\");\n range.textContent = textarea.value.slice(start, end) || \"\";\n const post = document.createTextNode(textarea.value.slice(end));\n\n mirror.appendChild(pre);\n mirror.appendChild(range);\n mirror.appendChild(post);\n document.body.appendChild(mirror);\n\n const taRect = textarea.getBoundingClientRect();\n const rangeRect = range.getBoundingClientRect();\n const mirrorRect = mirror.getBoundingClientRect();\n const out = new DOMRect(\n taRect.left + (rangeRect.left - mirrorRect.left) - textarea.scrollLeft,\n taRect.top + (rangeRect.top - mirrorRect.top) - textarea.scrollTop,\n rangeRect.width,\n rangeRect.height,\n );\n document.body.removeChild(mirror);\n return out;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaSelection({\n textareaRef,\n value,\n onChange,\n}: UseTextareaSelectionOptions): UseTextareaSelectionReturn {\n const [start, setStart] = useState(0);\n const [end, setEnd] = useState(0);\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n /* ── Subscribe to selectionchange (fires on caret moves + drags) ── */\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const handler = () => {\n const ta = textareaRef.current;\n if (!ta || document.activeElement !== ta) {\n setStart(0);\n setEnd(0);\n setRect(null);\n return;\n }\n const s = ta.selectionStart ?? 0;\n const e = ta.selectionEnd ?? 0;\n setStart(s);\n setEnd(e);\n setRect(s !== e ? getSelectionRect(ta, s, e) : null);\n };\n document.addEventListener(\"selectionchange\", handler);\n return () => document.removeEventListener(\"selectionchange\", handler);\n }, [textareaRef]);\n\n const active = start !== end;\n const text = active ? value.slice(start, end) : \"\";\n\n const writeToClipboard = useCallback(\n async (str: string): Promise<boolean> => {\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard?.writeText\n ) {\n await navigator.clipboard.writeText(str);\n return true;\n }\n } catch {\n /* fall through to execCommand fallback */\n }\n // Legacy fallback for permission-denied environments. Uses an\n // off-screen textarea so we don't disturb the user's selection.\n try {\n const tmp = document.createElement(\"textarea\");\n tmp.value = str;\n tmp.style.position = \"fixed\";\n tmp.style.left = \"-9999px\";\n document.body.appendChild(tmp);\n tmp.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(tmp);\n return ok;\n } catch {\n return false;\n }\n },\n [],\n );\n\n const copy = useCallback(async () => {\n if (!active) return false;\n return writeToClipboard(text);\n }, [active, text, writeToClipboard]);\n\n const replace = useCallback(\n (str: string) => {\n const ta = textareaRef.current;\n if (!ta) return;\n const next = value.slice(0, start) + str + value.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n const caret = start + str.length;\n ta.setSelectionRange(caret, caret);\n });\n },\n [textareaRef, value, start, end, onChange],\n );\n\n const cut = useCallback(async () => {\n if (!active) return false;\n const ok = await writeToClipboard(text);\n if (ok) replace(\"\");\n return ok;\n }, [active, text, writeToClipboard, replace]);\n\n const wrap = useCallback(\n (open: string, close?: string) => {\n const ta = textareaRef.current;\n if (!ta) return;\n const closing = close ?? open;\n const before = value.slice(0, start);\n const sel = value.slice(start, end);\n const after = value.slice(end);\n const next = `${before}${open}${sel}${closing}${after}`;\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n // Re-select the wrapped content (including the wrappers) so\n // the user sees the result and can keep working.\n const newStart = start;\n const newEnd = end + open.length + closing.length;\n ta.setSelectionRange(newStart, newEnd);\n });\n },\n [textareaRef, value, start, end, onChange],\n );\n\n return {\n active,\n text,\n start,\n end,\n rect,\n copy,\n cut,\n wrap,\n replace,\n };\n}\n","\"use client\";\nimport {\n CodeIcon,\n HeadingIcon,\n ListBulletedIcon,\n ListNumberedIcon,\n QuotesIcon,\n RedoIcon,\n TextBoldIcon,\n TextItalicIcon,\n TextLinkIcon,\n TextStrikethroughIcon,\n UndoIcon,\n} from \"@octaviaflow/icons\";\nimport type { RefObject } from \"react\";\nimport { type ReactNode, useCallback, useMemo, useRef } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * useTextareaTools — toolbar tools + always-on editor helpers.\n *\n * The \"third tier\" of the textarea editor section, sitting alongside:\n * - `useTextareaCommands` (inline `/command` palette)\n * - `useTextareaSelection` (selection-only toolbar)\n *\n * Tools are always-visible buttons rendered in a toolbar above/below the\n * textarea (think Markdown editor chrome: B / I / Code / Link / Quote).\n * Each tool receives a `helpers` bundle that exposes the underlying\n * editing primitives (selection, caret, line-aware mutations, undo).\n *\n * Consumers can:\n * - Compose any combination of built-in tools from the\n * `textareaTools` factory\n * - Mix in fully custom tools (`{ id, label, icon, onAction }`)\n * - Drive the hook directly to build their own toolbar UI\n * ------------------------------------------------------------------------- */\n\nexport interface TextareaToolHelpers {\n /** Current full text. */\n value: string;\n /** Current selection / caret state. */\n selection: {\n text: string;\n start: number;\n end: number;\n active: boolean;\n };\n /** Replace the entire textarea content. */\n setValue: (next: string) => void;\n /** Replace the selection with `text` (inserts at caret when no\n * selection is active). Caret lands after the inserted text. */\n replace: (text: string) => void;\n /** Insert `text` at the caret without disturbing the selection's\n * surrounding content. Identical to `replace` when nothing is\n * selected. */\n insert: (text: string) => void;\n /** Wrap the selection with `open` / `close` strings. When no\n * selection is active, drops the markers around an empty span at\n * the caret. Caret ends up between them so the user can type. */\n wrap: (open: string, close?: string) => void;\n /** Prepend `prefix` to the start of every line that overlaps the\n * selection (or just the caret's line when no selection). Useful for\n * list / quote / heading tools. */\n prependLines: (prefix: string) => void;\n /** Programmatic undo / redo via the native execCommand bridge.\n * Falls back silently when the browser doesn't expose it. */\n undo: () => void;\n redo: () => void;\n /** Direct access to the underlying DOM node for cases the abstraction\n * doesn't cover. */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\nexport interface TextareaTool {\n id: string;\n label: ReactNode;\n icon?: ReactNode;\n /** Title attribute for the toolbar button. Defaults to the `label`\n * when it's a string. */\n title?: string;\n /** Visual treatment — `\"divider\"` renders a vertical separator\n * instead of a button. Otherwise `\"button\"`. */\n kind?: \"button\" | \"divider\";\n /** Fires when the toolbar button is clicked. Receives a helpers\n * bundle that proxies the editing primitives. Can be async. */\n onAction?: (helpers: TextareaToolHelpers) => void | Promise<void>;\n /** Hide the button when this predicate returns false. Re-evaluated\n * on every value / selection change. Useful for \"only show Link\n * when something is selected\" patterns. */\n isVisible?: (helpers: TextareaToolHelpers) => boolean;\n}\n\nexport interface UseTextareaToolsOptions {\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n value: string;\n onChange: (next: string) => void;\n tools: TextareaTool[];\n}\n\nexport interface UseTextareaToolsReturn {\n /** Filtered + ready-to-render tools (visibility predicates applied). */\n tools: TextareaTool[];\n /** Invoke a tool by id. */\n runTool: (id: string) => Promise<void>;\n /** Snapshot helpers — same object passed into `onAction` so consumers\n * can call them outside the toolbar (e.g. from a keyboard shortcut). */\n helpers: TextareaToolHelpers;\n}\n\n/* ---------------------------------------------------------------------------\n * Hook\n * ------------------------------------------------------------------------- */\n\nexport function useTextareaTools({\n textareaRef,\n value,\n onChange,\n tools,\n}: UseTextareaToolsOptions): UseTextareaToolsReturn {\n // Keep latest value in a ref so tool callbacks always see the\n // up-to-date string, even when chained synchronously.\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const helpers = useMemo<TextareaToolHelpers>(() => {\n const getTa = () => textareaRef.current;\n\n const getSelection = () => {\n const ta = getTa();\n const s = ta?.selectionStart ?? 0;\n const e = ta?.selectionEnd ?? 0;\n return {\n text: valueRef.current.slice(s, e),\n start: s,\n end: e,\n active: s !== e,\n };\n };\n\n const setValue = (next: string) => onChange(next);\n\n const replace = (text: string) => {\n const ta = getTa();\n if (!ta) return;\n const { start, end } = getSelection();\n const next =\n valueRef.current.slice(0, start) + text + valueRef.current.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n const caret = start + text.length;\n ta.setSelectionRange(caret, caret);\n });\n };\n\n const insert = (text: string) => replace(text);\n\n const wrap = (open: string, close?: string) => {\n const ta = getTa();\n if (!ta) return;\n const closing = close ?? open;\n const { start, end } = getSelection();\n const sel = valueRef.current.slice(start, end);\n const next =\n valueRef.current.slice(0, start) +\n open +\n sel +\n closing +\n valueRef.current.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n if (start === end) {\n // Empty selection — drop the caret between the wrappers so\n // the user can type the body content right away.\n const caret = start + open.length;\n ta.setSelectionRange(caret, caret);\n } else {\n ta.setSelectionRange(start, end + open.length + closing.length);\n }\n });\n };\n\n const prependLines = (prefix: string) => {\n const ta = getTa();\n if (!ta) return;\n const { start, end } = getSelection();\n // Expand selection to whole lines so prefixes land at line starts.\n const v = valueRef.current;\n const lineStart = v.lastIndexOf(\"\\n\", start - 1) + 1;\n const lineEnd = (() => {\n const idx = v.indexOf(\"\\n\", end);\n return idx === -1 ? v.length : idx;\n })();\n const block = v.slice(lineStart, lineEnd);\n const updated = block\n .split(\"\\n\")\n .map((line) => `${prefix}${line}`)\n .join(\"\\n\");\n const next = v.slice(0, lineStart) + updated + v.slice(lineEnd);\n onChange(next);\n requestAnimationFrame(() => {\n ta.focus();\n ta.setSelectionRange(\n lineStart,\n lineStart + updated.length,\n );\n });\n };\n\n const undo = () => {\n try {\n getTa()?.focus();\n document.execCommand(\"undo\");\n } catch {\n /* not all browsers expose undo via execCommand */\n }\n };\n const redo = () => {\n try {\n getTa()?.focus();\n document.execCommand(\"redo\");\n } catch {\n /* same */\n }\n };\n\n return {\n get value() {\n return valueRef.current;\n },\n get selection() {\n return getSelection();\n },\n setValue,\n replace,\n insert,\n wrap,\n prependLines,\n undo,\n redo,\n getTextarea: getTa,\n };\n }, [textareaRef, onChange]);\n\n // Visibility filter — re-evaluated each render so predicates that\n // depend on the current selection update naturally.\n const visibleTools = useMemo(\n () => tools.filter((t) => (t.isVisible ? t.isVisible(helpers) : true)),\n [tools, helpers],\n );\n\n const runTool = useCallback(\n async (id: string) => {\n const tool = tools.find((t) => t.id === id);\n if (!tool || tool.kind === \"divider\") return;\n await tool.onAction?.(helpers);\n },\n [tools, helpers],\n );\n\n return { tools: visibleTools, runTool, helpers };\n}\n\n/* ---------------------------------------------------------------------------\n * `textareaTools` — factory for the built-in Markdown/editor tools.\n *\n * Each factory returns a `TextareaTool`. Consumers compose them freely:\n *\n * tools={[\n * textareaTools.bold(),\n * textareaTools.italic(),\n * textareaTools.divider(),\n * textareaTools.bulletList(),\n * textareaTools.numberedList(),\n * textareaTools.divider(),\n * textareaTools.link(),\n * myCustomTool,\n * ]}\n * ------------------------------------------------------------------------- */\n\nconst wrapTool = (\n id: string,\n open: string,\n close: string,\n label: ReactNode,\n icon: ReactNode,\n title?: string,\n): TextareaTool => ({\n id,\n label,\n icon,\n title,\n onAction: (h) => h.wrap(open, close),\n});\n\nconst prependLineTool = (\n id: string,\n prefix: string,\n label: ReactNode,\n icon: ReactNode,\n title?: string,\n): TextareaTool => ({\n id,\n label,\n icon,\n title,\n onAction: (h) => h.prependLines(prefix),\n});\n\nexport const textareaTools = {\n bold: (): TextareaTool =>\n wrapTool(\"bold\", \"**\", \"**\", \"Bold\", <TextBoldIcon />, \"Bold (⌘B)\"),\n\n italic: (): TextareaTool =>\n wrapTool(\"italic\", \"*\", \"*\", \"Italic\", <TextItalicIcon />, \"Italic (⌘I)\"),\n\n strikethrough: (): TextareaTool =>\n wrapTool(\n \"strike\",\n \"~~\",\n \"~~\",\n \"Strikethrough\",\n <TextStrikethroughIcon />,\n \"Strikethrough\",\n ),\n\n code: (): TextareaTool =>\n wrapTool(\"code\", \"`\", \"`\", \"Code\", <CodeIcon />, \"Inline code\"),\n\n codeBlock: (): TextareaTool => ({\n id: \"code-block\",\n label: \"Code block\",\n icon: <CodeIcon />,\n title: \"Code block\",\n onAction: (h) => h.wrap(\"```\\n\", \"\\n```\"),\n }),\n\n link: (): TextareaTool => ({\n id: \"link\",\n label: \"Link\",\n icon: <TextLinkIcon />,\n title: \"Insert link\",\n onAction: (h) => {\n const sel = h.selection;\n const text = sel.active ? sel.text : \"link text\";\n h.replace(`[${text}](https://)`);\n },\n }),\n\n /** Heading. Defaults to H2. Pass a `level` (1–6) to override. */\n heading: (level: 1 | 2 | 3 | 4 | 5 | 6 = 2): TextareaTool =>\n prependLineTool(\n `heading-${level}`,\n `${\"#\".repeat(level)} `,\n `H${level}`,\n <HeadingIcon />,\n `Heading ${level}`,\n ),\n\n bulletList: (): TextareaTool =>\n prependLineTool(\n \"ul\",\n \"- \",\n \"Bullet list\",\n <ListBulletedIcon />,\n \"Bullet list\",\n ),\n\n numberedList: (): TextareaTool =>\n prependLineTool(\n \"ol\",\n \"1. \",\n \"Numbered list\",\n <ListNumberedIcon />,\n \"Numbered list\",\n ),\n\n quote: (): TextareaTool =>\n prependLineTool(\n \"quote\",\n \"> \",\n \"Quote\",\n <QuotesIcon />,\n \"Quote\",\n ),\n\n undo: (): TextareaTool => ({\n id: \"undo\",\n label: \"Undo\",\n icon: <UndoIcon />,\n title: \"Undo (⌘Z)\",\n onAction: (h) => h.undo(),\n }),\n\n redo: (): TextareaTool => ({\n id: \"redo\",\n label: \"Redo\",\n icon: <RedoIcon />,\n title: \"Redo (⌘⇧Z)\",\n onAction: (h) => h.redo(),\n }),\n\n divider: (id = \"divider\"): TextareaTool => ({\n id: `${id}-${Math.random().toString(36).slice(2, 8)}`,\n label: \"\",\n kind: \"divider\",\n }),\n};\n","import type { ReactNode } from \"react\";\n\n/* ---------------------------------------------------------------------------\n * WorkflowShowcase engine — pure data + logic, no React rendering.\n *\n * Everything the marketing funnel needs to \"think\" lives here so it can be\n * unit-tested without mounting the (heavily animated) component tree:\n * connector recognition, schedule inference, plan resolution, activity-rail\n * script and prompt segmentation for the live-highlight overlay.\n * ------------------------------------------------------------------------- */\n\nexport type WorkflowShowcaseRole = \"source\" | \"destination\" | \"action\" | \"notify\";\n\nexport interface WorkflowShowcaseConnector {\n /** Canonical display name — matched case-insensitively inside the prompt. */\n name: string;\n role: WorkflowShowcaseRole;\n /** Extra strings that also count as a mention of this connector. */\n aliases?: string[];\n /** Optional icon tile. Defaults to a two-letter monogram. */\n icon?: ReactNode;\n}\n\nexport interface WorkflowShowcaseExample {\n id: string;\n /** Chip label, e.g. \"Storefront orders → Warehouse, hourly\". */\n label: string;\n /** Prompt inserted (and auto-built) when the chip is clicked. */\n prompt: string;\n}\n\nexport interface WorkflowShowcaseMetric {\n id: string;\n /** Final value once the pipeline reads as live. */\n value: number;\n /** Interim value while the workflow is still assembling. Omit → \"—\". */\n buildingValue?: number;\n decimals?: number;\n /** Small unit text after the value, e.g. \"rows/min\". */\n unit?: string;\n /** Rendered before the number, e.g. \"−\". */\n prefix?: string;\n /** Rendered flush after the number, e.g. \"%\". */\n suffix?: string;\n /** Mono microcopy under the value, e.g. \"THROUGHPUT\". */\n label: string;\n /** \"success\" tints the final value green (savings, wins). */\n tone?: \"default\" | \"success\";\n}\n\nexport type WorkflowShowcasePhase =\n | \"idle\"\n | \"analyzing\"\n | \"building\"\n | \"done\"\n | \"signup\"\n | \"creating\"\n | \"welcome\";\n\n/** Phases in which the generated workflow reads as complete. */\nexport const SETTLED_PHASES: readonly WorkflowShowcasePhase[] = [\n \"done\",\n \"signup\",\n \"creating\",\n \"welcome\",\n];\n\nexport interface WorkflowShowcasePlan {\n /** Sources, in catalog order. */\n left: WorkflowShowcaseConnector[];\n /** Destination → action → notify, in that order. */\n right: WorkflowShowcaseConnector[];\n /** Every connector in the plan (left + right). */\n all: WorkflowShowcaseConnector[];\n /** Total assemble steps: each source + schema map + each right-side node. */\n totalSteps: number;\n}\n\nexport interface WorkflowShowcaseSignupValues {\n name: string;\n email: string;\n company: string;\n teamSize: string;\n}\n\nexport interface ShowcaseActivityLine {\n id: string;\n text: string;\n tone: \"muted\" | \"faint\" | \"active\" | \"done\" | \"plain\";\n}\n\nexport interface ShowcasePromptSegment {\n text: string;\n /** Set when this segment is a recognized connector mention. */\n connector?: WorkflowShowcaseConnector;\n}\n\n/* ---------------------------------------------------------------------------\n * Defaults — deliberately vendor-neutral. The consuming site passes its real\n * connector catalog; the design system itself stays name-free.\n * ------------------------------------------------------------------------- */\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS: WorkflowShowcaseConnector[] = [\n { name: \"Storefront\", role: \"source\", aliases: [\"store\", \"shop orders\"] },\n { name: \"Payments\", role: \"source\", aliases: [\"payouts\"] },\n { name: \"Orders DB\", role: \"source\", aliases: [\"orders database\"] },\n { name: \"CRM\", role: \"source\", aliases: [\"crm leads\"] },\n { name: \"Warehouse\", role: \"destination\" },\n { name: \"Lakehouse\", role: \"destination\" },\n { name: \"Campaigns\", role: \"action\", aliases: [\"campaign\"] },\n { name: \"Team Chat\", role: \"notify\", aliases: [\"chat\", \"alert the team\"] },\n];\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES: WorkflowShowcaseExample[] = [\n {\n id: \"hourly-sync\",\n label: \"Storefront orders → Warehouse, hourly\",\n prompt: \"Sync Storefront orders to Warehouse every hour, alert sales in Team Chat\",\n },\n {\n id: \"daily-load\",\n label: \"Payments payouts → Lakehouse, daily\",\n prompt: \"Load Payments payouts into Lakehouse daily\",\n },\n {\n id: \"realtime-stream\",\n label: \"Orders DB changes → Warehouse + Team Chat\",\n prompt: \"Stream Orders DB changes to Warehouse in real-time and notify Team Chat\",\n },\n];\n\nexport const WORKFLOW_SHOWCASE_DEFAULT_METRICS: WorkflowShowcaseMetric[] = [\n { id: \"throughput\", value: 2341, buildingValue: 842, unit: \"rows/min\", label: \"THROUGHPUT\" },\n {\n id: \"latency\",\n value: 0.8,\n buildingValue: 1.1,\n decimals: 1,\n unit: \"s latency\",\n label: \"SYNC SPEED\",\n },\n { id: \"cost\", value: 43, suffix: \"%\", label: \"SAVED VS BASELINE\", tone: \"success\" },\n];\n\nexport const WORKFLOW_SHOWCASE_SCHEDULES = [\"AUTO\", \"HOURLY\", \"DAILY\", \"REAL-TIME\"] as const;\n\n/** Trigger modes the platform supports — mirrors real workflow capability. */\nexport const WORKFLOW_SHOWCASE_TRIGGERS = [\"SCHEDULE\", \"WEBHOOK\", \"APP EVENT\", \"MANUAL\"] as const;\n\n// Platform capability tiles — AI/data jobs the engine actually runs.\nexport const WORKFLOW_SHOWCASE_DEFAULT_TILES = [\n \"ELT\",\n \"CDC\",\n \"LLM\",\n \"RAG\",\n \"HEAL\",\n \"COST\",\n \"IDP\",\n \"VEC\",\n] as const;\n\n/* ---------------------------------------------------------------------------\n * Recognition\n * ------------------------------------------------------------------------- */\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\ninterface Mention {\n connector: WorkflowShowcaseConnector;\n pattern: string;\n}\n\n/** Every (connector, matchable-string) pair, longest pattern first so\n * overlapping names (\"Orders DB\" vs \"Orders\") resolve to the longest hit. */\nfunction mentionsOf(catalog: WorkflowShowcaseConnector[]): Mention[] {\n const out: Mention[] = [];\n for (const connector of catalog) {\n out.push({ connector, pattern: connector.name });\n for (const alias of connector.aliases ?? []) out.push({ connector, pattern: alias });\n }\n return out.sort((a, b) => b.pattern.length - a.pattern.length);\n}\n\n/** Connector names mentioned in the prompt, in catalog order, deduped. */\nexport function detectConnectors(prompt: string, catalog: WorkflowShowcaseConnector[]): string[] {\n const lower = prompt.toLowerCase();\n return catalog\n .filter((c) => [c.name, ...(c.aliases ?? [])].some((p) => lower.includes(p.toLowerCase())))\n .map((c) => c.name);\n}\n\n/** Split the prompt into plain / recognized-connector segments, preserving\n * the user's exact text. Powers the live-highlight overlay. */\nexport function segmentPrompt(\n prompt: string,\n catalog: WorkflowShowcaseConnector[],\n): ShowcasePromptSegment[] {\n if (!prompt) return [];\n const mentions = mentionsOf(catalog);\n if (!mentions.length) return [{ text: prompt }];\n const re = new RegExp(`(${mentions.map((m) => escapeRegExp(m.pattern)).join(\"|\")})`, \"gi\");\n const byPattern = new Map(mentions.map((m) => [m.pattern.toLowerCase(), m.connector]));\n return prompt\n .split(re)\n .filter((part) => part !== \"\")\n .map((part) => {\n const connector = byPattern.get(part.toLowerCase());\n return connector ? { text: part, connector } : { text: part };\n });\n}\n\n/** Infer a schedule from natural language; null when nothing matches. */\nexport function scheduleFromPrompt(prompt: string): string | null {\n const t = prompt.toLowerCase();\n if (/stream|real.?time|cdc/.test(t)) return \"REAL-TIME\";\n if (/hour/.test(t)) return \"HOURLY\";\n if (/dail|every day|nightly/.test(t)) return \"DAILY\";\n return null;\n}\n\n/** Two-letter monogram for the default icon tile: \"Team Chat\" → \"TC\". */\nexport function monogram(name: string): string {\n const words = name.trim().split(/\\s+/);\n const raw = words.length >= 2 ? `${words[0][0]}${words[1][0]}` : name.slice(0, 2);\n return raw.toUpperCase();\n}\n\n/* ---------------------------------------------------------------------------\n * Plan resolution\n * ------------------------------------------------------------------------- */\n\nconst RIGHT_ORDER: Record<WorkflowShowcaseRole, number> = {\n source: -1,\n destination: 0,\n action: 1,\n notify: 2,\n};\n\n/**\n * Resolve the workflow plan from explicit picks + prompt mentions. A viable\n * demo always has at least one source and one non-source, so missing sides\n * are backfilled from the catalog (first source / first notify-or-destination).\n */\nexport function resolvePlan(\n selected: string[],\n detected: string[],\n catalog: WorkflowShowcaseConnector[],\n): WorkflowShowcasePlan {\n const byName = new Map(catalog.map((c) => [c.name, c]));\n let names = [...new Set([...selected, ...detected])].filter((n) => byName.has(n));\n if (!names.length) {\n const fallback = [\n catalog.find((c) => c.role === \"source\"),\n catalog.find((c) => c.role === \"destination\"),\n catalog.find((c) => c.role === \"notify\"),\n ].filter((c): c is WorkflowShowcaseConnector => Boolean(c));\n names = fallback.map((c) => c.name);\n }\n const has = (predicate: (c: WorkflowShowcaseConnector) => boolean) =>\n names.some((n) => {\n const c = byName.get(n);\n return Boolean(c && predicate(c));\n });\n if (!has((c) => c.role === \"source\")) {\n const source = catalog.find((c) => c.role === \"source\");\n if (source) names = [source.name, ...names];\n }\n if (!has((c) => c.role !== \"source\")) {\n const sink =\n catalog.find((c) => c.role === \"notify\") ?? catalog.find((c) => c.role !== \"source\");\n if (sink) names = [...names, sink.name];\n }\n const picked = catalog.filter((c) => names.includes(c.name));\n const left = picked.filter((c) => c.role === \"source\");\n const right = picked\n .filter((c) => c.role !== \"source\")\n .sort((a, b) => RIGHT_ORDER[a.role] - RIGHT_ORDER[b.role]);\n const all = [...left, ...right];\n return { left, right, all, totalSteps: all.length + 1 };\n}\n\n/* ---------------------------------------------------------------------------\n * Activity rail script\n * ------------------------------------------------------------------------- */\n\nfunction stepVerb(role: WorkflowShowcaseRole): string {\n if (role === \"notify\") return \"alert\";\n if (role === \"action\") return \"trigger\";\n return \"load\";\n}\n\n/** Ordered assemble steps for the rail + canvas (\"storefront extract\", …). */\nexport function assembleSteps(plan: WorkflowShowcasePlan): string[] {\n return [\n ...plan.left.map((c) => `${c.name.toLowerCase()} extract`),\n \"schema map · 14 fields\",\n ...plan.right.map((c) => `${c.name.toLowerCase()} ${stepVerb(c.role)}`),\n ];\n}\n\n/**\n * Script the \"OCTAVIA IS DOING\" rail for the current moment.\n * `shown` = number of assemble steps already completed while building.\n */\nexport function buildActivity(args: {\n phase: WorkflowShowcasePhase;\n shown: number;\n plan: WorkflowShowcasePlan;\n selected: string[];\n status: string;\n}): ShowcaseActivityLine[] {\n const { phase, shown, plan, selected, status } = args;\n const settled = SETTLED_PHASES.includes(phase);\n const lines: ShowcaseActivityLine[] = [];\n if (phase === \"idle\") {\n if (!selected.length) {\n lines.push({ id: \"wait\", text: \"▸ waiting for instructions…\", tone: \"muted\" });\n lines.push({ id: \"hint\", text: \"· type a request or pick apps\", tone: \"faint\" });\n }\n for (const name of selected.slice(-6)) {\n lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: \"plain\" });\n }\n return lines;\n }\n if (phase === \"analyzing\") {\n for (const name of selected.slice(-4)) {\n lines.push({ id: `sel-${name}`, text: `+ ${name.toLowerCase()} connected`, tone: \"muted\" });\n }\n lines.push({ id: \"status\", text: `⟳ ${status}`, tone: \"active\" });\n return lines;\n }\n assembleSteps(plan).forEach((step, i) => {\n if (settled || shown > i) lines.push({ id: `step-${i}`, text: `✓ ${step}`, tone: \"done\" });\n else if (shown === i) lines.push({ id: `step-${i}`, text: `⟳ ${step}…`, tone: \"active\" });\n else lines.push({ id: `step-${i}`, text: `· ${step} queued`, tone: \"muted\" });\n });\n if (settled) lines.push({ id: \"errors\", text: \"✓ error handling attached\", tone: \"done\" });\n return lines.slice(-8);\n}\n\n/* ---------------------------------------------------------------------------\n * Misc\n * ------------------------------------------------------------------------- */\n\n/** \"Acme Inc.\" → \"acme-inc\" (workspace slug preview in the welcome card). */\nexport function slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"your-team\"\n );\n}\n\nexport function isValidEmail(value: string): boolean {\n return /^\\S+@\\S+\\.\\S+$/.test(value.trim());\n}\n","\"use client\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, type AvatarProps } from \"../Avatar\";\nimport { Card, type CardRadius } from \"../Card\";\n\n/* ---------------------------------------------------------------------------\n * BlogCard — composes on the polished `Card` primitive so it inherits\n * `forwardRef`, native prop spread, keyboard activation, hover/tap\n * microinteractions, and `prefers-reduced-motion` support for free.\n *\n * Adds blog-specific slots on top: cover image with configurable aspect\n * ratio, category chips, author row, reading-time + date meta. Renders\n * as a real `<a>` when `href` is given (via Card.asChild) so the link\n * gets browser semantics (open-in-new-tab, middle-click, etc.).\n * ------------------------------------------------------------------------- */\n\nexport type BlogCardOrientation = \"vertical\" | \"horizontal\";\nexport type BlogCardCoverAspect = \"16/9\" | \"4/3\" | \"1/1\" | \"3/4\" | \"21/9\";\n\nexport interface BlogCardAuthor {\n name: ReactNode;\n /** Optional avatar — passed through to the polished `Avatar` primitive. */\n avatar?: Pick<AvatarProps, \"src\" | \"initials\" | \"alt\" | \"seed\" | \"palette\">;\n /** Optional role / handle / etc. */\n byline?: ReactNode;\n}\n\nexport interface BlogCardProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"title\" | \"onChange\" | \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n /** Cover artwork — usually an `<img>` element, but accepts any node. */\n cover?: ReactNode;\n /**\n * Cover aspect ratio. Lets a grid of cards stay visually consistent\n * regardless of source image dimensions. Default `\"16/9\"`.\n */\n coverAspect?: BlogCardCoverAspect;\n /** Single category chip (legacy — prefer `tags`). */\n category?: ReactNode;\n /** Multiple category chips. Rendered before the title. */\n tags?: ReactNode[];\n /** Date / publish info — inline meta. */\n meta?: ReactNode;\n /** Structured reading-time slot. Renders alongside `meta`. */\n readingTime?: ReactNode;\n /** Required title — drives `aria-labelledby` on the card. */\n title: ReactNode;\n /** Heading level for the title. Default `\"h3\"`. */\n titleAs?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n description?: ReactNode;\n /** Structured author block — avatar + name + optional byline. */\n author?: BlogCardAuthor;\n /** Right-aligned footer content (call-to-action / \"Read more\" link). */\n footer?: ReactNode;\n /** Card corner radius. */\n radius?: CardRadius;\n /** Cover on top (default) or cover on left. */\n orientation?: BlogCardOrientation;\n /** When set, the card renders as an `<a>` element. */\n href?: string;\n /** Click handler. Pairing with `href` is fine; both fire. */\n onClick?: () => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const BlogCard = forwardRef<HTMLDivElement, BlogCardProps>(function BlogCard(\n {\n cover,\n coverAspect = \"16/9\",\n category,\n tags,\n meta,\n readingTime,\n title,\n titleAs = \"h3\",\n description,\n author,\n footer,\n radius = \"md\",\n orientation = \"vertical\",\n href,\n onClick,\n id: providedId,\n className,\n ...rest\n },\n ref,\n) {\n const reactId = useId();\n const baseId = providedId ?? `ods-blog-card-${reactId}`;\n const titleId = `${baseId}-title`;\n const descId = description ? `${baseId}-desc` : undefined;\n\n // Resolve the tag list — a single `category` is treated as a one-tag\n // list for back-compat with the v1 API.\n const tagList: ReactNode[] = tags ?? (category ? [category] : []);\n\n const body = (\n <>\n {cover && (\n <div\n className={cn(\n \"ods-blog-card__cover\",\n `ods-blog-card__cover--aspect-${coverAspect.replace(\"/\", \"-\")}`,\n )}\n aria-hidden=\"true\"\n >\n {cover}\n </div>\n )}\n\n <div className=\"ods-blog-card__body\">\n {(tagList.length > 0 || meta || readingTime) && (\n <div className=\"ods-blog-card__meta\">\n {tagList.length > 0 && (\n <span className=\"ods-blog-card__tags\">\n {tagList.map((t, i) => (\n <span key={i} className=\"ods-blog-card__tag\">\n {t}\n </span>\n ))}\n </span>\n )}\n {meta && <span className=\"ods-blog-card__date\">{meta}</span>}\n {readingTime && <span className=\"ods-blog-card__reading\">{readingTime}</span>}\n </div>\n )}\n\n <Card.Title as={titleAs} id={titleId} className=\"ods-blog-card__title\">\n {title}\n </Card.Title>\n\n {description && (\n <Card.Description id={descId} className=\"ods-blog-card__desc\">\n {description}\n </Card.Description>\n )}\n\n {(author || footer) && (\n <div className=\"ods-blog-card__footer\">\n {author && (\n <div className=\"ods-blog-card__author\">\n {author.avatar && (\n <Avatar\n size=\"sm\"\n src={author.avatar.src}\n initials={author.avatar.initials}\n seed={author.avatar.seed}\n palette={author.avatar.palette}\n alt={\n author.avatar.alt ??\n (typeof author.name === \"string\" ? author.name : undefined)\n }\n />\n )}\n <div className=\"ods-blog-card__author-text\">\n <span className=\"ods-blog-card__author-name\">{author.name}</span>\n {author.byline && (\n <span className=\"ods-blog-card__author-byline\">{author.byline}</span>\n )}\n </div>\n </div>\n )}\n {footer && <div className=\"ods-blog-card__action\">{footer}</div>}\n </div>\n )}\n </div>\n </>\n );\n\n // `href` → render as a real <a> via Card.asChild for browser-native\n // link semantics (open-in-new-tab, middle-click, copy-link, etc.).\n if (href) {\n return (\n <Card\n asChild\n radius={radius}\n padding=\"none\"\n className={cn(\n \"ods-blog-card\",\n `ods-blog-card--${orientation}`,\n \"ods-blog-card--interactive\",\n className,\n )}\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <a\n // `rest` is typed against HTMLDivElement handlers (BlogCardProps\n // extends div). The anchor accepts the same attributes\n // structurally at runtime, but TS sees\n // KeyboardEventHandler<HTMLDivElement> ≠ <HTMLAnchorElement>.\n // Route through `unknown` — TS's recommended escape hatch\n // when we know the runtime is safe.\n {...(rest as unknown as ComponentPropsWithoutRef<\"a\">)}\n ref={ref as unknown as React.Ref<HTMLAnchorElement>}\n href={href}\n id={baseId}\n onClick={onClick}\n >\n {body}\n </a>\n </Card>\n );\n }\n\n return (\n <Card\n {...rest}\n ref={ref}\n id={baseId}\n radius={radius}\n padding=\"none\"\n onClick={onClick}\n className={cn(\n \"ods-blog-card\",\n `ods-blog-card--${orientation}`,\n onClick && \"ods-blog-card--interactive\",\n className,\n )}\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n {body}\n </Card>\n );\n});\n\nBlogCard.displayName = \"BlogCard\";\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarShape = \"circle\" | \"square\";\n/** Presence indicator. `online` pulses gently; reduced-motion is respected. */\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\" | \"away\";\n\nexport interface AvatarProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"color\" | \"children\" | \"onClick\" | \"onKeyDown\"> {\n /** Image URL. If loading fails, falls back to `initials` (then `icon`, then `?`). */\n src?: string;\n /** Accessible name for the avatar. Used as the `<img>` alt AND as the\n * wrapping element's accessible name. If you only pass `initials`,\n * this is recommended so AT announces \"Jane Doe avatar\" not \"J D\". */\n alt?: string;\n /** Initials to render when there is no image. Auto-uppercased and\n * truncated to 2 characters so passing a full name stays sane. */\n initials?: string;\n /** Optional icon slot — rendered when neither `src` nor `initials` is\n * available (or used directly when you want a system/bot avatar). */\n icon?: ReactNode;\n /** Override the default `?` fallback content. */\n fallback?: ReactNode;\n /** Stable seed for the persistent palette — canonically the user's\n * NAME. Falls back to `alt` (usually the person's name) before\n * `initials`, so every surface that renders the same person derives\n * the same color even when `seed` isn't passed explicitly. */\n seed?: string;\n /** Explicit palette index (0–11) — wins over seed hashing. Pair with a\n * host-persisted value (e.g. `user.profile.avatarPalette` computed once\n * via `avatarPaletteIndex(name)`) to guarantee the identical color on\n * every surface, including non-DS ones like transactional emails. */\n palette?: number;\n /** Pixel/font size variant. */\n size?: AvatarSize;\n /** Shape — `circle` (people, default) or `square` (teams, bots, brands). */\n shape?: AvatarShape;\n /** Presence indicator dot. */\n status?: AvatarStatus;\n /** Human-readable status label folded into the accessible name. Defaults\n * to the capitalized `status` value. */\n statusLabel?: string;\n /** When set, the avatar becomes a button (Enter/Space activated). */\n onClick?: () => void;\n /** Native image attributes — set `loading=\"eager\"` for above-the-fold avatars\n * if you've measured CLS regressions. Defaults to `lazy`. */\n imgLoading?: \"eager\" | \"lazy\";\n /** Native referrerPolicy for cross-origin avatar hosts (Gravatar, etc.). */\n referrerPolicy?: ComponentPropsWithoutRef<\"img\">[\"referrerPolicy\"];\n}\n\n/* ---------------------------------------------------------------------------\n * Persistent palette\n *\n * 12 gradients exposed as CSS custom properties so consumers can theme them\n * (or replace the whole palette) without touching the component. We do NOT\n * hit localStorage — a deterministic djb2 hash gives stable assignment\n * across renders, machines, and SSR/CSR boundaries.\n * ------------------------------------------------------------------------- */\n\nconst PALETTE_SIZE = 12;\n\nfunction djb2(str: string): number {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction paletteIndexFor(seed: string): number {\n return djb2(seed) % PALETTE_SIZE;\n}\n\n/** Number of persistent avatar palettes. */\nexport const AVATAR_PALETTE_SIZE = PALETTE_SIZE;\n\n/**\n * Deterministic palette index for a seed (canonically the user's name).\n * Exposed so hosts can compute the value ONCE, persist it on the user\n * record, and pass it back via the `palette` prop everywhere.\n */\nexport function avatarPaletteIndex(seed: string): number {\n return paletteIndexFor(seed);\n}\n\nfunction normalizeInitials(raw: string): string {\n // Take the first character of up to two whitespace-separated tokens —\n // \"Jane Doe\" → \"JD\", \"Postgres\" → \"P\", \"schema-drift\" → \"S\". Falls\n // back to the first two characters of a contiguous run.\n const trimmed = raw.trim();\n if (!trimmed) return \"\";\n const tokens = trimmed.split(/\\s+/).filter(Boolean);\n if (tokens.length >= 2) {\n return (tokens[0]!.charAt(0) + tokens[1]!.charAt(0)).toUpperCase();\n }\n return trimmed.slice(0, 2).toUpperCase();\n}\n\nconst STATUS_DEFAULT_LABEL: Record<AvatarStatus, string> = {\n online: \"Online\",\n offline: \"Offline\",\n busy: \"Busy\",\n away: \"Away\",\n};\n\n/* ---------------------------------------------------------------------------\n * Avatar\n * ------------------------------------------------------------------------- */\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n {\n src,\n alt,\n initials,\n icon,\n fallback,\n seed,\n palette,\n size = \"md\",\n shape = \"circle\",\n status,\n statusLabel,\n onClick,\n imgLoading = \"lazy\",\n referrerPolicy,\n className,\n ...rest\n },\n ref,\n) {\n // Image failure is tracked locally so the next render swaps to the\n // initials fallback transparently. Reset key change resets state.\n const [imgFailed, setImgFailed] = useState(false);\n const handleImgError = useCallback(() => setImgFailed(true), []);\n\n const showImage = Boolean(src) && !imgFailed;\n\n const normalizedInitials = useMemo(\n () => (initials ? normalizeInitials(initials) : \"\"),\n [initials],\n );\n\n // Resolve palette once. Stable across renders. Precedence: explicit\n // saved `palette` > `seed` > `alt` (usually the person's NAME — shared\n // by every surface) > `initials` (2 chars, least unique — last resort).\n const paletteIdx = useMemo(() => {\n if (palette !== undefined) {\n return ((Math.trunc(palette) % PALETTE_SIZE) + PALETTE_SIZE) % PALETTE_SIZE;\n }\n const resolved = seed ?? alt ?? initials ?? \"?\";\n return paletteIndexFor(resolved);\n }, [palette, seed, alt, initials]);\n\n // Accessible name — fold status into the label so AT announces\n // \"Jane Doe, online\" as a single coherent label, not two separate nodes.\n const baseName = alt || normalizedInitials || \"Avatar\";\n const announcedStatus = status ? (statusLabel ?? STATUS_DEFAULT_LABEL[status]) : \"\";\n const accessibleName = announcedStatus ? `${baseName}, ${announcedStatus}` : baseName;\n\n const isClickable = Boolean(onClick);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isClickable) return;\n if ((e.key === \"Enter\" || e.key === \" \") && !e.repeat) {\n e.preventDefault();\n onClick?.();\n }\n };\n\n const rootClassName = cn(\n \"ods-avatar\",\n `ods-avatar--${size}`,\n `ods-avatar--${shape}`,\n isClickable && \"ods-avatar--clickable\",\n className,\n );\n\n return (\n <div\n {...rest}\n ref={ref}\n className={rootClassName}\n // Only the outer wrapper carries `role=\"img\"` + the merged label. The\n // inner <img> drops out of the AT tree (alt=\"\") so AT doesn't double-\n // announce \"Jane Doe avatar / Jane Doe\".\n role={isClickable ? \"button\" : \"img\"}\n aria-label={accessibleName}\n tabIndex={isClickable ? 0 : undefined}\n onClick={onClick}\n onKeyDown={isClickable ? handleKeyDown : undefined}\n data-status={status}\n >\n <span className=\"ods-avatar__inner\" data-palette={paletteIdx}>\n {showImage ? (\n <img\n src={src}\n alt=\"\"\n className=\"ods-avatar__image\"\n loading={imgLoading}\n decoding=\"async\"\n referrerPolicy={referrerPolicy}\n onError={handleImgError}\n draggable={false}\n />\n ) : icon ? (\n <span className=\"ods-avatar__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : normalizedInitials ? (\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n {normalizedInitials}\n </span>\n ) : (\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n {fallback ?? \"?\"}\n </span>\n )}\n </span>\n {status && (\n // Decorative — the textual status is folded into the wrapper's\n // aria-label above. `aria-hidden` keeps AT from double-announcing.\n <span\n className={cn(\"ods-avatar__status\", `ods-avatar__status--${status}`)}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n});\n\nAvatar.displayName = \"Avatar\";\n\n/* ---------------------------------------------------------------------------\n * AvatarStack\n * ------------------------------------------------------------------------- */\n\nexport interface AvatarStackProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n /** Avatars to display (in left-to-right stacking order). */\n children: ReactNode;\n /** Max avatars to show before collapsing the surplus into `+N`. */\n max?: number;\n /** Size applied to the overflow chip. Defaults to `md`. */\n size?: AvatarSize;\n /** Replace the default `+N` overflow chip. Receives the hidden count. */\n renderOverflow?: (count: number) => ReactNode;\n /** Stacking direction. `ltr` (default) overlaps each successive avatar to\n * the right of the previous one; `rtl` mirrors. */\n direction?: \"ltr\" | \"rtl\";\n}\n\nexport const AvatarStack = forwardRef<HTMLDivElement, AvatarStackProps>(function AvatarStack(\n { children, max, size = \"md\", renderOverflow, direction = \"ltr\", className, ...rest },\n ref,\n) {\n const arr = Array.isArray(children) ? children : [children];\n const visible = max && arr.length > max ? arr.slice(0, max) : arr;\n const overflow = max && arr.length > max ? arr.length - max : 0;\n\n return (\n <div\n {...rest}\n ref={ref}\n className={cn(\"ods-avatar-stack\", `ods-avatar-stack--${direction}`, className)}\n >\n {visible}\n {overflow > 0 &&\n (renderOverflow ? (\n renderOverflow(overflow)\n ) : (\n <div\n className={cn(\n \"ods-avatar\",\n `ods-avatar--${size}`,\n \"ods-avatar--circle\",\n \"ods-avatar-stack__overflow\",\n )}\n role=\"img\"\n aria-label={`${overflow} more`}\n >\n <span className=\"ods-avatar__inner\">\n <span className=\"ods-avatar__initials\" aria-hidden=\"true\">\n +{overflow}\n </span>\n </span>\n </div>\n ))}\n </div>\n );\n});\n\nAvatarStack.displayName = \"AvatarStack\";\n","\"use client\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n type ElementType,\n forwardRef,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Slot } from \"../../utils/Slot\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type CardVariant = \"default\" | \"elevated\" | \"outlined\" | \"subtle\" | \"selected\";\nexport type CardPadding = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type CardRadius = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface CardProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n variant?: CardVariant;\n padding?: CardPadding;\n radius?: CardRadius;\n /** Apply hover affordance (lift + tint) without making the card clickable.\n * For purely-visual surfaces that respond to mouse-over. */\n hoverable?: boolean;\n /** Disable a clickable card. Adds `aria-disabled` and suppresses interaction. */\n disabled?: boolean;\n /** Loading skeleton — replaces the card chrome with a shimmer block of\n * the same height. */\n loading?: boolean;\n /** Render Card's styling onto a custom child element (Radix-style Slot).\n *\n * <Card asChild variant=\"elevated\">\n * <NextLink href=\"/blog/post-1\">{...}</NextLink>\n * </Card>\n *\n * When set, Card does NOT wrap the child in motion.div — the consumer's\n * element fully owns content. Use without asChild for the built-in\n * hover / tap motion + keyboard activation. */\n asChild?: boolean;\n children?: ReactNode;\n}\n\n/* ---------------------------------------------------------------------------\n * Card root\n * ------------------------------------------------------------------------- */\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant = \"default\",\n padding = \"md\",\n radius = \"md\",\n hoverable = false,\n disabled = false,\n loading = false,\n asChild = false,\n onClick,\n onKeyDown,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const reducedMotion = useReducedMotion();\n const isInteractive = Boolean(onClick) && !disabled && !loading;\n\n // Keyboard activation for clickable cards. Without this, Enter/Space on a\n // focused card-as-button does nothing — a broken a11y contract that the\n // previous shape silently shipped.\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (!isInteractive) return;\n if ((e.key === \"Enter\" || e.key === \" \") && !e.repeat) {\n e.preventDefault();\n onClick?.(e as unknown as Parameters<NonNullable<typeof onClick>>[0]);\n }\n };\n\n const rootClassName = cn(\n \"ods-card\",\n `ods-card--${variant}`,\n `ods-card--pad-${padding}`,\n `ods-card--radius-${radius}`,\n (hoverable || isInteractive) && !loading && !disabled && \"ods-card--hoverable\",\n isInteractive && \"ods-card--clickable\",\n disabled && \"ods-card--disabled\",\n loading && \"ods-card--loading\",\n className,\n );\n\n // asChild — project Card's chrome onto the consumer's element.\n if (asChild) {\n return (\n <Slot\n {...(rest as ComponentPropsWithoutRef<ElementType>)}\n ref={ref as Ref<HTMLElement>}\n className={rootClassName}\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? handleKeyDown : onKeyDown}\n aria-disabled={disabled || undefined}\n >\n {children as ReactElement}\n </Slot>\n );\n }\n\n // Loading skeleton — same height-ish slot so layout doesn't jump.\n if (loading) {\n return (\n <div\n {...rest}\n ref={ref}\n className={rootClassName}\n aria-busy=\"true\"\n aria-label=\"Loading\"\n >\n <div className=\"ods-card__skeleton\" data-ods-animate=\"shimmer\" />\n </div>\n );\n }\n\n return (\n <motion.div\n {...(rest as any)}\n ref={ref}\n onClick={isInteractive ? onClick : undefined}\n onKeyDown={isInteractive ? handleKeyDown : onKeyDown}\n className={rootClassName}\n whileHover={\n (hoverable || isInteractive) && !reducedMotion\n ? { y: -2, transition: { duration: 0.15 } }\n : undefined\n }\n whileTap={isInteractive && !reducedMotion ? { scale: 0.99 } : undefined}\n role={isInteractive ? \"button\" : rest.role}\n tabIndex={isInteractive ? (rest.tabIndex ?? 0) : rest.tabIndex}\n aria-disabled={disabled || undefined}\n >\n {children}\n </motion.div>\n );\n}) as React.ForwardRefExoticComponent<\n CardProps & React.RefAttributes<HTMLDivElement>\n> & {\n Header: typeof CardHeader;\n Body: typeof CardBody;\n Footer: typeof CardFooter;\n Title: typeof CardTitle;\n Description: typeof CardDescription;\n};\n\nCard.displayName = \"Card\";\n\n/* ---------------------------------------------------------------------------\n * Subcomponents — `Card.Header`, `Card.Body`, `Card.Footer`, `Card.Title`,\n * `Card.Description`. Optional building blocks for the \"title + content +\n * actions\" pattern. Compose freely — none of them are required.\n * ------------------------------------------------------------------------- */\n\nexport interface CardSectionProps extends ComponentPropsWithoutRef<\"div\"> {\n children?: ReactNode;\n}\n\nexport const CardHeader = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardHeader({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__header\", className)}>\n {children}\n </div>\n );\n },\n);\nCardHeader.displayName = \"Card.Header\";\n\nexport const CardBody = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardBody({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__body\", className)}>\n {children}\n </div>\n );\n },\n);\nCardBody.displayName = \"Card.Body\";\n\nexport const CardFooter = forwardRef<HTMLDivElement, CardSectionProps>(\n function CardFooter({ className, children, ...rest }, ref) {\n return (\n <div {...rest} ref={ref} className={cn(\"ods-card__footer\", className)}>\n {children}\n </div>\n );\n },\n);\nCardFooter.displayName = \"Card.Footer\";\n\nexport interface CardTitleProps extends ComponentPropsWithoutRef<\"h3\"> {\n /** Override the heading level. Defaults to `<h3>`. */\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n children?: ReactNode;\n}\n\nexport const CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps>(\n function CardTitle({ as: Comp = \"h3\", className, children, ...rest }, ref) {\n return (\n <Comp\n {...(rest as ComponentPropsWithoutRef<typeof Comp>)}\n ref={ref}\n className={cn(\"ods-card__title\", className)}\n >\n {children}\n </Comp>\n );\n },\n);\nCardTitle.displayName = \"Card.Title\";\n\nexport interface CardDescriptionProps extends ComponentPropsWithoutRef<\"p\"> {\n children?: ReactNode;\n}\n\nexport const CardDescription = forwardRef<\n HTMLParagraphElement,\n CardDescriptionProps\n>(function CardDescription({ className, children, ...rest }, ref) {\n return (\n <p {...rest} ref={ref} className={cn(\"ods-card__description\", className)}>\n {children}\n </p>\n );\n});\nCardDescription.displayName = \"Card.Description\";\n\n// Dot-notation API: `Card.Header`, `Card.Body`, etc.\nCard.Header = CardHeader;\nCard.Body = CardBody;\nCard.Footer = CardFooter;\nCard.Title = CardTitle;\nCard.Description = CardDescription;\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { BlogCard } from \"../../../components/BlogCard/BlogCard\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * BlogGrid — the marketing blog/changelog teaser section body. Composes the\n * DS BlogCard into a responsive grid with an optional \"view all\" link.\n * Pair with MarketingSection for the kicker/title band.\n * ------------------------------------------------------------------------- */\n\nexport interface BlogGridPost {\n id: string;\n title: ReactNode;\n href: string;\n excerpt?: ReactNode;\n /** Publish date / meta line, e.g. \"Jul 12, 2026\". */\n date?: ReactNode;\n /** Reading-time chip, e.g. \"6 min read\". */\n readTime?: ReactNode;\n tags?: ReactNode[];\n /** Cover artwork (usually an <img>). */\n cover?: ReactNode;\n author?: {\n name: string;\n /** Avatar spec forwarded to the DS Avatar primitive. */\n avatar?: { src?: string; initials?: string; alt?: string };\n byline?: ReactNode;\n };\n}\n\nexport interface BlogGridProps extends ComponentPropsWithoutRef<\"div\"> {\n posts: BlogGridPost[];\n columns?: 2 | 3;\n viewAllHref?: string;\n viewAllLabel?: ReactNode;\n}\n\nexport function BlogGrid({\n posts,\n columns = 3,\n viewAllHref,\n viewAllLabel = \"View all posts →\",\n className,\n ...rest\n}: BlogGridProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-blog\", className)}>\n <div className={cn(\"ods-mkt-blog__grid\", `ods-mkt-blog__grid--${columns}`)}>\n {posts.map((post) => (\n <BlogCard\n key={post.id}\n title={post.title}\n description={post.excerpt}\n href={post.href}\n meta={post.date}\n readingTime={post.readTime}\n tags={post.tags}\n cover={post.cover}\n author={post.author}\n />\n ))}\n </div>\n {viewAllHref && (\n <div className=\"ods-mkt-blog__more\">\n <a className=\"ods-mkt-blog__more-link\" href={viewAllHref}>\n {viewAllLabel}\n </a>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { type FormEvent, type ReactNode, useId, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport { Textarea } from \"../../../components/Textarea/Textarea\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ContactForm — \"talk to us\" form for the contact page / sales section.\n * Same interaction contract as BetaAccessForm: async `onSubmit`, success\n * card on resolve, inline error with the form intact on failure.\n * ------------------------------------------------------------------------- */\n\nexport interface ContactFormValues {\n name: string;\n email: string;\n company?: string;\n /** Selected topic value (present when `topics` are configured). */\n topic?: string;\n message: string;\n}\n\nexport interface ContactFormTopic {\n value: string;\n label: string;\n /** Contextual hint shown under the select when this topic is chosen. */\n hint?: ReactNode;\n /** Message-textarea placeholder while this topic is selected. */\n messagePlaceholder?: string;\n}\n\nexport interface ContactFormProps {\n title?: ReactNode;\n subtitle?: ReactNode;\n /** Topic choices (sales, partnership, support…). Required when provided. */\n topics?: ContactFormTopic[];\n submitLabel?: ReactNode;\n footnote?: ReactNode;\n /** Resolve → success state; throw → inline error, form kept. */\n onSubmit?: (values: ContactFormValues) => Promise<void> | void;\n successTitle?: ReactNode;\n successBody?: ReactNode;\n disabled?: boolean;\n className?: string;\n}\n\ntype Phase = \"idle\" | \"submitting\" | \"success\";\n\nexport function ContactForm({\n title = \"Talk to us\",\n subtitle = \"SALES · PARTNERSHIPS · ANYTHING ELSE — WE READ EVERYTHING\",\n topics,\n submitLabel = \"Send message →\",\n footnote = \"WE USUALLY REPLY WITHIN ONE BUSINESS DAY\",\n onSubmit,\n successTitle = \"Message sent.\",\n successBody = \"Thanks for reaching out — we'll get back to you by email.\",\n disabled = false,\n className,\n}: ContactFormProps) {\n const uid = useId();\n const [values, setValues] = useState<ContactFormValues>({\n name: \"\",\n email: \"\",\n company: \"\",\n topic: \"\",\n message: \"\",\n });\n const selectedTopic = topics?.find((t) => t.value === values.topic);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (event: FormEvent) => {\n event.preventDefault();\n if (phase === \"submitting\") return;\n if (!values.name.trim()) {\n setError(\"Please enter your name.\");\n return;\n }\n if (!isValidEmail(values.email)) {\n setError(\"Please enter a valid work email.\");\n return;\n }\n if (topics?.length && !values.topic) {\n setError(\"Please choose a topic.\");\n return;\n }\n if (!values.message.trim()) {\n setError(\"Please write a short message.\");\n return;\n }\n setError(null);\n setPhase(\"submitting\");\n try {\n await onSubmit?.(values);\n setPhase(\"success\");\n } catch {\n setError(\"Something went wrong — please try again.\");\n setPhase(\"idle\");\n }\n };\n\n if (phase === \"success\") {\n return (\n <div className={cn(\"ods-mkt-contact\", \"ods-mkt-contact--success\", className)} role=\"status\">\n <p className=\"ods-mkt-contact__success-mark\">✓ {successTitle}</p>\n <p className=\"ods-mkt-contact__success-body\">{successBody}</p>\n </div>\n );\n }\n\n const busy = disabled || phase === \"submitting\";\n\n return (\n <form className={cn(\"ods-mkt-contact\", className)} onSubmit={handleSubmit} noValidate>\n <div className=\"ods-mkt-contact__head\">\n <h3 className=\"ods-mkt-contact__title\">{title}</h3>\n {subtitle && <p className=\"ods-mkt-contact__subtitle\">{subtitle}</p>}\n </div>\n\n <div className=\"ods-mkt-contact__grid\">\n <div className=\"ods-mkt-contact__field\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-name`}>\n Full name\n </label>\n <Input\n id={`${uid}-name`}\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-contact__field\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-email`}>\n Work email\n </label>\n <Input\n id={`${uid}-email`}\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n disabled={busy}\n />\n </div>\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n <label className=\"ods-mkt-contact__label\" htmlFor={`${uid}-company`}>\n Company <span className=\"ods-mkt-contact__optional\">(optional)</span>\n </label>\n <Input\n id={`${uid}-company`}\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n disabled={busy}\n />\n </div>\n {topics && topics.length > 0 && (\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n <span className=\"ods-mkt-contact__label\" id={`${uid}-topic-label`}>\n Topic\n </span>\n <Select\n aria-labelledby={`${uid}-topic-label`}\n placeholder=\"Choose a topic…\"\n options={topics.map((t) => ({ value: t.value, label: t.label }))}\n value={values.topic ?? \"\"}\n onChange={(topic) => setValues((v) => ({ ...v, topic }))}\n disabled={busy}\n />\n {selectedTopic?.hint && (\n <p className=\"ods-mkt-contact__topic-hint\">{selectedTopic.hint}</p>\n )}\n </div>\n )}\n <div className=\"ods-mkt-contact__field ods-mkt-contact__field--wide\">\n {/* Textarea's react-aria field wiring owns the name computation —\n associate the external label explicitly via aria-labelledby. */}\n <label\n className=\"ods-mkt-contact__label\"\n id={`${uid}-message-label`}\n htmlFor={`${uid}-message`}\n >\n Message\n </label>\n <Textarea\n id={`${uid}-message`}\n aria-labelledby={`${uid}-message-label`}\n placeholder={selectedTopic?.messagePlaceholder ?? \"What are you trying to build?\"}\n rows={4}\n value={values.message}\n onChange={(e) => setValues((v) => ({ ...v, message: e.target.value }))}\n disabled={busy}\n />\n </div>\n </div>\n\n {error && (\n <p className=\"ods-mkt-contact__error\" role=\"alert\">\n {error}\n </p>\n )}\n\n <div className=\"ods-mkt-contact__foot\">\n {footnote && <p className=\"ods-mkt-contact__footnote\">{footnote}</p>}\n <Button\n type=\"submit\"\n variant=\"primary\"\n loading={phase === \"submitting\"}\n disabled={disabled}\n >\n {submitLabel}\n </Button>\n </div>\n </form>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * CtaBanner — the closing conversion band: display headline, lede, primary +\n * secondary calls to action, mono footnote.\n * ------------------------------------------------------------------------- */\n\nexport interface CtaBannerAction {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface CtaBannerProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n title: ReactNode;\n lede?: ReactNode;\n primary: CtaBannerAction;\n secondary?: CtaBannerAction;\n /** Mono microcopy under the actions, e.g. beta-review cadence. */\n footnote?: ReactNode;\n}\n\nfunction Action({\n action,\n variant,\n}: {\n action: CtaBannerAction;\n variant: \"primary\" | \"secondary\";\n}) {\n if (action.href) {\n return (\n <a\n className={cn(\"ods-mkt-cta__link\", `ods-mkt-cta__link--${variant}`)}\n href={action.href}\n onClick={action.onClick}\n >\n {action.label}\n </a>\n );\n }\n return (\n <Button variant={variant} onClick={action.onClick}>\n {action.label}\n </Button>\n );\n}\n\nexport function CtaBanner({\n title,\n lede,\n primary,\n secondary,\n footnote,\n className,\n ...rest\n}: CtaBannerProps) {\n return (\n <section {...rest} className={cn(\"ods-mkt-cta\", className)}>\n <h2 className=\"ods-mkt-cta__title\">{title}</h2>\n {lede && <p className=\"ods-mkt-cta__lede\">{lede}</p>}\n <div className=\"ods-mkt-cta__actions\">\n <Action action={primary} variant=\"primary\" />\n {secondary && <Action action={secondary} variant=\"secondary\" />}\n </div>\n {footnote && <p className=\"ods-mkt-cta__footnote\">{footnote}</p>}\n </section>\n );\n}\n","\"use client\";\nimport { ChevronDownIcon } from \"@octaviaflow/icons\";\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useId,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Accordion — collapsible content sections.\n *\n * Used in ConfigPanel-style settings surfaces, FAQ blocks, runbook\n * docs, advanced-options sections. Two selection modes:\n * - `single` (default): only one item open at a time\n * - `multiple`: any combination of items can be open\n *\n * Controlled OR uncontrolled. Animated expand/collapse via\n * framer-motion (respects reduced-motion). Keyboard nav follows the\n * WAI-ARIA accordion pattern: ↑↓ moves between triggers, Home/End\n * jump to first/last, Enter/Space toggles.\n *\n * A11y: each item is `<div>` with a `<button aria-expanded>` header\n * and a `<div role=\"region\" aria-labelledby>` content panel.\n * ------------------------------------------------------------------------- */\n\nexport type AccordionMode = \"single\" | \"multiple\";\nexport type AccordionVariant = \"default\" | \"bordered\" | \"separated\";\n\nexport interface AccordionItem {\n /** Stable identifier. */\n id: string;\n /** Header label. */\n label: ReactNode;\n /** Optional secondary line below the label. */\n description?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional trailing slot in the header (badge, count, action). */\n trailing?: ReactNode;\n /** Panel content. */\n content: ReactNode;\n /** Disable interaction for this item. */\n disabled?: boolean;\n}\n\nexport interface AccordionProps\n extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n | \"onChange\"\n | \"defaultValue\"\n | \"children\"\n | \"onDrag\"\n | \"onDragStart\"\n | \"onDragEnd\"\n | \"onAnimationStart\"\n > {\n /** Items to render. */\n items: AccordionItem[];\n /** Single vs multiple expansion. Default `\"single\"`. */\n mode?: AccordionMode;\n /** Controlled expanded item ids. */\n value?: string[];\n /** Uncontrolled initial expanded ids. */\n defaultValue?: string[];\n /** Fires when the expanded set changes. */\n onValueChange?: (value: string[]) => void;\n /**\n * Allow the last open item to be closed (single mode). Default\n * `true`. When `false`, one item is always open — useful for tabbed-\n * like surfaces.\n */\n collapsible?: boolean;\n /** Visual variant. Default `\"default\"`. */\n variant?: AccordionVariant;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the entire accordion. */\n disabled?: boolean;\n}\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Accordion = forwardRef<HTMLDivElement, AccordionProps>(\n function Accordion(\n {\n items,\n mode = \"single\",\n value: controlledValue,\n defaultValue,\n onValueChange,\n collapsible = true,\n variant = \"default\",\n size = \"md\",\n disabled = false,\n id: providedId,\n className,\n ...rest\n },\n ref,\n ) {\n const reactId = useId();\n const baseId = providedId ?? `ods-accordion-${reactId}`;\n const reducedMotion = useReducedMotion();\n\n const [internalValue, setInternalValue] = useState<string[]>(\n defaultValue ?? [],\n );\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n const valueSet = new Set(value);\n\n const setValue = useCallback(\n (next: string[]) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange],\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n const isOpen = valueSet.has(id);\n if (mode === \"multiple\") {\n const next = isOpen\n ? value.filter((v) => v !== id)\n : [...value, id];\n setValue(next);\n return;\n }\n // single\n if (isOpen) {\n // Only close if collapsible — otherwise no-op.\n if (collapsible) setValue([]);\n return;\n }\n setValue([id]);\n },\n [collapsible, mode, setValue, value, valueSet],\n );\n\n const handleKeyDown = (\n e: KeyboardEvent<HTMLButtonElement>,\n index: number,\n ) => {\n const enabledIdx = items\n .map((it, i) => (it.disabled ? -1 : i))\n .filter((i) => i !== -1);\n const curr = enabledIdx.indexOf(index);\n const focusIdx = (i: number) => {\n const target = enabledIdx[i];\n if (target === undefined) return;\n const btn = document.getElementById(\n `${baseId}-trigger-${items[target]!.id}`,\n );\n (btn as HTMLButtonElement | null)?.focus();\n };\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n focusIdx((curr + 1) % enabledIdx.length);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusIdx((curr - 1 + enabledIdx.length) % enabledIdx.length);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n focusIdx(0);\n } else if (e.key === \"End\") {\n e.preventDefault();\n focusIdx(enabledIdx.length - 1);\n }\n };\n\n return (\n <div\n {...rest}\n ref={ref}\n id={baseId}\n className={cn(\n \"ods-accordion\",\n `ods-accordion--${variant}`,\n `ods-accordion--${size}`,\n disabled && \"ods-accordion--disabled\",\n className,\n )}\n >\n {items.map((item, i) => {\n const isOpen = valueSet.has(item.id);\n const itemDisabled = item.disabled || disabled;\n const triggerId = `${baseId}-trigger-${item.id}`;\n const panelId = `${baseId}-panel-${item.id}`;\n return (\n <div\n key={item.id}\n className={cn(\n \"ods-accordion__item\",\n isOpen && \"ods-accordion__item--open\",\n itemDisabled && \"ods-accordion__item--disabled\",\n )}\n >\n <button\n id={triggerId}\n type=\"button\"\n className=\"ods-accordion__trigger\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={itemDisabled}\n onClick={() => toggleItem(item.id)}\n onKeyDown={(e) => handleKeyDown(e, i)}\n >\n {item.icon && (\n <span\n className=\"ods-accordion__icon\"\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"ods-accordion__label-wrap\">\n <span className=\"ods-accordion__label\">{item.label}</span>\n {item.description && (\n <span className=\"ods-accordion__description\">\n {item.description}\n </span>\n )}\n </span>\n {item.trailing && (\n <span\n className=\"ods-accordion__trailing\"\n onClick={(e) => e.stopPropagation()}\n >\n {item.trailing}\n </span>\n )}\n <span\n className={cn(\n \"ods-accordion__chevron\",\n isOpen && \"ods-accordion__chevron--open\",\n )}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon size=\"sm\" aria-hidden />\n </span>\n </button>\n\n <AnimatePresence initial={false}>\n {isOpen && (\n <motion.div\n role=\"region\"\n id={panelId}\n aria-labelledby={triggerId}\n className=\"ods-accordion__panel\"\n initial={\n reducedMotion\n ? false\n : { height: 0, opacity: 0 }\n }\n animate={\n reducedMotion\n ? undefined\n : { height: \"auto\", opacity: 1 }\n }\n exit={\n reducedMotion\n ? undefined\n : { height: 0, opacity: 0 }\n }\n transition={\n reducedMotion\n ? { duration: 0 }\n : { duration: 0.18 }\n }\n style={{ overflow: \"hidden\" }}\n >\n <div className=\"ods-accordion__content\">\n {item.content}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n })}\n </div>\n );\n },\n);\n\nAccordion.displayName = \"Accordion\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Accordion } from \"../../../components/Accordion/Accordion\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * FaqSection — marketing Q&A built on the DS Accordion. One or two columns;\n * pass `defaultOpenIds` to pre-expand the questions that answer objections.\n * ------------------------------------------------------------------------- */\n\nexport interface FaqItem {\n id: string;\n question: ReactNode;\n answer: ReactNode;\n}\n\nexport interface FaqSectionProps extends ComponentPropsWithoutRef<\"div\"> {\n items: FaqItem[];\n columns?: 1 | 2;\n defaultOpenIds?: string[];\n}\n\nexport function FaqSection({\n items,\n columns = 1,\n defaultOpenIds = [],\n className,\n ...rest\n}: FaqSectionProps) {\n const half = Math.ceil(items.length / 2);\n const columnItems = columns === 2 ? [items.slice(0, half), items.slice(half)] : [items];\n\n return (\n <div {...rest} className={cn(\"ods-mkt-faq\", columns === 2 && \"ods-mkt-faq--2\", className)}>\n {columnItems.map((column, i) => (\n <Accordion\n // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional\n key={i}\n mode=\"multiple\"\n defaultValue={defaultOpenIds}\n items={column.map((item) => ({\n id: item.id,\n label: item.question,\n content: <div className=\"ods-mkt-faq__answer\">{item.answer}</div>,\n }))}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * FeatureGrid — hairline-bordered capability grid (the \"Everything you need\"\n * and AI-capability sections). Cells share borders like a table of features.\n * ------------------------------------------------------------------------- */\n\nexport interface FeatureGridItem {\n id: string;\n title: ReactNode;\n body: ReactNode;\n icon?: ReactNode;\n}\n\nexport interface FeatureGridProps extends ComponentPropsWithoutRef<\"div\"> {\n items: FeatureGridItem[];\n columns?: 2 | 3 | 4;\n /** Tighter cells for dense capability lists. */\n dense?: boolean;\n}\n\nexport function FeatureGrid({\n items,\n columns = 3,\n dense = false,\n className,\n ...rest\n}: FeatureGridProps) {\n return (\n <div\n {...rest}\n className={cn(\n \"ods-mkt-features\",\n `ods-mkt-features--${columns}`,\n dense && \"ods-mkt-features--dense\",\n className,\n )}\n >\n {items.map((item) => (\n <article key={item.id} className=\"ods-mkt-features__cell\">\n {item.icon && (\n <span className=\"ods-mkt-features__icon\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n <h3 className=\"ods-mkt-features__title\">{item.title}</h3>\n <p className=\"ods-mkt-features__body\">{item.body}</p>\n </article>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon, SearchIcon } from \"@octaviaflow/icons\";\nimport { type FormEvent, type ReactNode, useMemo, useState } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { cn } from \"../../../utils/cn\";\nimport { isValidEmail } from \"../WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * IntegrationsFinder — the /integrations page section: searchable connector\n * gallery with category pills (+ counts), native-first ordering, a\n * \"universal\" badge for tools reachable through the open connectors (never\n * overclaim), and a request-a-connector form when the search misses.\n *\n * Data, brand icons and the request transport come from the consuming site;\n * items without an icon fall back to a neutral letter tile.\n * ------------------------------------------------------------------------- */\n\nexport interface IntegrationsFinderItem {\n name: string;\n category: string;\n /** \"native\" (real template, default) or \"universal\" (via open connectors). */\n kind?: \"native\" | \"universal\";\n /** Extra search terms. */\n aliases?: string[];\n /** Brand icon node. Omit for a letter tile. */\n icon?: ReactNode;\n}\n\nexport interface IntegrationsFinderProps {\n items: IntegrationsFinderItem[];\n /** Category pill order. Defaults to first-appearance order in `items`. */\n categories?: string[];\n searchPlaceholder?: string;\n /** Badge on universal entries. Default \"Open API\". */\n universalBadgeLabel?: ReactNode;\n /**\n * Request-a-connector submit ({ query, email }). Resolve → sent state,\n * throw → error hint. Omit to hide the request form on misses.\n */\n onRequestConnector?: (request: { query: string; email: string }) => Promise<void> | void;\n /** Fallback line under a failed request, e.g. a contact address. */\n requestErrorHint?: ReactNode;\n className?: string;\n}\n\nfunction LetterTile({ name }: { name: string }) {\n return (\n <span className=\"ods-mkt-finder__letter\" aria-hidden=\"true\">\n {name.trim().charAt(0).toUpperCase()}\n </span>\n );\n}\n\ntype RequestState = \"idle\" | \"sending\" | \"sent\" | \"error\";\n\nexport function IntegrationsFinder({\n items,\n categories,\n searchPlaceholder = \"Find your connector — search by name or category…\",\n universalBadgeLabel = \"Open API\",\n onRequestConnector,\n requestErrorHint = \"Couldn't send right now — please try again in a moment.\",\n className,\n}: IntegrationsFinderProps) {\n const [query, setQuery] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [email, setEmail] = useState(\"\");\n const [requestState, setRequestState] = useState<RequestState>(\"idle\");\n const [emailError, setEmailError] = useState(false);\n\n const pillCategories = useMemo(() => {\n if (categories?.length) return categories;\n const seen: string[] = [];\n for (const item of items) {\n if (!seen.includes(item.category)) seen.push(item.category);\n }\n return seen;\n }, [categories, items]);\n\n const counts = useMemo(() => {\n const map = new Map<string, number>();\n for (const item of items) map.set(item.category, (map.get(item.category) ?? 0) + 1);\n return map;\n }, [items]);\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase();\n let list = items;\n if (activeCategory) list = list.filter((c) => c.category === activeCategory);\n if (q) {\n list = list.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.category.toLowerCase().includes(q) ||\n c.aliases?.some((a) => a.toLowerCase().includes(q)),\n );\n }\n // Native connectors first, then alphabetical — the honest ordering.\n return [...list].sort((a, b) => {\n const aKind = a.kind ?? \"native\";\n const bKind = b.kind ?? \"native\";\n if (aKind !== bKind) return aKind === \"native\" ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n }, [items, query, activeCategory]);\n\n const handleRequest = async (event: FormEvent) => {\n event.preventDefault();\n if (!onRequestConnector || requestState === \"sending\") return;\n if (!isValidEmail(email)) {\n setEmailError(true);\n return;\n }\n setEmailError(false);\n setRequestState(\"sending\");\n try {\n await onRequestConnector({ query: query.trim(), email });\n setRequestState(\"sent\");\n } catch {\n setRequestState(\"error\");\n }\n };\n\n return (\n <div className={cn(\"ods-mkt-finder\", className)}>\n <div className=\"ods-mkt-finder__search\">\n <Input\n type=\"search\"\n aria-label=\"Search connectors\"\n placeholder={searchPlaceholder}\n leftIcon={<SearchIcon size=\"sm\" />}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value);\n setRequestState(\"idle\");\n }}\n />\n </div>\n\n <fieldset className=\"ods-mkt-finder__pills\" aria-label=\"Connector categories\">\n <button\n type=\"button\"\n className={cn(\n \"ods-mkt-finder__pill\",\n activeCategory === null && \"ods-mkt-finder__pill--active\",\n )}\n onClick={() => setActiveCategory(null)}\n >\n All <span className=\"ods-mkt-finder__count\">{items.length}</span>\n </button>\n {pillCategories.map((category) => (\n <button\n key={category}\n type=\"button\"\n className={cn(\n \"ods-mkt-finder__pill\",\n activeCategory === category && \"ods-mkt-finder__pill--active\",\n )}\n onClick={() => setActiveCategory(activeCategory === category ? null : category)}\n >\n {category} <span className=\"ods-mkt-finder__count\">{counts.get(category) ?? 0}</span>\n </button>\n ))}\n </fieldset>\n\n {results.length > 0 ? (\n <div className=\"ods-mkt-finder__grid\">\n {results.map((item) => (\n <div key={item.name} className=\"ods-mkt-finder__card\">\n <span className=\"ods-mkt-finder__card-icon\" aria-hidden=\"true\">\n {item.icon ?? <LetterTile name={item.name} />}\n </span>\n <span className=\"ods-mkt-finder__card-name\">{item.name}</span>\n {(item.kind ?? \"native\") === \"universal\" && (\n <span className=\"ods-mkt-finder__badge\">{universalBadgeLabel}</span>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"ods-mkt-finder__miss\">\n {requestState === \"sent\" ? (\n <p className=\"ods-mkt-finder__sent\" role=\"status\">\n <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" /> Got it — we'll let you know when a{\" \"}\n <strong>{query.trim()}</strong> connector is available.\n </p>\n ) : (\n <>\n <h3 className=\"ods-mkt-finder__miss-title\">\n No native <strong>{query.trim()}</strong> connector yet\n </h3>\n <p className=\"ods-mkt-finder__miss-body\">\n Our universal open connectors likely cover it today — and we build native connectors\n on request. {onRequestConnector && \"Leave your email and we'll notify you.\"}\n </p>\n {onRequestConnector && (\n <form className=\"ods-mkt-finder__miss-form\" onSubmit={handleRequest} noValidate>\n <Input\n type=\"email\"\n aria-label=\"Work email for connector request\"\n placeholder=\"you@company.com\"\n value={email}\n error={emailError}\n errorMessage={emailError ? \"Please enter a valid work email.\" : undefined}\n onChange={(e) => {\n setEmail(e.target.value);\n setEmailError(false);\n }}\n />\n <Button type=\"submit\" variant=\"primary\" loading={requestState === \"sending\"}>\n Request connector\n </Button>\n </form>\n )}\n {requestState === \"error\" && (\n <p className=\"ods-mkt-finder__miss-error\" role=\"alert\">\n {requestErrorHint}\n </p>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * IntegrationsWall — the homepage integrations section: a grid of category\n * cards (icon + category name + connector name pills) with a footnote.\n * Mirrors the real site's structure; the consuming site passes category\n * icons and real connector names. For the searchable /integrations page,\n * use IntegrationsFinder instead.\n * ------------------------------------------------------------------------- */\n\nexport interface IntegrationsWallItem {\n name: string;\n /** Optional per-pill brand icon. */\n icon?: ReactNode;\n}\n\nexport interface IntegrationsWallCategory {\n id: string;\n label: ReactNode;\n /** Category icon in the card header. */\n icon?: ReactNode;\n items: IntegrationsWallItem[];\n}\n\nexport interface IntegrationsWallProps extends ComponentPropsWithoutRef<\"div\"> {\n categories: IntegrationsWallCategory[];\n /** Mono footnote under the wall. */\n footnote?: ReactNode;\n columns?: 2 | 3;\n}\n\nexport function IntegrationsWall({\n categories,\n footnote,\n columns = 3,\n className,\n ...rest\n}: IntegrationsWallProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-wall\", className)}>\n <div className={cn(\"ods-mkt-wall__grid\", `ods-mkt-wall__grid--${columns}`)}>\n {categories.map((category) => (\n <div key={category.id} className=\"ods-mkt-wall__card\">\n <div className=\"ods-mkt-wall__card-head\">\n {category.icon && (\n <span className=\"ods-mkt-wall__card-icon\" aria-hidden=\"true\">\n {category.icon}\n </span>\n )}\n <h3 className=\"ods-mkt-wall__card-label\">{category.label}</h3>\n </div>\n <div className=\"ods-mkt-wall__pills\">\n {category.items.map((item) => (\n <span key={item.name} className=\"ods-mkt-wall__pill\">\n {item.icon && (\n <span className=\"ods-mkt-wall__pill-icon\" aria-hidden=\"true\">\n {item.icon}\n </span>\n )}\n {item.name}\n </span>\n ))}\n </div>\n </div>\n ))}\n </div>\n {footnote && <p className=\"ods-mkt-wall__footnote\">{footnote}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon, CloseIcon } from \"@octaviaflow/icons\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Spinner } from \"../../../components/Spinner/Spinner\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * LiveConsole — the \"orders_pipeline · production\" terminal card: a mono log\n * of pipeline steps with staggered reveal and per-line state icons.\n *\n * State icons are real DS glyphs, not text characters: check (done), the DS\n * Spinner (running), a dashed pending circle (queued) and a cross (error) —\n * all in a fixed-width rail so labels align like a real console.\n * ------------------------------------------------------------------------- */\n\nexport type LiveConsoleState = \"done\" | \"running\" | \"queued\" | \"error\";\n\nexport interface LiveConsoleLine {\n id: string;\n /** Step label, e.g. \"warehouse.load\". */\n label: ReactNode;\n /** Trailing detail, e.g. \"— 14,204 rows · 1.2s\". */\n detail?: ReactNode;\n state?: LiveConsoleState;\n}\n\nexport interface LiveConsoleProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> {\n /** Header label, e.g. \"orders_pipeline · production\". */\n title: ReactNode;\n /** Header badge. Defaults to \"LIVE\". Pass null to hide. */\n badge?: ReactNode;\n lines: LiveConsoleLine[];\n /** Staggered line reveal (disabled automatically for reduced motion). */\n animated?: boolean;\n}\n\n/** Dashed circle — \"queued/pending\", matching the flow editor's vocabulary. */\nfunction PendingGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"13\"\n height=\"13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.4\"\n strokeLinecap=\"round\"\n strokeDasharray=\"3.5 3.5\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n </svg>\n );\n}\n\nfunction StateGlyph({ state }: { state: LiveConsoleState }) {\n switch (state) {\n case \"done\":\n return <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" />;\n case \"running\":\n return <Spinner size=\"sm\" />;\n case \"error\":\n return <CloseIcon size=\"sm\" aria-hidden=\"true\" />;\n case \"queued\":\n return <PendingGlyph />;\n }\n}\n\nexport function LiveConsole({\n title,\n badge = \"LIVE\",\n lines,\n animated = true,\n className,\n ...rest\n}: LiveConsoleProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-console\", className)}>\n <div className=\"ods-mkt-console__head\">\n <span className=\"ods-mkt-console__title\">{title}</span>\n {badge != null && (\n <span className=\"ods-mkt-console__badge\">\n <span className=\"ods-mkt-console__dot\" />\n {badge}\n </span>\n )}\n </div>\n <div className=\"ods-mkt-console__body\">\n {lines.map((line, i) => {\n const state = line.state ?? \"done\";\n return (\n <div\n key={line.id}\n className={cn(\"ods-mkt-console__line\", animated && \"ods-mkt-console__line--animated\")}\n style={animated ? { animationDelay: `${0.3 + i * 0.6}s` } : undefined}\n >\n <span\n className={cn(\"ods-mkt-console__glyph\", `ods-mkt-console__glyph--${state}`)}\n aria-hidden=\"true\"\n >\n <StateGlyph state={state} />\n </span>\n <span className=\"ods-mkt-console__text\">\n <span className=\"ods-mkt-console__label\">{line.label}</span>\n {line.detail && (\n <span\n className={cn(\n \"ods-mkt-console__detail\",\n state === \"running\" && \"ods-mkt-console__detail--running\",\n state === \"error\" && \"ods-mkt-console__detail--error\",\n )}\n >\n {\" \"}\n {line.detail}\n </span>\n )}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type SpinnerTone =\n | \"accent\"\n | \"muted\"\n | \"primary\"\n | \"success\"\n | \"warning\"\n | \"error\"\n | \"inverse\";\n\ntype SvgPropsBase = Omit<\n ComponentPropsWithoutRef<\"svg\">,\n \"color\" | \"viewBox\" | \"fill\" | \"size\"\n>;\n\nexport interface SpinnerProps extends SvgPropsBase {\n /** Keyword size OR custom pixel number. Default `\"md\"`. */\n size?: SpinnerSize | number;\n /** Token-driven colour. Defaults to `\"accent\"`. Consumers can also\n * set `color` directly via `style` if they need a one-off. */\n tone?: SpinnerTone;\n /** Accessible label. Default `\"Loading\"`. */\n label?: string;\n}\n\nconst SIZE_PX: Record<SpinnerSize, number> = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48,\n};\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(function Spinner(\n {\n size = \"md\",\n tone = \"accent\",\n label = \"Loading\",\n className,\n style,\n ...rest\n },\n ref,\n) {\n const px = typeof size === \"number\" ? size : SIZE_PX[size];\n const isKeyword = typeof size === \"string\";\n\n return (\n <svg\n {...rest}\n ref={ref}\n className={cn(\n \"ods-spinner\",\n isKeyword && `ods-spinner--${size}`,\n `ods-spinner--${tone}`,\n className,\n )}\n width={px}\n height={px}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role=\"status\"\n aria-label={label}\n style={style}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 31.4\"\n className=\"ods-spinner__circle\"\n />\n </svg>\n );\n});\n\nSpinner.displayName = \"Spinner\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * LogoMarquee — social-proof strip. Logos (or text wordmarks) scroll in a\n * seamless loop; the track is duplicated once (second copy aria-hidden) so\n * the animation wraps without a gap. Reduced-motion visitors get a static\n * wrapped row. The consuming site passes real logos via `icon`.\n * ------------------------------------------------------------------------- */\n\nexport interface LogoMarqueeItem {\n id: string;\n label: string;\n /** Logo mark. Omit for a plain text wordmark chip. */\n icon?: ReactNode;\n}\n\nexport interface LogoMarqueeProps extends ComponentPropsWithoutRef<\"div\"> {\n items: LogoMarqueeItem[];\n /** Mono microcopy above the strip, e.g. \"TRUSTED BY DATA TEAMS AT\". */\n label?: ReactNode;\n /** Seconds per full loop. Default 30. */\n speed?: number;\n /** Desaturate logos until hover. Default true. */\n grayscale?: boolean;\n}\n\nfunction Track({ items, hidden }: { items: LogoMarqueeItem[]; hidden?: boolean }) {\n return (\n <div className=\"ods-mkt-marquee__track\" aria-hidden={hidden || undefined}>\n {items.map((item) => (\n <span key={item.id} className=\"ods-mkt-marquee__logo\" title={item.label}>\n {item.icon ?? <span className=\"ods-mkt-marquee__wordmark\">{item.label}</span>}\n </span>\n ))}\n </div>\n );\n}\n\nexport function LogoMarquee({\n items,\n label,\n speed = 30,\n grayscale = true,\n className,\n ...rest\n}: LogoMarqueeProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-marquee\", grayscale && \"ods-mkt-marquee--gray\", className)}\n >\n {label && <p className=\"ods-mkt-marquee__label\">{label}</p>}\n <div className=\"ods-mkt-marquee__viewport\">\n <div className=\"ods-mkt-marquee__rail\" style={{ animationDuration: `${speed}s` }}>\n <Track items={items} />\n <Track items={items} hidden />\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkflowShowcaseRole } from \"./components/WorkflowShowcase/showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * Marketing glyphs — small stroke icons used as default \"app icon\" tiles\n * across the marketing subsystem (showcase cubes/chips, integration walls).\n *\n * Kept lucide-compatible (24×24 viewBox, stroke-based, currentColor) for\n * visual harmony with the rest of the design system. Consumers pass real\n * brand icons via each component's `icon` slot; these are the neutral\n * fallbacks so nothing ever renders as a bare letter pair.\n * ------------------------------------------------------------------------- */\n\ninterface GlyphProps {\n size?: number;\n}\n\nconst base = {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n};\n\n/** Database cylinder — data sources. */\nexport function SourceGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14a9 3 0 0 0 18 0V5\" />\n <path d=\"M3 12a9 3 0 0 0 18 0\" />\n </svg>\n );\n}\n\n/** Archive box — warehouses / destinations. */\nexport function DestinationGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"5\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** Bolt — downstream actions / triggers. */\nexport function ActionGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M13 2 3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n );\n}\n\n/** Chat bubble — notification targets. */\nexport function NotifyGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\n/** Plug — generic integration/connector mark (integration walls). */\nexport function ConnectorGlyph({ size = 12 }: GlyphProps) {\n return (\n <svg {...base} width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 22v-5\" />\n <path d=\"M9 8V2M15 8V2\" />\n <path d=\"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8h12z\" />\n </svg>\n );\n}\n\n/** OctaviaFlow brand mark — square with a forward arrow. */\nexport function BrandMark({ size = 18 }: GlyphProps) {\n return (\n <svg viewBox=\"0 0 18 18\" width={size} height={size} aria-hidden=\"true\">\n <rect width=\"18\" height=\"18\" fill=\"var(--ods-accent)\" />\n <path d=\"M4 9h8.5M9.5 5.5 13 9l-3.5 3.5\" stroke=\"#fff\" strokeWidth=\"1.6\" fill=\"none\" />\n </svg>\n );\n}\n\nexport function roleGlyph(role: WorkflowShowcaseRole, size = 12): ReactNode {\n switch (role) {\n case \"source\":\n return <SourceGlyph size={size} />;\n case \"destination\":\n return <DestinationGlyph size={size} />;\n case \"action\":\n return <ActionGlyph size={size} />;\n case \"notify\":\n return <NotifyGlyph size={size} />;\n }\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { BrandMark } from \"../../glyphs\";\n\n/* ---------------------------------------------------------------------------\n * MarketingFooter — brand column + link columns + legal bar.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingFooterLink {\n label: ReactNode;\n href: string;\n}\n\nexport interface MarketingFooterColumn {\n id: string;\n label: ReactNode;\n links: MarketingFooterLink[];\n}\n\nexport interface MarketingFooterProps extends ComponentPropsWithoutRef<\"footer\"> {\n /** Brand slot. Defaults to the OctaviaFlow mark + wordmark. */\n brand?: ReactNode;\n /** Short positioning line under the brand. */\n tagline?: ReactNode;\n /** Extra brand-column content (contact email, status link…). */\n meta?: ReactNode;\n columns?: MarketingFooterColumn[];\n /**\n * Newsletter / stay-in-the-loop slot rendered in the brand column —\n * typically `<BetaAccessForm appearance=\"inline\" …/>`.\n */\n newsletter?: ReactNode;\n /** Left side of the bottom bar, e.g. \"© 2026 OctaviaFlow\". */\n legal?: ReactNode;\n /** Right side of the bottom bar, e.g. social handles. */\n social?: ReactNode;\n}\n\nexport function MarketingFooter({\n brand,\n tagline,\n meta,\n columns = [],\n newsletter,\n legal,\n social,\n className,\n ...rest\n}: MarketingFooterProps) {\n return (\n <footer {...rest} className={cn(\"ods-mkt-footer\", className)}>\n <div className=\"ods-mkt-footer__grid\">\n <div className=\"ods-mkt-footer__brand-col\">\n <div className=\"ods-mkt-footer__brand\">\n {brand ?? (\n <>\n <BrandMark size={16} />\n <span>OctaviaFlow</span>\n </>\n )}\n </div>\n {tagline && <p className=\"ods-mkt-footer__tagline\">{tagline}</p>}\n {meta && <div className=\"ods-mkt-footer__meta\">{meta}</div>}\n {newsletter && <div className=\"ods-mkt-footer__newsletter\">{newsletter}</div>}\n </div>\n {columns.map((column) => (\n <nav key={column.id} className=\"ods-mkt-footer__col\" aria-label={String(column.id)}>\n <span className=\"ods-mkt-footer__col-label\">{column.label}</span>\n {column.links.map((link) => (\n <a key={link.href} className=\"ods-mkt-footer__link\" href={link.href}>\n {link.label}\n </a>\n ))}\n </nav>\n ))}\n </div>\n {(legal || social) && (\n <div className=\"ods-mkt-footer__bar\">\n <span>{legal}</span>\n <span>{social}</span>\n </div>\n )}\n </footer>\n );\n}\n","\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * MarketingHero — the opening band: kicker, word-by-word animated display\n * headline, lede, then a free slot (typically the WorkflowShowcase).\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingHeroProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n /** Mono eyebrow, e.g. \"AI-NATIVE PLATFORM — PRIVATE BETA\". */\n kicker?: ReactNode;\n /** Plain-string headline — split into words for the rise animation. */\n title: string;\n lede?: ReactNode;\n align?: \"start\" | \"center\";\n}\n\nexport function MarketingHero({\n kicker,\n title,\n lede,\n align = \"center\",\n className,\n children,\n ...rest\n}: MarketingHeroProps) {\n const reducedMotion = useReducedMotion();\n const words = title.split(/\\s+/).filter(Boolean);\n\n return (\n <section\n {...rest}\n className={cn(\"ods-mkt-hero\", align === \"center\" && \"ods-mkt-hero--center\", className)}\n >\n {kicker && <p className=\"ods-mkt-hero__kicker\">{kicker}</p>}\n <h1 className=\"ods-mkt-hero__title\">\n {words.map((word, i) => (\n <span\n className=\"ods-mkt-hero__word-clip\"\n // biome-ignore lint/suspicious/noArrayIndexKey: words are positional\n key={i}\n >\n <motion.span\n className=\"ods-mkt-hero__word\"\n initial={reducedMotion ? false : { opacity: 0, y: \"100%\" }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n duration: 0.7,\n delay: 0.05 + i * 0.08,\n ease: [0.2, 0.7, 0.2, 1],\n }}\n >\n {word}\n </motion.span>{\" \"}\n </span>\n ))}\n </h1>\n {lede && (\n <motion.p\n className=\"ods-mkt-hero__lede\"\n initial={reducedMotion ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.8, delay: 0.6, ease: [0.2, 0.7, 0.2, 1] }}\n >\n {lede}\n </motion.p>\n )}\n {children && (\n <motion.div\n className=\"ods-mkt-hero__body\"\n initial={reducedMotion ? false : { opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.8, delay: 0.75, ease: [0.2, 0.7, 0.2, 1] }}\n >\n {children}\n </motion.div>\n )}\n </section>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { BrandMark } from \"../../glyphs\";\n\n/* ---------------------------------------------------------------------------\n * MarketingNav — sticky top navigation for the marketing site.\n * Brand · links · right-aligned actions, with a hamburger + slide-down panel\n * on small screens so mobile visitors keep full navigation.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingNavLink {\n label: ReactNode;\n href: string;\n active?: boolean;\n}\n\nexport interface MarketingNavProps extends ComponentPropsWithoutRef<\"header\"> {\n /** Brand slot. Defaults to the OctaviaFlow mark + wordmark. */\n brand?: ReactNode;\n brandHref?: string;\n links?: MarketingNavLink[];\n /** Right side: login links, CTA buttons — consumer-provided. */\n actions?: ReactNode;\n sticky?: boolean;\n}\n\nfunction BurgerGlyph({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n {open ? <path d=\"M6 6l12 12M18 6 6 18\" /> : <path d=\"M4 7h16M4 12h16M4 17h16\" />}\n </svg>\n );\n}\n\nexport function MarketingNav({\n brand,\n brandHref = \"/\",\n links = [],\n actions,\n sticky = true,\n className,\n ...rest\n}: MarketingNavProps) {\n const [mobileOpen, setMobileOpen] = useState(false);\n\n return (\n <header {...rest} className={cn(\"ods-mkt-nav\", sticky && \"ods-mkt-nav--sticky\", className)}>\n <a className=\"ods-mkt-nav__brand\" href={brandHref}>\n {brand ?? (\n <>\n <BrandMark />\n <span>OctaviaFlow</span>\n </>\n )}\n </a>\n {links.length > 0 && (\n <nav className=\"ods-mkt-nav__links\" aria-label=\"Main\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className={cn(\"ods-mkt-nav__link\", link.active && \"ods-mkt-nav__link--active\")}\n aria-current={link.active ? \"page\" : undefined}\n >\n {link.label}\n </a>\n ))}\n </nav>\n )}\n {actions && <div className=\"ods-mkt-nav__actions\">{actions}</div>}\n\n {(links.length > 0 || actions) && (\n <button\n type=\"button\"\n className=\"ods-mkt-nav__toggle\"\n aria-expanded={mobileOpen}\n aria-label=\"Toggle menu\"\n onClick={() => setMobileOpen((open) => !open)}\n >\n <BurgerGlyph open={mobileOpen} />\n </button>\n )}\n\n {mobileOpen && (\n <nav className=\"ods-mkt-nav__mobile\" aria-label=\"Main\">\n {links.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className={cn(\n \"ods-mkt-nav__mobile-link\",\n link.active && \"ods-mkt-nav__mobile-link--active\",\n )}\n aria-current={link.active ? \"page\" : undefined}\n onClick={() => setMobileOpen(false)}\n >\n {link.label}\n </a>\n ))}\n {actions && <div className=\"ods-mkt-nav__mobile-actions\">{actions}</div>}\n </nav>\n )}\n </header>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * MarketingSection — the page-band primitive every marketing section sits in.\n * Kicker (mono microcopy) → display title → lede, then arbitrary children.\n * ------------------------------------------------------------------------- */\n\nexport interface MarketingSectionProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\"> {\n /** Mono eyebrow above the title, e.g. \"PLATFORM\". */\n kicker?: ReactNode;\n title?: ReactNode;\n /** Lede paragraph under the title. */\n lede?: ReactNode;\n align?: \"start\" | \"center\";\n /** \"subtle\" gives the band a muted background. */\n tone?: \"default\" | \"subtle\";\n /** Remove the default top hairline (e.g. for the first section). */\n flushTop?: boolean;\n}\n\nexport function MarketingSection({\n kicker,\n title,\n lede,\n align = \"start\",\n tone = \"default\",\n flushTop = false,\n className,\n children,\n ...rest\n}: MarketingSectionProps) {\n return (\n <section\n {...rest}\n className={cn(\n \"ods-mkt-section\",\n align === \"center\" && \"ods-mkt-section--center\",\n tone === \"subtle\" && \"ods-mkt-section--subtle\",\n flushTop && \"ods-mkt-section--flush\",\n className,\n )}\n >\n {(kicker || title || lede) && (\n <header className=\"ods-mkt-section__head\">\n {kicker && <p className=\"ods-mkt-section__kicker\">{kicker}</p>}\n {title && <h2 className=\"ods-mkt-section__title\">{title}</h2>}\n {lede && <p className=\"ods-mkt-section__lede\">{lede}</p>}\n </header>\n )}\n {children}\n </section>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * PageHero — the inner-page opening shell (pricing, features, AI platform,\n * about…): kicker pill → h1 → subtitle, optionally a row of actions.\n * MarketingHero is the animated homepage opener; this is its calmer inner-\n * page counterpart.\n * ------------------------------------------------------------------------- */\n\nexport interface PageHeroProps extends Omit<ComponentPropsWithoutRef<\"header\">, \"title\"> {\n /** Kicker pill above the title, e.g. \"Pricing\". */\n kicker?: ReactNode;\n title: ReactNode;\n subtitle?: ReactNode;\n /** Optional action row under the subtitle. */\n actions?: ReactNode;\n align?: \"center\" | \"start\";\n}\n\nexport function PageHero({\n kicker,\n title,\n subtitle,\n actions,\n align = \"center\",\n className,\n ...rest\n}: PageHeroProps) {\n return (\n <header\n {...rest}\n className={cn(\"ods-mkt-pagehero\", align === \"start\" && \"ods-mkt-pagehero--start\", className)}\n >\n {kicker && <span className=\"ods-mkt-pagehero__kicker\">{kicker}</span>}\n <h1 className=\"ods-mkt-pagehero__title\">{title}</h1>\n {subtitle && <p className=\"ods-mkt-pagehero__subtitle\">{subtitle}</p>}\n {actions && <div className=\"ods-mkt-pagehero__actions\">{actions}</div>}\n </header>\n );\n}\n","\"use client\";\n\nimport { CheckmarkIcon } from \"@octaviaflow/icons\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * PricingTiers — the /pricing plan grid: tier cards with price, period,\n * annual note, feature checklist and per-tier CTA; the featured tier gets a\n * highlight ring and badge. Prices and copy come entirely from the consumer\n * (pricing is site policy, not design-system content).\n * ------------------------------------------------------------------------- */\n\nexport interface PricingTierCta {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface PricingTier {\n id: string;\n name: ReactNode;\n /** Display price, e.g. \"$300\", \"Free\", \"Custom\". */\n price: ReactNode;\n /** Under the price, e.g. \"per month\", \"14-day trial\". */\n period?: ReactNode;\n /** e.g. \"Save 10% with annual billing\". */\n annualNote?: ReactNode;\n description?: ReactNode;\n features: ReactNode[];\n cta: PricingTierCta;\n featured?: boolean;\n /** Badge on the featured card. Default \"Recommended\". */\n badge?: ReactNode;\n}\n\nexport interface PricingTiersProps extends ComponentPropsWithoutRef<\"div\"> {\n tiers: PricingTier[];\n /** Footnote under the grid, e.g. the private-beta note. */\n note?: ReactNode;\n}\n\nfunction TierCta({ cta, featured }: { cta: PricingTierCta; featured: boolean }) {\n if (cta.href) {\n return (\n <a\n className={cn(\n \"ods-mkt-pricing__cta\",\n featured ? \"ods-mkt-pricing__cta--primary\" : \"ods-mkt-pricing__cta--secondary\",\n )}\n href={cta.href}\n onClick={cta.onClick}\n >\n {cta.label}\n </a>\n );\n }\n return (\n <Button variant={featured ? \"primary\" : \"secondary\"} fullWidth onClick={cta.onClick}>\n {cta.label}\n </Button>\n );\n}\n\nexport function PricingTiers({ tiers, note, className, ...rest }: PricingTiersProps) {\n return (\n <div {...rest} className={cn(\"ods-mkt-pricing\", className)}>\n <div className=\"ods-mkt-pricing__grid\">\n {tiers.map((tier) => (\n <article\n key={tier.id}\n className={cn(\n \"ods-mkt-pricing__card\",\n tier.featured && \"ods-mkt-pricing__card--featured\",\n )}\n >\n {tier.featured && (\n <span className=\"ods-mkt-pricing__badge\">{tier.badge ?? \"Recommended\"}</span>\n )}\n <h3 className=\"ods-mkt-pricing__name\">{tier.name}</h3>\n <div className=\"ods-mkt-pricing__price-row\">\n <span className=\"ods-mkt-pricing__price\">{tier.price}</span>\n {tier.period && <span className=\"ods-mkt-pricing__period\">{tier.period}</span>}\n </div>\n {tier.annualNote && <span className=\"ods-mkt-pricing__annual\">{tier.annualNote}</span>}\n {tier.description && <p className=\"ods-mkt-pricing__desc\">{tier.description}</p>}\n <ul className=\"ods-mkt-pricing__features\">\n {tier.features.map((feature, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: features are positional copy\n <li key={i} className=\"ods-mkt-pricing__feature\">\n <CheckmarkIcon size=\"sm\" aria-hidden=\"true\" />\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n <TierCta cta={tier.cta} featured={Boolean(tier.featured)} />\n </article>\n ))}\n </div>\n {note && <p className=\"ods-mkt-pricing__note\">{note}</p>}\n </div>\n );\n}\n","\"use client\";\n\nimport { useReducedMotion } from \"framer-motion\";\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { CountUp } from \"../../../components/CountUp/CountUp\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * StatBand — big proof numbers (\"600+ CONNECTORS · 10× FASTER SETUP …\").\n * Numeric values count up on mount; strings render as-is.\n * ------------------------------------------------------------------------- */\n\nexport interface StatBandItem {\n id: string;\n /** Number → animated count-up; string → rendered verbatim (\"10×\"). */\n value: number | string;\n label: ReactNode;\n prefix?: string;\n suffix?: string;\n}\n\nexport interface StatBandProps extends ComponentPropsWithoutRef<\"div\"> {\n items: StatBandItem[];\n /** \"row\" = horizontal band; \"column\" = stacked rail (default). */\n orientation?: \"column\" | \"row\";\n}\n\nexport function StatBand({ items, orientation = \"column\", className, ...rest }: StatBandProps) {\n const reducedMotion = useReducedMotion();\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-statband\", `ods-mkt-statband--${orientation}`, className)}\n >\n {items.map((item) => (\n <div key={item.id} className=\"ods-mkt-statband__item\">\n <div className=\"ods-mkt-statband__value\">\n {typeof item.value === \"number\" ? (\n <CountUp\n value={item.value}\n duration={900}\n disableAnimation={Boolean(reducedMotion)}\n prefix={item.prefix}\n suffix={item.suffix}\n formatValue={(v) => Math.round(v).toLocaleString(\"en-US\")}\n />\n ) : (\n <>\n {item.prefix}\n {item.value}\n {item.suffix}\n </>\n )}\n </div>\n <div className=\"ods-mkt-statband__label\">{item.label}</div>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * CountUp — animated numeric counter.\n *\n * For ETL / orchestration dashboards: rows processed, runs completed,\n * MRR, throughput totals. Pairs naturally with `Sparkline` and `Stat`.\n *\n * The animation is implementation-light — a `requestAnimationFrame` loop\n * with a configurable easing function. Skips entirely when the user has\n * `prefers-reduced-motion` enabled or `disableAnimation` is true.\n *\n * Re-runs the tween whenever `value` changes, starting from the previous\n * displayed value (so consecutive updates flow smoothly without a reset\n * to 0).\n * ------------------------------------------------------------------------- */\n\nexport type Easing = (t: number) => number;\n\nexport interface CountUpProps\n extends Omit<\n ComponentPropsWithoutRef<\"span\">,\n // HTMLSpanElement carries a native `prefix` attribute (string) — omit\n // it so our `ReactNode` prefix slot can coexist.\n \"children\" | \"onChange\" | \"prefix\"\n > {\n /** Target value. */\n value: number;\n /** Starting value on FIRST mount. Default 0. */\n from?: number;\n /** Tween duration in ms. Default 800. */\n duration?: number;\n /** Easing function. Default `easeOutCubic`. */\n easing?: Easing;\n /** Decimal places when no `formatValue` is supplied. Default 0. */\n decimals?: number;\n /** Custom formatter — wins over `decimals`. */\n formatValue?: (value: number) => ReactNode;\n /** Inline content before the number. */\n prefix?: ReactNode;\n /** Inline content after the number (e.g. \"%\"). */\n suffix?: ReactNode;\n /** Delay the tween start in ms. */\n delay?: number;\n /**\n * Skip the animation and render `value` immediately. Reads as a\n * \"static mode\" — useful for SSR snapshots or print views.\n */\n disableAnimation?: boolean;\n /** Fires once when the tween settles on the target value. */\n onComplete?: () => void;\n}\n\n/* ---------------------------------------------------------------------------\n * Easings\n * ------------------------------------------------------------------------- */\n\nexport const easeLinear: Easing = (t) => t;\nexport const easeOutCubic: Easing = (t) => 1 - Math.pow(1 - t, 3);\nexport const easeOutQuart: Easing = (t) => 1 - Math.pow(1 - t, 4);\nexport const easeOutExpo: Easing = (t) =>\n t === 1 ? 1 : 1 - Math.pow(2, -10 * t);\n\n/* ---------------------------------------------------------------------------\n * Component\n * ------------------------------------------------------------------------- */\n\nexport const CountUp = forwardRef<HTMLSpanElement, CountUpProps>(\n function CountUp(\n {\n value,\n from = 0,\n duration = 800,\n easing = easeOutCubic,\n decimals = 0,\n formatValue,\n prefix,\n suffix,\n delay = 0,\n disableAnimation = false,\n onComplete,\n className,\n ...rest\n },\n ref,\n ) {\n // The current rendered number. Initialise to `from` on first mount;\n // subsequent renders tween from the previous displayed value.\n const [n, setN] = useState<number>(disableAnimation ? value : from);\n const lastRendered = useRef<number>(disableAnimation ? value : from);\n\n useEffect(() => {\n // Respect prefers-reduced-motion — snap to target without animation.\n const reduced =\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")\n .matches;\n\n if (disableAnimation || reduced) {\n setN(value);\n lastRendered.current = value;\n onComplete?.();\n return;\n }\n\n const startValue = lastRendered.current;\n const delta = value - startValue;\n if (delta === 0) return;\n\n let raf: number | null = null;\n let timeoutId: number | null = null;\n let startTime: number | null = null;\n let cancelled = false;\n\n const tick = (ts: number) => {\n if (cancelled) return;\n if (startTime === null) startTime = ts;\n const t = Math.min(1, (ts - startTime) / Math.max(1, duration));\n const eased = easing(t);\n const current = startValue + delta * eased;\n setN(current);\n lastRendered.current = current;\n if (t < 1) {\n raf = requestAnimationFrame(tick);\n } else {\n lastRendered.current = value;\n setN(value);\n onComplete?.();\n }\n };\n\n const start = () => {\n raf = requestAnimationFrame(tick);\n };\n\n if (delay > 0) {\n timeoutId = window.setTimeout(start, delay);\n } else {\n start();\n }\n\n return () => {\n cancelled = true;\n if (raf !== null) cancelAnimationFrame(raf);\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n };\n // We intentionally exclude `easing` from deps — it should be a\n // stable function reference. If the consumer changes easing\n // mid-flight, we just pick it up on the next value change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, duration, delay, disableAnimation]);\n\n const display = formatValue ? formatValue(n) : n.toFixed(decimals);\n\n return (\n <span\n {...rest}\n ref={ref}\n className={cn(\"ods-count-up\", className)}\n // aria-live so screen readers announce updates without a stale\n // value lingering. Polite (default for \"status\") avoids\n // interrupting other announcements.\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {prefix}\n {display}\n {suffix}\n </span>\n );\n },\n);\n\nCountUp.displayName = \"CountUp\";\n","\"use client\";\nimport { QuotesIcon, StarFilledIcon, StarIcon } from \"@octaviaflow/icons\";\nimport { type ComponentPropsWithoutRef, forwardRef, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Avatar, type AvatarProps } from \"../Avatar\";\nimport { Card, type CardRadius } from \"../Card\";\n\n/* ---------------------------------------------------------------------------\n * TestimonialCard — pull-quote card with author + optional rating.\n *\n * Composes on the polished `Card` primitive (forwardRef, native props,\n * focus rings, radius). Uses the polished `Avatar` primitive for the\n * author photo and `@octaviaflow/icons` for the quote glyph + star\n * rating.\n * ------------------------------------------------------------------------- */\n\nexport type TestimonialCardSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TestimonialCardAuthor {\n /** Display name. */\n name: ReactNode;\n /** Avatar — forwarded to the polished Avatar primitive. */\n avatar?: Pick<AvatarProps, \"src\" | \"initials\" | \"alt\" | \"seed\" | \"palette\">;\n /** Job title / role / handle. */\n role?: ReactNode;\n}\n\nexport interface TestimonialCardProps\n extends Omit<\n ComponentPropsWithoutRef<\"figure\">,\n // Native `role` is an AriaRole string; our legacy `role` prop is a\n // ReactNode (author's job title). Omit so they don't collide.\n \"role\" | \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\"\n > {\n /** The testimonial body. */\n quote: ReactNode;\n /**\n * Author — accepts either a plain ReactNode (legacy: name only) or a\n * structured `{ name, role?, avatar? }` object (preferred).\n */\n author: ReactNode | TestimonialCardAuthor;\n /** Legacy: author role rendered below the name. Use `author.role` instead. */\n role?: ReactNode;\n /** Legacy: raw avatar slot (e.g. <img />). Use `author.avatar` instead. */\n avatar?: ReactNode;\n /** Legacy: initial character to render in the avatar circle. */\n initial?: ReactNode;\n /** 0–5 star rating. */\n rating?: number;\n /** Optional company logo node — rendered top-right (e.g. customer logo). */\n logo?: ReactNode;\n /** Size variant — drives quote-text size + padding. */\n size?: TestimonialCardSize;\n /** Card corner radius (passes through). */\n radius?: CardRadius;\n}\n\nfunction isAuthorObject(v: TestimonialCardProps[\"author\"]): v is TestimonialCardAuthor {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !(\"type\" in (v as object)) && // exclude React elements\n \"name\" in (v as unknown as Record<string, unknown>)\n );\n}\n\nexport const TestimonialCard = forwardRef<HTMLElement, TestimonialCardProps>(\n function TestimonialCard(\n {\n quote,\n author,\n role: legacyRole,\n avatar: legacyAvatar,\n initial: legacyInitial,\n rating,\n logo,\n size = \"md\",\n radius = \"md\",\n id: providedId,\n className,\n ...rest\n },\n ref,\n ) {\n const reactId = useId();\n const baseId = providedId ?? `ods-testimonial-${reactId}`;\n const quoteId = `${baseId}-quote`;\n const authorId = `${baseId}-author`;\n\n // Resolve the author shape — structured wins, legacy props fill in.\n const resolved: TestimonialCardAuthor = isAuthorObject(author)\n ? author\n : {\n name: author,\n role: legacyRole,\n avatar: legacyAvatar\n ? undefined // legacy raw-node path handled below\n : {\n initials:\n typeof legacyInitial === \"string\"\n ? legacyInitial\n : typeof author === \"string\"\n ? author.charAt(0).toUpperCase()\n : undefined,\n },\n };\n\n const renderAvatar = () => {\n // Legacy raw `avatar` node (e.g. <img />) — preserve back-compat.\n if (!isAuthorObject(author) && legacyAvatar) {\n return (\n <span\n className=\"ods-testimonial__avatar ods-testimonial__avatar--legacy\"\n aria-hidden=\"true\"\n >\n {legacyAvatar}\n </span>\n );\n }\n return (\n <Avatar\n size={size === \"sm\" ? \"xs\" : size === \"lg\" ? \"md\" : \"sm\"}\n src={resolved.avatar?.src}\n initials={resolved.avatar?.initials}\n seed={resolved.avatar?.seed}\n palette={resolved.avatar?.palette}\n alt={\n resolved.avatar?.alt ?? (typeof resolved.name === \"string\" ? resolved.name : undefined)\n }\n className=\"ods-testimonial__avatar\"\n />\n );\n };\n\n return (\n <Card\n // Card forwards refs to a div; figure is a different element so we\n // render the figure semantics in our children and let Card own\n // the focusable surface as a generic block. The forwardRef on\n // TestimonialCard's outer type is `HTMLElement` so consumers\n // can still attach a ref without TS friction.\n {...(rest as unknown as ComponentPropsWithoutRef<\"div\">)}\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n id={baseId}\n radius={radius}\n padding=\"none\"\n variant=\"subtle\"\n className={cn(\"ods-testimonial\", `ods-testimonial--${size}`, className)}\n aria-labelledby={authorId}\n aria-describedby={quoteId}\n >\n <div className=\"ods-testimonial__head\">\n <span className=\"ods-testimonial__quote\" aria-hidden=\"true\">\n <QuotesIcon size=\"md\" />\n </span>\n {logo && (\n <span className=\"ods-testimonial__logo\" aria-hidden=\"true\">\n {logo}\n </span>\n )}\n </div>\n\n <blockquote id={quoteId} className=\"ods-testimonial__text\">\n {quote}\n </blockquote>\n\n {typeof rating === \"number\" && (\n <div\n className=\"ods-testimonial__rating\"\n role=\"img\"\n aria-label={`${rating} out of 5 stars`}\n >\n {Array.from({ length: 5 }).map((_, i) =>\n i < Math.round(rating) ? (\n <StarFilledIcon\n key={i}\n size=\"xs\"\n className=\"ods-testimonial__star ods-testimonial__star--on\"\n />\n ) : (\n <StarIcon key={i} size=\"xs\" className=\"ods-testimonial__star\" />\n ),\n )}\n </div>\n )}\n\n <figcaption className=\"ods-testimonial__author\" id={authorId}>\n {renderAvatar()}\n <span className=\"ods-testimonial__author-info\">\n <span className=\"ods-testimonial__author-name\">{resolved.name}</span>\n {resolved.role && <span className=\"ods-testimonial__author-role\">{resolved.role}</span>}\n </span>\n </figcaption>\n </Card>\n );\n },\n);\n\nTestimonialCard.displayName = \"TestimonialCard\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { TestimonialCard } from \"../../../components/TestimonialCard/TestimonialCard\";\nimport { cn } from \"../../../utils/cn\";\n\n/* ---------------------------------------------------------------------------\n * TestimonialStrip — customer-proof grid composing the DS TestimonialCard.\n * Pair with MarketingSection for the kicker/title band.\n * ------------------------------------------------------------------------- */\n\nexport interface TestimonialStripItem {\n id: string;\n quote: ReactNode;\n author: {\n name: string;\n role?: ReactNode;\n /** Avatar spec forwarded to the DS Avatar primitive. */\n avatar?: { src?: string; initials?: string; alt?: string };\n };\n rating?: number;\n /** Customer company logo (top-right of the card). */\n logo?: ReactNode;\n}\n\nexport interface TestimonialStripProps extends ComponentPropsWithoutRef<\"div\"> {\n items: TestimonialStripItem[];\n columns?: 2 | 3;\n}\n\nexport function TestimonialStrip({\n items,\n columns = 3,\n className,\n ...rest\n}: TestimonialStripProps) {\n return (\n <div\n {...rest}\n className={cn(\"ods-mkt-testimonials\", `ods-mkt-testimonials--${columns}`, className)}\n >\n {items.map((item) => (\n <TestimonialCard\n key={item.id}\n quote={item.quote}\n author={item.author}\n rating={item.rating}\n logo={item.logo}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { CountUp } from \"../../../components/CountUp/CountUp\";\nimport { cn } from \"../../../utils/cn\";\nimport { roleGlyph } from \"../../glyphs\";\nimport { ShowcaseScene } from \"./ShowcaseScene\";\nimport { ShowcaseSignup } from \"./ShowcaseSignup\";\nimport {\n buildActivity,\n detectConnectors,\n isValidEmail,\n resolvePlan,\n SETTLED_PHASES,\n scheduleFromPrompt,\n segmentPrompt,\n WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n WORKFLOW_SHOWCASE_DEFAULT_TILES,\n WORKFLOW_SHOWCASE_SCHEDULES,\n WORKFLOW_SHOWCASE_TRIGGERS,\n type WorkflowShowcaseConnector,\n type WorkflowShowcaseExample,\n type WorkflowShowcaseMetric,\n type WorkflowShowcasePhase,\n type WorkflowShowcasePlan,\n type WorkflowShowcaseSignupValues,\n} from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * WorkflowShowcase — the marketing-site \"prompt → live pipeline → signup\"\n * funnel, as one self-driving composition.\n *\n * A visitor types (or taps an example), watches Octavia recognize connectors\n * live, builds the workflow on an isometric canvas with real-feeling\n * telemetry, and converts through an in-canvas workspace form — without ever\n * leaving the hero. All product copy (connector catalog, examples, metrics)\n * is prop-driven; the defaults are deliberately vendor-neutral.\n * ------------------------------------------------------------------------- */\n\nexport interface WorkflowShowcaseBuildDetail {\n prompt: string;\n connectors: string[];\n schedule: string;\n /** Trigger mode at build time: SCHEDULE / WEBHOOK / APP EVENT / MANUAL. */\n trigger: string;\n}\n\nexport interface WorkflowShowcaseProps\n extends Omit<ComponentPropsWithoutRef<\"section\">, \"onSubmit\"> {\n /** Connector catalog to recognize/pick from. Vendor-neutral by default. */\n connectors?: WorkflowShowcaseConnector[];\n /** \"TRY:\" example chips. */\n examples?: WorkflowShowcaseExample[];\n /** Right-rail metric cards. */\n metrics?: WorkflowShowcaseMetric[];\n /** Pre-filled prompt text. */\n defaultPrompt?: string;\n /**\n * Auto-rotate through the example prompts while the visitor hasn't\n * engaged (idle phase, not hovering/focusing/edited). Ignored when\n * `defaultPrompt` is set. Default true.\n */\n rotatePrompts?: boolean;\n /** Mono label at the right edge of the toolbar. */\n modelLabel?: string;\n /** Mono label in the canvas header. */\n canvasLabel?: string;\n /** Header of the live activity rail. */\n railLabel?: string;\n /** Labels for the 8 platform tiles in the scene. */\n platformTiles?: readonly string[];\n /** Icon on the core cube. */\n coreIcon?: ReactNode;\n /** Catalog-size figure used in coach copy, e.g. \"600+\". */\n catalogNote?: string;\n /** Team-size choices in the signup form. */\n teamSizes?: string[];\n /** Domain used for the workspace-slug preview in the welcome card. */\n workspaceDomain?: string;\n dashboardHref?: string;\n onboardingHref?: string;\n /** Accessible label for the prompt textarea. */\n promptAriaLabel?: string;\n /** Fires when a build kicks off (analytics hook). */\n onBuild?: (detail: WorkflowShowcaseBuildDetail) => void;\n /** Fires on every phase transition (analytics hook). */\n onPhaseChange?: (phase: WorkflowShowcasePhase) => void;\n /**\n * Real signup handler. Resolve → welcome card; throw → inline error and\n * back to the form. Omit to simulate provisioning (pure demo mode).\n */\n onSignup?: (values: WorkflowShowcaseSignupValues) => Promise<void> | void;\n}\n\ninterface SwapState {\n name: string;\n /** Exact text the visitor typed (may be an alias) — what gets replaced. */\n text: string;\n x: number;\n y: number;\n}\n\nconst EMPTY_PLAN: WorkflowShowcasePlan = { left: [], right: [], all: [], totalSteps: 1 };\n\nfunction ConnectorTile({ connector }: { connector: WorkflowShowcaseConnector }) {\n // Decorative app tile — hidden so button names stay clean for AT.\n // Consumers pass real brand icons via `icon`; the fallback is a role glyph.\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"ods-showcase__apptile\", `ods-showcase__apptile--${connector.role}`)}\n >\n {connector.icon ?? roleGlyph(connector.role)}\n </span>\n );\n}\n\nexport function WorkflowShowcase({\n connectors = WORKFLOW_SHOWCASE_DEFAULT_CONNECTORS,\n examples = WORKFLOW_SHOWCASE_DEFAULT_EXAMPLES,\n metrics = WORKFLOW_SHOWCASE_DEFAULT_METRICS,\n defaultPrompt = \"\",\n rotatePrompts = true,\n modelLabel = \"octavia-core-1\",\n canvasLabel = \"workflow_canvas\",\n railLabel = \"OCTAVIA IS DOING\",\n platformTiles = WORKFLOW_SHOWCASE_DEFAULT_TILES,\n coreIcon,\n catalogNote = \"600+\",\n teamSizes = [\"1–10\", \"11–50\", \"51–200\", \"200+\"],\n workspaceDomain = \"octaviaflow.com\",\n dashboardHref,\n onboardingHref = \"#\",\n promptAriaLabel = \"Describe your pipeline\",\n onBuild,\n onPhaseChange,\n onSignup,\n className,\n ...rest\n}: WorkflowShowcaseProps) {\n const reducedMotion = useReducedMotion();\n // Prefill with the first example so the hero never opens on an empty box;\n // rotation cycles through the rest until the visitor engages.\n const rotationActive = rotatePrompts && !defaultPrompt && examples.length > 0;\n const [prompt, setPrompt] = useState(\n defaultPrompt || (rotationActive ? (examples[0]?.prompt ?? \"\") : \"\"),\n );\n const [engagedWithPrompt, setEngagedWithPrompt] = useState(false);\n const [promptHovered, setPromptHovered] = useState(false);\n const [promptFocused, setPromptFocused] = useState(false);\n const rotateIdx = useRef(0);\n const [selected, setSelected] = useState<string[]>([]);\n const [phase, setPhase] = useState<WorkflowShowcasePhase>(\"idle\");\n const [shown, setShown] = useState(0);\n const [status, setStatus] = useState(\"\");\n const [pickerOpen, setPickerOpen] = useState(false);\n const [schedIdx, setSchedIdx] = useState(0);\n const [swap, setSwap] = useState<SwapState | null>(null);\n const [signupError, setSignupError] = useState<string | null>(null);\n // Where Back returns to — signup can open from the done CTA or the core.\n const signupReturnPhase = useRef<WorkflowShowcasePhase>(\"done\");\n\n const cardRef = useRef<HTMLDivElement>(null);\n const timers = useRef<ReturnType<typeof setTimeout>[]>([]);\n const clearTimers = useCallback(() => {\n for (const t of timers.current) clearTimeout(t);\n timers.current = [];\n }, []);\n useEffect(() => clearTimers, [clearTimers]);\n // Compress the choreography (not the content) when the visitor prefers\n // reduced motion — they still see every step, just sooner.\n const tempo = reducedMotion ? 0.35 : 1;\n const at = useCallback(\n (ms: number, fn: () => void) => {\n timers.current.push(setTimeout(fn, ms * tempo));\n },\n [tempo],\n );\n\n const firstPhase = useRef(true);\n useEffect(() => {\n if (firstPhase.current) {\n firstPhase.current = false;\n return;\n }\n onPhaseChange?.(phase);\n }, [phase, onPhaseChange]);\n\n // Render-time mirror of `phase` so callbacks that reset + immediately\n // rebuild (example chips) never read a stale \"building\" and bail out.\n const phaseRef = useRef(phase);\n phaseRef.current = phase;\n\n const byName = useMemo(() => new Map(connectors.map((c) => [c.name, c])), [connectors]);\n const detected = useMemo(() => detectConnectors(prompt, connectors), [prompt, connectors]);\n const union = useMemo(() => [...new Set([...selected, ...detected])], [selected, detected]);\n const settled = SETTLED_PHASES.includes(phase);\n const engaged = phase !== \"idle\";\n const buildingNow = phase === \"analyzing\" || phase === \"building\";\n\n /** Partition currently-selected connectors into scene sides (no backfill). */\n const plan = useMemo<WorkflowShowcasePlan>(() => {\n if (!selected.length) return EMPTY_PLAN;\n return resolvePlan(selected, [], connectors);\n }, [selected, connectors]);\n\n /* ── schedule ──────────────────────────────────────────────────────── */\n const schedules = WORKFLOW_SHOWCASE_SCHEDULES;\n const inferredSchedule = scheduleFromPrompt(prompt);\n const manualSchedule = schedules[schedIdx];\n const scheduleShown = inferredSchedule ?? (manualSchedule === \"AUTO\" ? \"HOURLY\" : manualSchedule);\n\n /* ── trigger mode (schedule / webhook / app event / manual) ────────── */\n const triggers = WORKFLOW_SHOWCASE_TRIGGERS;\n const [triggerIdx, setTriggerIdx] = useState(0);\n const manualTrigger = triggers[triggerIdx];\n // What the coach line shows as the cadence: the schedule when the trigger\n // is time-based, otherwise the trigger mode itself.\n const cadenceShown = manualTrigger === \"SCHEDULE\" ? scheduleShown : manualTrigger;\n\n /* ── idle prompt rotation ──────────────────────────────────────────── */\n // Rotate example prompts while nobody is engaging; stop the instant the\n // visitor hovers, focuses, or edits — the box is theirs from then on.\n useEffect(() => {\n if (\n !rotationActive ||\n engagedWithPrompt ||\n promptHovered ||\n promptFocused ||\n phase !== \"idle\"\n ) {\n return;\n }\n const timer = setInterval(() => {\n rotateIdx.current = (rotateIdx.current + 1) % examples.length;\n setPrompt(examples[rotateIdx.current].prompt);\n }, 4200);\n return () => clearInterval(timer);\n }, [rotationActive, engagedWithPrompt, promptHovered, promptFocused, phase, examples]);\n\n /* ── build choreography ────────────────────────────────────────────── */\n const startBuild = useCallback(\n (text: string, baseSelected: string[]) => {\n if (phaseRef.current === \"analyzing\" || phaseRef.current === \"building\") return;\n phaseRef.current = \"analyzing\";\n clearTimers();\n const resolved = resolvePlan(baseSelected, detectConnectors(text, connectors), connectors);\n const target = resolved.all.map((c) => c.name);\n const additions = target.filter((n) => !baseSelected.includes(n));\n setPrompt(text);\n setSelected(baseSelected);\n setPhase(\"analyzing\");\n setShown(0);\n setStatus(\"analyzing request · matching connectors\");\n setPickerOpen(false);\n setSwap(null);\n onBuild?.({\n prompt: text,\n connectors: target,\n schedule: scheduleShown,\n trigger: manualTrigger,\n });\n additions.forEach((name, i) => {\n at(250 + i * 200, () => setSelected((s) => (s.includes(name) ? s : [...s, name])));\n });\n const t0 = 250 + additions.length * 200;\n at(t0 + 750, () => setStatus(\"wiring transforms · adding error handling\"));\n at(t0 + 1500, () => {\n setPhase(\"building\");\n setStatus(\"assembling workflow · optimizing plan\");\n });\n for (let i = 0; i < resolved.totalSteps; i++) {\n at(t0 + 1600 + i * 380, () => setShown(i + 1));\n }\n at(t0 + 1600 + resolved.totalSteps * 380 + 350, () => setPhase(\"done\"));\n },\n [clearTimers, connectors, onBuild, scheduleShown, manualTrigger, at],\n );\n\n const resetToIdle = useCallback(() => {\n clearTimers();\n phaseRef.current = \"idle\";\n setPhase(\"idle\");\n setShown(0);\n setStatus(\"\");\n setSwap(null);\n }, [clearTimers]);\n\n const toggleConnector = (name: string) => {\n resetToIdle();\n setSelected((s) => (s.includes(name) ? s.filter((n) => n !== name) : [...s, name]));\n };\n\n const runExample = (example: WorkflowShowcaseExample) => {\n resetToIdle();\n startBuild(example.prompt, []);\n };\n\n /* ── swap menu ─────────────────────────────────────────────────────── */\n const openSwap = (name: string, text: string, anchor: HTMLElement) => {\n const card = cardRef.current;\n if (!card) return;\n const r = anchor.getBoundingClientRect();\n const cr = card.getBoundingClientRect();\n const x = Math.max(8, Math.min(r.left - cr.left, cr.width - 264));\n setSwap({ name, text, x, y: r.bottom - cr.top + 6 });\n };\n const doSwap = (current: SwapState, next: string) => {\n resetToIdle();\n const re = new RegExp(current.text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"i\");\n setPrompt((p) => p.replace(re, next));\n setSelected((s) => s.map((n) => (n === current.name ? next : n)));\n };\n const swapRole = swap ? byName.get(swap.name)?.role : undefined;\n const swapItems = swapRole ? connectors.filter((c) => c.role === swapRole) : [];\n\n /* ── coach line ────────────────────────────────────────────────────── */\n const roles = union.map((n) => byName.get(n)?.role);\n const hasSource = roles.includes(\"source\");\n const hasSink = roles.some((r) => r && r !== \"source\");\n const hasNotify = roles.includes(\"notify\");\n let coachLine: string;\n let coachAdds: WorkflowShowcaseConnector[] = [];\n const notIn = (c: WorkflowShowcaseConnector) => !union.includes(c.name);\n if (!union.length) {\n coachLine = prompt\n ? \"LISTENING… CONNECTOR NAMES LIGHT UP AS OCTAVIA RECOGNIZES THEM\"\n : `OCTAVIA MATCHES CONNECTORS LIVE AS YOU TYPE — OR PICK FROM ${catalogNote}`;\n } else if (union.length >= connectors.length) {\n coachLine =\n \"FULL STACK — OCTAVIA SPLITS THIS INTO PARALLEL INGEST → AI TRANSFORM → SEQUENCED ACTIONS\";\n } else if (union.length >= 6) {\n coachLine = `BIG STACK — ${union.length} CONNECTORS FAN OUT ACROSS PARALLEL BRANCHES · COST OPTIMIZER ON`;\n } else if (hasSource && !hasSink) {\n coachLine = \"SOURCES WIRED — WHERE SHOULD THE DATA LAND?\";\n coachAdds = connectors.filter((c) => c.role === \"destination\" && notIn(c)).slice(0, 2);\n } else if (!hasSource && hasSink) {\n coachLine = \"DESTINATION SET — WHAT SHOULD OCTAVIA PULL FROM?\";\n coachAdds = connectors.filter((c) => c.role === \"source\" && notIn(c)).slice(0, 2);\n } else if (!hasNotify) {\n coachLine = `✓ ${union.length} CONNECTORS · ${cadenceShown} · TIP: ALERT YOUR TEAM WHEN RUNS FINISH`;\n coachAdds = connectors.filter((c) => c.role === \"notify\" && notIn(c)).slice(0, 1);\n } else {\n coachLine = `✓ ${union.length} CONNECTORS · ${cadenceShown} · CLICK A HIGHLIGHTED NAME TO SWAP IT`;\n }\n const coachTone = union.length ? (hasSource && hasSink ? \"success\" : \"accent\") : \"muted\";\n\n /* ── canvas derived state ──────────────────────────────────────────── */\n const badge = settled\n ? { label: \"LIVE\", tone: \"success\" as const, pulse: true }\n : buildingNow\n ? {\n label: phase === \"analyzing\" ? \"ANALYZING\" : \"BUILDING\",\n tone: \"accent\" as const,\n pulse: true,\n }\n : { label: \"IDLE\", tone: \"muted\" as const, pulse: false };\n const canvasSub = settled ? \"production\" : buildingNow ? \"generating\" : \"draft\";\n const sceneCaption = settled\n ? \"PIPELINE LIVE · SQUARES = ROWS IN FLIGHT\"\n : phase === \"building\"\n ? \"ASSEMBLING WORKFLOW…\"\n : phase === \"analyzing\"\n ? \"ANALYZING REQUEST…\"\n : \"CLICK THE CORE · CONNECTORS LAND AS CUBES\";\n\n const activity = buildActivity({ phase, shown, plan, selected, status });\n const costMetric = metrics.find((m) => m.tone === \"success\");\n const costLabel = costMetric\n ? `${costMetric.prefix ?? \"\"}${costMetric.value}${costMetric.suffix ?? \"\"}`\n : \"\";\n const railFoot =\n phase === \"idle\"\n ? `${catalogNote} CONNECTORS · FREE IN PRIVATE BETA`\n : settled\n ? `COST PLAN SELECTED · ${costLabel} SAVED`\n : \"COST OPTIMIZER RUNNING…\";\n\n const nLeft = plan.left.length;\n const sceneLeft = plan.left.map((c, i) => ({\n connector: c,\n active: engaged && (settled || shown > i),\n }));\n const sceneRight = plan.right.map((c, j) => ({\n connector: c,\n active: engaged && (settled || shown > nLeft + 1 + j),\n }));\n\n const stepCount = (selected.length || 3) + 1;\n const doneNote = costMetric\n ? `${stepCount}-step workflow generated · cost optimizer: ${costMetric.value}% below baseline`\n : `${stepCount}-step workflow generated`;\n\n /* ── signup ────────────────────────────────────────────────────────── */\n const submitSignup = (values: WorkflowShowcaseSignupValues) => {\n if (!values.name.trim() || !isValidEmail(values.email)) {\n setSignupError(\"Please enter your name and a valid work email.\");\n return;\n }\n setSignupError(null);\n setPhase(\"creating\");\n const finish = () => setPhase(\"welcome\");\n const fail = () => {\n setSignupError(\"Something went wrong — please try again.\");\n setPhase(\"signup\");\n };\n if (!onSignup) {\n at(1600, finish);\n return;\n }\n try {\n const result = onSignup(values);\n if (result && typeof (result as Promise<void>).then === \"function\") {\n (result as Promise<void>).then(finish, fail);\n } else {\n finish();\n }\n } catch {\n fail();\n }\n };\n\n /* ── prompt rendering ──────────────────────────────────────────────── */\n const segments = segmentPrompt(prompt, connectors);\n const onPromptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n startBuild(prompt, selected);\n }\n };\n\n const rise = (delay = 0) =>\n reducedMotion\n ? {}\n : {\n initial: { opacity: 0, y: 10 },\n animate: { opacity: 1, y: 0 },\n transition: { duration: 0.4, delay, ease: [0.2, 0.7, 0.2, 1] as const },\n };\n\n return (\n <section {...rest} className={cn(\"ods-showcase\", className)}>\n {/* ── prompt card ─────────────────────────────────────────────── */}\n <div\n ref={cardRef}\n className=\"ods-showcase__card\"\n onMouseEnter={() => setPromptHovered(true)}\n onMouseLeave={() => setPromptHovered(false)}\n >\n <div className=\"ods-showcase__prompt\">\n <textarea\n className=\"ods-showcase__prompt-input\"\n value={prompt}\n onChange={(e) => {\n setEngagedWithPrompt(true);\n setPrompt(e.target.value);\n }}\n onKeyDown={onPromptKeyDown}\n onFocus={() => setPromptFocused(true)}\n onBlur={() => setPromptFocused(false)}\n aria-label={promptAriaLabel}\n spellCheck={false}\n rows={2}\n />\n <div className=\"ods-showcase__prompt-render\" aria-hidden=\"true\">\n {prompt ? (\n segments.map((seg, i) =>\n seg.connector ? (\n <button\n // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature\n key={i}\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"ods-showcase__token\",\n `ods-showcase__token--${seg.connector.role}`,\n )}\n onClick={(e) => {\n const name = seg.connector?.name;\n if (name) openSwap(name, seg.text, e.currentTarget);\n }}\n >\n {/* Icon hides while editing so the overlay stays exactly\n caret-aligned with the transparent textarea text. */}\n {!promptFocused && <ConnectorTile connector={seg.connector} />}\n {seg.text}\n </button>\n ) : (\n // biome-ignore lint/suspicious/noArrayIndexKey: segments are positional by nature\n <span key={i}>{seg.text}</span>\n ),\n )\n ) : (\n <>\n <span className=\"ods-showcase__placeholder\">Describe your pipeline — e.g. </span>\n <span className=\"ods-showcase__placeholder ods-showcase__placeholder--faint\">\n \"Sync Storefront orders to Warehouse hourly, alert sales in Team Chat\"\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"ods-showcase__coach\">\n <span\n className={cn(\"ods-showcase__coach-line\", `ods-showcase__coach-line--${coachTone}`)}\n >\n {coachLine}\n </span>\n {coachAdds.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n className=\"ods-showcase__coach-add\"\n onClick={() => toggleConnector(c.name)}\n >\n <ConnectorTile connector={c} />+ {c.name}\n </button>\n ))}\n </div>\n\n <AnimatePresence initial={false}>\n {pickerOpen && (\n <motion.div\n className=\"ods-showcase__picker\"\n initial={reducedMotion ? false : { opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={reducedMotion ? { opacity: 0 } : { opacity: 0, height: 0 }}\n transition={{ duration: 0.22, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__picker-row\">\n <span className=\"ods-showcase__microcopy\">CONNECTORS</span>\n {connectors.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n className={cn(\n \"ods-showcase__pick\",\n selected.includes(c.name) && \"ods-showcase__pick--on\",\n )}\n aria-pressed={selected.includes(c.name)}\n onClick={() => toggleConnector(c.name)}\n >\n <ConnectorTile connector={c} />\n {c.name}\n </button>\n ))}\n <span className=\"ods-showcase__microcopy ods-showcase__microcopy--faint\">\n + {catalogNote} IN THE APP\n </span>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <div className=\"ods-showcase__toolbar\">\n <button\n type=\"button\"\n className={cn(\n \"ods-showcase__tool\",\n (pickerOpen || selected.length > 0) && \"ods-showcase__tool--on\",\n )}\n aria-expanded={pickerOpen}\n onClick={() => setPickerOpen((o) => !o)}\n >\n + Connectors{selected.length ? ` · ${selected.length}` : \"\"}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"ods-showcase__tool\",\n manualTrigger !== \"SCHEDULE\" && \"ods-showcase__tool--on\",\n )}\n onClick={() => setTriggerIdx((i) => (i + 1) % triggers.length)}\n >\n ⚑ {manualTrigger}\n </button>\n {manualTrigger === \"SCHEDULE\" && (\n <button\n type=\"button\"\n className=\"ods-showcase__tool\"\n onClick={() => setSchedIdx((i) => (i + 1) % schedules.length)}\n >\n ◷ {manualSchedule}\n </button>\n )}\n <span className=\"ods-showcase__model\">{modelLabel}</span>\n <Button\n variant=\"primary\"\n onClick={() => startBuild(prompt, selected)}\n disabled={buildingNow}\n >\n {buildingNow ? \"Building…\" : \"Build workflow →\"}\n </Button>\n </div>\n\n {swap && swapRole && (\n <>\n <button\n type=\"button\"\n className=\"ods-showcase__swap-backdrop\"\n aria-label=\"Close swap menu\"\n onClick={() => setSwap(null)}\n />\n <div\n className=\"ods-showcase__swap\"\n role=\"menu\"\n style={{ left: swap.x, top: swap.y }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setSwap(null);\n }}\n >\n <div className=\"ods-showcase__swap-head\">\n SWAP {swapRole.toUpperCase()} — {swap.name.toUpperCase()}\n </div>\n {swapItems.map((c) => (\n <button\n key={c.name}\n type=\"button\"\n role=\"menuitem\"\n className=\"ods-showcase__swap-item\"\n onClick={() => doSwap(swap, c.name)}\n >\n <ConnectorTile connector={c} />\n <span className=\"ods-showcase__swap-name\">{c.name}</span>\n {c.name === swap.name && (\n <span className=\"ods-showcase__swap-mark\">● CURRENT</span>\n )}\n </button>\n ))}\n <div className=\"ods-showcase__swap-foot\">{catalogNote} CONNECTORS IN THE APP</div>\n </div>\n </>\n )}\n </div>\n\n {/* ── example chips ───────────────────────────────────────────── */}\n <div className=\"ods-showcase__examples\">\n <span className=\"ods-showcase__microcopy\">TRY:</span>\n {examples.map((ex) => (\n <button\n key={ex.id}\n type=\"button\"\n className=\"ods-showcase__try\"\n onClick={() => runExample(ex)}\n >\n {ex.label}\n </button>\n ))}\n </div>\n\n {/* ── canvas ──────────────────────────────────────────────────── */}\n <div className=\"ods-showcase__canvas\">\n <div className=\"ods-showcase__canvas-head\">\n <span className=\"ods-showcase__microcopy\">\n {canvasLabel} · {canvasSub}\n </span>\n <span className={cn(\"ods-showcase__badge\", `ods-showcase__badge--${badge.tone}`)}>\n <span className={cn(\"ods-showcase__dot\", badge.pulse && \"ods-showcase__dot--pulse\")} />\n {badge.label}\n </span>\n </div>\n <div className=\"ods-showcase__stage\">\n <div className=\"ods-showcase__rail\">\n <div className=\"ods-showcase__rail-head\">\n <span className=\"ods-showcase__microcopy\">{railLabel}</span>\n <span\n className={cn(\"ods-showcase__dot\", badge.pulse && \"ods-showcase__dot--pulse\")}\n />\n </div>\n <div className=\"ods-showcase__rail-body\">\n <AnimatePresence initial={false}>\n {activity.map((line) => (\n <motion.div\n key={line.id}\n className={cn(\"ods-showcase__act\", `ods-showcase__act--${line.tone}`)}\n initial={reducedMotion ? false : { opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.25 }}\n >\n {line.text}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n <div\n className={cn(\n \"ods-showcase__rail-foot\",\n settled && \"ods-showcase__rail-foot--done\",\n buildingNow && \"ods-showcase__rail-foot--active\",\n )}\n >\n {railFoot}\n </div>\n </div>\n\n <ShowcaseScene\n left={sceneLeft}\n right={sceneRight}\n engaged={engaged}\n tiles={platformTiles}\n coreIcon={coreIcon}\n caption={sceneCaption}\n onCoreClick={() => {\n // Second door into signup: clicking the core opens the same\n // workspace form as the CTA. Blocked mid-build so pending\n // phase timers can't stomp the overlay.\n if (\n buildingNow ||\n phase === \"signup\" ||\n phase === \"creating\" ||\n phase === \"welcome\"\n ) {\n return;\n }\n signupReturnPhase.current = phase;\n setSignupError(null);\n setPhase(\"signup\");\n }}\n />\n\n <div className=\"ods-showcase__metrics\">\n {metrics.map((m, idx) => {\n const revealed = settled || (phase === \"building\" && shown > idx);\n const interim = m.buildingValue != null && !settled && revealed;\n return (\n <div key={m.id} className=\"ods-showcase__metric\">\n <div\n className={cn(\n \"ods-showcase__metric-value\",\n !revealed && \"ods-showcase__metric-value--empty\",\n m.tone === \"success\" && settled && \"ods-showcase__metric-value--success\",\n )}\n >\n {settled ? (\n <CountUp\n value={m.value}\n from={m.buildingValue ?? 0}\n decimals={m.decimals ?? 0}\n duration={reducedMotion ? 0 : 900}\n disableAnimation={Boolean(reducedMotion)}\n prefix={m.prefix}\n formatValue={\n m.decimals ? undefined : (v) => Math.round(v).toLocaleString(\"en-US\")\n }\n />\n ) : interim ? (\n `${m.prefix ?? \"\"}${m.buildingValue}`\n ) : (\n \"—\"\n )}\n {revealed && m.suffix ? m.suffix : null}\n {revealed && m.unit ? (\n <span className=\"ods-showcase__metric-unit\"> {m.unit}</span>\n ) : null}\n </div>\n <div className=\"ods-showcase__microcopy\">{m.label}</div>\n </div>\n );\n })}\n </div>\n\n <ShowcaseSignup\n phase={phase}\n stepCount={stepCount}\n workspaceDomain={workspaceDomain}\n teamSizes={teamSizes}\n error={signupError}\n onSubmit={submitSignup}\n onBack={() => {\n setSignupError(null);\n setPhase(signupReturnPhase.current);\n }}\n dashboardHref={dashboardHref}\n onboardingHref={onboardingHref}\n />\n </div>\n </div>\n\n {/* ── status / CTA band ───────────────────────────────────────── */}\n <div className=\"ods-showcase__outro\" aria-live=\"polite\">\n {buildingNow && (\n <div className=\"ods-showcase__building\">\n <span className=\"ods-showcase__spin\" aria-hidden=\"true\">\n ⟳\n </span>{\" \"}\n {status}\n </div>\n )}\n {phase === \"done\" && (\n <div className=\"ods-showcase__done\">\n <motion.div className=\"ods-showcase__done-note\" {...rise(0)}>\n ✓ {doneNote}\n </motion.div>\n <motion.div className=\"ods-showcase__cta\" {...rise(0.2)}>\n <span className=\"ods-showcase__cta-copy\">\n Deploy it on your own data — takes 2 minutes.\n </span>\n <Button\n variant=\"primary\"\n onClick={() => {\n signupReturnPhase.current = \"done\";\n setSignupError(null);\n setPhase(\"signup\");\n }}\n >\n Create free account →\n </Button>\n <a className=\"ods-showcase__text-link\" href={onboardingHref}>\n Book onboarding →\n </a>\n </motion.div>\n </div>\n )}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { type CSSProperties, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { roleGlyph } from \"../../glyphs\";\nimport type { WorkflowShowcaseConnector } from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ShowcaseScene — the isometric \"workflow assembling itself\" illustration.\n *\n * Pure presentation: an isometric platform of capability tiles with the\n * Octavia core at the center, connector cubes landing on each side, and\n * particles tracing the guide paths (\"squares = rows in flight\"). The whole\n * scene is decorative — it's aria-hidden and every fact it communicates is\n * also present in the activity rail + metrics, which are real DOM text.\n * ------------------------------------------------------------------------- */\n\nexport interface ShowcaseSceneNode {\n connector: WorkflowShowcaseConnector;\n /** Whether this node's step has completed (wires + particles light up). */\n active: boolean;\n}\n\nexport interface ShowcaseSceneProps {\n left: ShowcaseSceneNode[];\n right: ShowcaseSceneNode[];\n /** Any build/run motion is happening (analyzing → welcome). */\n engaged: boolean;\n /** Platform tile labels (8). */\n tiles: readonly string[];\n /** Center-of-platform icon — any node: glyph, image, 3D asset embed. */\n coreIcon?: ReactNode;\n caption: string;\n /** Fires alongside the particle pulse when the core is clicked. */\n onCoreClick?: () => void;\n}\n\n/** Vertical slot centers for n cubes on one side (matches guide geometry). */\nfunction slots(n: number): number[] {\n return Array.from({ length: n }, (_, i) => 208 + (i - (n - 1) / 2) * 80);\n}\n\n// Entry/exit lanes across the platform edge — the tile-row centers and the\n// gaps between tiles — so each connector's line routes through its own\n// channel instead of every wire converging on one point.\nconst LANES = [228, 190, 266, 152, 304];\nconst laneFor = (index: number) => LANES[index % LANES.length];\n\nconst leftGuide = (cy: number, lane: number) => `M74 ${cy} H150 V${lane} H193`;\nconst rightGuide = (cy: number, lane: number) => `M263 ${lane} H340 V${cy} H388`;\n\ninterface ParticleSpec {\n key: string;\n path: string;\n size: number;\n duration: string;\n delay: string;\n variant: \"lead\" | \"echo\" | \"spark\";\n}\n\nfunction particlesFor(\n side: \"l\" | \"r\",\n index: number,\n path: string,\n active: boolean,\n fast: boolean,\n): ParticleSpec[] {\n const base = index * 0.4 + (side === \"r\" ? 0.5 : 0);\n const duration = fast ? (active ? \"1.1s\" : \"2.6s\") : active ? \"2.2s\" : \"4.8s\";\n const size = active ? 8 : 6;\n const out: ParticleSpec[] = [\n { key: `${side}${index}-a`, path, size, duration, delay: `${base}s`, variant: \"lead\" },\n {\n key: `${side}${index}-b`,\n path,\n size,\n duration,\n delay: `${base + (active ? 1.1 : 2.4)}s`,\n variant: \"echo\",\n },\n ];\n if (active) {\n out.push({\n key: `${side}${index}-c`,\n path,\n size: 6,\n duration,\n delay: `${base + 0.55}s`,\n variant: \"spark\",\n });\n }\n return out;\n}\n\nfunction DefaultCoreGlyph() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"30\" height=\"30\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.6\" />\n <path\n d=\"M7 12h7M11.5 8.5 15 12l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction CubeFace({ connector }: { connector: WorkflowShowcaseConnector }) {\n return (\n <span\n className={cn(\n \"ods-showcase__apptile\",\n \"ods-showcase__apptile--lg\",\n `ods-showcase__apptile--${connector.role}`,\n )}\n >\n {connector.icon ?? roleGlyph(connector.role, 18)}\n </span>\n );\n}\n\nexport function ShowcaseScene({\n left,\n right,\n engaged,\n tiles,\n coreIcon,\n caption,\n onCoreClick,\n}: ShowcaseSceneProps) {\n // Clicking the core briefly speeds particles up — a tiny reward that makes\n // the scene feel alive without changing any state that matters.\n const [pulse, setPulse] = useState(false);\n const pulseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(\n () => () => {\n if (pulseTimer.current) clearTimeout(pulseTimer.current);\n },\n [],\n );\n const firePulse = () => {\n if (pulse) return;\n setPulse(true);\n pulseTimer.current = setTimeout(() => setPulse(false), 1500);\n };\n\n const leftYs = slots(left.length);\n const rightYs = slots(right.length);\n\n const guides: { d: string; on: boolean; delay: string }[] = [];\n const particles: ParticleSpec[] = [];\n\n // Continuous routing: each source line enters the platform, takes a lane,\n // skirts AROUND the core cuboid (bypass channel north or south of it, the\n // core spans x 193–263 / y 193–263), and continues out to its paired\n // destination — one unbroken journey across the board. Sources without a\n // destination exit down through the south pin edge instead.\n const bypassFor = (index: number) => (index % 2 === 0 ? 188 : 268);\n left.forEach((node, i) => {\n const on = engaged && node.active;\n const laneIn = laneFor(i);\n const bypass = bypassFor(i);\n let d: string;\n if (right.length) {\n const pairIdx = i % right.length;\n const laneOut = laneFor(i + 1);\n d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H270 V${laneOut} H340 V${rightYs[pairIdx]} H388`;\n } else {\n d = `M74 ${leftYs[i]} H150 V${laneIn} H186 V${bypass} H${210 + (i % 3) * 40} V372`;\n }\n guides.push({ d, on, delay: `${i * 0.2}s` });\n particles.push(...particlesFor(\"l\", i, d, on, pulse));\n });\n // Destinations beyond the paired sources still get their own feed line.\n right.forEach((node, j) => {\n if (left.length > 0 && j < left.length) return; // already fed by a crossing\n const d = rightGuide(rightYs[j], laneFor(j + 1));\n const on = engaged && node.active;\n guides.push({ d, on, delay: `${j * 0.2 + 0.3}s` });\n particles.push(...particlesFor(\"r\", j, d, on, pulse));\n });\n if (!left.length) guides.push({ d: leftGuide(208, 228), on: false, delay: \"0s\" });\n if (!right.length) guides.push({ d: rightGuide(208, 228), on: false, delay: \"0s\" });\n\n // CPU-style pin traces on all four platform edges, each ending in a small\n // pad square (staggered accent ticks per edge).\n const pins: { d: string; accent: boolean }[] = [];\n const pads: { x: number; y: number; accent: boolean }[] = [];\n for (let x = 118; x <= 338; x += 20) {\n const south = (x / 20) % 4 === 0;\n const north = (x / 20) % 4 === 2;\n pins.push({ d: `M${x} 346 L${x} 366`, accent: south });\n pads.push({ x, y: 369, accent: south });\n pins.push({ d: `M${x} 110 L${x} 90`, accent: north });\n pads.push({ x, y: 87, accent: north });\n }\n for (let y = 118; y <= 338; y += 20) {\n const east = (y / 20) % 4 === 1;\n const west = (y / 20) % 4 === 3;\n pins.push({ d: `M346 ${y} L366 ${y}`, accent: east });\n pads.push({ x: 369, y, accent: east });\n pins.push({ d: `M110 ${y} L90 ${y}`, accent: west });\n pads.push({ x: 87, y, accent: west });\n }\n\n const tilePositions = [\n { left: 8, top: 8 },\n { left: 83, top: 8 },\n { left: 158, top: 8 },\n { left: 8, top: 83 },\n { left: 158, top: 83 },\n { left: 8, top: 158 },\n { left: 83, top: 158 },\n { left: 158, top: 158 },\n ];\n\n return (\n <div className=\"ods-showcase__scene\" aria-hidden=\"true\">\n <div className=\"ods-showcase__scene-stage\">\n <svg className=\"ods-showcase__wires\" width=\"460\" height=\"460\" aria-hidden=\"true\">\n {pins.map((pin) => (\n <path\n key={pin.d}\n d={pin.d}\n className={cn(\"ods-showcase__pin\", pin.accent && \"ods-showcase__pin--accent\")}\n />\n ))}\n {pads.map((pad) => (\n <rect\n key={`${pad.x}-${pad.y}`}\n x={pad.x - 2}\n y={pad.y - 2}\n width={4}\n height={4}\n className={cn(\"ods-showcase__pin-pad\", pad.accent && \"ods-showcase__pin-pad--accent\")}\n />\n ))}\n {guides.map((guide) => (\n <g key={guide.d}>\n <path d={guide.d} className=\"ods-showcase__guide\" />\n <path\n d={guide.d}\n className={cn(\n \"ods-showcase__guide-trace\",\n guide.on && \"ods-showcase__guide-trace--on\",\n )}\n style={{ animationDelay: guide.delay }}\n />\n </g>\n ))}\n </svg>\n\n {particles.map((p) => (\n <span\n key={p.key}\n className={cn(\"ods-showcase__particle\", `ods-showcase__particle--${p.variant}`)}\n style={\n {\n width: p.size,\n height: p.size,\n offsetPath: `path('${p.path}')`,\n animationDuration: p.duration,\n animationDelay: p.delay,\n } as CSSProperties\n }\n />\n ))}\n\n <div className=\"ods-showcase__platform\">\n <span className=\"ods-showcase__platform-south\" />\n <span className=\"ods-showcase__platform-east\" />\n <span className=\"ods-showcase__platform-top\" />\n {/* Capability tiles — flat by default; hovering lifts one into a\n complete mini glass cuboid (face rises, four walls fade in). */}\n {tiles.slice(0, 8).map((label, i) => (\n <span\n key={label}\n className=\"ods-showcase__tile\"\n style={{ left: tilePositions[i].left, top: tilePositions[i].top }}\n >\n <span className=\"ods-showcase__tile-flip\">\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--south\" />\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--east\" />\n </span>\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--south\" />\n <span className=\"ods-showcase__tile-wall ods-showcase__tile-wall--east\" />\n <span className=\"ods-showcase__tile-face\">{label}</span>\n </span>\n ))}\n {pulse && <span className=\"ods-showcase__core-ring\" />}\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"ods-showcase__core\"\n onClick={() => {\n firePulse();\n onCoreClick?.();\n }}\n >\n {/* Glass cuboid: translucent walls so the volume reads as a 3D\n box you can see through; the lid stays solid. The north/west\n walls REUSE the proven south/east transforms inside a 180°-\n rotated wrapper — connection to the lid is guaranteed by\n construction instead of fresh rotation math. */}\n <span className=\"ods-showcase__core-flip\">\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--south ods-showcase__core-wall--back\" />\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--east ods-showcase__core-wall--back\" />\n </span>\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--south\" />\n <span className=\"ods-showcase__core-wall ods-showcase__core-wall--east\" />\n <span className=\"ods-showcase__core-top\">{coreIcon ?? <DefaultCoreGlyph />}</span>\n </button>\n </div>\n\n <span className=\"ods-showcase__floater ods-showcase__floater--a\" />\n <span className=\"ods-showcase__floater ods-showcase__floater--b\" />\n <span className=\"ods-showcase__floater ods-showcase__floater--c\" />\n\n {!left.length && (\n <span className=\"ods-showcase__ghost\" style={{ left: 8, top: 178 }}>\n +\n </span>\n )}\n {!right.length && (\n <span className=\"ods-showcase__ghost\" style={{ left: 392, top: 178 }}>\n +\n </span>\n )}\n\n {/* Each cube sits in a STATIC preserve-3d slot with the animated\n element nested inside — the exact layering the core uses\n (platform → animated core → faces). Animating the outermost\n positioned element directly under the stage is what broke the\n cubes' 3D context; don't collapse these two layers. */}\n {left.map((node, i) => (\n <span\n key={node.connector.name}\n className=\"ods-showcase__cube-slot\"\n style={{ left: 8, top: leftYs[i] - 30 }}\n >\n <span\n className={cn(\n \"ods-showcase__cube\",\n node.active && \"ods-showcase__cube--active\",\n i % 2 ? \"ods-showcase__cube--float-b\" : \"ods-showcase__cube--float-a\",\n )}\n style={{ animationDelay: `${i * 0.15}s` }}\n >\n <span className=\"ods-showcase__cube-flip\">\n <span className=\"ods-showcase__cube-south ods-showcase__cube-wall--back\" />\n <span className=\"ods-showcase__cube-east ods-showcase__cube-wall--back\" />\n </span>\n <span className=\"ods-showcase__cube-south\" />\n <span className=\"ods-showcase__cube-east\" />\n <span className=\"ods-showcase__cube-top\">\n <CubeFace connector={node.connector} />\n </span>\n </span>\n </span>\n ))}\n {right.map((node, j) => (\n <span\n key={node.connector.name}\n className=\"ods-showcase__cube-slot\"\n style={{ left: 392, top: rightYs[j] - 30 }}\n >\n <span\n className={cn(\n \"ods-showcase__cube\",\n node.active && \"ods-showcase__cube--active\",\n j % 2 ? \"ods-showcase__cube--float-a\" : \"ods-showcase__cube--float-b\",\n )}\n style={{ animationDelay: `${j * 0.15}s` }}\n >\n <span className=\"ods-showcase__cube-flip\">\n <span className=\"ods-showcase__cube-south ods-showcase__cube-wall--back\" />\n <span className=\"ods-showcase__cube-east ods-showcase__cube-wall--back\" />\n </span>\n <span className=\"ods-showcase__cube-south\" />\n <span className=\"ods-showcase__cube-east\" />\n <span className=\"ods-showcase__cube-top\">\n <CubeFace connector={node.connector} />\n </span>\n </span>\n </span>\n ))}\n </div>\n <span className=\"ods-showcase__scene-caption\">{caption}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { FocusScope } from \"react-aria\";\nimport { Button } from \"../../../components/Button/Button\";\nimport { Input } from \"../../../components/Input/Input\";\nimport { Select } from \"../../../components/Select/Select\";\nimport {\n slugify,\n type WorkflowShowcasePhase,\n type WorkflowShowcaseSignupValues,\n} from \"./showcaseEngine\";\n\n/* ---------------------------------------------------------------------------\n * ShowcaseSignup — the conversion overlay that floats over the canvas.\n *\n * Three moments share one glass surface: the workspace form (\"signup\"),\n * the provisioning interstitial (\"creating\") and the welcome card\n * (\"welcome\"). It follows the Dialog accessibility reference: minted ids\n * wired to aria-labelledby/-describedby, focus contained + restored.\n * ------------------------------------------------------------------------- */\n\nexport interface ShowcaseSignupProps {\n phase: WorkflowShowcasePhase;\n stepCount: number;\n workspaceDomain: string;\n teamSizes: string[];\n error: string | null;\n onSubmit: (values: WorkflowShowcaseSignupValues) => void;\n onBack: () => void;\n dashboardHref?: string;\n onboardingHref?: string;\n}\n\nconst OVERLAY_MOTION = {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n};\n\nexport function ShowcaseSignup({\n phase,\n stepCount,\n workspaceDomain,\n teamSizes,\n error,\n onSubmit,\n onBack,\n dashboardHref = \"#\",\n onboardingHref = \"#\",\n}: ShowcaseSignupProps) {\n const reducedMotion = useReducedMotion();\n const titleId = useId();\n const subtitleId = useId();\n const [values, setValues] = useState<WorkflowShowcaseSignupValues>({\n name: \"\",\n email: \"\",\n company: \"\",\n teamSize: teamSizes[0] ?? \"1–10\",\n });\n\n const open = phase === \"signup\" || phase === \"creating\" || phase === \"welcome\";\n const cardMotion = reducedMotion\n ? OVERLAY_MOTION\n : {\n initial: { opacity: 0, y: 14, scale: 0.985 },\n animate: { opacity: 1, y: 0, scale: 1 },\n exit: { opacity: 0, y: 8, scale: 0.99 },\n };\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault();\n onSubmit(values);\n };\n\n const firstName = values.name.trim().split(/\\s+/)[0] || \"\";\n const emailShown = values.email.trim() || \"your inbox\";\n const slug = `${slugify(values.company)}.${workspaceDomain}`;\n\n return (\n <AnimatePresence>\n {open && (\n <motion.div\n className=\"ods-showcase__veil\"\n {...OVERLAY_MOTION}\n transition={{ duration: reducedMotion ? 0 : 0.22 }}\n >\n <FocusScope contain restoreFocus autoFocus>\n {phase === \"signup\" && (\n <motion.form\n key=\"signup\"\n className=\"ods-showcase__glass-card\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={subtitleId}\n onSubmit={handleSubmit}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onBack();\n }}\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__glass-head\">\n <h3 id={titleId} className=\"ods-showcase__glass-title\">\n Create your workspace\n </h3>\n <p id={subtitleId} className=\"ods-showcase__microcopy\">\n FREE IN PRIVATE BETA · YOUR {stepCount}-STEP WORKFLOW COMES WITH YOU\n </p>\n </div>\n <div className=\"ods-showcase__form-grid\">\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">FULL NAME</span>\n <Input\n aria-label=\"Full name\"\n autoComplete=\"name\"\n placeholder=\"Ada Lovelace\"\n value={values.name}\n onChange={(e) => setValues((v) => ({ ...v, name: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">WORK EMAIL</span>\n <Input\n aria-label=\"Work email\"\n type=\"email\"\n autoComplete=\"email\"\n placeholder=\"ada@company.com\"\n value={values.email}\n onChange={(e) => setValues((v) => ({ ...v, email: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">COMPANY</span>\n <Input\n aria-label=\"Company\"\n autoComplete=\"organization\"\n placeholder=\"Acme Inc.\"\n value={values.company}\n onChange={(e) => setValues((v) => ({ ...v, company: e.target.value }))}\n />\n </div>\n <div className=\"ods-showcase__field\">\n <span className=\"ods-showcase__field-label\">TEAM SIZE</span>\n <Select\n aria-label=\"Team size\"\n options={teamSizes.map((size) => ({ value: size, label: size }))}\n value={values.teamSize}\n onChange={(teamSize) => setValues((v) => ({ ...v, teamSize }))}\n />\n </div>\n </div>\n {error && (\n <p className=\"ods-showcase__form-error\" role=\"alert\">\n {error}\n </p>\n )}\n <div className=\"ods-showcase__glass-foot\">\n <span className=\"ods-showcase__microcopy\">\n NO CREDIT CARD · SSO & SELF-HOSTING LATER\n </span>\n <div className=\"ods-showcase__glass-actions\">\n <Button type=\"button\" variant=\"secondary\" onClick={onBack}>\n Back\n </Button>\n <Button type=\"submit\" variant=\"primary\">\n Create account & deploy →\n </Button>\n </div>\n </div>\n </motion.form>\n )}\n\n {phase === \"creating\" && (\n <motion.div\n key=\"creating\"\n className=\"ods-showcase__glass-card ods-showcase__glass-card--slim\"\n role=\"status\"\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.25 }}\n >\n <span className=\"ods-showcase__spin\" aria-hidden=\"true\">\n ⟳\n </span>\n <span className=\"ods-showcase__creating-line\">\n provisioning workspace · saving draft · inviting {emailShown}\n </span>\n </motion.div>\n )}\n\n {phase === \"welcome\" && (\n <motion.div\n key=\"welcome\"\n className=\"ods-showcase__glass-card ods-showcase__glass-card--welcome\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n {...cardMotion}\n transition={{ duration: reducedMotion ? 0 : 0.3, ease: [0.2, 0.7, 0.2, 1] }}\n >\n <div className=\"ods-showcase__glass-head\">\n <p className=\"ods-showcase__microcopy ods-showcase__microcopy--success\">\n ✓ WORKSPACE READY\n </p>\n <h3 id={titleId} className=\"ods-showcase__glass-title\">\n Welcome to OctaviaFlow{firstName ? `, ${firstName}` : \"\"}.\n </h3>\n <p className=\"ods-showcase__welcome-body\">\n We emailed a sign-in link to <strong>{emailShown}</strong>. Your {stepCount}\n -step workflow is saved as a draft in{\" \"}\n <code className=\"ods-showcase__slug\">{slug}</code> — deploy it from the\n dashboard whenever you're ready.\n </p>\n </div>\n <div className=\"ods-showcase__glass-foot\">\n <div className=\"ods-showcase__glass-actions\">\n <a className=\"ods-showcase__solid-link\" href={dashboardHref}>\n Open dashboard →\n </a>\n <a className=\"ods-showcase__text-link\" href={onboardingHref}>\n Book onboarding →\n </a>\n </div>\n <span className=\"ods-showcase__microcopy ods-showcase__microcopy--right\">\n PRIVATE BETA\n <br />\n ONBOARDING INCLUDED\n </span>\n </div>\n </motion.div>\n )}\n </FocusScope>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_react","import_react","import_react","Slot","import_jsx_runtime","Button","import_react","import_jsx_runtime","import_framer_motion","import_react","import_react_aria","import_react_dom","$1CcWn$react","$1CcWn$useState","$1CcWn$useRef","$1CcWn$useEffect","$1CcWn$useReducer","$1CcWn$useCallback","value","$8AuPP$createContext","$8AuPP$useMemo","$8AuPP$useContext","name","$8AuPP$useState","$8AuPP$useRef","$8AuPP$useEffect","value","a","a","$7w3VE$useRef","$7w3VE$useState","$7w3VE$useMemo","$7w3VE$useEffect","$jO8i1$react","items","node","$emYU7$useMemo","$3yt54$useMemo","$3yt54$useCallback","$3yt54$useRef","$3yt54$useEffect","$kE40A$useCallback","$dJmKC$react","$5t5rb$useState","$5t5rb$useMemo","value","focusStrategy","$auOuY$useMemo","$auOuY$useRef","$auOuY$useEffect","import_icons","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime","Select","import_react","import_react_aria","import_react_dom","import_icons","import_react","import_react","import_icons","import_react","import_jsx_runtime","import_jsx_runtime","Textarea","import_jsx_runtime","import_react","import_react","import_jsx_runtime","Avatar","AvatarStack","import_framer_motion","import_react","import_jsx_runtime","Card","CardHeader","CardBody","CardFooter","CardTitle","CardDescription","import_jsx_runtime","BlogCard","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_icons","import_framer_motion","import_react","import_jsx_runtime","Accordion","import_jsx_runtime","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","Spinner","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_framer_motion","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_icons","import_jsx_runtime","import_framer_motion","import_react","import_jsx_runtime","CountUp","import_jsx_runtime","import_icons","import_react","import_jsx_runtime","TestimonialCard","import_jsx_runtime","import_framer_motion","import_react","import_react","import_jsx_runtime","base","import_framer_motion","import_react","import_react_aria","import_jsx_runtime","import_jsx_runtime"]}
|