@mdxui/services 0.3.0 → 0.4.0
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/components/index.d.ts +18 -3
- package/dist/components/index.js +163 -31
- package/dist/components/index.js.map +1 -1
- package/dist/{index-D2nWoFGI.d.ts → index-DNgc8Joy.d.ts} +33 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +339 -192
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.js +14 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/shared/index.d.ts +7 -1
- package/dist/shared/index.js +3 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/styles.css +9 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/scroll-reveal.tsx","../src/components/Masthead.tsx","../src/components/ScrollHeader.tsx","../src/components/Footer.tsx","../src/components/HeroSplit.tsx","../src/components/HeroStacked.tsx","../src/components/Hero.tsx","../src/shared/section-eyebrow.tsx","../src/components/Problem.tsx","../src/components/WhatYouGet.tsx","../src/components/HowItWorks.tsx","../src/components/Defensibility.tsx","../src/components/Pricing.tsx","../src/components/Faq.tsx","../src/components/FinalCta.tsx","../src/views/ServicesLandingView.tsx","../src/shared/svg-inline.tsx","../src/parse-props.ts","../src/schemas/index.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * ScrollReveal — dialect-wide scroll-driven fade-in wrapper.\n *\n * Each landing section fades in once when it enters the viewport. ONE fixed\n * duration + ONE fixed easing for every section across every service — motion\n * is package-owned, NOT theme-controllable.\n *\n * Duration + easing read from `--motion-fade-duration` +\n * `--motion-fade-easing` CSS variables (the host's globals define them; under\n * `prefers-reduced-motion: reduce` the duration token collapses to `0ms` so the\n * fade becomes instant with zero JS branching here).\n *\n * Behavior:\n * • One-shot — once `data-visible=\"true\"` flips, the observer disconnects.\n * • SSR-safe — if `IntersectionObserver` isn't defined, the wrapper reveals\n * immediately rather than trapping content invisible.\n * • Threshold 0.1 — section starts revealing as ~10% crosses the viewport edge.\n */\nexport interface ScrollRevealProps {\n children: React.ReactNode\n}\n\nexport function ScrollReveal({ children }: ScrollRevealProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n\n // SSR-safe fallback: in environments without IntersectionObserver,\n // reveal immediately so content isn't trapped invisible.\n if (typeof IntersectionObserver === 'undefined') {\n setVisible(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setVisible(true)\n observer.disconnect()\n }\n },\n { threshold: 0.1 },\n )\n\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n return (\n <div\n ref={ref}\n data-scroll-reveal\n data-visible={visible}\n style={{\n opacity: visible ? 1 : 0,\n transition:\n 'opacity var(--motion-fade-duration) var(--motion-fade-easing)',\n }}\n >\n {children}\n </div>\n )\n}\n","/** Static masthead at the top of a service page. Pairs with ScrollHeader,\n * which reveals on scroll once this one has scrolled away.\n *\n * Right-side slot is either a primary CTA pill (`cta`) or a small uppercase\n * status label (`eyebrow`) — passing both lets `cta` win. Use `narrow` when\n * the page below uses the 900px container instead of the default 1100px. */\n\nimport Link from 'next/link'\nimport * as schemas from '../schemas'\n\nexport type MastheadProps = schemas.MastheadProps\n\nexport function Masthead({ brand, cta, eyebrow, narrow }: MastheadProps) {\n return (\n <header className=\"border-b border-line\">\n <div\n className={\n 'mx-auto flex items-center justify-between gap-4 px-6 py-5 sm:px-10 ' +\n (narrow ? 'max-w-[900px]' : 'max-w-container')\n }\n >\n <div className=\"flex items-center gap-3\">\n <Link\n href={brand.href}\n className=\"font-display text-[18px] tracking-tightish text-ink\"\n >\n {brand.primary}\n </Link>\n {brand.secondary && (\n <>\n <span className=\"hidden h-4 w-px bg-line2 sm:inline-block\" />\n <span className=\"hidden text-[11px] uppercase tracking-[0.18em] text-ink3 sm:inline\">\n {brand.secondary}\n </span>\n </>\n )}\n </div>\n {cta ? (\n <Link\n href={cta.href}\n // Theme-driven CTA recipe — see Hero.tsx.\n className=\"rounded-cta bg-cta px-4 py-2 text-[12px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover\"\n >\n {cta.label}\n </Link>\n ) : eyebrow ? (\n <span className=\"text-[10.5px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </span>\n ) : null}\n </div>\n </header>\n )\n}\n","'use client'\n\n/**\n * Reveals on scroll past `threshold` pixels and stays fixed at the top of the\n * viewport. Renders the same `Masthead` component used at the top of the page so\n * the two are visually identical — the scroll variant is `Masthead` inside a\n * fixed-positioned sliding wrapper, never both visible at once.\n */\n\nimport { useEffect, useState } from 'react'\nimport { Masthead, type MastheadProps } from './Masthead'\n\nexport interface ScrollHeaderProps extends MastheadProps {\n /** Pixels of scrollY before the header reveals. Default 480. */\n threshold?: number\n}\n\nexport function ScrollHeader({\n threshold = 480,\n ...mastheadProps\n}: ScrollHeaderProps) {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n let raf = 0\n const update = () => {\n raf = 0\n setVisible(window.scrollY > threshold)\n }\n const onScroll = () => {\n if (raf) return\n raf = requestAnimationFrame(update)\n }\n update()\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => {\n window.removeEventListener('scroll', onScroll)\n if (raf) cancelAnimationFrame(raf)\n }\n }, [threshold])\n\n return (\n <div\n aria-hidden={!visible}\n className={\n 'pointer-events-none fixed inset-x-0 top-0 z-40 transition-[transform,opacity] duration-[220ms] ease-out-quart ' +\n (visible\n ? 'translate-y-0 opacity-100'\n : '-translate-y-full opacity-0')\n }\n >\n <div className=\"pointer-events-auto bg-paper shadow-sheet\">\n <Masthead {...mastheadProps} />\n </div>\n </div>\n )\n}\n","/** Page footer with attribution text on the left and an optional legal-link\n * list (Privacy, Terms) on the right. */\n\nimport Link from 'next/link'\nimport * as schemas from '../schemas'\n\nexport type FooterLink = schemas.SiteFooterLink\n\nexport type FooterProps = schemas.SiteFooterProps\n\nexport function Footer({ text, links }: FooterProps) {\n return (\n <footer className=\"border-t border-line\">\n <div className=\"mx-auto flex max-w-container flex-col items-center gap-4 px-6 py-10 text-center text-[12px] text-ink3 sm:flex-row sm:justify-between sm:px-10 sm:text-left\">\n <p>{text}</p>\n {links && links.length > 0 && (\n <ul className=\"flex flex-wrap items-center justify-center gap-x-5 gap-y-2 sm:justify-end\">\n {links.map((l) => (\n <li key={l.href}>\n <Link\n href={l.href}\n className=\"text-ink3 no-underline transition-colors hover:text-ink\"\n >\n {l.label}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n </footer>\n )\n}\n","/** Hero variant: split-illustration-right.\n *\n * Text-left + ~360px illustration column on lg+. The Services-dialect hero\n * layout — outcome-led grammar (eyebrow / headline / body / primary /\n * secondary), NOT neo's code-bento hero with `installSnippet`.\n *\n * The illustration column accepts either:\n * 1. A custom `illustration` prop (raw ReactNode, used by the per-service\n * illustration manifest AND by per-product HeroGlyph SVGs)\n * 2. The dialect default `<HeroGlyph />` when no custom one provided\n * 3. Nothing at all when `showGlyph={false}` (text-only hero)\n *\n * Pairs with the `glyphOnMobile` prop to control mobile rendering. */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\n\nimport * as schemas from '../schemas'\n\n/** Inline call-to-action. Sourced from the schema — `SiteActionSchema`. */\nexport type HeroAction = schemas.SiteAction\n\n/** Hero component props. Sourced from the schema (`HeroPropsExtendedSchema`).\n * The schema is the canonical shape; this component reads `variant`,\n * `showGlyph`, `glyphOnMobile`, `illustration` from it. */\nexport type HeroProps = schemas.HeroPropsExtended\n\nexport function HeroSplit({\n eyebrow,\n headline,\n body,\n primary,\n secondary,\n showGlyph = true,\n /* INTENTIONALLY UNDEFAULTED — the smart default below uses the\n * undefined state to distinguish \"explicitly unset\" from\n * \"explicitly false\" (the opt-out escape hatch). */\n glyphOnMobile,\n illustration,\n}: HeroProps) {\n /* Smart mobile-visibility default for hero illustrations.\n *\n * - Explicit `glyphOnMobile: true` → show on mobile\n * - Explicit `glyphOnMobile: false` → hide on mobile (opt-out)\n * - Unset + bespoke `illustration` → DEFAULT TRUE (bespoke illustrations\n * ARE the value-prop preview and must show on mobile)\n * - Unset + no illustration (HeroGlyph renders) → DEFAULT FALSE\n */\n const effectiveGlyphOnMobile = glyphOnMobile ?? Boolean(illustration)\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32\">\n <div className={showGlyph ? 'lg:grid lg:grid-cols-[minmax(0,1fr)_360px] lg:items-center lg:gap-16' : ''}>\n <div>\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h1 className=\"mt-5 max-w-[18ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink\">\n {headline}\n </h1>\n <p className=\"mt-6 max-w-[58ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]\">\n {body}\n </p>\n <div className=\"mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <PrimaryAction action={primary} />\n {secondary && <SecondaryAction action={secondary} />}\n </div>\n </div>\n {showGlyph && (\n <div\n className={\n effectiveGlyphOnMobile\n ? 'mt-12 lg:mt-0 lg:block'\n : 'hidden lg:block'\n }\n aria-hidden=\"true\"\n >\n {illustration ?? <HeroGlyph />}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport function PrimaryAction({ action }: { action: HeroAction }) {\n // Theme-driven CTA recipe. `bg-cta / bg-cta-hover / text-cta-fg` resolve via\n // `--cta-*` vars set by `@mdxui/themes`' `themeToCssVars()` per theme.\n const className =\n 'inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-5 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto sm:justify-start'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </Link>\n )\n}\n\nexport function SecondaryAction({ action }: { action: HeroAction }) {\n const className =\n 'inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink2 transition-colors hover:text-accentDeep sm:justify-start'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </Link>\n )\n}\n\n/** Sparse geometric mark: stack of comp lines, median emphasized in\n * accent teal, range bracket on the right. Default for split-variant\n * heroes that don't pass a custom `illustration`. */\nfunction HeroGlyph() {\n return (\n <svg\n viewBox=\"0 0 360 280\"\n className=\"h-auto w-full\"\n fill=\"none\"\n role=\"presentation\"\n >\n <g\n stroke=\"oklch(var(--ink3) / 0.55)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <line x1=\"40\" y1=\"40\" x2=\"180\" y2=\"40\" />\n <line x1=\"60\" y1=\"78\" x2=\"220\" y2=\"78\" />\n <line x1=\"40\" y1=\"172\" x2=\"200\" y2=\"172\" />\n <line x1=\"80\" y1=\"210\" x2=\"260\" y2=\"210\" />\n <line x1=\"60\" y1=\"248\" x2=\"180\" y2=\"248\" />\n </g>\n <line\n x1=\"40\"\n y1=\"135\"\n x2=\"280\"\n y2=\"135\"\n stroke=\"oklch(var(--accent))\"\n strokeWidth=\"2.75\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"280\" cy=\"135\" r=\"4\" fill=\"oklch(var(--accent-deep))\" />\n <g\n stroke=\"oklch(var(--accent-deep) / 0.85)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n >\n <line x1=\"312\" y1=\"100\" x2=\"312\" y2=\"170\" />\n <line x1=\"306\" y1=\"100\" x2=\"318\" y2=\"100\" />\n <line x1=\"306\" y1=\"170\" x2=\"318\" y2=\"170\" />\n <line x1=\"308\" y1=\"135\" x2=\"316\" y2=\"135\" />\n </g>\n </svg>\n )\n}\n","/** Hero variant: stacked-illustration-below.\n *\n * Text-center top + illustration centered below at ~1080px cap. For services\n * whose hero illustration needs full-bleed scale — code editors, spreadsheets,\n * dashboard mockups — that would feel cramped in the 360px split slot.\n *\n * Unlike HeroSplit, this variant has NO default glyph fallback — the\n * dispatcher in `./Hero.tsx` only routes here when an `illustration` is\n * provided. Services without a bespoke illustration fall back to HeroSplit\n * (which has the `<HeroGlyph />` default mark). */\n\nimport type { HeroProps } from './HeroSplit'\nimport { PrimaryAction, SecondaryAction } from './HeroSplit'\n\nexport function HeroStacked({\n eyebrow,\n headline,\n body,\n primary,\n secondary,\n illustration,\n}: HeroProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32\">\n <div className=\"text-center\">\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h1 className=\"mx-auto mt-5 max-w-[22ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink\">\n {headline}\n </h1>\n <p className=\"mx-auto mt-6 max-w-[60ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]\">\n {body}\n </p>\n <div className=\"mt-10 flex flex-col items-stretch justify-center gap-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <PrimaryAction action={primary} />\n {secondary && <SecondaryAction action={secondary} />}\n </div>\n </div>\n {/* Illustration sits below text, capped at 1080px so it feels\n * substantial without bullying the page. */}\n <div className=\"mx-auto mt-14 max-w-[1080px] sm:mt-16\" aria-hidden=\"true\">\n {illustration}\n </div>\n </div>\n </section>\n )\n}\n","/** ServiceHero — Services-dialect hero composition dispatcher.\n *\n * Routes to the variant render based on `variant` (from the\n * `HeroPropsExtendedSchema`). Default is `'split-illustration-right'`\n * (`HeroSplit`). Adding a future variant = new `Hero<Name>.tsx` file + one\n * additional dispatcher branch here. */\n\nimport { HeroSplit, type HeroAction, type HeroProps } from './HeroSplit'\nimport { HeroStacked } from './HeroStacked'\n\nexport type { HeroAction, HeroProps }\n\nexport function Hero(props: HeroProps) {\n if (props.variant === 'stacked-illustration-below' && props.illustration) {\n return <HeroStacked {...props} />\n }\n return <HeroSplit {...props} />\n}\n\n/** Services-dialect alias — the dialect names this block `ServiceHero`\n * (ADR 0003 §3). Same component as `Hero`. */\nexport { Hero as ServiceHero }\n","/** Small uppercase label that anchors a section heading. */\n\nexport function SectionEyebrow({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {children}\n </p>\n )\n}\n","/** Three-card \"problem\" section. Each card has a category label, a\n * cost line, a one-line outcome verdict, and a body paragraph. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type ProblemItem = schemas.ProblemItem\n\nexport type ProblemProps = schemas.ProblemProps\n\nexport function Problem({ eyebrow, heading, items }: ProblemProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-12 grid gap-8 md:grid-cols-3\">\n {items.map((item) => (\n <ProblemCard key={item.label} {...item} />\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nfunction ProblemCard({ label, cost, outcome, body }: ProblemItem) {\n return (\n <article>\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n {label}\n </p>\n <p className=\"mt-3 font-display text-[24px] leading-tight tracking-tightish text-ink\">\n {cost}\n </p>\n <p className=\"mt-4 text-body-sm font-medium leading-snug tracking-tightish text-accentDeep\">\n {outcome}\n </p>\n <p className=\"mt-3 text-body-sm leading-relaxed text-ink2\">{body}</p>\n </article>\n )\n}\n","/** \"What's in the report\" — numbered grid listing each section. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type WhatYouGetItem = schemas.WhatYouGetItem\n\nexport type WhatYouGetProps = schemas.WhatYouGetProps\n\nexport function WhatYouGet({ eyebrow, heading, sections }: WhatYouGetProps) {\n // Empty-array graceful handling — skip the section entirely rather\n // than render dangling chrome (eyebrow + heading) above an empty grid.\n if (sections.length === 0) return null\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <ul className=\"mt-12 grid gap-x-8 gap-y-7 md:grid-cols-2 lg:grid-cols-3\">\n {sections.map((s) => (\n <li key={s.n}>\n <p className=\"font-display text-[14px] tracking-tightish text-ink3\">\n {s.n}\n </p>\n <p className=\"mt-1.5 text-[15px] font-medium tracking-tightish text-ink\">\n {s.title}\n </p>\n <p className=\"mt-1.5 text-[13.5px] leading-relaxed text-ink2\">\n {s.body}\n </p>\n </li>\n ))}\n </ul>\n </div>\n </section>\n )\n}\n","/** Three-column \"how it works\" strip with large numbered eyebrows.\n *\n * Optional per-step illustration row above the number — opt in by passing\n * `stepIllustrations` (a `ComponentType[]` matching `steps.length`). When the\n * lengths don't match (or the prop is absent), the text-only layout renders\n * unchanged. Opt-in only, never degrade. */\n\nimport type { ComponentType } from 'react'\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type HowItWorksStep = schemas.HowItWorksStep\n\n/** HowItWorks component props. Sourced from `HowItWorksPropsSchema`, which\n * includes the opt-in `stepIllustrations` field. */\nexport type HowItWorksProps = schemas.HowItWorksProps\n\nexport function HowItWorks({\n eyebrow,\n heading,\n steps,\n stepIllustrations,\n}: HowItWorksProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (steps.length === 0) return null\n const hasIllustrations =\n stepIllustrations !== undefined &&\n stepIllustrations.length === steps.length\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <ol\n itemScope\n itemType=\"https://schema.org/HowTo\"\n className=\"mt-12 grid gap-10 md:grid-cols-3\"\n >\n {steps.map((s, i) => (\n <Step\n key={s.n}\n {...s}\n illustration={hasIllustrations ? stepIllustrations![i] : undefined}\n />\n ))}\n </ol>\n </div>\n </section>\n )\n}\n\nfunction Step({\n n,\n title,\n body,\n illustration: Illustration,\n}: HowItWorksStep & { illustration?: ComponentType }) {\n /* When step illustrations are present, the parent grid stretches all <li>s to\n * the height of the tallest column; the flex-col + `mt-auto` on the text block\n * pushes numbers / titles / bodies to a shared baseline. Without an\n * illustration, content flows naturally from the top (text-only layout). */\n return (\n <li\n itemScope\n itemType=\"https://schema.org/HowToStep\"\n className={Illustration ? 'flex flex-col' : undefined}\n >\n {Illustration && (\n <div className=\"mb-6 w-full lg:max-w-[320px]\">\n <Illustration />\n </div>\n )}\n <div className={Illustration ? 'mt-auto' : undefined}>\n <p className=\"font-display text-[36px] leading-none tracking-tighter2 text-ink3/60\">\n {n}\n </p>\n <p className=\"mt-4 font-display text-[20px] leading-tight tracking-tightish text-ink\">\n {title}\n </p>\n <p className=\"mt-3 text-body-sm leading-relaxed text-ink2\">{body}</p>\n </div>\n </li>\n )\n}\n","/** Two-column \"what it is / what it isn't\" block with a closing caveat\n * paragraph — THE Services signature block (ADR 0003 §3). Used to set scope\n * expectations on a service page. No neo equivalent. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type DefensibilityColumn = schemas.DefensibilityColumnFromSchema\n\nexport type DefensibilityProps = schemas.DefensibilityPropsFromSchema\n\nexport function Defensibility({\n eyebrow,\n heading,\n columns,\n caveat,\n}: DefensibilityProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-10 grid gap-10 lg:grid-cols-2\">\n {columns.map((col) => (\n <Column key={col.heading} {...col} />\n ))}\n </div>\n {caveat && (\n <p className=\"mt-12 max-w-[68ch] text-body-xs leading-relaxed text-ink3\">\n {caveat}\n </p>\n )}\n </div>\n </section>\n )\n}\n\nfunction Column({ heading, bullets }: DefensibilityColumn) {\n return (\n <div>\n <h3 className=\"font-display text-[18px] leading-tight tracking-tightish text-ink\">\n {heading}\n </h3>\n <ul className=\"mt-4 space-y-3 text-body-sm leading-relaxed text-ink2\">\n {bullets.map((b, i) => (\n <li key={i} className=\"flex gap-2.5\">\n <span className=\"mt-2 h-1 w-1 shrink-0 rounded-full bg-ink3\" />\n <span>{b}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","/** ReportPricing — the Services-dialect pricing section. Two variants on the\n * discriminated `Pricing` union:\n *\n * - `kind: 'tiered'` — renders 1, 2, or 3 tier cards. CTAs flex to the bottom\n * of each card so heights stay symmetric.\n * - `kind: 'unit'` — renders a single per-unit price (\"$3 per transcript\"\n * style) with billing cadence. No tier chrome, no per-tier CTA.\n *\n * Services grammar: \"per report, no subscription\" — NOT neo's subscription\n * tier pricing. The default price suffix is \"/ report\". */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type PriceTier = schemas.PriceTier\n\n/** Legacy tiered-only props shape (omits `kind` + `currency`). The component\n * accepts EITHER this OR the wider discriminated `Pricing` union. */\nexport type PricingProps = schemas.PricingPropsExtended\n\n/** The canonical discriminated `Pricing` union (carries `kind: 'unit'`). */\nexport type PricingData = schemas.Pricing\n\n/** Component-level accepted props: the legacy tiered-only shape OR the\n * discriminated `Pricing` union. The component branches on `kind` internally. */\nexport type PricingComponentProps = PricingProps | PricingData\n\nconst GRID_COLS: Record<1 | 2 | 3, string> = {\n 1: 'max-w-[420px]',\n 2: 'max-w-[820px] md:grid-cols-2',\n 3: 'max-w-container md:grid-cols-3',\n}\n\nexport function Pricing(props: PricingComponentProps) {\n if ('kind' in props && props.kind === 'unit') {\n return <UnitPricing {...props} />\n }\n // Both legacy `PricingProps` (no `kind`) and `PricingTiered`\n // (`kind: 'tiered'`) hit this branch — both carry `tiers[]`.\n return <TieredPricing {...(props as TieredRenderProps)} />\n}\n\ntype TieredRenderProps = {\n eyebrow: string\n heading: string\n tiers: readonly PriceTier[]\n footnote?: string\n}\n\nfunction TieredPricing({\n eyebrow,\n heading,\n tiers,\n footnote,\n}: TieredRenderProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (tiers.length === 0) return null\n const count = (\n tiers.length === 1 || tiers.length === 2 ? tiers.length : 3\n ) as 1 | 2 | 3\n return (\n <section className=\"border-b border-line bg-surface\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className={`mt-12 mx-auto grid gap-6 ${GRID_COLS[count]}`}>\n {tiers.map((t) => (\n <PriceCard key={t.tier} {...t} />\n ))}\n </div>\n {footnote && (\n <p className=\"mt-10 max-w-[64ch] text-[13px] text-ink3\">{footnote}</p>\n )}\n </div>\n </section>\n )\n}\n\n/** Format a per-unit price using `Intl.NumberFormat`. Trims trailing\n * zero-cents for clean reading (\"$3\" not \"$3.00\"). */\nfunction formatPerUnit(perUnit: number, currency: 'usd' | 'eur' | 'gbp'): string {\n const isWhole = Number.isInteger(perUnit)\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n minimumFractionDigits: isWhole ? 0 : 2,\n maximumFractionDigits: 2,\n }).format(perUnit)\n}\n\nfunction UnitPricing({\n eyebrow,\n heading,\n footnote,\n currency,\n perUnit,\n billingCadence,\n}: Extract<PricingData, { kind: 'unit' }>) {\n const formatted = formatPerUnit(perUnit, currency)\n return (\n <section className=\"border-b border-line bg-surface\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-12 mx-auto max-w-[420px]\">\n <article\n itemScope\n itemType=\"https://schema.org/Offer\"\n data-pricing-kind=\"unit\"\n className=\"flex flex-col rounded-card border border-line bg-paper p-7\"\n >\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n Per call\n </p>\n <p className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"font-display text-[40px] leading-none tracking-tighter2 text-ink\">\n {formatted}\n </span>\n <span className=\"text-[12px] text-ink3\">{billingCadence}</span>\n </p>\n </article>\n </div>\n {footnote && (\n <p className=\"mt-10 max-w-[64ch] text-[13px] text-ink3\">{footnote}</p>\n )}\n </div>\n </section>\n )\n}\n\n/** Split a price string like \"$0.10/VIN\" into (\"$0.10\", \"/VIN\"). */\nfunction splitPrice(price: string): { core: string; suffix: string | null } {\n const i = price.indexOf('/')\n if (i === -1) return { core: price, suffix: null }\n return { core: price.slice(0, i).trim(), suffix: price.slice(i) }\n}\n\n/** Resolve the suffix shown after the price. Explicit per-tier `priceSuffix`\n * wins; otherwise an auto-extracted \"/X\"; otherwise the dialect default\n * \"/ report\" (the \"per report, no subscription\" Services grammar). */\nfunction resolvePriceSuffix(\n price: string,\n override: string | undefined,\n): string {\n if (override !== undefined) return override\n const { suffix } = splitPrice(price)\n return suffix ?? '/ report'\n}\n\nfunction PriceCard({\n tierKey,\n tier,\n price,\n priceSuffix,\n audience,\n features,\n featured,\n cta,\n}: PriceTier) {\n const isMailto = cta.href.startsWith('mailto:')\n const { core } = splitPrice(price)\n const suffix = resolvePriceSuffix(price, priceSuffix)\n return (\n <article\n itemScope\n itemType=\"https://schema.org/Offer\"\n data-tier-key={tierKey}\n className={\n 'flex flex-col rounded-card border bg-paper p-7 ' +\n (featured ? 'border-accent shadow-lift' : 'border-line')\n }\n >\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n {tier}\n </p>\n <p className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"font-display text-[40px] leading-none tracking-tighter2 text-ink\">\n {core}\n </span>\n {suffix && <span className=\"text-[12px] text-ink3\">{suffix}</span>}\n </p>\n <p className=\"mt-2 text-[13px] text-ink2\">{audience}</p>\n <ul className=\"mt-6 flex-1 space-y-2.5 text-[13.5px] text-ink2\">\n {features.map((f) => (\n <li key={f} className=\"flex gap-2.5\">\n <span\n className={\n 'mt-2 h-1 w-1 shrink-0 rounded-full ' +\n (featured ? 'bg-accent' : 'bg-ink3')\n }\n />\n <span>{f}</span>\n </li>\n ))}\n </ul>\n <PriceCardCta\n label={cta.label}\n href={cta.href}\n featured={featured}\n external={isMailto}\n />\n </article>\n )\n}\n\nfunction PriceCardCta({\n label,\n href,\n featured,\n external,\n}: {\n label: string\n href: string\n featured?: boolean\n external?: boolean\n}) {\n const baseClass =\n 'mt-7 inline-flex w-full items-center justify-center gap-1.5 rounded-cta px-5 py-2.5 text-[13.5px] font-medium tracking-tightish transition-colors'\n // Theme-driven CTA recipe for the featured tier. The unfeatured (outlined)\n // variant stays ink-typed as a quiet secondary action.\n const variantClass = featured\n ? 'bg-cta text-cta-fg hover:bg-cta-hover'\n : 'border border-line2 bg-paper text-ink hover:border-ink hover:text-ink'\n const className = `${baseClass} ${variantClass}`\n const body = (\n <>\n {label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </>\n )\n if (external) {\n return (\n <a className={className} href={href} data-action=\"buy\">\n {body}\n </a>\n )\n }\n return (\n <Link className={className} href={href} data-action=\"buy\">\n {body}\n </Link>\n )\n}\n\n/** Services-dialect alias — the dialect names this block `ReportPricing`\n * (ADR 0003 §3: \"per report, no subscription\"). Same component as `Pricing`. */\nexport { Pricing as ReportPricing }\n","/** Two-column FAQ grid. Each item is a question (display serif) and an\n * answer paragraph (sans). Uses Services' short-key q/a convention. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type FaqItem = schemas.FaqItem\n\nexport type FaqProps = schemas.FaqPropsExtended\n\nexport function Faq({ eyebrow, heading, items }: FaqProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (items.length === 0) return null\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[20ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <dl className=\"mt-12 grid gap-x-12 gap-y-10 md:grid-cols-2\">\n {items.map((f) => (\n <div key={f.q} itemScope itemType=\"https://schema.org/Question\">\n <dt className=\"font-display text-body leading-snug tracking-tightish text-ink\">\n {f.q}\n </dt>\n <dd className=\"mt-2 text-body-sm leading-relaxed text-ink2\">\n {f.a}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n </section>\n )\n}\n","/** Closing call-to-action with a centered headline and one or two buttons.\n * Primary is always rendered; secondary is optional and rendered as a quieter\n * link beside the primary pill. */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\nimport * as schemas from '../schemas'\n\nexport type FinalCtaProps = schemas.FinalCtaProps\n\ntype CtaAction = schemas.SiteAction\n\nexport function FinalCta({\n eyebrow,\n headline,\n primary,\n secondary,\n}: FinalCtaProps) {\n return (\n <section>\n <div className=\"mx-auto max-w-container px-6 py-20 text-center sm:px-10 sm:py-32\">\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h2 className=\"mx-auto mt-4 max-w-[22ch] font-display text-[36px] leading-[1.04] tracking-tighter2 text-ink sm:text-[52px]\">\n {headline}\n </h2>\n <div className=\"mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center\">\n <PrimaryButton action={primary} />\n {secondary && <SecondaryLink action={secondary} />}\n </div>\n </div>\n </section>\n )\n}\n\nfunction PrimaryButton({ action }: { action: CtaAction }) {\n // Theme-driven CTA recipe — see Hero.tsx for context.\n const className =\n 'inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-6 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto'\n const body = (\n <>\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </>\n )\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {body}\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {body}\n </Link>\n )\n}\n\nfunction SecondaryLink({ action }: { action: CtaAction }) {\n const className =\n 'inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink3 transition-colors hover:text-ink'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n </Link>\n )\n}\n","/**\n * ServicesLandingView — the Services dialect's single high-level view (ADR 0003\n * §2, design note §6). Renders the full Services narrative arc from one\n * validated `content` bag:\n *\n * masthead → hero → problem → what-you-get → how-it-works → defensibility\n * → pricing → faq → final-cta → footer\n *\n * This is the package-internal equivalent of carriage's `/[slug]/page.tsx` body.\n * After W-B4, carriage's landing route becomes:\n *\n * const catalog = deriveCatalog(svc) // carriage keeps the derive layer\n * return <ServicesLandingView content={catalog} />\n *\n * Every section is fed its slice of the content bag. Optional sections render\n * only when their slice is present; the empty-array guards inside each section\n * component handle the \"present but empty\" case. Chrome (Masthead / ScrollHeader\n * / Footer) is NOT wrapped in ScrollReveal — only narrative sections are.\n */\n\nimport { ScrollReveal } from '../shared/scroll-reveal'\nimport { Masthead } from '../components/Masthead'\nimport { ScrollHeader } from '../components/ScrollHeader'\nimport { Footer } from '../components/Footer'\nimport { Hero } from '../components/Hero'\nimport { Problem } from '../components/Problem'\nimport { WhatYouGet } from '../components/WhatYouGet'\nimport { HowItWorks } from '../components/HowItWorks'\nimport { Defensibility } from '../components/Defensibility'\nimport { Pricing } from '../components/Pricing'\nimport { Faq } from '../components/Faq'\nimport { FinalCta } from '../components/FinalCta'\nimport { DialectShell } from '@mdxui/dialect'\nimport type { DialectViewProps } from '@mdxui/dialect'\n\nimport type {\n MastheadProps,\n SiteFooterProps,\n HeroPropsExtended,\n ProblemProps,\n WhatYouGetProps,\n HowItWorksProps,\n DefensibilityPropsFromSchema,\n PricingPropsExtended,\n Pricing as PricingUnion,\n FaqPropsExtended,\n FinalCtaProps,\n} from '../schemas'\n\n/**\n * The validated content bag for a Services landing page — the union of every\n * section's prop slice. Carriage's `deriveCatalog(svc)` output maps onto this\n * shape; a generated Startup's mapper produces the same bag from the wire type.\n */\nexport interface ServicesLandingContent {\n /** Top masthead + the scroll-revealed sticky header (same props). */\n masthead: MastheadProps\n /** Pixels of scrollY before the sticky ScrollHeader reveals. Default 480. */\n scrollHeaderThreshold?: number\n hero: HeroPropsExtended\n /** When true, the hero renders its illustration slot; default true. */\n heroShowGlyph?: boolean\n problem?: ProblemProps\n whatYouGet?: WhatYouGetProps\n howItWorks?: HowItWorksProps\n defensibility?: DefensibilityPropsFromSchema\n /** Tiered or unit pricing — the discriminated `Pricing` union, or the legacy\n * tiered-only `PricingPropsExtended` shape. */\n pricing?: PricingPropsExtended | PricingUnion\n faq?: FaqPropsExtended\n finalCta: FinalCtaProps\n footer: SiteFooterProps\n}\n\n/**\n * Uniform dialect contract (ui#30): `{ content, theme, mode, brandName,\n * hostname }`, same as the agent dialects. Services drives its chrome from the\n * `content` bag (masthead / footer), so it ignores brandName/hostname, but it\n * accepts them so the renderer + cascade consume every dialect identically.\n */\nexport type ServicesLandingViewProps = DialectViewProps<ServicesLandingContent>\n\nexport function ServicesLandingView({ content, theme, mode }: ServicesLandingViewProps) {\n return (\n // texture off: the editorial Services surface keeps its own treatment; the\n // shell's only job here is the <Site> theming envelope (services previously\n // wrapped none, relying on the consumer — now it's self-contained).\n <DialectShell theme={theme} mode={mode} texture={false}>\n {/* Scope wrapper for the carriage theme envelope. `@mdxui/services/styles.css`\n scopes ALL carriage tokens/utilities (Fraunces --font-display, the\n ink/surface/cta palette, text-display-* ramp, rounded-cta, etc.) under\n this `data-dialect=\"services\"` selector so they light up here WITHOUT\n colliding with the host's global --font-display/--accent (which the\n other dialects depend on). The package ships JSX referencing these\n tokens; the CSS ships their definitions — consumers\n `@import \"@mdxui/services/styles.css\"`. */}\n <div data-dialect=\"services\">\n <Masthead {...content.masthead} />\n <ScrollHeader\n {...content.masthead}\n threshold={content.scrollHeaderThreshold}\n />\n\n <main>\n <ScrollReveal>\n <Hero {...content.hero} showGlyph={content.heroShowGlyph} />\n </ScrollReveal>\n\n {content.problem && (\n <ScrollReveal>\n <Problem {...content.problem} />\n </ScrollReveal>\n )}\n\n {content.whatYouGet && (\n <ScrollReveal>\n <WhatYouGet {...content.whatYouGet} />\n </ScrollReveal>\n )}\n\n {content.howItWorks && (\n <ScrollReveal>\n <HowItWorks {...content.howItWorks} />\n </ScrollReveal>\n )}\n\n {content.defensibility && (\n <ScrollReveal>\n <Defensibility {...content.defensibility} />\n </ScrollReveal>\n )}\n\n {content.pricing && (\n <ScrollReveal>\n <Pricing {...content.pricing} />\n </ScrollReveal>\n )}\n\n {content.faq && (\n <ScrollReveal>\n <Faq {...content.faq} />\n </ScrollReveal>\n )}\n\n <ScrollReveal>\n <FinalCta {...content.finalCta} />\n </ScrollReveal>\n </main>\n\n <Footer {...content.footer} />\n </div>\n </DialectShell>\n )\n}\n","/**\n * SvgInline — render a raw SVG markup string inside a sized container.\n *\n * Used to consume `ServiceBranding.heroGlyph` — JSON-driven services author\n * their hero illustration as an inline SVG string.\n *\n * Trust model: the SVG markup originates from a service-definition JSON file\n * authored by the service generator or a human at absorption time. It is NOT\n * untrusted user input; treat it as trusted asset content rendered via\n * `dangerouslySetInnerHTML`.\n *\n * Authoring rules (enforced at JSON-write time, not runtime):\n * - Single `<svg>` root element with a `viewBox` attribute.\n * - No `<script>` tags, no event handlers, no external references.\n * - Use theme tokens (`oklch(var(--accent))`, `oklch(var(--ink3) / 0.55)`,\n * etc.) for stroke + fill — the glyph picks up the current theme.\n */\n\nexport interface SvgInlineProps {\n /** Raw SVG markup (`<svg>...</svg>`). */\n svg: string\n}\n\nexport function SvgInline({ svg }: SvgInlineProps) {\n return (\n <div\n className=\"h-auto w-full\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )\n}\n","import type { ZodSchema, ZodError } from 'zod'\n\n/**\n * parseProps — the JSON→component validation seam for the Services dialect.\n *\n * Ported verbatim from carriage's `src/chassis/mdxui-bridge/parse-props.ts`\n * (already dependency-free + host-agnostic). Runs `schema.parse(data)` exactly\n * once per JSON→component crossing, with a Services-shaped error envelope.\n * Inside the package's components, props are already typed and trusted — no\n * need to re-validate on every render.\n */\n\nexport interface ParsePropsOptions {\n /**\n * Caller context for error messages — e.g. \"deriveCatalog/charity-vehicle-valuation\".\n * Appears in the thrown error so logs are greppable by source.\n */\n source?: string\n}\n\nexport class MdxuiParseError extends Error {\n readonly issues: Array<{ path: string; message: string }>\n readonly source: string | undefined\n\n constructor(zodError: ZodError, source: string | undefined) {\n const issues = zodError.issues.map((issue) => ({\n path: issue.path.join('.') || '(root)',\n message: issue.message,\n }))\n const lines = issues.map((i) => ` ${i.path}: ${i.message}`)\n const header = source\n ? `[@mdxui/services] parseProps failed (source: ${source})`\n : '[@mdxui/services] parseProps failed'\n super(`${header}\\n${lines.join('\\n')}`)\n this.name = 'MdxuiParseError'\n this.issues = issues\n this.source = source\n }\n}\n\n/**\n * Run `schema.parse(data)` with a Services-shaped error envelope.\n *\n * Throws `MdxuiParseError` on invalid input — message includes\n * path-prefixed Zod issues and the `opts.source` string so errors\n * are greppable in logs.\n */\nexport function parseProps<T>(\n schema: ZodSchema<T>,\n data: unknown,\n opts?: ParsePropsOptions,\n): T {\n const result = schema.safeParse(data)\n if (result.success) return result.data\n throw new MdxuiParseError(result.error, opts?.source)\n}\n","/**\n * @mdxui/services — the Services dialect prop contract (ADR 0003 §3).\n *\n * These Zod schemas ARE the Services dialect's public prop surface. They were\n * authored and battle-tested in carriage's `src/chassis/mdxui-bridge/extensions/`\n * (7 products + 4 example services + 26 snapshot baselines) by reframing each\n * carriage component prop interface against mdxui's nearest equivalent — every\n * `// upstream-proposal:` comment documents WHY the Services shape differs from\n * neo/mdxui's dev-first grammar. That delta IS the dialect. This package is the\n * upstream those proposals always pointed at: it promotes the shapes to a\n * published contract.\n *\n * The four base mdxui input schemas (Text/Select/RadioGroup/File) are the\n * dialect's base vocabulary for the intake-form field contract; the rest are\n * fresh Services-semantic objects. The landing narrative arc (Hero → Problem →\n * WhatYouGet → HowItWorks → Defensibility → ReportPricing → Faq → FinalCta)\n * does not depend on the mdxui input schemas.\n */\n\nimport type React from 'react'\nimport { z } from 'zod'\nimport {\n TextInputPropsSchema,\n SelectInputPropsSchema,\n RadioGroupInputPropsSchema,\n FileInputPropsSchema,\n} from 'mdxui'\n\n// =============================================================================\n// PR 2 extensions — derive* contract layer\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// CatalogShapeSchema\n//\n// Zod-validated form of Carriage's `CatalogShape` (the \"browse\" surface\n// that deriveCatalog produces). mdxui's LandingPagePropsSchema is a layout\n// container (`{ children: any }`) — it composes section-level schemas\n// (HeroPropsSchema, PricingPropsSchema, etc.) as children, not as a flat\n// data shape. deriveCatalog returns flat data (hero headline, pricingSummary)\n// that a renderer then maps to section-level components. The two shapes serve\n// different layers; forcing deriveCatalog's output into LandingPagePropsSchema\n// would be a meaningless structural fit.\n//\n// upstream-proposal: file against mdxui as CatalogShapeSchema alongside\n// DeliveryShapeSchema and PortalShapeSchema — all three are the Carriage-\n// proposed service-runtime data shapes that precede component rendering.\n// See docs/patterns/upstream-proposals.md §PR2-catalog (PR 5 will file this).\n// -----------------------------------------------------------------------------\n\nexport const CatalogHeroSchema = z.object({\n /** Main landing-page headline. Falls back to `service.name` when unset. */\n headline: z.string().optional(),\n /** Sub-headline. Falls back to `service.promise` when unset. */\n subheadline: z.string().optional(),\n /** Asset reference for a visual element resolved by the renderer.\n * Today Carriage uses per-product HeroGlyph SVGs keyed by slug. */\n visual: z.string().optional(),\n})\n\nexport type CatalogHero = z.infer<typeof CatalogHeroSchema>\n\n/**\n * Pricing summary hint for the catalog card. Drives which Pricing\n * layout variant the renderer selects.\n *\n * upstream-proposal: same as CatalogShapeSchema above.\n */\nexport const PricingSummarySchema = z.enum([\n 'starting-at',\n 'per-call',\n 'tier-comparison',\n 'contact-us',\n])\n\nexport type PricingSummary = z.infer<typeof PricingSummarySchema>\n\n/**\n * Browse-side catalog UI shape. Produced by deriveCatalog(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-catalog.\n * The shape is the data layer; LandingPagePropsSchema (already in mdxui)\n * is the layout layer. Proposing CatalogShapeSchema as the data contract\n * that feeds the layout.\n */\nexport const CatalogShapeSchema = z.object({\n hero: CatalogHeroSchema.optional(),\n pricingSummary: PricingSummarySchema,\n})\n\nexport type CatalogShape = z.infer<typeof CatalogShapeSchema>\n\n// -----------------------------------------------------------------------------\n// Input field schemas with `source` made optional\n//\n// mdxui's BaseInputPropsSchema requires `source: string` (the\n// ReactAdmin/Platform.do data-binding field path). Carriage's form renderer\n// uses `name` (the JSON-schema property key) for data binding — `source` is\n// not applicable to the derive-layer output. We extend each input schema to\n// make `source` optional so derivOrder's field objects can conform without\n// carrying a meaningless value.\n//\n// upstream-proposal: file against mdxui — source should be optional (or moved\n// to a separate ReactAdmin-specific extension) since non-ReactAdmin consumers\n// don't use it. See docs/patterns/upstream-proposals.md §PR2-source-optional.\n// -----------------------------------------------------------------------------\n\n/**\n * TextInputPropsSchema with `source` optional.\n * Used for string fields without enum (plain text, email, date, etc.)\n */\nexport const TextInputSchema = TextInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type TextInput = z.infer<typeof TextInputSchema>\n\n/**\n * SelectInputPropsSchema with `source` optional.\n * Used for string/number fields with `enum` constraint.\n */\nexport const SelectInputSchema = SelectInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type SelectInput = z.infer<typeof SelectInputSchema>\n\n/**\n * RadioGroupInputPropsSchema with `source` optional.\n * Used for string/number fields with enum + `options` (rich label/sub display).\n */\nexport const RadioGroupInputSchema = RadioGroupInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type RadioGroupInput = z.infer<typeof RadioGroupInputSchema>\n\n/**\n * FileInputPropsSchema with `source` optional.\n * Used for fields with `widget: 'image-upload'` or `format: 'uri'` + upload widget.\n */\nexport const FileInputSchema = FileInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type FileInput = z.infer<typeof FileInputSchema>\n\n// -----------------------------------------------------------------------------\n// OrderShapeSchema\n//\n// Zod-validated form of Carriage's `OrderShape` (the \"buy / form\" surface\n// that deriveOrder produces). The individual field entries are validated at\n// the TEST layer against the dispatched input schemas (TextInputSchema,\n// SelectInputSchema, etc.) by widget kind — that validation is runtime-\n// contextual and lives in derive.mdxui-contract.test.ts.\n//\n// upstream-proposal: file against mdxui as OrderShapeSchema alongside\n// CatalogShapeSchema, DeliveryShapeSchema, and PortalShapeSchema.\n// See docs/patterns/upstream-proposals.md §PR2-order (PR 5 will file this).\n// -----------------------------------------------------------------------------\n\nexport const OrderFlowSchema = z.enum([\n 'instant',\n 'guided',\n 'consultation-first',\n])\n\nexport type OrderFlow = z.infer<typeof OrderFlowSchema>\n\n/**\n * One field in an order step — the data representation used by the\n * form renderer.\n *\n * upstream-proposal: same as OrderShapeSchema above.\n */\nexport const OrderFieldSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'number', 'integer', 'boolean']),\n required: z.boolean(),\n title: z.string().optional(),\n description: z.string().optional(),\n enum: z.array(z.union([z.string(), z.number(), z.boolean()])).readonly().optional(),\n pattern: z.string().optional(),\n format: z.enum(['date', 'date-time', 'email', 'uri']).optional(),\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n widget: z.enum(['vin-decoder', 'image-upload']).optional(),\n row: z.number().optional(),\n placeholder: z.string().optional(),\n autocomplete: z.string().optional(),\n options: z.array(z.object({\n value: z.union([z.string(), z.number(), z.boolean()]),\n label: z.string().optional(),\n sub: z.string().optional(),\n })).readonly().optional(),\n tiers: z.array(z.string()).readonly().optional(),\n /** Phase 1b multi-substrate (Carriage Iter / master 2026-05-26):\n * forwarded from JSON Schema's `x-connect` vendor annotation. When\n * set, the chassis form renders `<ConnectFlow>` instead of a\n * TextField. upstream-proposal: §PR11-theme + §x-connect. */\n xConnect: z.object({\n providerId: z.string(),\n resourceType: z.enum([\n 'channel',\n 'crm-record',\n 'sequence',\n 'phone-number',\n 'voice-line',\n 'webhook-event',\n 'database-table',\n 'folder',\n 'mailbox',\n 'account',\n ]),\n }).optional(),\n /** Phase 1b multi-substrate: forwarded from JSON Schema's\n * `x-derived-from` vendor annotation. When set, the chassis form\n * suppresses input UI and auto-populates from connection metadata.\n * upstream-proposal: §PR11-theme + §x-derived-from. */\n xDerivedFrom: z.object({\n providerId: z.string(),\n metadataKey: z.string(),\n }).optional(),\n})\n\nexport type OrderField = z.infer<typeof OrderFieldSchema>\n\nexport const OrderGroupSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().optional(),\n fields: z.array(OrderFieldSchema).readonly(),\n})\n\nexport type OrderGroup = z.infer<typeof OrderGroupSchema>\n\nexport const OrderStepSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n fields: z.array(OrderFieldSchema).readonly(),\n groups: z.array(OrderGroupSchema).readonly(),\n})\n\nexport type OrderStep = z.infer<typeof OrderStepSchema>\n\nexport const OrderLegalSchema = z.object({\n termsRequired: z.boolean(),\n privacyRequired: z.boolean(),\n})\n\nexport type OrderLegal = z.infer<typeof OrderLegalSchema>\n\n/**\n * Order-side UI shape. Produced by deriveOrder(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-order.\n */\nexport const OrderShapeSchema = z.object({\n flow: OrderFlowSchema,\n steps: z.array(OrderStepSchema).readonly().optional(),\n legal: OrderLegalSchema.optional(),\n})\n\nexport type OrderShape = z.infer<typeof OrderShapeSchema>\n\n// -----------------------------------------------------------------------------\n// DeliveryShapeSchema\n//\n// mdxui has no delivery-shape schema — this is a Carriage proposal.\n// Produced by deriveDelivery(svc). Covers the post-checkout UX archetype,\n// preview mode, and optional SLA fields.\n//\n// upstream-proposal: file against mdxui as DeliveryShapeSchema. Covers the\n// \"what the buyer sees after payment\" surface — document download, async-batch\n// status, and sync-result-card. See docs/patterns/upstream-proposals.md\n// §PR2-delivery.\n// -----------------------------------------------------------------------------\n\n/**\n * Post-checkout UX archetype.\n *\n * sync-result-card — synchronous return, inline card\n * document-download — file deliverable + email link\n * async-batch-status — job-queue with polling status; download on completion\n */\nexport const DeliveryUxSchema = z.enum([\n 'sync-result-card',\n 'document-download',\n 'async-batch-status',\n])\n\nexport type DeliveryUx = z.infer<typeof DeliveryUxSchema>\n\n/**\n * Preview mode for the delivery surface.\n *\n * first-page — rendered PDF first page\n * first-row — first N rows of a spreadsheet\n * inline-summary — one-line text summary in the result card\n * none — no preview\n */\nexport const PreviewModeSchema = z.enum([\n 'first-page',\n 'first-row',\n 'inline-summary',\n 'none',\n])\n\nexport type PreviewMode = z.infer<typeof PreviewModeSchema>\n\n/**\n * Delivery-side UI shape. Produced by deriveDelivery(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-delivery.\n */\nexport const DeliveryShapeSchema = z.object({\n ux: DeliveryUxSchema,\n previewMode: PreviewModeSchema,\n /** Whether to show a step-by-step progress timeline while the cascade runs. */\n progressTimeline: z.boolean(),\n /** Optional SLA echo — ISO 8601 duration (e.g. \"PT2M\"). */\n estimatedDelivery: z.string().optional(),\n /** Optional outcome predicate lifted from outcomeContract. */\n outcomePredicate: z.string().optional(),\n})\n\nexport type DeliveryShape = z.infer<typeof DeliveryShapeSchema>\n\n// -----------------------------------------------------------------------------\n// PortalShapeSchema\n//\n// mdxui has no portal-shape schema — this is a Carriage proposal.\n// Produced by derivePortal(svc). Covers the order-management table surface:\n// column set, filters, and row actions.\n//\n// upstream-proposal: file against mdxui as PortalShapeSchema. Covers the\n// operator/admin \"manage orders\" surface. See docs/patterns/upstream-proposals.md\n// §PR2-portal.\n// -----------------------------------------------------------------------------\n\n/**\n * Column type vocabulary for the portal table renderer.\n *\n * upstream-proposal: same as PortalShapeSchema above.\n */\nexport const PortalColumnTypeSchema = z.enum([\n 'identifier',\n 'timestamp',\n 'currency',\n 'duration',\n 'status',\n 'text',\n 'evaluator',\n])\n\nexport type PortalColumnType = z.infer<typeof PortalColumnTypeSchema>\n\nexport const PortalColumnSchema = z.object({\n id: z.string(),\n label: z.string(),\n type: PortalColumnTypeSchema,\n})\n\nexport type PortalColumn = z.infer<typeof PortalColumnSchema>\n\n/**\n * Row action vocabulary for the portal table renderer.\n *\n * upstream-proposal: same as PortalShapeSchema above.\n */\nexport const PortalActionKindSchema = z.enum([\n 'view-deliverable',\n 'reissue',\n 'refund',\n 'flag-for-review',\n])\n\nexport type PortalActionKind = z.infer<typeof PortalActionKindSchema>\n\nexport const PortalActionSchema = z.object({\n id: z.string(),\n label: z.string(),\n kind: PortalActionKindSchema,\n})\n\nexport type PortalAction = z.infer<typeof PortalActionSchema>\n\nexport const PortalFilterSchema = z.object({\n id: z.string(),\n field: z.string(),\n label: z.string(),\n})\n\nexport type PortalFilter = z.infer<typeof PortalFilterSchema>\n\n/**\n * Order-management UI shape. Produced by derivePortal(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-portal.\n */\nexport const PortalShapeSchema = z.object({\n columns: z.array(PortalColumnSchema),\n filters: z.array(PortalFilterSchema).optional(),\n actions: z.array(PortalActionSchema).optional(),\n})\n\nexport type PortalShape = z.infer<typeof PortalShapeSchema>\n\n// =============================================================================\n// PR 3 extensions — Tier 1 component reframe\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// HeroPropsSchema extension\n//\n// mdxui's HeroPropsSchema uses `title` (string), `badge` (string), and\n// `callToAction` (string label only — no href). Carriage's Hero component uses:\n// - `eyebrow` (small uppercase label above the headline)\n// - `headline` (the h1 — distinct from mdxui's `title`)\n// - `body` (body paragraph — mdxui has `subtitle` but that's a sub-head, not prose)\n// - `primary` / `secondary` (action objects with `label` + `href` + `external`)\n// - `showGlyph` / `illustration` (presentational controls; no mdxui equivalent)\n//\n// mdxui's `actions.primary` accepts a string or `{ href, onClick, target }` —\n// Carriage's action object has `label` (string) + `href` + `external` (bool).\n// The shapes are structurally incompatible without adapter work. Extending here.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero\n// -----------------------------------------------------------------------------\n\n/** Inline action with label + href + optional new-tab flag.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero */\nexport const SiteActionSchema = z.object({\n label: z.string(),\n href: z.string(),\n external: z.boolean().optional(),\n})\n\nexport type SiteAction = z.infer<typeof SiteActionSchema>\n\n/**\n * Hero composition variant identifier. Drives the dispatcher in\n * `<Hero>` (chassis/components/landing/Hero.tsx) between `HeroSplit`\n * (default) and `HeroStacked`.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-hero-variant\n * (master 2026-05-26 — illustration abstraction Phase 3; see\n * docs/abstraction/illustrations.md §1.4 + §3).\n */\nexport const HeroVariantSchema = z.enum([\n 'split-illustration-right',\n 'stacked-illustration-below',\n])\n\nexport type HeroVariantFromSchema = z.infer<typeof HeroVariantSchema>\n\n/**\n * HeroPropsSchema extended for Carriage's landing-page Hero component.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero\n */\nexport const HeroPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n headline: z.string(),\n body: z.string(),\n primary: SiteActionSchema,\n secondary: SiteActionSchema.optional(),\n showGlyph: z.boolean().optional(),\n /** When true, the glyph also renders below `lg` (stacked beneath\n * the hero text on mobile). When false (default), the glyph is\n * hidden below `lg`. Services opt in via `publicCopy.hero.glyphOnMobile`.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR11-theme */\n glyphOnMobile: z.boolean().optional(),\n illustration: z.any().optional(),\n /** Hero composition variant. Routes the `<Hero>` dispatcher to\n * `HeroSplit` (default) or `HeroStacked`. Sourced from\n * `ServiceDefinition.branding.heroVariant`.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-hero-variant */\n variant: HeroVariantSchema.optional(),\n})\n\nexport type HeroPropsExtended = z.infer<typeof HeroPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// PricingPropsSchema extension\n//\n// mdxui's PricingTierSchema uses `name` (Carriage uses `tier`), `callToAction`\n// as a plain string (Carriage uses `cta: { label, href }`), and `highlighted`\n// (Carriage uses `featured`). Carriage's tier also carries Stripe commerce\n// fields (`tierKey`, `sku`, `amountCents`, `currency`, `stripeName`) and a\n// distinct `audience` sub-headline. mdxui has no commerce fields — Carriage\n// adds them as the proposing substrate.\n//\n// mdxui's PricingPropsSchema also uses `title` not `eyebrow`/`heading`.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing\n// -----------------------------------------------------------------------------\n\n/** One pricing tier with Stripe commerce fields.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing */\nexport const PriceTierSchema = z.object({\n tierKey: z.string(),\n tier: z.string(),\n price: z.string(),\n audience: z.string(),\n features: z.array(z.string()),\n featured: z.boolean().optional(),\n cta: z.object({ label: z.string(), href: z.string() }),\n sku: z.string(),\n amountCents: z.number(),\n currency: z.enum(['usd', 'eur', 'gbp']),\n stripeName: z.string(),\n minimumAmountCents: z.number().optional(),\n priceSuffix: z.string().optional(),\n})\n\nexport type PriceTier = z.infer<typeof PriceTierSchema>\n\n/**\n * PricingPropsSchema extended for Carriage's Pricing component.\n *\n * `tiers` uses `.readonly()` (Zod v4+) so `z.infer<...>` produces\n * `readonly PriceTier[]` — matching `ServiceDefinition.pricing.tiers`.\n * The `Omit<...> & { tiers: readonly PriceTier[] }` workaround in\n * `Pricing.tsx` is retired; the component interface is now\n * `z.infer<typeof PricingPropsExtendedSchema>` directly.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing\n */\nexport const PricingPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n tiers: z.array(PriceTierSchema).readonly(),\n footnote: z.string().optional(),\n})\n\nexport type PricingPropsExtended = z.infer<typeof PricingPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// FAQPropsSchema extension\n//\n// mdxui's FAQPropsSchema uses `title` (optional) and items with `question` /\n// `answer`. Carriage's Faq uses `eyebrow` + `heading` (both required, distinct\n// typographic roles) and items with `q` / `a` (short keys used throughout\n// publicCopy JSON). The item-field rename (question→q, answer→a) is a naming\n// convention that predates mdxui adoption; the keys appear across all service\n// JSON files. Proposing mdxui accept `q`/`a` as aliases (or Carriage migrates\n// to `question`/`answer` in a follow-up once settled with Nathan).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq\n// -----------------------------------------------------------------------------\n\n/** FAQ item using Carriage's short-key convention (q/a).\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq */\nexport const FaqItemSchema = z.object({\n q: z.string(),\n a: z.string(),\n})\n\nexport type FaqItem = z.infer<typeof FaqItemSchema>\n\n/**\n * FAQPropsSchema extended for Carriage's Faq component.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq\n */\nexport const FaqPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n items: z.array(FaqItemSchema),\n})\n\nexport type FaqPropsExtended = z.infer<typeof FaqPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// HowItWorksPropsSchema (new — no mdxui equivalent)\n//\n// mdxui has no \"how it works\" numbered-step section schema. The closest is\n// FeaturesPropsSchema (title + description + features[]) but that takes\n// description + icon + actions per feature — not a numbered-step with a\n// large display numeral. Proposing HowItWorksPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks\n// -----------------------------------------------------------------------------\n\n/** One numbered step in a HowItWorks section.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks */\nexport const HowItWorksStepSchema = z.object({\n n: z.string(),\n title: z.string(),\n body: z.string(),\n})\n\nexport type HowItWorksStep = z.infer<typeof HowItWorksStepSchema>\n\n/**\n * Props for the HowItWorks component. No mdxui base — proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks\n */\nexport const HowItWorksPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n steps: z.array(HowItWorksStepSchema),\n /** Optional mini-illustration per step. When provided and length\n * matches `steps.length`, each step renders its illustration in\n * a row above the number. All-or-none — if length doesn't match,\n * the prop is silently ignored and the text-only layout renders\n * (per opt-in-only semantics in illustrations.md §2).\n *\n * Sourced from the per-service illustration manifest at\n * `src/services/<slug>/illustration.tsx`.\n *\n * Each element is a React `ComponentType` (zero-arg renderer).\n * Zod can't validate component identity at runtime; type-level\n * contract carries via `z.custom`.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-step-illustrations\n * (master 2026-05-26 — illustration abstraction Phase 4). */\n stepIllustrations: z\n .array(z.custom<React.ComponentType>())\n .optional(),\n})\n\nexport type HowItWorksProps = z.infer<typeof HowItWorksPropsSchema>\n\n// -----------------------------------------------------------------------------\n// WhatYouGetPropsSchema (new — no mdxui equivalent)\n//\n// mdxui has no \"what you get\" numbered-feature grid schema. The section\n// renders a numbered grid of deliverable sections (n + title + body) — a\n// shape distinct from FeaturesPropsSchema's icon-based list. Proposing\n// WhatYouGetPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget\n// -----------------------------------------------------------------------------\n\n/** One numbered item in a WhatYouGet section.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget */\nexport const WhatYouGetItemSchema = z.object({\n n: z.string(),\n title: z.string(),\n body: z.string(),\n})\n\nexport type WhatYouGetItem = z.infer<typeof WhatYouGetItemSchema>\n\n/**\n * Props for the WhatYouGet component. No mdxui base — proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget\n */\nexport const WhatYouGetPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n sections: z.array(WhatYouGetItemSchema),\n})\n\nexport type WhatYouGetProps = z.infer<typeof WhatYouGetPropsSchema>\n\n// -----------------------------------------------------------------------------\n// CTASectionPropsSchema extension → FinalCtaPropsSchema\n//\n// mdxui's CTASectionPropsSchema uses `title` (string) and `callToAction`\n// (string label only). Carriage's FinalCta uses `eyebrow` + `headline`\n// (both required, distinct typographic roles) and `primary`/`secondary`\n// (action objects with label + href + external). The action objects are\n// incompatible with mdxui's string `callToAction` without an adapter.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-finalcta\n// -----------------------------------------------------------------------------\n\n/**\n * FinalCtaPropsSchema — CTASectionPropsSchema extended for Carriage.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-finalcta\n */\nexport const FinalCtaPropsSchema = z.object({\n eyebrow: z.string(),\n headline: z.string(),\n primary: SiteActionSchema,\n secondary: SiteActionSchema.optional(),\n})\n\nexport type FinalCtaProps = z.infer<typeof FinalCtaPropsSchema>\n\n// -----------------------------------------------------------------------------\n// HeaderPropsSchema extension → MastheadPropsSchema\n//\n// mdxui's HeaderPropsSchema uses `logo` (any), `nav: NavItem[]`, `cta.text`.\n// Carriage's Masthead uses `brand: { primary, secondary?, href }` (text-based\n// brand lockup — no image logo), `cta: { label, href }` (renamed `text`→`label`),\n// `eyebrow` (right-slot fallback when no CTA), and `narrow` (container width\n// toggle). mdxui has no `eyebrow` slot or narrow-layout concept.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-masthead\n// -----------------------------------------------------------------------------\n\n/**\n * MastheadPropsSchema — HeaderPropsSchema extended for Carriage's Masthead.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-masthead\n */\nexport const MastheadPropsSchema = z.object({\n brand: z.object({\n primary: z.string(),\n secondary: z.string().optional(),\n href: z.string(),\n }),\n cta: z.object({ label: z.string(), href: z.string() }).optional(),\n eyebrow: z.string().optional(),\n narrow: z.boolean().optional(),\n})\n\nexport type MastheadProps = z.infer<typeof MastheadPropsSchema>\n\n// -----------------------------------------------------------------------------\n// FooterPropsSchema extension → SiteFooterPropsSchema\n//\n// mdxui's FooterPropsSchema uses `logo` (any), `links: FooterLinkGroup[]`\n// (grouped by section title), `social[]`, `copyright`, `newsletter`. Carriage's\n// Footer is a minimal bar with a flat `text` attribution string and an optional\n// flat `links[]` (label + href only — no grouping, no social, no newsletter).\n// The structures are fundamentally different: mdxui's footer is a full-featured\n// multi-column layout; Carriage's is a single-row legal bar.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer\n// -----------------------------------------------------------------------------\n\n/** Flat footer link (no grouping).\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer */\nexport const SiteFooterLinkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport type SiteFooterLink = z.infer<typeof SiteFooterLinkSchema>\n\n/**\n * SiteFooterPropsSchema — FooterPropsSchema extended for Carriage's Footer.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer\n */\nexport const SiteFooterPropsSchema = z.object({\n text: z.string(),\n links: z.array(SiteFooterLinkSchema).optional(),\n})\n\nexport type SiteFooterProps = z.infer<typeof SiteFooterPropsSchema>\n\n// =============================================================================\n// PR 4 extensions — form primitives\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// TextFieldPropsSchema\n//\n// mdxui's TextInputPropsSchema is a data-binding shape (ReactAdmin-style):\n// `source` (field path), `value`/`defaultValue` as optional, no `onChange`\n// callback. Carriage's TextField is a controlled React component:\n// `value: string` (required), `onChange: (v: string) => void` (required),\n// `type` includes 'number' and 'date' (not in mdxui's enum), `hint` (not\n// `helperText`), `inputRef` (Ref<HTMLInputElement>), `mono` and `invalid`\n// (presentational flags). The shapes are structurally incompatible for a\n// direct `.extend()` — proposing a Carriage-native schema that adopts\n// mdxui naming where possible (`label`, `placeholder`).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-textfield\n// -----------------------------------------------------------------------------\n\n/**\n * TextFieldPropsSchema — controlled text-input component props.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-textfield\n */\nexport const TextFieldPropsSchema = z.object({\n label: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n placeholder: z.string().optional(),\n /** Helper text shown below the field. `invalid=true` renders it in error colour. */\n hint: z.string().optional(),\n type: z.enum(['text', 'date', 'number', 'email']).optional(),\n /** Right-edge suffix label (e.g. \"miles\", \"%\"). */\n suffix: z.string().optional(),\n /** Renders the input in a monospace typeface (e.g. VIN, code). */\n mono: z.boolean().optional(),\n /** Renders the field in error state (red border + hint text). */\n invalid: z.boolean().optional(),\n inputRef: z.custom<React.Ref<HTMLInputElement>>().optional(),\n /** HTML `autocomplete` attribute for browser autofill. */\n autoComplete: z.string().optional(),\n})\n\nexport type TextFieldProps = z.infer<typeof TextFieldPropsSchema>\n\n// -----------------------------------------------------------------------------\n// SelectFieldPropsSchema\n//\n// mdxui's SelectInputPropsSchema is a data-binding shape: `source`, options\n// with `disabled`/`group`/`icon`/`description`, no `onChange` callback, no\n// `autoComplete`. Carriage's SelectField is a controlled dropdown:\n// `value: string` (required), `onChange: (v: string) => void` (required),\n// `options: Array<{ value: string; label: string }>` (string-only, no extras),\n// `autoComplete` for browser autofill.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-selectfield\n// -----------------------------------------------------------------------------\n\n/**\n * SelectFieldPropsSchema — controlled select-dropdown component props.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-selectfield\n */\nexport const SelectFieldPropsSchema = z.object({\n label: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n /** HTML `autocomplete` attribute for browser autofill. */\n autoComplete: z.string().optional(),\n})\n\nexport type SelectFieldProps = z.infer<typeof SelectFieldPropsSchema>\n\n// -----------------------------------------------------------------------------\n// RadioGroupPropsSchema\n//\n// mdxui's RadioGroupInputPropsSchema is a data-binding shape: `source`,\n// options with `disabled`/`group`/`icon`/`description`, no `onChange`,\n// no `sub` per option. Carriage's RadioGroup is a generic controlled component:\n// the value type `T` extends `string`; options carry an optional `sub`\n// (secondary descriptor line inside the card). No mdxui equivalent for `sub`.\n// The generic `T` can't be expressed in Zod — the schema uses `z.string()` for\n// value/option value; callers narrow to `T` at the component level.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup\n// -----------------------------------------------------------------------------\n\n/** One option in a RadioGroup card.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup */\nexport const RadioGroupOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n /** Optional secondary descriptor line rendered inside the card. */\n sub: z.string().optional(),\n})\n\nexport type RadioGroupOption = z.infer<typeof RadioGroupOptionSchema>\n\n/**\n * RadioGroupPropsSchema — controlled radio-card-group component props.\n * Note: the generic type parameter `T extends string` from RadioGroup<T>\n * is represented as `z.string()` here; consumers narrow at call sites.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup\n */\nexport const RadioGroupPropsSchema = z.object({\n label: z.string(),\n name: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n options: z.array(RadioGroupOptionSchema),\n})\n\nexport type RadioGroupProps = z.infer<typeof RadioGroupPropsSchema>\n\n// -----------------------------------------------------------------------------\n// FieldRowPropsSchema (new — no mdxui equivalent)\n//\n// FieldRow is a 2-column layout shell (`display: grid; grid-template-columns:\n// 1fr 1fr`). mdxui has no layout-grid primitive for form field pairs.\n// The only prop is `children: ReactNode`. Proposing a minimal schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-fieldrow\n// -----------------------------------------------------------------------------\n\n/**\n * FieldRowPropsSchema — 2-column layout shell for side-by-side form fields.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-fieldrow\n */\nexport const FieldRowPropsSchema = z.object({\n children: z.custom<React.ReactNode>(),\n})\n\nexport type FieldRowProps = z.infer<typeof FieldRowPropsSchema>\n\n// -----------------------------------------------------------------------------\n// StepHeadingPropsSchema (new — no mdxui equivalent)\n//\n// StepHeading renders a numbered section header (index like \"01\"/\"02\",\n// eyebrow, title, body). mdxui has no multi-step form section header schema.\n// The closest mdxui primitive is HeroPropsSchema's eyebrow/headline/body\n// pattern, but HeroPropsSchema also carries CTAs and is a page-level section,\n// not a within-form step marker. Proposing StepHeadingPropsSchema as a\n// distinct lightweight schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-stepheading\n// -----------------------------------------------------------------------------\n\n/**\n * StepHeadingPropsSchema — numbered section header for multi-step flows.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-stepheading\n */\nexport const StepHeadingPropsSchema = z.object({\n /** Numeric step indicator, e.g. \"01\", \"02\". Rendered in tabular mono. */\n index: z.string(),\n /** Short action-verb eyebrow label. e.g. \"Connect\", \"Compose\". */\n eyebrow: z.string(),\n /** Primary section heading. */\n title: z.string(),\n /** Supporting body copy below the heading. */\n body: z.string(),\n className: z.string().optional(),\n})\n\nexport type StepHeadingPropsFromSchema = z.infer<typeof StepHeadingPropsSchema>\n\n// -----------------------------------------------------------------------------\n// LogoUploadPropsSchema (new — no mdxui equivalent)\n//\n// LogoUpload is a Vercel-Blob-backed logo upload widget. mdxui's\n// FileInputPropsSchema models file inputs as data-binding shapes (no\n// `uploading` state flag, no `onClear` callback, no `bodyText`). Carriage's\n// LogoUpload owns the visual preview + upload/clear/error state externally\n// (the parent form drives state; this component renders it). The shape is\n// fundamentally a controlled component with stateful flags, not a data-\n// binding primitive. Proposing LogoUploadPropsSchema as a Carriage-native\n// controlled-upload schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-logoupload\n// -----------------------------------------------------------------------------\n\n/**\n * LogoUploadPropsSchema — controlled logo-upload widget with preview.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-logoupload\n */\nexport const LogoUploadPropsSchema = z.object({\n /** Resolved Vercel-Blob URL, or null when no logo is set. */\n value: z.string().nullable(),\n /** True while the upload network call is in-flight. */\n uploading: z.boolean(),\n /** Error message from the last failed upload attempt, or null. */\n error: z.string().nullable(),\n onChange: z.custom<(file: File) => void>(),\n onClear: z.custom<() => void>(),\n /** Widget label override (default: \"Firm logo (optional)\"). */\n label: z.string().optional(),\n /** Body copy override below the preview thumbnail. */\n bodyText: z.string().optional(),\n})\n\nexport type LogoUploadPropsFromSchema = z.infer<typeof LogoUploadPropsSchema>\n\n// -----------------------------------------------------------------------------\n// ImageUploadFieldPropsSchema (new — no mdxui equivalent)\n//\n// ImageUploadField wraps LogoUpload for the JSON-driven form path. It owns\n// the upload state machine internally (uploading + error are local state),\n// exposing only label, description, value, and onChange to the form renderer.\n// mdxui's FileInputPropsSchema doesn't model Vercel-Blob uploads or the\n// controlled (url | null) value pattern. Proposing a Carriage-native schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-imageuploadfield\n// -----------------------------------------------------------------------------\n\n/**\n * ImageUploadFieldPropsSchema — form-renderer image-upload field.\n * Wraps LogoUpload with an internal upload state machine.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-imageuploadfield\n */\nexport const ImageUploadFieldPropsSchema = z.object({\n /** Renderer label — sourced from `OrderField.title`. */\n label: z.string(),\n /** Helper text — sourced from `OrderField.description`. */\n description: z.string().optional(),\n /** Current value (resolved Vercel-Blob URL, or null). */\n value: z.string().nullable(),\n /** Called with the new URL after a successful upload, or null on clear. */\n onChange: z.custom<(url: string | null) => void>(),\n})\n\nexport type ImageUploadFieldPropsFromSchema = z.infer<typeof ImageUploadFieldPropsSchema>\n\n// =============================================================================\n// PR 5 extensions — Tier 2 component prop reframes\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// ServiceFormPropsSchema\n//\n// ServiceForm is the chassis-driven intake form. Its prop interface merges\n// two already-registered shapes (OrderShape + Pricing) with per-page display\n// copy (formHeadline, formIntro, productName, paymentHeadline). mdxui has no\n// multi-step service-intake form schema. Proposing ServiceFormPropsSchema as\n// the canonical shape for service-intake form chrome, wrapping OrderShape and\n// Pricing as sub-shapes.\n//\n// OrderShape (§PR2-order) + PricingPropsExtended (§PR3-pricing) are already\n// in the extension registry. ServiceFormPropsSchema composes them + adds the\n// form-chrome copy fields that the page layer passes down.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR5-serviceform\n// -----------------------------------------------------------------------------\n\n/**\n * ServiceFormPropsSchema — chassis service-intake form component props.\n * Composes OrderShapeSchema + PricingPropsExtendedSchema with page-chrome copy.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR5-serviceform\n */\n/**\n * Section-chrome shared by every Pricing variant.\n * Mirrors `PricingSectionChrome` from `@/chassis/types`.\n */\nconst PricingSectionChromeSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n footnote: z.string().optional(),\n currency: z.enum(['usd', 'eur', 'gbp']),\n})\n\n/**\n * Tiered pricing variant — mirrors `PricingTiered` from `@/chassis/types`.\n */\nconst PricingTieredSchema = PricingSectionChromeSchema.extend({\n kind: z.literal('tiered'),\n tiers: z.array(PriceTierSchema).readonly(),\n})\n\n/**\n * Unit pricing variant — mirrors `PricingUnit` from `@/chassis/types`.\n */\nconst PricingUnitSchema = PricingSectionChromeSchema.extend({\n kind: z.literal('unit'),\n perUnit: z.number(),\n billingCadence: z.string(),\n})\n\n/**\n * Full Pricing discriminated union — mirrors `Pricing` from `@/chassis/types`.\n */\nexport const PricingSchema = z.union([PricingTieredSchema, PricingUnitSchema])\n\n/** Full Pricing discriminated union — the `ReportPricing` component reads this. */\nexport type Pricing = z.infer<typeof PricingSchema>\n\nexport const ServiceFormPropsSchema = z.object({\n /** Service slug — used in the `/api/checkout` body + return-URL construction. */\n slug: z.string(),\n /** Derived order shape from `deriveOrder(svc)`. */\n order: OrderShapeSchema,\n /** Service pricing — from `ServiceDefinition.pricing`. Mirrors the `Pricing` union. */\n pricing: PricingSchema,\n /** Form-phase headline (h1 above the fields). Optional — omit in unit tests. */\n formHeadline: z.string().optional(),\n /** Form-phase intro paragraph. Optional. */\n formIntro: z.string().optional(),\n /** Product-name eyebrow (e.g. \"Carriage Donation\") rendered above the h1. */\n productName: z.string().optional(),\n /** Payment-phase h1. Defaults to \"Generate your report\" when unset. */\n paymentHeadline: z.string().optional(),\n})\n\nexport type ServiceFormPropsFromSchema = z.infer<typeof ServiceFormPropsSchema>\n\n// -----------------------------------------------------------------------------\n// CheckoutPanelPropsSchema\n//\n// CheckoutPanel wraps Stripe Elements for Carriage's design tokens. mdxui has\n// no Stripe/payment abstraction — this is a Carriage-native from-scratch schema.\n// The shape is minimal: clientSecret + amountCents are required (the Stripe\n// session data); email, returnUrl, onSuccess, ctaSuffix, onCancel are the\n// caller-controlled options.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR5-checkoutpanel\n// -----------------------------------------------------------------------------\n\n/**\n * CheckoutPanelPropsSchema — Stripe Elements payment panel props.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR5-checkoutpanel\n */\nexport const CheckoutPanelPropsSchema = z.object({\n /** Stripe PaymentIntent client secret from /api/checkout. */\n clientSecret: z.string(),\n /** Payment amount in cents — displayed as \"Pay $X.XX & {ctaSuffix}\". */\n amountCents: z.number(),\n /** Email pre-fill passed to Stripe as receipt email. */\n email: z.string().optional(),\n /** Where Stripe redirects after a successful payment (redirect flow). */\n returnUrl: z.string().optional(),\n /** Optional inline-confirmation callback (inline flow — bulk products). */\n onSuccess: z.custom<() => Promise<void> | void>().optional(),\n /** Custom CTA suffix on the Pay button. Default: \"generate report\". */\n ctaSuffix: z.string().optional(),\n /** \"Edit details\" callback — re-shows the form. */\n onCancel: z.custom<() => void>(),\n})\n\nexport type CheckoutPanelPropsFromSchema = z.infer<typeof CheckoutPanelPropsSchema>\n\n// =============================================================================\n// PR 6 extensions — ReactNode-prop components\n// =============================================================================\n//\n// Components in this section carry `React.ReactNode` props (bullets[],\n// body, cta). Zod can't validate ReactNode contents at runtime, but\n// `z.custom<ReactNode>()` in Zod v4 preserves the correct TypeScript type\n// in `z.infer<...>` (the type param O flows through `ZodCustom<O, O>`).\n// Runtime validation is intentionally a no-op for these fields — the value\n// is: auditability (every Carriage component prop has a schema entry) and\n// type-level correctness (z.infer produces the same shape as the component\n// interface).\n//\n// See upstream-proposals.md §PR6-defensibility, §PR6-upsell.\n\n// -----------------------------------------------------------------------------\n// DefensibilityPropsSchema\n//\n// Defensibility renders a 2-column \"what it is / what it isn't\" block with\n// optional caveat. Its `bullets: ReactNode[]` and `caveat?: ReactNode` props\n// were deferred in PR 5 because Zod can't validate ReactNode arrays. Reframed\n// here using `z.custom<React.ReactNode>()` which satisfies the type-level\n// contract while treating runtime validation as pass-through.\n//\n// In practice, Carriage's service JSONs pass `string[]` as bullets — the\n// ReactNode type is load-bearing only for future rich-content upgrades (e.g.,\n// bullets with inline <strong> tags). The schema allows that upgrade path.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility\n// -----------------------------------------------------------------------------\n\n/** One column in a Defensibility two-up.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility */\nexport const DefensibilityColumnSchema = z.object({\n heading: z.string(),\n /** Array of bullet content. Each bullet is a ReactNode — strings in\n * practice today; rich content possible in future JSON upgrades. */\n bullets: z.array(z.custom<React.ReactNode>()),\n})\n\nexport type DefensibilityColumnFromSchema = z.infer<typeof DefensibilityColumnSchema>\n\n/**\n * DefensibilityPropsSchema — two-column scope-expectations block.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility\n */\nexport const DefensibilityPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n /** Tuple of exactly two columns (left = \"what it is\", right = \"what it isn't\"). */\n columns: z.tuple([DefensibilityColumnSchema, DefensibilityColumnSchema]),\n /** Optional closing caveat paragraph. */\n caveat: z.custom<React.ReactNode>().optional(),\n})\n\nexport type DefensibilityPropsFromSchema = z.infer<typeof DefensibilityPropsSchema>\n\n// -----------------------------------------------------------------------------\n// UpsellBannerPropsSchema / UpsellCardPropsSchema\n//\n// UpsellBanner + UpsellCard are client-side upsell primitives. Both expose\n// `React.ReactNode` props: UpsellBanner.cta is a ReactNode (allows inline\n// price display like \"$29 → $99\"); UpsellCard.body is a ReactNode.\n// Both use `z.custom<ReactNode>()` for the same reasons as Defensibility above.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n// -----------------------------------------------------------------------------\n\n/**\n * UpsellBannerPropsSchema — single-line upsell nudge component props.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n */\nexport const UpsellBannerPropsSchema = z.object({\n /** Display-serif hook line. Often phrased as a question. */\n headline: z.string(),\n /** Optional one-line explanation below the headline. */\n body: z.string().optional(),\n /** Activation pill content — ReactNode for inline price transitions. */\n cta: z.custom<React.ReactNode>(),\n onActivate: z.custom<() => void>(),\n})\n\nexport type UpsellBannerPropsFromSchema = z.infer<typeof UpsellBannerPropsSchema>\n\n/**\n * UpsellCardPropsSchema — richer upsell card with body paragraph.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n */\nexport const UpsellCardPropsSchema = z.object({\n eyebrow: z.string(),\n /** Card body — ReactNode for future rich-text upgrades. */\n body: z.custom<React.ReactNode>(),\n ctaLabel: z.string(),\n onActivate: z.custom<() => void>(),\n})\n\nexport type UpsellCardPropsFromSchema = z.infer<typeof UpsellCardPropsSchema>\n\n// =============================================================================\n// PR 7 extensions — landing route wire-up\n// =============================================================================\n//\n// These additions widen CatalogShapeSchema to carry everything the\n// /[slug]/page.tsx landing route needs from a ServiceDefinition:\n//\n// publicCopy — all landing-page section props (Hero, Problem, WhatYouGet,\n// HowItWorks, Defensibility, Faq, FinalCta, SEO metadata)\n// branding — product name + hero glyph + brand colours\n// pricing — tiered pricing (section chrome + tiers)\n// archetype — service archetype id (drives MIME / totalTime defaults)\n//\n// Why CatalogShape and not a new top-level shape:\n// CatalogShape is the derive layer's output for the landing surface; it is\n// the natural home for \"everything the landing page needs\". Widening it here\n// keeps the 1:1 mapping: deriveCatalog → landing page props, no intermediate.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// CtaSchema — shared label+href action\n//\n// Reuses SiteActionSchema's shape but without the `external` flag since\n// header/footer CTAs are always internal navigation.\n// -----------------------------------------------------------------------------\n\n/**\n * Inline call-to-action used by header/footer chrome.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport type Cta = z.infer<typeof CtaSchema>\n\n// -----------------------------------------------------------------------------\n// BreadcrumbSchema\n// -----------------------------------------------------------------------------\n\n/**\n * One breadcrumb entry for the landing-page JSON-LD BreadcrumbList.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const BreadcrumbSchema = z.object({\n name: z.string(),\n href: z.string(),\n})\n\nexport type Breadcrumb = z.infer<typeof BreadcrumbSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceSchemaSpecSchema — static JSON-LD Service fields\n// -----------------------------------------------------------------------------\n\n/**\n * Static fields for the Service JSON-LD block. Dynamic fields (description,\n * offers) are filled at render time.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceSchemaSpecSchema = z.object({\n name: z.string(),\n serviceType: z.string(),\n url: z.string(),\n areaServed: z.string(),\n})\n\nexport type ServiceSchemaSpec = z.infer<typeof ServiceSchemaSpecSchema>\n\n// -----------------------------------------------------------------------------\n// ProblemPropsSchema — three-card problem section\n//\n// mdxui has no \"problem framing\" section schema. The section renders three\n// cards with a category label, cost line, outcome verdict, and body paragraph.\n// Proposing ProblemPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/** One problem card.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening */\nexport const ProblemItemSchema = z.object({\n label: z.string(),\n cost: z.string(),\n outcome: z.string(),\n body: z.string(),\n})\n\nexport type ProblemItem = z.infer<typeof ProblemItemSchema>\n\n/**\n * ProblemPropsSchema — three-card problem-framing section.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ProblemPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n items: z.array(ProblemItemSchema),\n})\n\nexport type ProblemProps = z.infer<typeof ProblemPropsSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceBrandingSchema — product name + hero glyph + brand colours\n//\n// The fields needed by the landing route from ServiceDefinition.branding.\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * Subset of ServiceBranding needed by the landing route.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceBrandingSchema = z.object({\n primary: z.string(),\n secondary: z.string().optional(),\n productName: z.string(),\n /** SERP title default for the landing page. */\n defaultTitle: z.string(),\n /** OG/SERP description default. */\n defaultDescription: z.string(),\n heroGlyph: z.string().optional(),\n showHeroGlyph: z.boolean().optional(),\n og: z.object({ headline: z.string() }),\n})\n\nexport type ServiceBranding = z.infer<typeof ServiceBrandingSchema>\n\n// -----------------------------------------------------------------------------\n// LandingPublicCopySchema — all landing-page section props in one schema\n//\n// Composes all the section-level prop schemas already registered in this file\n// into the flat content bag that /[slug]/page.tsx consumes.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * All landing-page section content in one flat schema.\n * Corresponds to ServicePublicCopy minus the pricing sub-object (pricing lives\n * on Pricing directly as of iter 7f.2).\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const LandingPublicCopySchema = z.object({\n pageTitle: z.string(),\n pageDescription: z.string(),\n headerCta: CtaSchema,\n hero: HeroPropsExtendedSchema,\n problem: ProblemPropsSchema,\n whatYouGet: WhatYouGetPropsSchema,\n howItWorks: HowItWorksPropsSchema,\n defensibility: DefensibilityPropsSchema,\n faq: FaqPropsExtendedSchema,\n finalCta: FinalCtaPropsSchema,\n footerText: z.string(),\n serviceSchema: ServiceSchemaSpecSchema,\n breadcrumbs: z.array(BreadcrumbSchema).optional(),\n})\n\nexport type LandingPublicCopy = z.infer<typeof LandingPublicCopySchema>\n\n// -----------------------------------------------------------------------------\n// LandingPricingSchema — unified pricing prop bag for the landing route\n//\n// Mirrors the `Pricing` discriminated union from chassis/types.ts but as a\n// Zod schema. The landing route currently only renders `tiered` pricing, so\n// the schema validates the tiered variant's fields; `kind` is kept so the\n// route can guard against future non-tiered kinds.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * Pricing prop bag for the landing-route Pricing component.\n *\n * `eyebrow` and `heading` are optional here because test fixtures and\n * example services may carry partial pricing objects. The landing route\n * guards on `pricing.kind === 'tiered'` before rendering and reads the\n * chrome fields directly.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const LandingPricingSchema = z.object({\n kind: z.enum(['tiered', 'unit']),\n eyebrow: z.string(),\n heading: z.string(),\n footnote: z.string().optional(),\n currency: z.enum(['usd', 'eur', 'gbp']).optional(),\n tiers: z.array(PriceTierSchema).readonly().optional(),\n /** unit pricing fields — optional; only present when kind='unit' */\n perUnit: z.number().optional(),\n billingCadence: z.string().optional(),\n})\n\nexport type LandingPricing = z.infer<typeof LandingPricingSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceArchetypeIdSchema\n// -----------------------------------------------------------------------------\n\n/**\n * ServiceArchetype $id vocabulary — the 8-member frozen set from upstream.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceArchetypeIdSchema = z.enum([\n 'service-archetype-document-extraction',\n 'service-archetype-data-enrichment',\n 'service-archetype-transactional-action',\n 'service-archetype-sourced-comparative-analysis',\n 'service-archetype-form-preparation',\n 'service-archetype-compliance-check',\n 'service-archetype-market-intelligence',\n 'service-archetype-communication-automation',\n])\n\nexport type ServiceArchetypeId = z.infer<typeof ServiceArchetypeIdSchema>\n\n// -----------------------------------------------------------------------------\n// CatalogShapeSchema widening (PR 7)\n//\n// CatalogShapeSchema was introduced in PR 2 with two fields: hero + pricingSummary.\n// PR 7 widens it to carry the full landing-route data so deriveCatalog(svc)\n// becomes the single call the landing route makes, replacing the split between\n// getRenderData(slug) + the legacy listings/render-data.ts bridge for absorbed\n// products.\n//\n// The widening is ADDITIVE and ALL NEW FIELDS ARE OPTIONAL — this preserves\n// backwards-compat for callers that constructed a bare CatalogShape (e.g. tests\n// and example services that only populate hero + pricingSummary).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * CatalogShapeSchema widened for PR 7 — carries everything /[slug]/page.tsx needs.\n *\n * PR 2 fields (hero, pricingSummary) unchanged; PR 7 adds optional\n * publicCopy + branding + pricing + archetype. The landing route reads from\n * `catalogShape.publicCopy` when present; falls back to getRenderData for\n * non-absorbed products.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const CatalogShapeFullSchema = CatalogShapeSchema.extend({\n /** Full landing-page section copy. Present for all fully-absorbed services. */\n publicCopy: LandingPublicCopySchema.optional(),\n /** Product branding (wordmark + heroGlyph + og headline). */\n branding: ServiceBrandingSchema.optional(),\n /** Commercial pricing — section chrome + tiers. */\n pricing: LandingPricingSchema.optional(),\n /** Service archetype id — drives MIME/totalTime defaults at render time. */\n archetype: ServiceArchetypeIdSchema.optional(),\n})\n\nexport type CatalogShapeFull = z.infer<typeof CatalogShapeFullSchema>\n"],"mappings":"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","names":["jsx","useEffect","useState","jsx","useState","useEffect","Link","jsx","jsxs","Link","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Link","ChevronRight","Fragment","jsx","jsxs","ChevronRight","Link","jsx","jsxs","Link","ChevronRight","Fragment","jsx","jsxs","jsx","jsxs","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/scroll-reveal.tsx","../src/components/Masthead.tsx","../src/components/MobileNav.tsx","../src/components/ScrollHeader.tsx","../src/components/Footer.tsx","../src/components/HeroSplit.tsx","../src/components/HeroStacked.tsx","../src/components/Hero.tsx","../src/shared/section-eyebrow.tsx","../src/components/Problem.tsx","../src/components/WhatYouGet.tsx","../src/components/HowItWorks.tsx","../src/components/Defensibility.tsx","../src/components/Pricing.tsx","../src/components/Faq.tsx","../src/components/FinalCta.tsx","../src/views/ServicesLandingView.tsx","../src/shared/svg-inline.tsx","../src/parse-props.ts","../src/schemas/index.ts"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\n\n/**\n * ScrollReveal — dialect-wide scroll-driven fade-in wrapper.\n *\n * Each landing section fades in once when it enters the viewport. ONE fixed\n * duration + ONE fixed easing for every section across every service — motion\n * is package-owned, NOT theme-controllable.\n *\n * Duration + easing read from `--motion-fade-duration` +\n * `--motion-fade-easing` CSS variables (the host's globals define them; under\n * `prefers-reduced-motion: reduce` the duration token collapses to `0ms` so the\n * fade becomes instant with zero JS branching here).\n *\n * Behavior:\n * • One-shot — once `data-visible=\"true\"` flips, the observer disconnects.\n * • SSR-safe — if `IntersectionObserver` isn't defined, the wrapper reveals\n * immediately rather than trapping content invisible.\n * • Threshold 0.1 — section starts revealing as ~10% crosses the viewport edge.\n */\nexport interface ScrollRevealProps {\n children: React.ReactNode\n /** Optional anchor id so masthead `links` can deep-link to this section.\n * Pair with a `scroll-mt-*` className so the fixed ScrollHeader doesn't\n * overlap the scroll target. */\n id?: string\n /** Extra classes on the wrapper (e.g. `scroll-mt-24` for anchors). */\n className?: string\n}\n\nexport function ScrollReveal({ id, className, children }: ScrollRevealProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n\n // SSR-safe fallback: in environments without IntersectionObserver,\n // reveal immediately so content isn't trapped invisible.\n if (typeof IntersectionObserver === 'undefined') {\n setVisible(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setVisible(true)\n observer.disconnect()\n }\n },\n { threshold: 0.1 },\n )\n\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n return (\n <div\n ref={ref}\n id={id}\n className={className}\n data-scroll-reveal\n data-visible={visible}\n style={{\n opacity: visible ? 1 : 0,\n transition:\n 'opacity var(--motion-fade-duration) var(--motion-fade-easing)',\n }}\n >\n {children}\n </div>\n )\n}\n","/** Static masthead at the top of a service page. Pairs with ScrollHeader,\n * which reveals on scroll once this one has scrolled away.\n *\n * Three zones (carriage parity, origin/master a8700e6 + fda6fb6): brand (left,\n * with an optional `brand.logo` to the LEFT of the wordmark), an optional\n * centered nav of 3–5 page `links` (middle, `md`+ only), and a right-side slot\n * that is either a primary CTA pill (`cta`) or a small uppercase status label\n * (`eyebrow`) — passing both lets `cta` win. Below `md` the centered nav\n * collapses into a hamburger (`MobileNav`) rendered to the right of the CTA,\n * which opens a dropdown overlay carrying the same links. Use `narrow` when the\n * page below uses the 900px container instead of the default 1100px. */\n\nimport Link from 'next/link'\nimport * as schemas from '../schemas'\nimport { MobileNav } from './MobileNav'\n\nexport type MastheadProps = schemas.MastheadProps\n\nexport function Masthead({ brand, cta, links, eyebrow, narrow }: MastheadProps) {\n const hasNav = Boolean(links && links.length > 0)\n\n return (\n <header className=\"border-b border-line\">\n <div\n className={\n 'relative mx-auto flex items-center justify-between gap-4 px-6 py-5 sm:px-10 ' +\n (narrow ? 'max-w-[900px]' : 'max-w-container')\n }\n >\n <div className=\"flex items-center gap-3\">\n <Link\n href={brand.href}\n className=\"inline-flex items-center gap-2 font-display text-[18px] tracking-tightish text-ink\"\n >\n {brand.logo && (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={brand.logo.src} alt={brand.logo.alt} className=\"h-6 w-auto\" />\n )}\n {brand.primary}\n </Link>\n {brand.secondary && (\n <>\n <span className=\"hidden h-4 w-px bg-line2 sm:inline-block\" />\n <span className=\"hidden text-[11px] uppercase tracking-[0.18em] text-ink3 sm:inline\">\n {brand.secondary}\n </span>\n </>\n )}\n </div>\n\n {hasNav && (\n <nav className=\"absolute left-1/2 hidden -translate-x-1/2 items-center gap-7 md:flex\">\n {links!.map((l) => (\n <Link\n key={l.href}\n href={l.href}\n className=\"text-[13px] tracking-tightish text-ink2 transition-colors hover:text-ink\"\n >\n {l.label}\n </Link>\n ))}\n </nav>\n )}\n\n <div className=\"flex items-center gap-2\">\n {cta ? (\n <Link\n href={cta.href}\n // Theme-driven CTA recipe — see Hero.tsx.\n className=\"rounded-cta bg-cta px-4 py-2 text-[12px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover\"\n >\n {cta.label}\n </Link>\n ) : eyebrow ? (\n <span className=\"text-[10.5px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </span>\n ) : null}\n {hasNav && (\n <MobileNav links={links!} cta={cta} brand={brand} narrow={narrow} />\n )}\n </div>\n </div>\n </header>\n )\n}\n","'use client'\n\n/** Mobile navigation: a hamburger trigger + a dropdown overlay panel.\n * Rendered by `Masthead` only when page `links` are present and only below the\n * `md` breakpoint (the centered desktop nav takes over at `md`). Masthead\n * itself stays a Server Component; this client island owns the open/close\n * interactivity.\n *\n * The panel drops from the top over a plain dimmed scrim (no blur). It closes\n * on link tap, backdrop click, its own close button, or Escape, and locks body\n * scroll while open. Theme-driven (paper / ink / line / cta tokens from the\n * Services envelope); motion reuses the `ease-out-quart` / 220ms language and\n * collapses under prefers-reduced-motion via the host globals.\n *\n * Ported verbatim from carriage `src/chassis/components/site/MobileNav.tsx`\n * (origin/master a8700e6) — only the `NavLink` import (now from the schema\n * contract layer) differs. */\n\nimport { useEffect, useState } from 'react'\nimport Link from 'next/link'\nimport { Menu, X } from 'lucide-react'\n\nimport type { NavLink } from '../schemas'\n\nexport interface MobileNavProps {\n links: NavLink[]\n cta?: { label: string; href: string }\n brand: { primary: string; secondary?: string; href: string }\n narrow?: boolean\n}\n\nexport function MobileNav({ links, cta, brand, narrow }: MobileNavProps) {\n const [open, setOpen] = useState(false)\n const [scrollbarWidth, setScrollbarWidth] = useState(0)\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n // Reserve the page scrollbar's width as body padding while scroll is\n // locked. Without this, `overflow: hidden` removes the scrollbar, the\n // content area widens, and the `mx-auto`-centered masthead recenters —\n // visibly shoving the right-side group over as the menu opens. Pinning the\n // width keeps the layout perfectly still.\n const prevOverflow = document.body.style.overflow\n const prevPaddingRight = document.body.style.paddingRight\n document.body.style.overflow = 'hidden'\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n window.addEventListener('keydown', onKey)\n return () => {\n document.body.style.overflow = prevOverflow\n document.body.style.paddingRight = prevPaddingRight\n window.removeEventListener('keydown', onKey)\n }\n }, [open, scrollbarWidth])\n\n // Measure the scrollbar BEFORE locking scroll. Batched with `setOpen` so the\n // overlay's first paint already carries the matching padding — its inner row\n // stays aligned with the (now padded) masthead row.\n const openMenu = () => {\n setScrollbarWidth(window.innerWidth - document.documentElement.clientWidth)\n setOpen(true)\n }\n\n const row =\n 'mx-auto px-6 sm:px-10 ' + (narrow ? 'max-w-[900px]' : 'max-w-container')\n\n return (\n <div className=\"md:hidden\">\n <button\n type=\"button\"\n aria-label=\"Open menu\"\n aria-expanded={open}\n onClick={openMenu}\n className=\"flex h-9 w-9 items-center justify-center rounded-cta text-ink transition-colors hover:bg-surface\"\n >\n <Menu className=\"h-5 w-5\" strokeWidth={1.75} aria-hidden=\"true\" />\n </button>\n\n <div\n aria-hidden=\"true\"\n onClick={() => setOpen(false)}\n className={\n 'fixed inset-0 z-50 bg-ink/40 transition-opacity duration-[220ms] ease-out-quart ' +\n (open ? 'opacity-100' : 'pointer-events-none opacity-0')\n }\n />\n\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Site navigation\"\n // Same scrollbar-width reservation as the body, so this fixed\n // (full-viewport) panel's centered row lines up with the masthead.\n style={scrollbarWidth ? { paddingRight: scrollbarWidth } : undefined}\n className={\n 'fixed inset-x-0 top-0 z-50 origin-top bg-paper shadow-sheet transition-[transform,opacity] duration-[220ms] ease-out-quart ' +\n (open\n ? 'translate-y-0 opacity-100'\n : 'pointer-events-none -translate-y-3 opacity-0')\n }\n >\n <div\n className={`flex items-center justify-between gap-4 border-b border-line py-5 ${row}`}\n >\n <Link\n href={brand.href}\n onClick={() => setOpen(false)}\n className=\"font-display text-[18px] tracking-tightish text-ink\"\n >\n {brand.primary}\n </Link>\n <button\n type=\"button\"\n aria-label=\"Close menu\"\n onClick={() => setOpen(false)}\n className=\"flex h-9 w-9 items-center justify-center rounded-cta text-ink transition-colors hover:bg-surface\"\n >\n <X className=\"h-5 w-5\" strokeWidth={1.75} aria-hidden=\"true\" />\n </button>\n </div>\n\n <nav className={`flex flex-col py-2 ${row}`}>\n {links.map((l) => (\n <Link\n key={l.href}\n href={l.href}\n onClick={() => setOpen(false)}\n className=\"border-b border-line py-4 font-display text-[20px] tracking-tightish text-ink transition-colors last:border-b-0 hover:text-accent\"\n >\n {l.label}\n </Link>\n ))}\n </nav>\n\n {cta && (\n <div className={`pb-6 pt-3 ${row}`}>\n <Link\n href={cta.href}\n onClick={() => setOpen(false)}\n className=\"block rounded-cta bg-cta px-4 py-3 text-center text-[13px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover\"\n >\n {cta.label}\n </Link>\n </div>\n )}\n </div>\n </div>\n )\n}\n","'use client'\n\n/**\n * Reveals on scroll past `threshold` pixels and stays fixed at the top of the\n * viewport. Renders the same `Masthead` component used at the top of the page so\n * the two are visually identical — the scroll variant is `Masthead` inside a\n * fixed-positioned sliding wrapper, never both visible at once.\n */\n\nimport { useEffect, useState } from 'react'\nimport { Masthead, type MastheadProps } from './Masthead'\n\nexport interface ScrollHeaderProps extends MastheadProps {\n /** Pixels of scrollY before the header reveals. Default 480. */\n threshold?: number\n}\n\nexport function ScrollHeader({\n threshold = 480,\n ...mastheadProps\n}: ScrollHeaderProps) {\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n let raf = 0\n const update = () => {\n raf = 0\n setVisible(window.scrollY > threshold)\n }\n const onScroll = () => {\n if (raf) return\n raf = requestAnimationFrame(update)\n }\n update()\n window.addEventListener('scroll', onScroll, { passive: true })\n return () => {\n window.removeEventListener('scroll', onScroll)\n if (raf) cancelAnimationFrame(raf)\n }\n }, [threshold])\n\n return (\n <div\n aria-hidden={!visible}\n className={\n 'pointer-events-none fixed inset-x-0 top-0 z-40 transition-[transform,opacity] duration-[220ms] ease-out-quart ' +\n (visible\n ? 'translate-y-0 opacity-100'\n : '-translate-y-full opacity-0')\n }\n >\n <div className=\"pointer-events-auto bg-paper shadow-sheet\">\n <Masthead {...mastheadProps} />\n </div>\n </div>\n )\n}\n","/** Page footer with attribution text on the left and an optional legal-link\n * list (Privacy, Terms) on the right. */\n\nimport Link from 'next/link'\nimport * as schemas from '../schemas'\n\nexport type FooterLink = schemas.SiteFooterLink\n\nexport type FooterProps = schemas.SiteFooterProps\n\nexport function Footer({ text, links }: FooterProps) {\n return (\n <footer className=\"border-t border-line\">\n <div className=\"mx-auto flex max-w-container flex-col items-center gap-4 px-6 py-10 text-center text-[12px] text-ink3 sm:flex-row sm:justify-between sm:px-10 sm:text-left\">\n <p>{text}</p>\n {links && links.length > 0 && (\n <ul className=\"flex flex-wrap items-center justify-center gap-x-5 gap-y-2 sm:justify-end\">\n {links.map((l) => (\n <li key={l.href}>\n <Link\n href={l.href}\n className=\"text-ink3 no-underline transition-colors hover:text-ink\"\n >\n {l.label}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n </footer>\n )\n}\n","/** Hero variant: split-illustration-right.\n *\n * Text-left + ~360px illustration column on lg+. The Services-dialect hero\n * layout — outcome-led grammar (eyebrow / headline / body / primary /\n * secondary), NOT neo's code-bento hero with `installSnippet`.\n *\n * The illustration column accepts either:\n * 1. A custom `illustration` prop (raw ReactNode, used by the per-service\n * illustration manifest AND by per-product HeroGlyph SVGs)\n * 2. The dialect default `<HeroGlyph />` when no custom one provided\n * 3. Nothing at all when `showGlyph={false}` (text-only hero)\n *\n * Pairs with the `glyphOnMobile` prop to control mobile rendering. */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\n\nimport * as schemas from '../schemas'\n\n/** Inline call-to-action. Sourced from the schema — `SiteActionSchema`. */\nexport type HeroAction = schemas.SiteAction\n\n/** Hero component props. Sourced from the schema (`HeroPropsExtendedSchema`).\n * The schema is the canonical shape; this component reads `variant`,\n * `showGlyph`, `glyphOnMobile`, `illustration` from it. */\nexport type HeroProps = schemas.HeroPropsExtended\n\nexport function HeroSplit({\n eyebrow,\n headline,\n body,\n primary,\n secondary,\n showGlyph = true,\n /* INTENTIONALLY UNDEFAULTED — the smart default below uses the\n * undefined state to distinguish \"explicitly unset\" from\n * \"explicitly false\" (the opt-out escape hatch). */\n glyphOnMobile,\n illustration,\n}: HeroProps) {\n /* Smart mobile-visibility default for hero illustrations.\n *\n * - Explicit `glyphOnMobile: true` → show on mobile\n * - Explicit `glyphOnMobile: false` → hide on mobile (opt-out)\n * - Unset + bespoke `illustration` → DEFAULT TRUE (bespoke illustrations\n * ARE the value-prop preview and must show on mobile)\n * - Unset + no illustration (HeroGlyph renders) → DEFAULT FALSE\n */\n const effectiveGlyphOnMobile = glyphOnMobile ?? Boolean(illustration)\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32\">\n <div className={showGlyph ? 'lg:grid lg:grid-cols-[minmax(0,1fr)_360px] lg:items-center lg:gap-16' : ''}>\n <div>\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h1 className=\"mt-5 max-w-[18ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink\">\n {headline}\n </h1>\n <p className=\"mt-6 max-w-[58ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]\">\n {body}\n </p>\n <div className=\"mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <PrimaryAction action={primary} />\n {secondary && <SecondaryAction action={secondary} />}\n </div>\n </div>\n {showGlyph && (\n <div\n className={\n effectiveGlyphOnMobile\n ? 'mt-12 lg:mt-0 lg:block'\n : 'hidden lg:block'\n }\n aria-hidden=\"true\"\n >\n {illustration ?? <HeroGlyph />}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nexport function PrimaryAction({ action }: { action: HeroAction }) {\n // Theme-driven CTA recipe. `bg-cta / bg-cta-hover / text-cta-fg` resolve via\n // `--cta-*` vars set by `@mdxui/themes`' `themeToCssVars()` per theme.\n const className =\n 'inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-5 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto sm:justify-start'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </Link>\n )\n}\n\nexport function SecondaryAction({ action }: { action: HeroAction }) {\n const className =\n 'inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink2 transition-colors hover:text-accentDeep sm:justify-start'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </Link>\n )\n}\n\n/** Sparse geometric mark: stack of comp lines, median emphasized in\n * accent teal, range bracket on the right. Default for split-variant\n * heroes that don't pass a custom `illustration`. */\nfunction HeroGlyph() {\n return (\n <svg\n viewBox=\"0 0 360 280\"\n className=\"h-auto w-full\"\n fill=\"none\"\n role=\"presentation\"\n >\n <g\n stroke=\"oklch(var(--ink3) / 0.55)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <line x1=\"40\" y1=\"40\" x2=\"180\" y2=\"40\" />\n <line x1=\"60\" y1=\"78\" x2=\"220\" y2=\"78\" />\n <line x1=\"40\" y1=\"172\" x2=\"200\" y2=\"172\" />\n <line x1=\"80\" y1=\"210\" x2=\"260\" y2=\"210\" />\n <line x1=\"60\" y1=\"248\" x2=\"180\" y2=\"248\" />\n </g>\n <line\n x1=\"40\"\n y1=\"135\"\n x2=\"280\"\n y2=\"135\"\n stroke=\"oklch(var(--accent))\"\n strokeWidth=\"2.75\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"280\" cy=\"135\" r=\"4\" fill=\"oklch(var(--accent-deep))\" />\n <g\n stroke=\"oklch(var(--accent-deep) / 0.85)\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n >\n <line x1=\"312\" y1=\"100\" x2=\"312\" y2=\"170\" />\n <line x1=\"306\" y1=\"100\" x2=\"318\" y2=\"100\" />\n <line x1=\"306\" y1=\"170\" x2=\"318\" y2=\"170\" />\n <line x1=\"308\" y1=\"135\" x2=\"316\" y2=\"135\" />\n </g>\n </svg>\n )\n}\n","/** Hero variant: stacked-illustration-below.\n *\n * Text-center top + illustration centered below at ~1080px cap. For services\n * whose hero illustration needs full-bleed scale — code editors, spreadsheets,\n * dashboard mockups — that would feel cramped in the 360px split slot.\n *\n * Unlike HeroSplit, this variant has NO default glyph fallback — the\n * dispatcher in `./Hero.tsx` only routes here when an `illustration` is\n * provided. Services without a bespoke illustration fall back to HeroSplit\n * (which has the `<HeroGlyph />` default mark). */\n\nimport type { HeroProps } from './HeroSplit'\nimport { PrimaryAction, SecondaryAction } from './HeroSplit'\n\nexport function HeroStacked({\n eyebrow,\n headline,\n body,\n primary,\n secondary,\n illustration,\n}: HeroProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-28 lg:py-32\">\n <div className=\"text-center\">\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h1 className=\"mx-auto mt-5 max-w-[22ch] font-display text-display-hero leading-[1.04] tracking-tighter2 text-ink\">\n {headline}\n </h1>\n <p className=\"mx-auto mt-6 max-w-[60ch] text-[16px] leading-relaxed text-ink2 sm:mt-7 sm:text-[17px]\">\n {body}\n </p>\n <div className=\"mt-10 flex flex-col items-stretch justify-center gap-4 sm:flex-row sm:flex-wrap sm:items-center\">\n <PrimaryAction action={primary} />\n {secondary && <SecondaryAction action={secondary} />}\n </div>\n </div>\n {/* Illustration sits below text, capped at 1080px so it feels\n * substantial without bullying the page. */}\n <div className=\"mx-auto mt-14 max-w-[1080px] sm:mt-16\" aria-hidden=\"true\">\n {illustration}\n </div>\n </div>\n </section>\n )\n}\n","/** ServiceHero — Services-dialect hero composition dispatcher.\n *\n * Routes to the variant render based on `variant` (from the\n * `HeroPropsExtendedSchema`). Default is `'split-illustration-right'`\n * (`HeroSplit`). Adding a future variant = new `Hero<Name>.tsx` file + one\n * additional dispatcher branch here. */\n\nimport { HeroSplit, type HeroAction, type HeroProps } from './HeroSplit'\nimport { HeroStacked } from './HeroStacked'\n\nexport type { HeroAction, HeroProps }\n\nexport function Hero(props: HeroProps) {\n if (props.variant === 'stacked-illustration-below' && props.illustration) {\n return <HeroStacked {...props} />\n }\n return <HeroSplit {...props} />\n}\n\n/** Services-dialect alias — the dialect names this block `ServiceHero`\n * (ADR 0003 §3). Same component as `Hero`. */\nexport { Hero as ServiceHero }\n","/** Small uppercase label that anchors a section heading. */\n\nexport function SectionEyebrow({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {children}\n </p>\n )\n}\n","/** Three-card \"problem\" section. Each card has a category label, a\n * cost line, a one-line outcome verdict, and a body paragraph. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type ProblemItem = schemas.ProblemItem\n\nexport type ProblemProps = schemas.ProblemProps\n\nexport function Problem({ eyebrow, heading, items }: ProblemProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-12 grid gap-8 md:grid-cols-3\">\n {items.map((item) => (\n <ProblemCard key={item.label} {...item} />\n ))}\n </div>\n </div>\n </section>\n )\n}\n\nfunction ProblemCard({ label, cost, outcome, body }: ProblemItem) {\n return (\n <article>\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n {label}\n </p>\n <p className=\"mt-3 font-display text-[24px] leading-tight tracking-tightish text-ink\">\n {cost}\n </p>\n <p className=\"mt-4 text-body-sm font-medium leading-snug tracking-tightish text-accentDeep\">\n {outcome}\n </p>\n <p className=\"mt-3 text-body-sm leading-relaxed text-ink2\">{body}</p>\n </article>\n )\n}\n","/** \"What's in the report\" — numbered grid listing each section. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type WhatYouGetItem = schemas.WhatYouGetItem\n\nexport type WhatYouGetProps = schemas.WhatYouGetProps\n\nexport function WhatYouGet({ eyebrow, heading, sections }: WhatYouGetProps) {\n // Empty-array graceful handling — skip the section entirely rather\n // than render dangling chrome (eyebrow + heading) above an empty grid.\n if (sections.length === 0) return null\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <ul className=\"mt-12 grid gap-x-8 gap-y-7 md:grid-cols-2 lg:grid-cols-3\">\n {sections.map((s) => (\n <li key={s.n}>\n <p className=\"font-display text-[14px] tracking-tightish text-ink3\">\n {s.n}\n </p>\n <p className=\"mt-1.5 text-[15px] font-medium tracking-tightish text-ink\">\n {s.title}\n </p>\n <p className=\"mt-1.5 text-[13.5px] leading-relaxed text-ink2\">\n {s.body}\n </p>\n </li>\n ))}\n </ul>\n </div>\n </section>\n )\n}\n","/** Three-column \"how it works\" strip with large numbered eyebrows.\n *\n * Optional per-step illustration row above the number — opt in by passing\n * `stepIllustrations` (a `ComponentType[]` matching `steps.length`). When the\n * lengths don't match (or the prop is absent), the text-only layout renders\n * unchanged. Opt-in only, never degrade. */\n\nimport type { ComponentType } from 'react'\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type HowItWorksStep = schemas.HowItWorksStep\n\n/** HowItWorks component props. Sourced from `HowItWorksPropsSchema`, which\n * includes the opt-in `stepIllustrations` field. */\nexport type HowItWorksProps = schemas.HowItWorksProps\n\nexport function HowItWorks({\n eyebrow,\n heading,\n steps,\n stepIllustrations,\n}: HowItWorksProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (steps.length === 0) return null\n const hasIllustrations =\n stepIllustrations !== undefined &&\n stepIllustrations.length === steps.length\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <ol\n itemScope\n itemType=\"https://schema.org/HowTo\"\n className=\"mt-12 grid gap-10 md:grid-cols-3\"\n >\n {steps.map((s, i) => (\n <Step\n key={s.n}\n {...s}\n illustration={hasIllustrations ? stepIllustrations![i] : undefined}\n />\n ))}\n </ol>\n </div>\n </section>\n )\n}\n\nfunction Step({\n n,\n title,\n body,\n illustration: Illustration,\n}: HowItWorksStep & { illustration?: ComponentType }) {\n /* When step illustrations are present, the parent grid stretches all <li>s to\n * the height of the tallest column; the flex-col + `mt-auto` on the text block\n * pushes numbers / titles / bodies to a shared baseline. Without an\n * illustration, content flows naturally from the top (text-only layout). */\n return (\n <li\n itemScope\n itemType=\"https://schema.org/HowToStep\"\n className={Illustration ? 'flex flex-col' : undefined}\n >\n {Illustration && (\n <div className=\"mb-6 w-full lg:max-w-[320px]\">\n <Illustration />\n </div>\n )}\n <div className={Illustration ? 'mt-auto' : undefined}>\n <p className=\"font-display text-[36px] leading-none tracking-tighter2 text-ink3/60\">\n {n}\n </p>\n <p className=\"mt-4 font-display text-[20px] leading-tight tracking-tightish text-ink\">\n {title}\n </p>\n <p className=\"mt-3 text-body-sm leading-relaxed text-ink2\">{body}</p>\n </div>\n </li>\n )\n}\n","/** Two-column \"what it is / what it isn't\" block with a closing caveat\n * paragraph — THE Services signature block (ADR 0003 §3). Used to set scope\n * expectations on a service page. No neo equivalent. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type DefensibilityColumn = schemas.DefensibilityColumnFromSchema\n\nexport type DefensibilityProps = schemas.DefensibilityPropsFromSchema\n\nexport function Defensibility({\n eyebrow,\n heading,\n columns,\n caveat,\n}: DefensibilityProps) {\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-10 grid gap-10 lg:grid-cols-2\">\n {columns.map((col) => (\n <Column key={col.heading} {...col} />\n ))}\n </div>\n {caveat && (\n <p className=\"mt-12 max-w-[68ch] text-body-xs leading-relaxed text-ink3\">\n {caveat}\n </p>\n )}\n </div>\n </section>\n )\n}\n\nfunction Column({ heading, bullets }: DefensibilityColumn) {\n return (\n <div>\n <h3 className=\"font-display text-[18px] leading-tight tracking-tightish text-ink\">\n {heading}\n </h3>\n <ul className=\"mt-4 space-y-3 text-body-sm leading-relaxed text-ink2\">\n {bullets.map((b, i) => (\n <li key={i} className=\"flex gap-2.5\">\n <span className=\"mt-2 h-1 w-1 shrink-0 rounded-full bg-ink3\" />\n <span>{b}</span>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","/** ReportPricing — the Services-dialect pricing section. Two variants on the\n * discriminated `Pricing` union:\n *\n * - `kind: 'tiered'` — renders 1, 2, or 3 tier cards. CTAs flex to the bottom\n * of each card so heights stay symmetric.\n * - `kind: 'unit'` — renders a single per-unit price (\"$3 per transcript\"\n * style) with billing cadence. No tier chrome, no per-tier CTA.\n *\n * Services grammar: \"per report, no subscription\" — NOT neo's subscription\n * tier pricing. The default price suffix is \"/ report\". */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type PriceTier = schemas.PriceTier\n\n/** Legacy tiered-only props shape (omits `kind` + `currency`). The component\n * accepts EITHER this OR the wider discriminated `Pricing` union. */\nexport type PricingProps = schemas.PricingPropsExtended\n\n/** The canonical discriminated `Pricing` union (carries `kind: 'unit'`). */\nexport type PricingData = schemas.Pricing\n\n/** Component-level accepted props: the legacy tiered-only shape OR the\n * discriminated `Pricing` union. The component branches on `kind` internally. */\nexport type PricingComponentProps = PricingProps | PricingData\n\nconst GRID_COLS: Record<1 | 2 | 3, string> = {\n 1: 'max-w-[420px]',\n 2: 'max-w-[820px] md:grid-cols-2',\n 3: 'max-w-container md:grid-cols-3',\n}\n\nexport function Pricing(props: PricingComponentProps) {\n if ('kind' in props && props.kind === 'unit') {\n return <UnitPricing {...props} />\n }\n // Both legacy `PricingProps` (no `kind`) and `PricingTiered`\n // (`kind: 'tiered'`) hit this branch — both carry `tiers[]`.\n return <TieredPricing {...(props as TieredRenderProps)} />\n}\n\ntype TieredRenderProps = {\n eyebrow: string\n heading: string\n tiers: readonly PriceTier[]\n footnote?: string\n}\n\nfunction TieredPricing({\n eyebrow,\n heading,\n tiers,\n footnote,\n}: TieredRenderProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (tiers.length === 0) return null\n const count = (\n tiers.length === 1 || tiers.length === 2 ? tiers.length : 3\n ) as 1 | 2 | 3\n return (\n <section className=\"border-b border-line bg-surface\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className={`mt-12 mx-auto grid gap-6 ${GRID_COLS[count]}`}>\n {tiers.map((t) => (\n <PriceCard key={t.tier} {...t} />\n ))}\n </div>\n {footnote && (\n <p className=\"mt-10 max-w-[64ch] text-[13px] text-ink3\">{footnote}</p>\n )}\n </div>\n </section>\n )\n}\n\n/** Format a per-unit price using `Intl.NumberFormat`. Trims trailing\n * zero-cents for clean reading (\"$3\" not \"$3.00\"). */\nfunction formatPerUnit(perUnit: number, currency: 'usd' | 'eur' | 'gbp'): string {\n const isWhole = Number.isInteger(perUnit)\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: currency.toUpperCase(),\n minimumFractionDigits: isWhole ? 0 : 2,\n maximumFractionDigits: 2,\n }).format(perUnit)\n}\n\nfunction UnitPricing({\n eyebrow,\n heading,\n footnote,\n currency,\n perUnit,\n billingCadence,\n}: Extract<PricingData, { kind: 'unit' }>) {\n const formatted = formatPerUnit(perUnit, currency)\n return (\n <section className=\"border-b border-line bg-surface\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[22ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <div className=\"mt-12 mx-auto max-w-[420px]\">\n <article\n itemScope\n itemType=\"https://schema.org/Offer\"\n data-pricing-kind=\"unit\"\n className=\"flex flex-col rounded-card border border-line bg-paper p-7\"\n >\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n Per call\n </p>\n <p className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"font-display text-[40px] leading-none tracking-tighter2 text-ink\">\n {formatted}\n </span>\n <span className=\"text-[12px] text-ink3\">{billingCadence}</span>\n </p>\n </article>\n </div>\n {footnote && (\n <p className=\"mt-10 max-w-[64ch] text-[13px] text-ink3\">{footnote}</p>\n )}\n </div>\n </section>\n )\n}\n\n/** Split a price string like \"$0.10/VIN\" into (\"$0.10\", \"/VIN\"). */\nfunction splitPrice(price: string): { core: string; suffix: string | null } {\n const i = price.indexOf('/')\n if (i === -1) return { core: price, suffix: null }\n return { core: price.slice(0, i).trim(), suffix: price.slice(i) }\n}\n\n/** Resolve the suffix shown after the price. Explicit per-tier `priceSuffix`\n * wins; otherwise an auto-extracted \"/X\"; otherwise the dialect default\n * \"/ report\" (the \"per report, no subscription\" Services grammar). */\nfunction resolvePriceSuffix(\n price: string,\n override: string | undefined,\n): string {\n if (override !== undefined) return override\n const { suffix } = splitPrice(price)\n return suffix ?? '/ report'\n}\n\nfunction PriceCard({\n tierKey,\n tier,\n price,\n priceSuffix,\n audience,\n features,\n featured,\n cta,\n}: PriceTier) {\n const isMailto = cta.href.startsWith('mailto:')\n const { core } = splitPrice(price)\n const suffix = resolvePriceSuffix(price, priceSuffix)\n return (\n <article\n itemScope\n itemType=\"https://schema.org/Offer\"\n data-tier-key={tierKey}\n className={\n 'flex flex-col rounded-card border bg-paper p-7 ' +\n (featured ? 'border-accent shadow-lift' : 'border-line')\n }\n >\n <p className=\"text-[10.5px] uppercase tracking-[0.16em] text-ink3\">\n {tier}\n </p>\n <p className=\"mt-3 flex items-baseline gap-2\">\n <span className=\"font-display text-[40px] leading-none tracking-tighter2 text-ink\">\n {core}\n </span>\n {suffix && <span className=\"text-[12px] text-ink3\">{suffix}</span>}\n </p>\n <p className=\"mt-2 text-[13px] text-ink2\">{audience}</p>\n <ul className=\"mt-6 flex-1 space-y-2.5 text-[13.5px] text-ink2\">\n {features.map((f) => (\n <li key={f} className=\"flex gap-2.5\">\n <span\n className={\n 'mt-2 h-1 w-1 shrink-0 rounded-full ' +\n (featured ? 'bg-accent' : 'bg-ink3')\n }\n />\n <span>{f}</span>\n </li>\n ))}\n </ul>\n <PriceCardCta\n label={cta.label}\n href={cta.href}\n featured={featured}\n external={isMailto}\n />\n </article>\n )\n}\n\nfunction PriceCardCta({\n label,\n href,\n featured,\n external,\n}: {\n label: string\n href: string\n featured?: boolean\n external?: boolean\n}) {\n const baseClass =\n 'mt-7 inline-flex w-full items-center justify-center gap-1.5 rounded-cta px-5 py-2.5 text-[13.5px] font-medium tracking-tightish transition-colors'\n // Theme-driven CTA recipe for the featured tier. The unfeatured (outlined)\n // variant stays ink-typed as a quiet secondary action.\n const variantClass = featured\n ? 'bg-cta text-cta-fg hover:bg-cta-hover'\n : 'border border-line2 bg-paper text-ink hover:border-ink hover:text-ink'\n const className = `${baseClass} ${variantClass}`\n const body = (\n <>\n {label}\n <ChevronRight className=\"h-3.5 w-3.5\" strokeWidth={1.7} />\n </>\n )\n if (external) {\n return (\n <a className={className} href={href} data-action=\"buy\">\n {body}\n </a>\n )\n }\n return (\n <Link className={className} href={href} data-action=\"buy\">\n {body}\n </Link>\n )\n}\n\n/** Services-dialect alias — the dialect names this block `ReportPricing`\n * (ADR 0003 §3: \"per report, no subscription\"). Same component as `Pricing`. */\nexport { Pricing as ReportPricing }\n","/** Two-column FAQ grid. Each item is a question (display serif) and an\n * answer paragraph (sans). Uses Services' short-key q/a convention. */\n\nimport { SectionEyebrow } from '../shared/section-eyebrow'\nimport * as schemas from '../schemas'\n\nexport type FaqItem = schemas.FaqItem\n\nexport type FaqProps = schemas.FaqPropsExtended\n\nexport function Faq({ eyebrow, heading, items }: FaqProps) {\n // Empty-array graceful handling — skip the section entirely.\n if (items.length === 0) return null\n return (\n <section className=\"border-b border-line\">\n <div className=\"mx-auto max-w-container px-6 py-16 sm:px-10 sm:py-24\">\n <SectionEyebrow>{eyebrow}</SectionEyebrow>\n <h2 className=\"mt-3 max-w-[20ch] font-display text-display-section leading-[1.08] tracking-tightish text-ink\">\n {heading}\n </h2>\n <dl className=\"mt-12 grid gap-x-12 gap-y-10 md:grid-cols-2\">\n {items.map((f) => (\n <div key={f.q} itemScope itemType=\"https://schema.org/Question\">\n <dt className=\"font-display text-body leading-snug tracking-tightish text-ink\">\n {f.q}\n </dt>\n <dd className=\"mt-2 text-body-sm leading-relaxed text-ink2\">\n {f.a}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n </section>\n )\n}\n","/** Closing call-to-action with a centered headline and one or two buttons.\n * Primary is always rendered; secondary is optional and rendered as a quieter\n * link beside the primary pill. */\n\nimport Link from 'next/link'\nimport { ChevronRight } from 'lucide-react'\nimport * as schemas from '../schemas'\n\nexport type FinalCtaProps = schemas.FinalCtaProps\n\ntype CtaAction = schemas.SiteAction\n\nexport function FinalCta({\n eyebrow,\n headline,\n primary,\n secondary,\n}: FinalCtaProps) {\n return (\n <section>\n <div className=\"mx-auto max-w-container px-6 py-20 text-center sm:px-10 sm:py-32\">\n <p className=\"text-[11px] uppercase tracking-[0.18em] text-ink3\">\n {eyebrow}\n </p>\n <h2 className=\"mx-auto mt-4 max-w-[22ch] font-display text-[36px] leading-[1.04] tracking-tighter2 text-ink sm:text-[52px]\">\n {headline}\n </h2>\n <div className=\"mt-10 flex flex-col items-stretch gap-4 sm:flex-row sm:flex-wrap sm:items-center sm:justify-center\">\n <PrimaryButton action={primary} />\n {secondary && <SecondaryLink action={secondary} />}\n </div>\n </div>\n </section>\n )\n}\n\nfunction PrimaryButton({ action }: { action: CtaAction }) {\n // Theme-driven CTA recipe — see Hero.tsx for context.\n const className =\n 'inline-flex w-full items-center justify-center gap-1.5 rounded-cta bg-cta px-6 py-3 text-[14px] font-medium tracking-tightish text-cta-fg transition-colors hover:bg-cta-hover sm:w-auto'\n const body = (\n <>\n {action.label}\n <ChevronRight className=\"h-4 w-4\" strokeWidth={1.7} />\n </>\n )\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {body}\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {body}\n </Link>\n )\n}\n\nfunction SecondaryLink({ action }: { action: CtaAction }) {\n const className =\n 'inline-flex items-center justify-center gap-1.5 text-[13px] font-medium tracking-tightish text-ink3 transition-colors hover:text-ink'\n if (action.external) {\n return (\n <a\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className}\n >\n {action.label}\n </a>\n )\n }\n return (\n <Link href={action.href} className={className}>\n {action.label}\n </Link>\n )\n}\n","/**\n * ServicesLandingView — the Services dialect's single high-level view (ADR 0003\n * §2, design note §6). Renders the full Services narrative arc from one\n * validated `content` bag:\n *\n * masthead → hero → problem → what-you-get → how-it-works → defensibility\n * → pricing → faq → final-cta → footer\n *\n * This is the package-internal equivalent of carriage's `/[slug]/page.tsx` body.\n * After W-B4, carriage's landing route becomes:\n *\n * const catalog = deriveCatalog(svc) // carriage keeps the derive layer\n * return <ServicesLandingView content={catalog} />\n *\n * Every section is fed its slice of the content bag. Optional sections render\n * only when their slice is present; the empty-array guards inside each section\n * component handle the \"present but empty\" case. Chrome (Masthead / ScrollHeader\n * / Footer) is NOT wrapped in ScrollReveal — only narrative sections are.\n */\n\nimport { ScrollReveal } from '../shared/scroll-reveal'\nimport { Masthead } from '../components/Masthead'\nimport { ScrollHeader } from '../components/ScrollHeader'\nimport { Footer } from '../components/Footer'\nimport { Hero } from '../components/Hero'\nimport { Problem } from '../components/Problem'\nimport { WhatYouGet } from '../components/WhatYouGet'\nimport { HowItWorks } from '../components/HowItWorks'\nimport { Defensibility } from '../components/Defensibility'\nimport { Pricing } from '../components/Pricing'\nimport { Faq } from '../components/Faq'\nimport { FinalCta } from '../components/FinalCta'\nimport { DialectShell } from '@mdxui/dialect'\nimport type { DialectViewProps } from '@mdxui/dialect'\n\nimport type {\n MastheadProps,\n SiteFooterProps,\n HeroPropsExtended,\n ProblemProps,\n WhatYouGetProps,\n HowItWorksProps,\n DefensibilityPropsFromSchema,\n PricingPropsExtended,\n Pricing as PricingUnion,\n FaqPropsExtended,\n FinalCtaProps,\n} from '../schemas'\n\n/**\n * The validated content bag for a Services landing page — the union of every\n * section's prop slice. Carriage's `deriveCatalog(svc)` output maps onto this\n * shape; a generated Startup's mapper produces the same bag from the wire type.\n */\nexport interface ServicesLandingContent {\n /** Top masthead + the scroll-revealed sticky header (same props). */\n masthead: MastheadProps\n /** Pixels of scrollY before the sticky ScrollHeader reveals. Default 480. */\n scrollHeaderThreshold?: number\n hero: HeroPropsExtended\n /** When true, the hero renders its illustration slot; default true. */\n heroShowGlyph?: boolean\n problem?: ProblemProps\n whatYouGet?: WhatYouGetProps\n howItWorks?: HowItWorksProps\n defensibility?: DefensibilityPropsFromSchema\n /** Tiered or unit pricing — the discriminated `Pricing` union, or the legacy\n * tiered-only `PricingPropsExtended` shape. */\n pricing?: PricingPropsExtended | PricingUnion\n faq?: FaqPropsExtended\n finalCta: FinalCtaProps\n footer: SiteFooterProps\n}\n\n/**\n * Uniform dialect contract (ui#30): `{ content, theme, mode, brandName,\n * hostname }`, same as the agent dialects. Services drives its chrome from the\n * `content` bag (masthead / footer), so it ignores brandName/hostname, but it\n * accepts them so the renderer + cascade consume every dialect identically.\n */\nexport type ServicesLandingViewProps = DialectViewProps<ServicesLandingContent>\n\nexport function ServicesLandingView({ content, theme, mode }: ServicesLandingViewProps) {\n return (\n // texture off: the editorial Services surface keeps its own treatment; the\n // shell's only job here is the <Site> theming envelope (services previously\n // wrapped none, relying on the consumer — now it's self-contained).\n <DialectShell theme={theme} mode={mode} texture={false}>\n {/* Scope wrapper for the carriage theme envelope. `@mdxui/services/styles.css`\n scopes ALL carriage tokens/utilities (Fraunces --font-display, the\n ink/surface/cta palette, text-display-* ramp, rounded-cta, etc.) under\n this `data-dialect=\"services\"` selector so they light up here WITHOUT\n colliding with the host's global --font-display/--accent (which the\n other dialects depend on). The package ships JSX referencing these\n tokens; the CSS ships their definitions — consumers\n `@import \"@mdxui/services/styles.css\"`. */}\n <div data-dialect=\"services\">\n <Masthead {...content.masthead} />\n <ScrollHeader\n {...content.masthead}\n threshold={content.scrollHeaderThreshold}\n />\n\n <main>\n <ScrollReveal>\n <Hero {...content.hero} showGlyph={content.heroShowGlyph} />\n </ScrollReveal>\n\n {content.problem && (\n <ScrollReveal>\n <Problem {...content.problem} />\n </ScrollReveal>\n )}\n\n {content.whatYouGet && (\n <ScrollReveal>\n <WhatYouGet {...content.whatYouGet} />\n </ScrollReveal>\n )}\n\n {content.howItWorks && (\n <ScrollReveal id=\"how-it-works\" className=\"scroll-mt-24\">\n <HowItWorks {...content.howItWorks} />\n </ScrollReveal>\n )}\n\n {content.defensibility && (\n <ScrollReveal>\n <Defensibility {...content.defensibility} />\n </ScrollReveal>\n )}\n\n {content.pricing && (\n <ScrollReveal id=\"pricing\" className=\"scroll-mt-24\">\n <Pricing {...content.pricing} />\n </ScrollReveal>\n )}\n\n {content.faq && (\n <ScrollReveal id=\"faq\" className=\"scroll-mt-24\">\n <Faq {...content.faq} />\n </ScrollReveal>\n )}\n\n <ScrollReveal>\n <FinalCta {...content.finalCta} />\n </ScrollReveal>\n </main>\n\n <Footer {...content.footer} />\n </div>\n </DialectShell>\n )\n}\n","/**\n * SvgInline — render a raw SVG markup string inside a sized container.\n *\n * Used to consume `ServiceBranding.heroGlyph` — JSON-driven services author\n * their hero illustration as an inline SVG string.\n *\n * Trust model: the SVG markup originates from a service-definition JSON file\n * authored by the service generator or a human at absorption time. It is NOT\n * untrusted user input; treat it as trusted asset content rendered via\n * `dangerouslySetInnerHTML`.\n *\n * Authoring rules (enforced at JSON-write time, not runtime):\n * - Single `<svg>` root element with a `viewBox` attribute.\n * - No `<script>` tags, no event handlers, no external references.\n * - Use theme tokens (`oklch(var(--accent))`, `oklch(var(--ink3) / 0.55)`,\n * etc.) for stroke + fill — the glyph picks up the current theme.\n */\n\nexport interface SvgInlineProps {\n /** Raw SVG markup (`<svg>...</svg>`). */\n svg: string\n}\n\nexport function SvgInline({ svg }: SvgInlineProps) {\n return (\n <div\n className=\"h-auto w-full\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )\n}\n","import type { ZodSchema, ZodError } from 'zod'\n\n/**\n * parseProps — the JSON→component validation seam for the Services dialect.\n *\n * Ported verbatim from carriage's `src/chassis/mdxui-bridge/parse-props.ts`\n * (already dependency-free + host-agnostic). Runs `schema.parse(data)` exactly\n * once per JSON→component crossing, with a Services-shaped error envelope.\n * Inside the package's components, props are already typed and trusted — no\n * need to re-validate on every render.\n */\n\nexport interface ParsePropsOptions {\n /**\n * Caller context for error messages — e.g. \"deriveCatalog/charity-vehicle-valuation\".\n * Appears in the thrown error so logs are greppable by source.\n */\n source?: string\n}\n\nexport class MdxuiParseError extends Error {\n readonly issues: Array<{ path: string; message: string }>\n readonly source: string | undefined\n\n constructor(zodError: ZodError, source: string | undefined) {\n const issues = zodError.issues.map((issue) => ({\n path: issue.path.join('.') || '(root)',\n message: issue.message,\n }))\n const lines = issues.map((i) => ` ${i.path}: ${i.message}`)\n const header = source\n ? `[@mdxui/services] parseProps failed (source: ${source})`\n : '[@mdxui/services] parseProps failed'\n super(`${header}\\n${lines.join('\\n')}`)\n this.name = 'MdxuiParseError'\n this.issues = issues\n this.source = source\n }\n}\n\n/**\n * Run `schema.parse(data)` with a Services-shaped error envelope.\n *\n * Throws `MdxuiParseError` on invalid input — message includes\n * path-prefixed Zod issues and the `opts.source` string so errors\n * are greppable in logs.\n */\nexport function parseProps<T>(\n schema: ZodSchema<T>,\n data: unknown,\n opts?: ParsePropsOptions,\n): T {\n const result = schema.safeParse(data)\n if (result.success) return result.data\n throw new MdxuiParseError(result.error, opts?.source)\n}\n","/**\n * @mdxui/services — the Services dialect prop contract (ADR 0003 §3).\n *\n * These Zod schemas ARE the Services dialect's public prop surface. They were\n * authored and battle-tested in carriage's `src/chassis/mdxui-bridge/extensions/`\n * (7 products + 4 example services + 26 snapshot baselines) by reframing each\n * carriage component prop interface against mdxui's nearest equivalent — every\n * `// upstream-proposal:` comment documents WHY the Services shape differs from\n * neo/mdxui's dev-first grammar. That delta IS the dialect. This package is the\n * upstream those proposals always pointed at: it promotes the shapes to a\n * published contract.\n *\n * The four base mdxui input schemas (Text/Select/RadioGroup/File) are the\n * dialect's base vocabulary for the intake-form field contract; the rest are\n * fresh Services-semantic objects. The landing narrative arc (Hero → Problem →\n * WhatYouGet → HowItWorks → Defensibility → ReportPricing → Faq → FinalCta)\n * does not depend on the mdxui input schemas.\n */\n\nimport type React from 'react'\nimport { z } from 'zod'\nimport {\n TextInputPropsSchema,\n SelectInputPropsSchema,\n RadioGroupInputPropsSchema,\n FileInputPropsSchema,\n} from 'mdxui'\n\n// =============================================================================\n// PR 2 extensions — derive* contract layer\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// CatalogShapeSchema\n//\n// Zod-validated form of Carriage's `CatalogShape` (the \"browse\" surface\n// that deriveCatalog produces). mdxui's LandingPagePropsSchema is a layout\n// container (`{ children: any }`) — it composes section-level schemas\n// (HeroPropsSchema, PricingPropsSchema, etc.) as children, not as a flat\n// data shape. deriveCatalog returns flat data (hero headline, pricingSummary)\n// that a renderer then maps to section-level components. The two shapes serve\n// different layers; forcing deriveCatalog's output into LandingPagePropsSchema\n// would be a meaningless structural fit.\n//\n// upstream-proposal: file against mdxui as CatalogShapeSchema alongside\n// DeliveryShapeSchema and PortalShapeSchema — all three are the Carriage-\n// proposed service-runtime data shapes that precede component rendering.\n// See docs/patterns/upstream-proposals.md §PR2-catalog (PR 5 will file this).\n// -----------------------------------------------------------------------------\n\nexport const CatalogHeroSchema = z.object({\n /** Main landing-page headline. Falls back to `service.name` when unset. */\n headline: z.string().optional(),\n /** Sub-headline. Falls back to `service.promise` when unset. */\n subheadline: z.string().optional(),\n /** Asset reference for a visual element resolved by the renderer.\n * Today Carriage uses per-product HeroGlyph SVGs keyed by slug. */\n visual: z.string().optional(),\n})\n\nexport type CatalogHero = z.infer<typeof CatalogHeroSchema>\n\n/**\n * Pricing summary hint for the catalog card. Drives which Pricing\n * layout variant the renderer selects.\n *\n * upstream-proposal: same as CatalogShapeSchema above.\n */\nexport const PricingSummarySchema = z.enum([\n 'starting-at',\n 'per-call',\n 'tier-comparison',\n 'contact-us',\n])\n\nexport type PricingSummary = z.infer<typeof PricingSummarySchema>\n\n/**\n * Browse-side catalog UI shape. Produced by deriveCatalog(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-catalog.\n * The shape is the data layer; LandingPagePropsSchema (already in mdxui)\n * is the layout layer. Proposing CatalogShapeSchema as the data contract\n * that feeds the layout.\n */\nexport const CatalogShapeSchema = z.object({\n hero: CatalogHeroSchema.optional(),\n pricingSummary: PricingSummarySchema,\n})\n\nexport type CatalogShape = z.infer<typeof CatalogShapeSchema>\n\n// -----------------------------------------------------------------------------\n// Input field schemas with `source` made optional\n//\n// mdxui's BaseInputPropsSchema requires `source: string` (the\n// ReactAdmin/Platform.do data-binding field path). Carriage's form renderer\n// uses `name` (the JSON-schema property key) for data binding — `source` is\n// not applicable to the derive-layer output. We extend each input schema to\n// make `source` optional so derivOrder's field objects can conform without\n// carrying a meaningless value.\n//\n// upstream-proposal: file against mdxui — source should be optional (or moved\n// to a separate ReactAdmin-specific extension) since non-ReactAdmin consumers\n// don't use it. See docs/patterns/upstream-proposals.md §PR2-source-optional.\n// -----------------------------------------------------------------------------\n\n/**\n * TextInputPropsSchema with `source` optional.\n * Used for string fields without enum (plain text, email, date, etc.)\n */\nexport const TextInputSchema = TextInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type TextInput = z.infer<typeof TextInputSchema>\n\n/**\n * SelectInputPropsSchema with `source` optional.\n * Used for string/number fields with `enum` constraint.\n */\nexport const SelectInputSchema = SelectInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type SelectInput = z.infer<typeof SelectInputSchema>\n\n/**\n * RadioGroupInputPropsSchema with `source` optional.\n * Used for string/number fields with enum + `options` (rich label/sub display).\n */\nexport const RadioGroupInputSchema = RadioGroupInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type RadioGroupInput = z.infer<typeof RadioGroupInputSchema>\n\n/**\n * FileInputPropsSchema with `source` optional.\n * Used for fields with `widget: 'image-upload'` or `format: 'uri'` + upload widget.\n */\nexport const FileInputSchema = FileInputPropsSchema.extend({\n source: z.string().optional(),\n})\n\nexport type FileInput = z.infer<typeof FileInputSchema>\n\n// -----------------------------------------------------------------------------\n// OrderShapeSchema\n//\n// Zod-validated form of Carriage's `OrderShape` (the \"buy / form\" surface\n// that deriveOrder produces). The individual field entries are validated at\n// the TEST layer against the dispatched input schemas (TextInputSchema,\n// SelectInputSchema, etc.) by widget kind — that validation is runtime-\n// contextual and lives in derive.mdxui-contract.test.ts.\n//\n// upstream-proposal: file against mdxui as OrderShapeSchema alongside\n// CatalogShapeSchema, DeliveryShapeSchema, and PortalShapeSchema.\n// See docs/patterns/upstream-proposals.md §PR2-order (PR 5 will file this).\n// -----------------------------------------------------------------------------\n\nexport const OrderFlowSchema = z.enum([\n 'instant',\n 'guided',\n 'consultation-first',\n])\n\nexport type OrderFlow = z.infer<typeof OrderFlowSchema>\n\n/**\n * One field in an order step — the data representation used by the\n * form renderer.\n *\n * upstream-proposal: same as OrderShapeSchema above.\n */\nexport const OrderFieldSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'number', 'integer', 'boolean']),\n required: z.boolean(),\n title: z.string().optional(),\n description: z.string().optional(),\n enum: z.array(z.union([z.string(), z.number(), z.boolean()])).readonly().optional(),\n pattern: z.string().optional(),\n format: z.enum(['date', 'date-time', 'email', 'uri']).optional(),\n minimum: z.number().optional(),\n maximum: z.number().optional(),\n widget: z.enum(['vin-decoder', 'image-upload']).optional(),\n row: z.number().optional(),\n placeholder: z.string().optional(),\n autocomplete: z.string().optional(),\n options: z.array(z.object({\n value: z.union([z.string(), z.number(), z.boolean()]),\n label: z.string().optional(),\n sub: z.string().optional(),\n })).readonly().optional(),\n tiers: z.array(z.string()).readonly().optional(),\n /** Phase 1b multi-substrate (Carriage Iter / master 2026-05-26):\n * forwarded from JSON Schema's `x-connect` vendor annotation. When\n * set, the chassis form renders `<ConnectFlow>` instead of a\n * TextField. upstream-proposal: §PR11-theme + §x-connect. */\n xConnect: z.object({\n providerId: z.string(),\n resourceType: z.enum([\n 'channel',\n 'crm-record',\n 'sequence',\n 'phone-number',\n 'voice-line',\n 'webhook-event',\n 'database-table',\n 'folder',\n 'mailbox',\n 'account',\n ]),\n }).optional(),\n /** Phase 1b multi-substrate: forwarded from JSON Schema's\n * `x-derived-from` vendor annotation. When set, the chassis form\n * suppresses input UI and auto-populates from connection metadata.\n * upstream-proposal: §PR11-theme + §x-derived-from. */\n xDerivedFrom: z.object({\n providerId: z.string(),\n metadataKey: z.string(),\n }).optional(),\n})\n\nexport type OrderField = z.infer<typeof OrderFieldSchema>\n\nexport const OrderGroupSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().optional(),\n fields: z.array(OrderFieldSchema).readonly(),\n})\n\nexport type OrderGroup = z.infer<typeof OrderGroupSchema>\n\nexport const OrderStepSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n fields: z.array(OrderFieldSchema).readonly(),\n groups: z.array(OrderGroupSchema).readonly(),\n})\n\nexport type OrderStep = z.infer<typeof OrderStepSchema>\n\nexport const OrderLegalSchema = z.object({\n termsRequired: z.boolean(),\n privacyRequired: z.boolean(),\n})\n\nexport type OrderLegal = z.infer<typeof OrderLegalSchema>\n\n/**\n * Order-side UI shape. Produced by deriveOrder(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-order.\n */\nexport const OrderShapeSchema = z.object({\n flow: OrderFlowSchema,\n steps: z.array(OrderStepSchema).readonly().optional(),\n legal: OrderLegalSchema.optional(),\n})\n\nexport type OrderShape = z.infer<typeof OrderShapeSchema>\n\n// -----------------------------------------------------------------------------\n// DeliveryShapeSchema\n//\n// mdxui has no delivery-shape schema — this is a Carriage proposal.\n// Produced by deriveDelivery(svc). Covers the post-checkout UX archetype,\n// preview mode, and optional SLA fields.\n//\n// upstream-proposal: file against mdxui as DeliveryShapeSchema. Covers the\n// \"what the buyer sees after payment\" surface — document download, async-batch\n// status, and sync-result-card. See docs/patterns/upstream-proposals.md\n// §PR2-delivery.\n// -----------------------------------------------------------------------------\n\n/**\n * Post-checkout UX archetype.\n *\n * sync-result-card — synchronous return, inline card\n * document-download — file deliverable + email link\n * async-batch-status — job-queue with polling status; download on completion\n */\nexport const DeliveryUxSchema = z.enum([\n 'sync-result-card',\n 'document-download',\n 'async-batch-status',\n])\n\nexport type DeliveryUx = z.infer<typeof DeliveryUxSchema>\n\n/**\n * Preview mode for the delivery surface.\n *\n * first-page — rendered PDF first page\n * first-row — first N rows of a spreadsheet\n * inline-summary — one-line text summary in the result card\n * none — no preview\n */\nexport const PreviewModeSchema = z.enum([\n 'first-page',\n 'first-row',\n 'inline-summary',\n 'none',\n])\n\nexport type PreviewMode = z.infer<typeof PreviewModeSchema>\n\n/**\n * Delivery-side UI shape. Produced by deriveDelivery(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-delivery.\n */\nexport const DeliveryShapeSchema = z.object({\n ux: DeliveryUxSchema,\n previewMode: PreviewModeSchema,\n /** Whether to show a step-by-step progress timeline while the cascade runs. */\n progressTimeline: z.boolean(),\n /** Optional SLA echo — ISO 8601 duration (e.g. \"PT2M\"). */\n estimatedDelivery: z.string().optional(),\n /** Optional outcome predicate lifted from outcomeContract. */\n outcomePredicate: z.string().optional(),\n})\n\nexport type DeliveryShape = z.infer<typeof DeliveryShapeSchema>\n\n// -----------------------------------------------------------------------------\n// PortalShapeSchema\n//\n// mdxui has no portal-shape schema — this is a Carriage proposal.\n// Produced by derivePortal(svc). Covers the order-management table surface:\n// column set, filters, and row actions.\n//\n// upstream-proposal: file against mdxui as PortalShapeSchema. Covers the\n// operator/admin \"manage orders\" surface. See docs/patterns/upstream-proposals.md\n// §PR2-portal.\n// -----------------------------------------------------------------------------\n\n/**\n * Column type vocabulary for the portal table renderer.\n *\n * upstream-proposal: same as PortalShapeSchema above.\n */\nexport const PortalColumnTypeSchema = z.enum([\n 'identifier',\n 'timestamp',\n 'currency',\n 'duration',\n 'status',\n 'text',\n 'evaluator',\n])\n\nexport type PortalColumnType = z.infer<typeof PortalColumnTypeSchema>\n\nexport const PortalColumnSchema = z.object({\n id: z.string(),\n label: z.string(),\n type: PortalColumnTypeSchema,\n})\n\nexport type PortalColumn = z.infer<typeof PortalColumnSchema>\n\n/**\n * Row action vocabulary for the portal table renderer.\n *\n * upstream-proposal: same as PortalShapeSchema above.\n */\nexport const PortalActionKindSchema = z.enum([\n 'view-deliverable',\n 'reissue',\n 'refund',\n 'flag-for-review',\n])\n\nexport type PortalActionKind = z.infer<typeof PortalActionKindSchema>\n\nexport const PortalActionSchema = z.object({\n id: z.string(),\n label: z.string(),\n kind: PortalActionKindSchema,\n})\n\nexport type PortalAction = z.infer<typeof PortalActionSchema>\n\nexport const PortalFilterSchema = z.object({\n id: z.string(),\n field: z.string(),\n label: z.string(),\n})\n\nexport type PortalFilter = z.infer<typeof PortalFilterSchema>\n\n/**\n * Order-management UI shape. Produced by derivePortal(svc).\n *\n * upstream-proposal: file against mdxui — see\n * docs/patterns/upstream-proposals.md §PR2-portal.\n */\nexport const PortalShapeSchema = z.object({\n columns: z.array(PortalColumnSchema),\n filters: z.array(PortalFilterSchema).optional(),\n actions: z.array(PortalActionSchema).optional(),\n})\n\nexport type PortalShape = z.infer<typeof PortalShapeSchema>\n\n// =============================================================================\n// PR 3 extensions — Tier 1 component reframe\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// HeroPropsSchema extension\n//\n// mdxui's HeroPropsSchema uses `title` (string), `badge` (string), and\n// `callToAction` (string label only — no href). Carriage's Hero component uses:\n// - `eyebrow` (small uppercase label above the headline)\n// - `headline` (the h1 — distinct from mdxui's `title`)\n// - `body` (body paragraph — mdxui has `subtitle` but that's a sub-head, not prose)\n// - `primary` / `secondary` (action objects with `label` + `href` + `external`)\n// - `showGlyph` / `illustration` (presentational controls; no mdxui equivalent)\n//\n// mdxui's `actions.primary` accepts a string or `{ href, onClick, target }` —\n// Carriage's action object has `label` (string) + `href` + `external` (bool).\n// The shapes are structurally incompatible without adapter work. Extending here.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero\n// -----------------------------------------------------------------------------\n\n/** Inline action with label + href + optional new-tab flag.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero */\nexport const SiteActionSchema = z.object({\n label: z.string(),\n href: z.string(),\n external: z.boolean().optional(),\n})\n\nexport type SiteAction = z.infer<typeof SiteActionSchema>\n\n/**\n * Hero composition variant identifier. Drives the dispatcher in\n * `<Hero>` (chassis/components/landing/Hero.tsx) between `HeroSplit`\n * (default) and `HeroStacked`.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-hero-variant\n * (master 2026-05-26 — illustration abstraction Phase 3; see\n * docs/abstraction/illustrations.md §1.4 + §3).\n */\nexport const HeroVariantSchema = z.enum([\n 'split-illustration-right',\n 'stacked-illustration-below',\n])\n\nexport type HeroVariantFromSchema = z.infer<typeof HeroVariantSchema>\n\n/**\n * HeroPropsSchema extended for Carriage's landing-page Hero component.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-hero\n */\nexport const HeroPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n headline: z.string(),\n body: z.string(),\n primary: SiteActionSchema,\n secondary: SiteActionSchema.optional(),\n showGlyph: z.boolean().optional(),\n /** When true, the glyph also renders below `lg` (stacked beneath\n * the hero text on mobile). When false (default), the glyph is\n * hidden below `lg`. Services opt in via `publicCopy.hero.glyphOnMobile`.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR11-theme */\n glyphOnMobile: z.boolean().optional(),\n illustration: z.any().optional(),\n /** Hero composition variant. Routes the `<Hero>` dispatcher to\n * `HeroSplit` (default) or `HeroStacked`. Sourced from\n * `ServiceDefinition.branding.heroVariant`.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-hero-variant */\n variant: HeroVariantSchema.optional(),\n})\n\nexport type HeroPropsExtended = z.infer<typeof HeroPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// PricingPropsSchema extension\n//\n// mdxui's PricingTierSchema uses `name` (Carriage uses `tier`), `callToAction`\n// as a plain string (Carriage uses `cta: { label, href }`), and `highlighted`\n// (Carriage uses `featured`). Carriage's tier also carries Stripe commerce\n// fields (`tierKey`, `sku`, `amountCents`, `currency`, `stripeName`) and a\n// distinct `audience` sub-headline. mdxui has no commerce fields — Carriage\n// adds them as the proposing substrate.\n//\n// mdxui's PricingPropsSchema also uses `title` not `eyebrow`/`heading`.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing\n// -----------------------------------------------------------------------------\n\n/** One pricing tier with Stripe commerce fields.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing */\nexport const PriceTierSchema = z.object({\n tierKey: z.string(),\n tier: z.string(),\n price: z.string(),\n audience: z.string(),\n features: z.array(z.string()),\n featured: z.boolean().optional(),\n cta: z.object({ label: z.string(), href: z.string() }),\n sku: z.string(),\n amountCents: z.number(),\n currency: z.enum(['usd', 'eur', 'gbp']),\n stripeName: z.string(),\n minimumAmountCents: z.number().optional(),\n priceSuffix: z.string().optional(),\n})\n\nexport type PriceTier = z.infer<typeof PriceTierSchema>\n\n/**\n * PricingPropsSchema extended for Carriage's Pricing component.\n *\n * `tiers` uses `.readonly()` (Zod v4+) so `z.infer<...>` produces\n * `readonly PriceTier[]` — matching `ServiceDefinition.pricing.tiers`.\n * The `Omit<...> & { tiers: readonly PriceTier[] }` workaround in\n * `Pricing.tsx` is retired; the component interface is now\n * `z.infer<typeof PricingPropsExtendedSchema>` directly.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-pricing\n */\nexport const PricingPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n tiers: z.array(PriceTierSchema).readonly(),\n footnote: z.string().optional(),\n})\n\nexport type PricingPropsExtended = z.infer<typeof PricingPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// FAQPropsSchema extension\n//\n// mdxui's FAQPropsSchema uses `title` (optional) and items with `question` /\n// `answer`. Carriage's Faq uses `eyebrow` + `heading` (both required, distinct\n// typographic roles) and items with `q` / `a` (short keys used throughout\n// publicCopy JSON). The item-field rename (question→q, answer→a) is a naming\n// convention that predates mdxui adoption; the keys appear across all service\n// JSON files. Proposing mdxui accept `q`/`a` as aliases (or Carriage migrates\n// to `question`/`answer` in a follow-up once settled with Nathan).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq\n// -----------------------------------------------------------------------------\n\n/** FAQ item using Carriage's short-key convention (q/a).\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq */\nexport const FaqItemSchema = z.object({\n q: z.string(),\n a: z.string(),\n})\n\nexport type FaqItem = z.infer<typeof FaqItemSchema>\n\n/**\n * FAQPropsSchema extended for Carriage's Faq component.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-faq\n */\nexport const FaqPropsExtendedSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n items: z.array(FaqItemSchema),\n})\n\nexport type FaqPropsExtended = z.infer<typeof FaqPropsExtendedSchema>\n\n// -----------------------------------------------------------------------------\n// HowItWorksPropsSchema (new — no mdxui equivalent)\n//\n// mdxui has no \"how it works\" numbered-step section schema. The closest is\n// FeaturesPropsSchema (title + description + features[]) but that takes\n// description + icon + actions per feature — not a numbered-step with a\n// large display numeral. Proposing HowItWorksPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks\n// -----------------------------------------------------------------------------\n\n/** One numbered step in a HowItWorks section.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks */\nexport const HowItWorksStepSchema = z.object({\n n: z.string(),\n title: z.string(),\n body: z.string(),\n})\n\nexport type HowItWorksStep = z.infer<typeof HowItWorksStepSchema>\n\n/**\n * Props for the HowItWorks component. No mdxui base — proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-howitworks\n */\nexport const HowItWorksPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n steps: z.array(HowItWorksStepSchema),\n /** Optional mini-illustration per step. When provided and length\n * matches `steps.length`, each step renders its illustration in\n * a row above the number. All-or-none — if length doesn't match,\n * the prop is silently ignored and the text-only layout renders\n * (per opt-in-only semantics in illustrations.md §2).\n *\n * Sourced from the per-service illustration manifest at\n * `src/services/<slug>/illustration.tsx`.\n *\n * Each element is a React `ComponentType` (zero-arg renderer).\n * Zod can't validate component identity at runtime; type-level\n * contract carries via `z.custom`.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR12-step-illustrations\n * (master 2026-05-26 — illustration abstraction Phase 4). */\n stepIllustrations: z\n .array(z.custom<React.ComponentType>())\n .optional(),\n})\n\nexport type HowItWorksProps = z.infer<typeof HowItWorksPropsSchema>\n\n// -----------------------------------------------------------------------------\n// WhatYouGetPropsSchema (new — no mdxui equivalent)\n//\n// mdxui has no \"what you get\" numbered-feature grid schema. The section\n// renders a numbered grid of deliverable sections (n + title + body) — a\n// shape distinct from FeaturesPropsSchema's icon-based list. Proposing\n// WhatYouGetPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget\n// -----------------------------------------------------------------------------\n\n/** One numbered item in a WhatYouGet section.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget */\nexport const WhatYouGetItemSchema = z.object({\n n: z.string(),\n title: z.string(),\n body: z.string(),\n})\n\nexport type WhatYouGetItem = z.infer<typeof WhatYouGetItemSchema>\n\n/**\n * Props for the WhatYouGet component. No mdxui base — proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-whatyouget\n */\nexport const WhatYouGetPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n sections: z.array(WhatYouGetItemSchema),\n})\n\nexport type WhatYouGetProps = z.infer<typeof WhatYouGetPropsSchema>\n\n// -----------------------------------------------------------------------------\n// CTASectionPropsSchema extension → FinalCtaPropsSchema\n//\n// mdxui's CTASectionPropsSchema uses `title` (string) and `callToAction`\n// (string label only). Carriage's FinalCta uses `eyebrow` + `headline`\n// (both required, distinct typographic roles) and `primary`/`secondary`\n// (action objects with label + href + external). The action objects are\n// incompatible with mdxui's string `callToAction` without an adapter.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-finalcta\n// -----------------------------------------------------------------------------\n\n/**\n * FinalCtaPropsSchema — CTASectionPropsSchema extended for Carriage.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-finalcta\n */\nexport const FinalCtaPropsSchema = z.object({\n eyebrow: z.string(),\n headline: z.string(),\n primary: SiteActionSchema,\n secondary: SiteActionSchema.optional(),\n})\n\nexport type FinalCtaProps = z.infer<typeof FinalCtaPropsSchema>\n\n// -----------------------------------------------------------------------------\n// HeaderPropsSchema extension → MastheadPropsSchema\n//\n// mdxui's HeaderPropsSchema uses `logo` (any), `nav: NavItem[]`, `cta.text`.\n// Carriage's Masthead uses `brand: { primary, secondary?, href }` (text-based\n// brand lockup — no image logo), `cta: { label, href }` (renamed `text`→`label`),\n// `eyebrow` (right-slot fallback when no CTA), and `narrow` (container width\n// toggle). mdxui has no `eyebrow` slot or narrow-layout concept.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-masthead\n// -----------------------------------------------------------------------------\n\n/**\n * One masthead nav link (centered nav on `md`+, mobile dropdown below).\n * Mirrors carriage's `NavLink` (Masthead.tsx, origin/master a8700e6).\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-masthead §24\n */\nexport const NavLinkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport type NavLink = z.infer<typeof NavLinkSchema>\n\n/**\n * MastheadPropsSchema — HeaderPropsSchema extended for Carriage's Masthead.\n *\n * carriage parity (origin/master): the masthead is a three-zone lockup — brand\n * (left, with an optional `brand.logo` to the LEFT of the wordmark, fda6fb6),\n * an optional centered nav of 3–5 page `links` (middle, `md`+ only), and the\n * right-side CTA/eyebrow. Below `md` the centered nav collapses into a hamburger\n * (`MobileNav`) that opens a dropdown overlay carrying the same links.\n *\n * The `.max(5)` link cap IS the schema/contract layer carriage lacks — carriage\n * enforces `navLinks ≤ 5` in a `verify-service` gate at the service-definition\n * level; here the contract encodes it directly.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-masthead §24\n */\nexport const MastheadPropsSchema = z.object({\n brand: z.object({\n primary: z.string(),\n secondary: z.string().optional(),\n href: z.string(),\n /** Optional brand logo, shown to the LEFT of the wordmark. With it the\n * navbar reads `[logo] <primary>`; without it the wordmark stands alone. */\n logo: z.object({ src: z.string(), alt: z.string() }).optional(),\n }),\n cta: z.object({ label: z.string(), href: z.string() }).optional(),\n /** Page links shown centered on `md`+; collapsed into the mobile dropdown\n * below `md`. 3–5 links — 5 is the hard cap (more crowds the centered nav +\n * mobile overlay). Hrefs are typically in-page section anchors\n * (`#how-it-works` / `#pricing` / `#faq`) but any route works. */\n links: z.array(NavLinkSchema).max(5).optional(),\n eyebrow: z.string().optional(),\n narrow: z.boolean().optional(),\n})\n\nexport type MastheadProps = z.infer<typeof MastheadPropsSchema>\n\n// -----------------------------------------------------------------------------\n// FooterPropsSchema extension → SiteFooterPropsSchema\n//\n// mdxui's FooterPropsSchema uses `logo` (any), `links: FooterLinkGroup[]`\n// (grouped by section title), `social[]`, `copyright`, `newsletter`. Carriage's\n// Footer is a minimal bar with a flat `text` attribution string and an optional\n// flat `links[]` (label + href only — no grouping, no social, no newsletter).\n// The structures are fundamentally different: mdxui's footer is a full-featured\n// multi-column layout; Carriage's is a single-row legal bar.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer\n// -----------------------------------------------------------------------------\n\n/** Flat footer link (no grouping).\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer */\nexport const SiteFooterLinkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport type SiteFooterLink = z.infer<typeof SiteFooterLinkSchema>\n\n/**\n * SiteFooterPropsSchema — FooterPropsSchema extended for Carriage's Footer.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR3-footer\n */\nexport const SiteFooterPropsSchema = z.object({\n text: z.string(),\n links: z.array(SiteFooterLinkSchema).optional(),\n})\n\nexport type SiteFooterProps = z.infer<typeof SiteFooterPropsSchema>\n\n// =============================================================================\n// PR 4 extensions — form primitives\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// TextFieldPropsSchema\n//\n// mdxui's TextInputPropsSchema is a data-binding shape (ReactAdmin-style):\n// `source` (field path), `value`/`defaultValue` as optional, no `onChange`\n// callback. Carriage's TextField is a controlled React component:\n// `value: string` (required), `onChange: (v: string) => void` (required),\n// `type` includes 'number' and 'date' (not in mdxui's enum), `hint` (not\n// `helperText`), `inputRef` (Ref<HTMLInputElement>), `mono` and `invalid`\n// (presentational flags). The shapes are structurally incompatible for a\n// direct `.extend()` — proposing a Carriage-native schema that adopts\n// mdxui naming where possible (`label`, `placeholder`).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-textfield\n// -----------------------------------------------------------------------------\n\n/**\n * TextFieldPropsSchema — controlled text-input component props.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-textfield\n */\nexport const TextFieldPropsSchema = z.object({\n label: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n placeholder: z.string().optional(),\n /** Helper text shown below the field. `invalid=true` renders it in error colour. */\n hint: z.string().optional(),\n type: z.enum(['text', 'date', 'number', 'email']).optional(),\n /** Right-edge suffix label (e.g. \"miles\", \"%\"). */\n suffix: z.string().optional(),\n /** Renders the input in a monospace typeface (e.g. VIN, code). */\n mono: z.boolean().optional(),\n /** Renders the field in error state (red border + hint text). */\n invalid: z.boolean().optional(),\n inputRef: z.custom<React.Ref<HTMLInputElement>>().optional(),\n /** HTML `autocomplete` attribute for browser autofill. */\n autoComplete: z.string().optional(),\n})\n\nexport type TextFieldProps = z.infer<typeof TextFieldPropsSchema>\n\n// -----------------------------------------------------------------------------\n// SelectFieldPropsSchema\n//\n// mdxui's SelectInputPropsSchema is a data-binding shape: `source`, options\n// with `disabled`/`group`/`icon`/`description`, no `onChange` callback, no\n// `autoComplete`. Carriage's SelectField is a controlled dropdown:\n// `value: string` (required), `onChange: (v: string) => void` (required),\n// `options: Array<{ value: string; label: string }>` (string-only, no extras),\n// `autoComplete` for browser autofill.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-selectfield\n// -----------------------------------------------------------------------------\n\n/**\n * SelectFieldPropsSchema — controlled select-dropdown component props.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-selectfield\n */\nexport const SelectFieldPropsSchema = z.object({\n label: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n options: z.array(z.object({ value: z.string(), label: z.string() })),\n /** HTML `autocomplete` attribute for browser autofill. */\n autoComplete: z.string().optional(),\n})\n\nexport type SelectFieldProps = z.infer<typeof SelectFieldPropsSchema>\n\n// -----------------------------------------------------------------------------\n// RadioGroupPropsSchema\n//\n// mdxui's RadioGroupInputPropsSchema is a data-binding shape: `source`,\n// options with `disabled`/`group`/`icon`/`description`, no `onChange`,\n// no `sub` per option. Carriage's RadioGroup is a generic controlled component:\n// the value type `T` extends `string`; options carry an optional `sub`\n// (secondary descriptor line inside the card). No mdxui equivalent for `sub`.\n// The generic `T` can't be expressed in Zod — the schema uses `z.string()` for\n// value/option value; callers narrow to `T` at the component level.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup\n// -----------------------------------------------------------------------------\n\n/** One option in a RadioGroup card.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup */\nexport const RadioGroupOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n /** Optional secondary descriptor line rendered inside the card. */\n sub: z.string().optional(),\n})\n\nexport type RadioGroupOption = z.infer<typeof RadioGroupOptionSchema>\n\n/**\n * RadioGroupPropsSchema — controlled radio-card-group component props.\n * Note: the generic type parameter `T extends string` from RadioGroup<T>\n * is represented as `z.string()` here; consumers narrow at call sites.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-radiogroup\n */\nexport const RadioGroupPropsSchema = z.object({\n label: z.string(),\n name: z.string(),\n value: z.string(),\n onChange: z.custom<(v: string) => void>(),\n options: z.array(RadioGroupOptionSchema),\n})\n\nexport type RadioGroupProps = z.infer<typeof RadioGroupPropsSchema>\n\n// -----------------------------------------------------------------------------\n// FieldRowPropsSchema (new — no mdxui equivalent)\n//\n// FieldRow is a 2-column layout shell (`display: grid; grid-template-columns:\n// 1fr 1fr`). mdxui has no layout-grid primitive for form field pairs.\n// The only prop is `children: ReactNode`. Proposing a minimal schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-fieldrow\n// -----------------------------------------------------------------------------\n\n/**\n * FieldRowPropsSchema — 2-column layout shell for side-by-side form fields.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-fieldrow\n */\nexport const FieldRowPropsSchema = z.object({\n children: z.custom<React.ReactNode>(),\n})\n\nexport type FieldRowProps = z.infer<typeof FieldRowPropsSchema>\n\n// -----------------------------------------------------------------------------\n// StepHeadingPropsSchema (new — no mdxui equivalent)\n//\n// StepHeading renders a numbered section header (index like \"01\"/\"02\",\n// eyebrow, title, body). mdxui has no multi-step form section header schema.\n// The closest mdxui primitive is HeroPropsSchema's eyebrow/headline/body\n// pattern, but HeroPropsSchema also carries CTAs and is a page-level section,\n// not a within-form step marker. Proposing StepHeadingPropsSchema as a\n// distinct lightweight schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-stepheading\n// -----------------------------------------------------------------------------\n\n/**\n * StepHeadingPropsSchema — numbered section header for multi-step flows.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-stepheading\n */\nexport const StepHeadingPropsSchema = z.object({\n /** Numeric step indicator, e.g. \"01\", \"02\". Rendered in tabular mono. */\n index: z.string(),\n /** Short action-verb eyebrow label. e.g. \"Connect\", \"Compose\". */\n eyebrow: z.string(),\n /** Primary section heading. */\n title: z.string(),\n /** Supporting body copy below the heading. */\n body: z.string(),\n className: z.string().optional(),\n})\n\nexport type StepHeadingPropsFromSchema = z.infer<typeof StepHeadingPropsSchema>\n\n// -----------------------------------------------------------------------------\n// LogoUploadPropsSchema (new — no mdxui equivalent)\n//\n// LogoUpload is a Vercel-Blob-backed logo upload widget. mdxui's\n// FileInputPropsSchema models file inputs as data-binding shapes (no\n// `uploading` state flag, no `onClear` callback, no `bodyText`). Carriage's\n// LogoUpload owns the visual preview + upload/clear/error state externally\n// (the parent form drives state; this component renders it). The shape is\n// fundamentally a controlled component with stateful flags, not a data-\n// binding primitive. Proposing LogoUploadPropsSchema as a Carriage-native\n// controlled-upload schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-logoupload\n// -----------------------------------------------------------------------------\n\n/**\n * LogoUploadPropsSchema — controlled logo-upload widget with preview.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-logoupload\n */\nexport const LogoUploadPropsSchema = z.object({\n /** Resolved Vercel-Blob URL, or null when no logo is set. */\n value: z.string().nullable(),\n /** True while the upload network call is in-flight. */\n uploading: z.boolean(),\n /** Error message from the last failed upload attempt, or null. */\n error: z.string().nullable(),\n onChange: z.custom<(file: File) => void>(),\n onClear: z.custom<() => void>(),\n /** Widget label override (default: \"Firm logo (optional)\"). */\n label: z.string().optional(),\n /** Body copy override below the preview thumbnail. */\n bodyText: z.string().optional(),\n})\n\nexport type LogoUploadPropsFromSchema = z.infer<typeof LogoUploadPropsSchema>\n\n// -----------------------------------------------------------------------------\n// ImageUploadFieldPropsSchema (new — no mdxui equivalent)\n//\n// ImageUploadField wraps LogoUpload for the JSON-driven form path. It owns\n// the upload state machine internally (uploading + error are local state),\n// exposing only label, description, value, and onChange to the form renderer.\n// mdxui's FileInputPropsSchema doesn't model Vercel-Blob uploads or the\n// controlled (url | null) value pattern. Proposing a Carriage-native schema.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR4-imageuploadfield\n// -----------------------------------------------------------------------------\n\n/**\n * ImageUploadFieldPropsSchema — form-renderer image-upload field.\n * Wraps LogoUpload with an internal upload state machine.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR4-imageuploadfield\n */\nexport const ImageUploadFieldPropsSchema = z.object({\n /** Renderer label — sourced from `OrderField.title`. */\n label: z.string(),\n /** Helper text — sourced from `OrderField.description`. */\n description: z.string().optional(),\n /** Current value (resolved Vercel-Blob URL, or null). */\n value: z.string().nullable(),\n /** Called with the new URL after a successful upload, or null on clear. */\n onChange: z.custom<(url: string | null) => void>(),\n})\n\nexport type ImageUploadFieldPropsFromSchema = z.infer<typeof ImageUploadFieldPropsSchema>\n\n// =============================================================================\n// PR 5 extensions — Tier 2 component prop reframes\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// ServiceFormPropsSchema\n//\n// ServiceForm is the chassis-driven intake form. Its prop interface merges\n// two already-registered shapes (OrderShape + Pricing) with per-page display\n// copy (formHeadline, formIntro, productName, paymentHeadline). mdxui has no\n// multi-step service-intake form schema. Proposing ServiceFormPropsSchema as\n// the canonical shape for service-intake form chrome, wrapping OrderShape and\n// Pricing as sub-shapes.\n//\n// OrderShape (§PR2-order) + PricingPropsExtended (§PR3-pricing) are already\n// in the extension registry. ServiceFormPropsSchema composes them + adds the\n// form-chrome copy fields that the page layer passes down.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR5-serviceform\n// -----------------------------------------------------------------------------\n\n/**\n * ServiceFormPropsSchema — chassis service-intake form component props.\n * Composes OrderShapeSchema + PricingPropsExtendedSchema with page-chrome copy.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR5-serviceform\n */\n/**\n * Section-chrome shared by every Pricing variant.\n * Mirrors `PricingSectionChrome` from `@/chassis/types`.\n */\nconst PricingSectionChromeSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n footnote: z.string().optional(),\n currency: z.enum(['usd', 'eur', 'gbp']),\n})\n\n/**\n * Tiered pricing variant — mirrors `PricingTiered` from `@/chassis/types`.\n */\nconst PricingTieredSchema = PricingSectionChromeSchema.extend({\n kind: z.literal('tiered'),\n tiers: z.array(PriceTierSchema).readonly(),\n})\n\n/**\n * Unit pricing variant — mirrors `PricingUnit` from `@/chassis/types`.\n */\nconst PricingUnitSchema = PricingSectionChromeSchema.extend({\n kind: z.literal('unit'),\n perUnit: z.number(),\n billingCadence: z.string(),\n})\n\n/**\n * Full Pricing discriminated union — mirrors `Pricing` from `@/chassis/types`.\n */\nexport const PricingSchema = z.union([PricingTieredSchema, PricingUnitSchema])\n\n/** Full Pricing discriminated union — the `ReportPricing` component reads this. */\nexport type Pricing = z.infer<typeof PricingSchema>\n\nexport const ServiceFormPropsSchema = z.object({\n /** Service slug — used in the `/api/checkout` body + return-URL construction. */\n slug: z.string(),\n /** Derived order shape from `deriveOrder(svc)`. */\n order: OrderShapeSchema,\n /** Service pricing — from `ServiceDefinition.pricing`. Mirrors the `Pricing` union. */\n pricing: PricingSchema,\n /** Form-phase headline (h1 above the fields). Optional — omit in unit tests. */\n formHeadline: z.string().optional(),\n /** Form-phase intro paragraph. Optional. */\n formIntro: z.string().optional(),\n /** Product-name eyebrow (e.g. \"Carriage Donation\") rendered above the h1. */\n productName: z.string().optional(),\n /** Payment-phase h1. Defaults to \"Generate your report\" when unset. */\n paymentHeadline: z.string().optional(),\n})\n\nexport type ServiceFormPropsFromSchema = z.infer<typeof ServiceFormPropsSchema>\n\n// -----------------------------------------------------------------------------\n// CheckoutPanelPropsSchema\n//\n// CheckoutPanel wraps Stripe Elements for Carriage's design tokens. mdxui has\n// no Stripe/payment abstraction — this is a Carriage-native from-scratch schema.\n// The shape is minimal: clientSecret + amountCents are required (the Stripe\n// session data); email, returnUrl, onSuccess, ctaSuffix, onCancel are the\n// caller-controlled options.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR5-checkoutpanel\n// -----------------------------------------------------------------------------\n\n/**\n * CheckoutPanelPropsSchema — Stripe Elements payment panel props.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR5-checkoutpanel\n */\nexport const CheckoutPanelPropsSchema = z.object({\n /** Stripe PaymentIntent client secret from /api/checkout. */\n clientSecret: z.string(),\n /** Payment amount in cents — displayed as \"Pay $X.XX & {ctaSuffix}\". */\n amountCents: z.number(),\n /** Email pre-fill passed to Stripe as receipt email. */\n email: z.string().optional(),\n /** Where Stripe redirects after a successful payment (redirect flow). */\n returnUrl: z.string().optional(),\n /** Optional inline-confirmation callback (inline flow — bulk products). */\n onSuccess: z.custom<() => Promise<void> | void>().optional(),\n /** Custom CTA suffix on the Pay button. Default: \"generate report\". */\n ctaSuffix: z.string().optional(),\n /** \"Edit details\" callback — re-shows the form. */\n onCancel: z.custom<() => void>(),\n})\n\nexport type CheckoutPanelPropsFromSchema = z.infer<typeof CheckoutPanelPropsSchema>\n\n// =============================================================================\n// PR 6 extensions — ReactNode-prop components\n// =============================================================================\n//\n// Components in this section carry `React.ReactNode` props (bullets[],\n// body, cta). Zod can't validate ReactNode contents at runtime, but\n// `z.custom<ReactNode>()` in Zod v4 preserves the correct TypeScript type\n// in `z.infer<...>` (the type param O flows through `ZodCustom<O, O>`).\n// Runtime validation is intentionally a no-op for these fields — the value\n// is: auditability (every Carriage component prop has a schema entry) and\n// type-level correctness (z.infer produces the same shape as the component\n// interface).\n//\n// See upstream-proposals.md §PR6-defensibility, §PR6-upsell.\n\n// -----------------------------------------------------------------------------\n// DefensibilityPropsSchema\n//\n// Defensibility renders a 2-column \"what it is / what it isn't\" block with\n// optional caveat. Its `bullets: ReactNode[]` and `caveat?: ReactNode` props\n// were deferred in PR 5 because Zod can't validate ReactNode arrays. Reframed\n// here using `z.custom<React.ReactNode>()` which satisfies the type-level\n// contract while treating runtime validation as pass-through.\n//\n// In practice, Carriage's service JSONs pass `string[]` as bullets — the\n// ReactNode type is load-bearing only for future rich-content upgrades (e.g.,\n// bullets with inline <strong> tags). The schema allows that upgrade path.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility\n// -----------------------------------------------------------------------------\n\n/** One column in a Defensibility two-up.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility */\nexport const DefensibilityColumnSchema = z.object({\n heading: z.string(),\n /** Array of bullet content. Each bullet is a ReactNode — strings in\n * practice today; rich content possible in future JSON upgrades. */\n bullets: z.array(z.custom<React.ReactNode>()),\n})\n\nexport type DefensibilityColumnFromSchema = z.infer<typeof DefensibilityColumnSchema>\n\n/**\n * DefensibilityPropsSchema — two-column scope-expectations block.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-defensibility\n */\nexport const DefensibilityPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n /** Tuple of exactly two columns (left = \"what it is\", right = \"what it isn't\"). */\n columns: z.tuple([DefensibilityColumnSchema, DefensibilityColumnSchema]),\n /** Optional closing caveat paragraph. */\n caveat: z.custom<React.ReactNode>().optional(),\n})\n\nexport type DefensibilityPropsFromSchema = z.infer<typeof DefensibilityPropsSchema>\n\n// -----------------------------------------------------------------------------\n// UpsellBannerPropsSchema / UpsellCardPropsSchema\n//\n// UpsellBanner + UpsellCard are client-side upsell primitives. Both expose\n// `React.ReactNode` props: UpsellBanner.cta is a ReactNode (allows inline\n// price display like \"$29 → $99\"); UpsellCard.body is a ReactNode.\n// Both use `z.custom<ReactNode>()` for the same reasons as Defensibility above.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n// -----------------------------------------------------------------------------\n\n/**\n * UpsellBannerPropsSchema — single-line upsell nudge component props.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n */\nexport const UpsellBannerPropsSchema = z.object({\n /** Display-serif hook line. Often phrased as a question. */\n headline: z.string(),\n /** Optional one-line explanation below the headline. */\n body: z.string().optional(),\n /** Activation pill content — ReactNode for inline price transitions. */\n cta: z.custom<React.ReactNode>(),\n onActivate: z.custom<() => void>(),\n})\n\nexport type UpsellBannerPropsFromSchema = z.infer<typeof UpsellBannerPropsSchema>\n\n/**\n * UpsellCardPropsSchema — richer upsell card with body paragraph.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR6-upsell\n */\nexport const UpsellCardPropsSchema = z.object({\n eyebrow: z.string(),\n /** Card body — ReactNode for future rich-text upgrades. */\n body: z.custom<React.ReactNode>(),\n ctaLabel: z.string(),\n onActivate: z.custom<() => void>(),\n})\n\nexport type UpsellCardPropsFromSchema = z.infer<typeof UpsellCardPropsSchema>\n\n// =============================================================================\n// PR 7 extensions — landing route wire-up\n// =============================================================================\n//\n// These additions widen CatalogShapeSchema to carry everything the\n// /[slug]/page.tsx landing route needs from a ServiceDefinition:\n//\n// publicCopy — all landing-page section props (Hero, Problem, WhatYouGet,\n// HowItWorks, Defensibility, Faq, FinalCta, SEO metadata)\n// branding — product name + hero glyph + brand colours\n// pricing — tiered pricing (section chrome + tiers)\n// archetype — service archetype id (drives MIME / totalTime defaults)\n//\n// Why CatalogShape and not a new top-level shape:\n// CatalogShape is the derive layer's output for the landing surface; it is\n// the natural home for \"everything the landing page needs\". Widening it here\n// keeps the 1:1 mapping: deriveCatalog → landing page props, no intermediate.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// CtaSchema — shared label+href action\n//\n// Reuses SiteActionSchema's shape but without the `external` flag since\n// header/footer CTAs are always internal navigation.\n// -----------------------------------------------------------------------------\n\n/**\n * Inline call-to-action used by header/footer chrome.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport type Cta = z.infer<typeof CtaSchema>\n\n// -----------------------------------------------------------------------------\n// BreadcrumbSchema\n// -----------------------------------------------------------------------------\n\n/**\n * One breadcrumb entry for the landing-page JSON-LD BreadcrumbList.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const BreadcrumbSchema = z.object({\n name: z.string(),\n href: z.string(),\n})\n\nexport type Breadcrumb = z.infer<typeof BreadcrumbSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceSchemaSpecSchema — static JSON-LD Service fields\n// -----------------------------------------------------------------------------\n\n/**\n * Static fields for the Service JSON-LD block. Dynamic fields (description,\n * offers) are filled at render time.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceSchemaSpecSchema = z.object({\n name: z.string(),\n serviceType: z.string(),\n url: z.string(),\n areaServed: z.string(),\n})\n\nexport type ServiceSchemaSpec = z.infer<typeof ServiceSchemaSpecSchema>\n\n// -----------------------------------------------------------------------------\n// ProblemPropsSchema — three-card problem section\n//\n// mdxui has no \"problem framing\" section schema. The section renders three\n// cards with a category label, cost line, outcome verdict, and body paragraph.\n// Proposing ProblemPropsSchema to mdxui.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/** One problem card.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening */\nexport const ProblemItemSchema = z.object({\n label: z.string(),\n cost: z.string(),\n outcome: z.string(),\n body: z.string(),\n})\n\nexport type ProblemItem = z.infer<typeof ProblemItemSchema>\n\n/**\n * ProblemPropsSchema — three-card problem-framing section.\n * No mdxui equivalent. Proposed from scratch.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ProblemPropsSchema = z.object({\n eyebrow: z.string(),\n heading: z.string(),\n items: z.array(ProblemItemSchema),\n})\n\nexport type ProblemProps = z.infer<typeof ProblemPropsSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceBrandingSchema — product name + hero glyph + brand colours\n//\n// The fields needed by the landing route from ServiceDefinition.branding.\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * Subset of ServiceBranding needed by the landing route.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceBrandingSchema = z.object({\n primary: z.string(),\n secondary: z.string().optional(),\n productName: z.string(),\n /** SERP title default for the landing page. */\n defaultTitle: z.string(),\n /** OG/SERP description default. */\n defaultDescription: z.string(),\n heroGlyph: z.string().optional(),\n showHeroGlyph: z.boolean().optional(),\n og: z.object({ headline: z.string() }),\n})\n\nexport type ServiceBranding = z.infer<typeof ServiceBrandingSchema>\n\n// -----------------------------------------------------------------------------\n// LandingPublicCopySchema — all landing-page section props in one schema\n//\n// Composes all the section-level prop schemas already registered in this file\n// into the flat content bag that /[slug]/page.tsx consumes.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * All landing-page section content in one flat schema.\n * Corresponds to ServicePublicCopy minus the pricing sub-object (pricing lives\n * on Pricing directly as of iter 7f.2).\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const LandingPublicCopySchema = z.object({\n pageTitle: z.string(),\n pageDescription: z.string(),\n headerCta: CtaSchema,\n hero: HeroPropsExtendedSchema,\n problem: ProblemPropsSchema,\n whatYouGet: WhatYouGetPropsSchema,\n howItWorks: HowItWorksPropsSchema,\n defensibility: DefensibilityPropsSchema,\n faq: FaqPropsExtendedSchema,\n finalCta: FinalCtaPropsSchema,\n footerText: z.string(),\n serviceSchema: ServiceSchemaSpecSchema,\n breadcrumbs: z.array(BreadcrumbSchema).optional(),\n})\n\nexport type LandingPublicCopy = z.infer<typeof LandingPublicCopySchema>\n\n// -----------------------------------------------------------------------------\n// LandingPricingSchema — unified pricing prop bag for the landing route\n//\n// Mirrors the `Pricing` discriminated union from chassis/types.ts but as a\n// Zod schema. The landing route currently only renders `tiered` pricing, so\n// the schema validates the tiered variant's fields; `kind` is kept so the\n// route can guard against future non-tiered kinds.\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * Pricing prop bag for the landing-route Pricing component.\n *\n * `eyebrow` and `heading` are optional here because test fixtures and\n * example services may carry partial pricing objects. The landing route\n * guards on `pricing.kind === 'tiered'` before rendering and reads the\n * chrome fields directly.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const LandingPricingSchema = z.object({\n kind: z.enum(['tiered', 'unit']),\n eyebrow: z.string(),\n heading: z.string(),\n footnote: z.string().optional(),\n currency: z.enum(['usd', 'eur', 'gbp']).optional(),\n tiers: z.array(PriceTierSchema).readonly().optional(),\n /** unit pricing fields — optional; only present when kind='unit' */\n perUnit: z.number().optional(),\n billingCadence: z.string().optional(),\n})\n\nexport type LandingPricing = z.infer<typeof LandingPricingSchema>\n\n// -----------------------------------------------------------------------------\n// ServiceArchetypeIdSchema\n// -----------------------------------------------------------------------------\n\n/**\n * ServiceArchetype $id vocabulary — the 8-member frozen set from upstream.\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const ServiceArchetypeIdSchema = z.enum([\n 'service-archetype-document-extraction',\n 'service-archetype-data-enrichment',\n 'service-archetype-transactional-action',\n 'service-archetype-sourced-comparative-analysis',\n 'service-archetype-form-preparation',\n 'service-archetype-compliance-check',\n 'service-archetype-market-intelligence',\n 'service-archetype-communication-automation',\n])\n\nexport type ServiceArchetypeId = z.infer<typeof ServiceArchetypeIdSchema>\n\n// -----------------------------------------------------------------------------\n// CatalogShapeSchema widening (PR 7)\n//\n// CatalogShapeSchema was introduced in PR 2 with two fields: hero + pricingSummary.\n// PR 7 widens it to carry the full landing-route data so deriveCatalog(svc)\n// becomes the single call the landing route makes, replacing the split between\n// getRenderData(slug) + the legacy listings/render-data.ts bridge for absorbed\n// products.\n//\n// The widening is ADDITIVE and ALL NEW FIELDS ARE OPTIONAL — this preserves\n// backwards-compat for callers that constructed a bare CatalogShape (e.g. tests\n// and example services that only populate hero + pricingSummary).\n//\n// upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n// -----------------------------------------------------------------------------\n\n/**\n * CatalogShapeSchema widened for PR 7 — carries everything /[slug]/page.tsx needs.\n *\n * PR 2 fields (hero, pricingSummary) unchanged; PR 7 adds optional\n * publicCopy + branding + pricing + archetype. The landing route reads from\n * `catalogShape.publicCopy` when present; falls back to getRenderData for\n * non-absorbed products.\n *\n * upstream-proposal: docs/patterns/upstream-proposals.md §PR7-catalog-widening\n */\nexport const CatalogShapeFullSchema = CatalogShapeSchema.extend({\n /** Full landing-page section copy. Present for all fully-absorbed services. */\n publicCopy: LandingPublicCopySchema.optional(),\n /** Product branding (wordmark + heroGlyph + og headline). */\n branding: ServiceBrandingSchema.optional(),\n /** Commercial pricing — section chrome + tiers. */\n pricing: LandingPricingSchema.optional(),\n /** Service archetype id — drives MIME/totalTime defaults at render time. */\n archetype: ServiceArchetypeIdSchema.optional(),\n})\n\nexport type CatalogShapeFull = z.infer<typeof CatalogShapeFullSchema>\n"],"mappings":"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","names":["Link","useEffect","useState","jsx","jsx","jsxs","Link","useEffect","useState","jsx","useState","useEffect","Link","jsx","jsxs","Link","jsx","jsxs","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Link","ChevronRight","Fragment","jsx","jsxs","ChevronRight","Link","jsx","jsxs","Link","ChevronRight","Fragment","jsx","jsxs","jsx","jsxs","jsx"]}
|