{"schemaVersion":1,"version":"0.1.0","released":"2026-09-25","components":[{"id":"cta-band","type":"cta","name":"Call-to-action band","summary":"Full-width band with one sentence, one line of support, and one action. Accent or quiet surface tone.","export":"CtaBand","tags":["conversion","band","footer"],"accessibility":["On the accent tone the action swaps colors: accent-ink background with accent text. Check that pair's contrast for your style.","The action is a link with a visible focus outline."],"states":[{"name":"hover","description":"The action drops to 90% opacity."},{"name":"focus-visible","description":"A 2px outline in the focus color."},{"name":"surface tone","description":"Surface background with ruled edges instead of the accent fill."}],"examples":[{"name":"Accent","props":{}},{"name":"Surface","props":{"tone":"surface"}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"48a6cab1e6ab","source":"export interface CtaBandProps {\n  title?: string;\n  body?: string;\n  action?: { label: string; href: string };\n  /** accent fills the band with the accent color; surface keeps it quiet. */\n  tone?: \"accent\" | \"surface\";\n}\n\nconst focusRing =\n  \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--nl-focus)]\";\n\n/**\n * A full-width band with one sentence and one action. Use the accent tone once\n * per page at most.\n */\nexport function CtaBand({\n  title = \"Your next release note is already half written.\",\n  body = \"Connect a repository and see the first draft in a few minutes.\",\n  action = { label: \"Start a trial\", href: \"#start\" },\n  tone = \"accent\",\n}: CtaBandProps) {\n  const accent = tone === \"accent\";\n  return (\n    <section\n      className={`px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] ${\n        accent\n          ? \"bg-[color:var(--nl-accent)] text-[color:var(--nl-accent-ink)]\"\n          : \"border-y border-[color:var(--nl-line)] bg-[color:var(--nl-surface)] text-[color:var(--nl-ink)]\"\n      }`}\n    >\n      <div className=\"mx-auto flex max-w-6xl flex-col items-start justify-between gap-8 md:flex-row md:items-end\">\n        <div className=\"max-w-2xl\">\n          <h2 className=\"text-balance font-[family-name:var(--nl-font-display)] text-3xl font-semibold sm:text-4xl\">{title}</h2>\n          <p className={`mt-4 text-lg ${accent ? \"opacity-90\" : \"text-[color:var(--nl-muted)]\"}`}>{body}</p>\n        </div>\n        <a\n          href={action.href}\n          className={`shrink-0 rounded-[var(--nl-radius)] px-6 py-3 font-medium ${\n            accent\n              ? \"bg-[color:var(--nl-accent-ink)] text-[color:var(--nl-accent)] hover:opacity-90\"\n              : \"bg-[color:var(--nl-accent)] text-[color:var(--nl-accent-ink)] hover:opacity-90\"\n          } ${focusRing}`}\n        >\n          {action.label}\n        </a>\n      </div>\n    </section>\n  );\n}\n","tokens":["accent","accent-ink","focus","font-display","font-sans","ink","line","muted","radius","section-y","surface"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"faq-disclosure","type":"faq","name":"FAQ disclosure","summary":"Questions in native <details> elements with a plus that turns into a cross when open.","export":"FaqDisclosure","tags":["faq","accordion","no javascript"],"accessibility":["Each question is a native <summary>, so Enter and Space toggle it and screen readers announce expanded or collapsed.","The plus sign is aria-hidden; its rotation only runs when the user hasn't asked for reduced motion.","Questions open independently. Opening one doesn't close another."],"states":[{"name":"open","description":"The answer shows under the question and the plus rotates 45 degrees."},{"name":"focus-visible","description":"A 2px outline in the focus color around the question row."}],"examples":[{"name":"All closed","props":{}},{"name":"First open","props":{"openIndex":0}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"00e6e8d41633","source":"export interface Question {\n  question: string;\n  answer: string;\n}\n\nexport interface FaqDisclosureProps {\n  heading?: string;\n  questions?: Question[];\n  /** Index of the question that starts open. Omit to start with all closed. */\n  openIndex?: number;\n}\n\nconst focusRing =\n  \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--nl-focus)]\";\n\n/**\n * Questions as native disclosure widgets. Keyboard and screen reader support\n * come from <details> and <summary>, and it needs no client JavaScript.\n */\nexport function FaqDisclosure({\n  heading = \"Questions\",\n  questions = [\n    { question: \"Does anything publish without approval?\", answer: \"No. Every draft waits for someone on your team to approve it.\" },\n    { question: \"Which repositories can I connect?\", answer: \"Any GitHub repository you can install an app on, public or private.\" },\n    { question: \"Can I export my notes?\", answer: \"Yes. Download every note as Markdown from the settings page.\" },\n    { question: \"What happens when my trial ends?\", answer: \"Your drafts stay. Publishing pauses until you choose a plan.\" },\n  ],\n  openIndex,\n}: FaqDisclosureProps) {\n  return (\n    <section className=\"bg-[color:var(--nl-canvas)] px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <div className=\"mx-auto max-w-3xl\">\n        <h2 className=\"font-[family-name:var(--nl-font-display)] text-3xl font-semibold sm:text-4xl\">{heading}</h2>\n        <div className=\"mt-10 divide-y divide-[color:var(--nl-line)] border-y border-[color:var(--nl-line)]\">\n          {questions.map((item, index) => (\n            <details key={item.question} open={index === openIndex} className=\"group\">\n              <summary\n                className={`flex cursor-pointer list-none items-center justify-between gap-6 rounded-[var(--nl-radius)] py-5 font-medium [&::-webkit-details-marker]:hidden ${focusRing}`}\n              >\n                {item.question}\n                <span aria-hidden=\"true\" className=\"font-[family-name:var(--nl-font-mono)] text-[color:var(--nl-muted)] group-open:rotate-45 motion-safe:transition-transform\">\n                  +\n                </span>\n              </summary>\n              <p className=\"pb-6 leading-relaxed text-[color:var(--nl-muted)]\">{item.answer}</p>\n            </details>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n","tokens":["canvas","focus","font-display","font-mono","font-sans","ink","line","muted","radius","section-y"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"features-grid","type":"features","name":"Feature grid","summary":"Heading and intro above a ruled grid of numbered feature notes. Three, two, or one column by width.","export":"FeaturesGrid","tags":["features","grid","content"],"accessibility":["Features are a list, so screen readers announce the count.","Headings step from h2 to h3. Put the grid under a page that already has an h1."],"states":[],"examples":[{"name":"Six features","props":{}},{"name":"Three features","props":{"heading":"Three things it does well","intro":"No more, no less.","features":[{"title":"Imports","body":"Bring in CSV or connect a spreadsheet."},{"title":"Checks","body":"Flags rows that don't match the schema."},{"title":"Sync","body":"Pushes clean rows back on a schedule."}]}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"f2896265613a","source":"export interface Feature {\n  title: string;\n  body: string;\n}\n\nexport interface FeaturesGridProps {\n  heading?: string;\n  intro?: string;\n  features?: Feature[];\n}\n\n/**\n * Heading and intro above a three-column grid of short feature notes, each\n * numbered in the mono face. Drops to two columns on tablets and one on phones.\n */\nexport function FeaturesGrid({\n  heading = \"Built for the week after launch\",\n  intro = \"The parts of release work that usually slip, done the same way every time.\",\n  features = [\n    { title: \"Drafts from real changes\", body: \"Each note starts from the merged pull request, so nothing is invented.\" },\n    { title: \"Review before it ships\", body: \"Drafts wait for a person to approve them. Nothing publishes on its own.\" },\n    { title: \"Your words, kept\", body: \"Edits you make to one draft carry into the style of the next.\" },\n    { title: \"One changelog\", body: \"Web, email, and in-app notes come from the same approved text.\" },\n    { title: \"Quiet by default\", body: \"Minor fixes are grouped into a weekly digest instead of separate posts.\" },\n    { title: \"Plain exports\", body: \"Download everything as Markdown whenever you like.\" },\n  ],\n}: FeaturesGridProps) {\n  return (\n    <section className=\"bg-[color:var(--nl-canvas)] px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <div className=\"mx-auto max-w-6xl\">\n        <div className=\"max-w-2xl\">\n          <h2 className=\"text-balance font-[family-name:var(--nl-font-display)] text-3xl font-semibold sm:text-4xl\">{heading}</h2>\n          <p className=\"mt-4 text-lg text-[color:var(--nl-muted)]\">{intro}</p>\n        </div>\n        <ul className=\"mt-12 grid gap-px overflow-hidden rounded-[var(--nl-radius)] border border-[color:var(--nl-line)] bg-[color:var(--nl-line)] sm:grid-cols-2 lg:grid-cols-3\">\n          {features.map((feature, index) => (\n            <li key={feature.title} className=\"bg-[color:var(--nl-surface)] p-6\">\n              <p className=\"font-[family-name:var(--nl-font-mono)] text-xs text-[color:var(--nl-muted)]\">\n                {String(index + 1).padStart(2, \"0\")}\n              </p>\n              <h3 className=\"mt-3 font-semibold\">{feature.title}</h3>\n              <p className=\"mt-2 text-sm leading-relaxed text-[color:var(--nl-muted)]\">{feature.body}</p>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </section>\n  );\n}\n","tokens":["canvas","font-display","font-mono","font-sans","ink","line","muted","radius","section-y","surface"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"hero-split","type":"hero","name":"Split hero","summary":"Headline, supporting copy, and two actions beside a numbered checklist panel. Stacks on phones.","export":"HeroSplit","tags":["landing","above the fold","two column"],"accessibility":["Uses a single <h1>. Place it once per page.","The checklist is an ordered list; the number badges are aria-hidden so screen readers don't read each number twice.","Both actions are links with visible focus outlines."],"states":[{"name":"hover","description":"The primary action drops to 90% opacity; the secondary action fills with the surface color."},{"name":"focus-visible","description":"A 2px outline in the focus color on both actions."}],"examples":[{"name":"Default","props":{}},{"name":"Short checklist","props":{"eyebrow":"For small teams","title":"One inbox for every customer question.","body":"Email, chat, and forms land in the same queue, with the history attached.","checklist":["Connect your inbox","Invite the team"]}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"7a37deb08c96","source":"export interface HeroSplitProps {\n  eyebrow?: string;\n  title?: string;\n  body?: string;\n  primary?: { label: string; href: string };\n  secondary?: { label: string; href: string };\n  checklist?: string[];\n}\n\nconst focusRing =\n  \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--nl-focus)]\";\n\n/**\n * Two-column hero: the promise and actions on the left, a checklist panel on\n * the right that shows what the product does. Stacks on phones.\n */\nexport function HeroSplit({\n  eyebrow = \"Release notes, handled\",\n  title = \"Ship the update. We'll write it up.\",\n  body = \"Example Studio turns merged pull requests into release notes your customers will read. Review the draft, edit anything, and publish.\",\n  primary = { label: \"Start a trial\", href: \"#start\" },\n  secondary = { label: \"See a sample\", href: \"#sample\" },\n  checklist = [\"Drafts from merged pull requests\", \"Edits stay in your voice\", \"Publishes to your changelog\"],\n}: HeroSplitProps) {\n  return (\n    <section className=\"bg-[color:var(--nl-canvas)] px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <div className=\"mx-auto grid max-w-6xl items-center gap-12 lg:grid-cols-2\">\n        <div>\n          <p className=\"font-[family-name:var(--nl-font-mono)] text-xs uppercase tracking-wider text-[color:var(--nl-muted)]\">{eyebrow}</p>\n          <h1 className=\"mt-4 text-balance font-[family-name:var(--nl-font-display)] text-4xl leading-tight font-semibold sm:text-5xl\">\n            {title}\n          </h1>\n          <p className=\"mt-6 max-w-prose text-lg leading-relaxed text-[color:var(--nl-muted)]\">{body}</p>\n          <div className=\"mt-8 flex flex-wrap gap-3\">\n            <a\n              href={primary.href}\n              className={`rounded-[var(--nl-radius)] bg-[color:var(--nl-accent)] px-5 py-3 font-medium text-[color:var(--nl-accent-ink)] hover:opacity-90 ${focusRing}`}\n            >\n              {primary.label}\n            </a>\n            <a\n              href={secondary.href}\n              className={`rounded-[var(--nl-radius)] border border-[color:var(--nl-line)] px-5 py-3 font-medium hover:bg-[color:var(--nl-surface)] ${focusRing}`}\n            >\n              {secondary.label}\n            </a>\n          </div>\n        </div>\n        <div className=\"rounded-[var(--nl-radius)] border border-[color:var(--nl-line)] bg-[color:var(--nl-surface)] p-6 sm:p-8\">\n          <p className=\"text-sm font-medium text-[color:var(--nl-muted)]\">What happens after you merge</p>\n          <ol className=\"mt-6 space-y-4\">\n            {checklist.map((item, index) => (\n              <li key={item} className=\"flex items-start gap-4\">\n                <span\n                  aria-hidden=\"true\"\n                  className=\"flex size-7 shrink-0 items-center justify-center rounded-full bg-[color:var(--nl-accent)] font-[family-name:var(--nl-font-mono)] text-xs text-[color:var(--nl-accent-ink)]\"\n                >\n                  {index + 1}\n                </span>\n                <span className=\"pt-0.5\">{item}</span>\n              </li>\n            ))}\n          </ol>\n        </div>\n      </div>\n    </section>\n  );\n}\n","tokens":["accent","accent-ink","canvas","focus","font-display","font-mono","font-sans","ink","line","muted","radius","section-y","surface"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"nav-simple","type":"nav","name":"Simple navigation","summary":"Brand, three to five links, and one action. Links collapse into a native disclosure menu on phones.","export":"NavSimple","tags":["header","navigation","responsive"],"accessibility":["The <nav> has aria-label=\"Main\" so it is distinguishable from other navigation landmarks.","The phone menu is a native <details> element: Enter and Space toggle it, and it works without JavaScript.","Every link and the menu toggle show a focus outline in the focus color."],"states":[{"name":"hover","description":"Links darken from muted to ink; the action button drops to 90% opacity."},{"name":"focus-visible","description":"A 2px outline in the focus color, offset by 2px."},{"name":"menu open","description":"Below md, the Menu disclosure opens a panel with the links and the action."}],"examples":[{"name":"Default","props":{}},{"name":"Two links","props":{"brand":"Example Docs","links":[{"label":"Guides","href":"#guides"},{"label":"API","href":"#api"}],"action":{"label":"Sign in","href":"#sign-in"}}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"c260468446a7","source":"export interface NavLink {\n  label: string;\n  href: string;\n}\n\nexport interface NavSimpleProps {\n  brand?: string;\n  links?: NavLink[];\n  action?: NavLink;\n}\n\nconst focusRing =\n  \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--nl-focus)]\";\n\n/**\n * Top navigation with a brand, a short link list, and one action. Below the\n * md breakpoint the links move into a native <details> menu, so it works\n * without client JavaScript.\n */\nexport function NavSimple({\n  brand = \"Example Studio\",\n  links = [\n    { label: \"Product\", href: \"#product\" },\n    { label: \"Pricing\", href: \"#pricing\" },\n    { label: \"Changelog\", href: \"#changelog\" },\n  ],\n  action = { label: \"Start a trial\", href: \"#start\" },\n}: NavSimpleProps) {\n  return (\n    <header className=\"border-b border-[color:var(--nl-line)] bg-[color:var(--nl-canvas)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <nav aria-label=\"Main\" className=\"mx-auto flex max-w-6xl items-center justify-between gap-6 px-6 py-4\">\n        <a href=\"/\" className={`rounded-[var(--nl-radius)] font-[family-name:var(--nl-font-display)] text-lg font-semibold ${focusRing}`}>\n          {brand}\n        </a>\n        <ul className=\"hidden items-center gap-8 text-sm md:flex\">\n          {links.map((link) => (\n            <li key={link.href}>\n              <a href={link.href} className={`rounded-[var(--nl-radius)] text-[color:var(--nl-muted)] hover:text-[color:var(--nl-ink)] ${focusRing}`}>\n                {link.label}\n              </a>\n            </li>\n          ))}\n        </ul>\n        <a\n          href={action.href}\n          className={`hidden rounded-[var(--nl-radius)] bg-[color:var(--nl-accent)] px-4 py-2 text-sm font-medium text-[color:var(--nl-accent-ink)] hover:opacity-90 md:inline-flex ${focusRing}`}\n        >\n          {action.label}\n        </a>\n        <details className=\"relative md:hidden\">\n          <summary className={`cursor-pointer list-none rounded-[var(--nl-radius)] border border-[color:var(--nl-line)] px-3 py-1.5 text-sm [&::-webkit-details-marker]:hidden ${focusRing}`}>\n            Menu\n          </summary>\n          <div className=\"absolute right-0 z-10 mt-2 w-56 rounded-[var(--nl-radius)] border border-[color:var(--nl-line)] bg-[color:var(--nl-surface)] p-2 shadow-lg\">\n            <ul className=\"text-sm\">\n              {links.map((link) => (\n                <li key={link.href}>\n                  <a href={link.href} className={`block rounded-[var(--nl-radius)] px-3 py-2 hover:bg-[color:var(--nl-canvas)] ${focusRing}`}>\n                    {link.label}\n                  </a>\n                </li>\n              ))}\n            </ul>\n            <a\n              href={action.href}\n              className={`mt-2 block rounded-[var(--nl-radius)] bg-[color:var(--nl-accent)] px-3 py-2 text-center text-sm font-medium text-[color:var(--nl-accent-ink)] ${focusRing}`}\n            >\n              {action.label}\n            </a>\n          </div>\n        </details>\n      </nav>\n    </header>\n  );\n}\n","tokens":["accent","accent-ink","canvas","focus","font-display","font-sans","ink","line","muted","radius","surface"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"pricing-tiers","type":"pricing","name":"Pricing tiers","summary":"Plan cards with price, summary, features, and an action. One plan can carry the accent border.","export":"PricingTiers","tags":["pricing","plans","cards"],"accessibility":["Plans are list items with an h3 each, so users can jump between plans by heading.","Check marks are decorative and aria-hidden; the feature text carries the meaning.","The highlighted plan is marked with text as well as color."],"states":[{"name":"hover","description":"The highlighted plan's action drops to 90% opacity; other actions fill with the canvas color."},{"name":"focus-visible","description":"A 2px outline in the focus color on each action."},{"name":"highlighted","description":"A 2px accent border and a mono label above the plan name."}],"examples":[{"name":"Middle plan highlighted","props":{}},{"name":"No highlight","props":{"heading":"Plans","plans":[{"name":"Monthly","price":"$12","period":"per month","summary":"Cancel any time.","features":["All features"],"action":{"label":"Choose monthly","href":"#monthly"}},{"name":"Yearly","price":"$120","period":"per year","summary":"Two months free.","features":["All features"],"action":{"label":"Choose yearly","href":"#yearly"}}]}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"1244e13abde7","source":"export interface Plan {\n  name: string;\n  price: string;\n  period?: string;\n  summary: string;\n  features: string[];\n  action: { label: string; href: string };\n  highlighted?: boolean;\n}\n\nexport interface PricingTiersProps {\n  heading?: string;\n  plans?: Plan[];\n}\n\nconst columns: Record<number, string> = { 2: \"md:grid-cols-2\", 3: \"md:grid-cols-3\", 4: \"md:grid-cols-4\" };\n\nconst focusRing =\n  \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--nl-focus)]\";\n\n/**\n * Two to four plan cards side by side. One plan can be highlighted with the\n * accent border and a \"Most teams pick this\" label.\n */\nexport function PricingTiers({\n  heading = \"Pricing\",\n  plans = [\n    {\n      name: \"Solo\",\n      price: \"$0\",\n      period: \"per month\",\n      summary: \"For one person trying it on a side project.\",\n      features: [\"One repository\", \"Drafts for every merge\", \"Markdown export\"],\n      action: { label: \"Start free\", href: \"#solo\" },\n    },\n    {\n      name: \"Team\",\n      price: \"$24\",\n      period: \"per seat, per month\",\n      summary: \"For teams that publish on a schedule.\",\n      features: [\"Unlimited repositories\", \"Approval workflow\", \"Email and in-app notes\", \"Weekly digest\"],\n      action: { label: \"Start a trial\", href: \"#team\" },\n      highlighted: true,\n    },\n    {\n      name: \"Company\",\n      price: \"Talk to us\",\n      summary: \"For several products and custom review rules.\",\n      features: [\"Everything in Team\", \"SSO\", \"Audit log\"],\n      action: { label: \"Contact sales\", href: \"#company\" },\n    },\n  ],\n}: PricingTiersProps) {\n  return (\n    <section className=\"bg-[color:var(--nl-canvas)] px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <div className=\"mx-auto max-w-6xl\">\n        <h2 className=\"text-center font-[family-name:var(--nl-font-display)] text-3xl font-semibold sm:text-4xl\">{heading}</h2>\n        <ul className={`mt-12 grid gap-6 ${columns[plans.length] ?? \"md:grid-cols-3\"}`}>\n          {plans.map((plan) => (\n            <li\n              key={plan.name}\n              className={`flex flex-col rounded-[var(--nl-radius)] border bg-[color:var(--nl-surface)] p-6 ${\n                plan.highlighted ? \"border-2 border-[color:var(--nl-accent)]\" : \"border-[color:var(--nl-line)]\"\n              }`}\n            >\n              {plan.highlighted ? (\n                <p className=\"mb-3 font-[family-name:var(--nl-font-mono)] text-xs uppercase tracking-wider text-[color:var(--nl-muted)]\">\n                  Most teams pick this\n                </p>\n              ) : null}\n              <h3 className=\"text-lg font-semibold\">{plan.name}</h3>\n              <p className=\"mt-4\">\n                <span className=\"font-[family-name:var(--nl-font-display)] text-4xl font-semibold\">{plan.price}</span>\n                {plan.period ? <span className=\"ml-2 text-sm text-[color:var(--nl-muted)]\">{plan.period}</span> : null}\n              </p>\n              <p className=\"mt-3 text-sm text-[color:var(--nl-muted)]\">{plan.summary}</p>\n              <ul className=\"mt-6 flex-1 space-y-2 text-sm\">\n                {plan.features.map((feature) => (\n                  <li key={feature} className=\"flex gap-2\">\n                    <span aria-hidden=\"true\" className=\"text-[color:var(--nl-accent)]\">&#10003;</span>\n                    {feature}\n                  </li>\n                ))}\n              </ul>\n              <a\n                href={plan.action.href}\n                className={`mt-8 rounded-[var(--nl-radius)] px-4 py-2.5 text-center font-medium ${\n                  plan.highlighted\n                    ? \"bg-[color:var(--nl-accent)] text-[color:var(--nl-accent-ink)] hover:opacity-90\"\n                    : \"border border-[color:var(--nl-line)] hover:bg-[color:var(--nl-canvas)]\"\n                } ${focusRing}`}\n              >\n                {plan.action.label}\n              </a>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </section>\n  );\n}\n","tokens":["accent","accent-ink","canvas","focus","font-display","font-mono","font-sans","ink","line","muted","radius","section-y","surface"],"requires":{"react":">=18","tailwindcss":">=4"}},{"id":"stat-row","type":"stat","name":"Stat row","summary":"Three figures with labels in a ruled row, plus a source line underneath. Stacks on phones.","export":"StatRow","tags":["metrics","social proof"],"accessibility":["Figures are a description list: each label is a <dt> and each value a <dd>, so they are read as pairs.","The visual order puts the value first with flex-col-reverse, while the source order keeps the label first for screen readers."],"states":[],"examples":[{"name":"Three figures","props":{}},{"name":"Source cited","props":{"label":"Source: internal usage data, August 2026.","stats":[{"value":"98.2%","label":"Uptime over 90 days"},{"value":"140 ms","label":"Median API response"},{"value":"6","label":"Regions"}]}}],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. No third-party source, copy, or assets.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"fe6845b34242","source":"export interface Stat {\n  value: string;\n  label: string;\n}\n\nexport interface StatRowProps {\n  label?: string;\n  stats?: Stat[];\n}\n\n/**\n * A row of three or four figures with labels, separated by rules. Values are\n * strings so you control the formatting. Use real numbers only.\n */\nexport function StatRow({\n  label = \"Example figures. Replace them with your own measured numbers.\",\n  stats = [\n    { value: \"42\", label: \"Release notes drafted last month\" },\n    { value: \"3 min\", label: \"Median time to approve a draft\" },\n    { value: \"12\", label: \"Teams publishing weekly\" },\n  ],\n}: StatRowProps) {\n  return (\n    <section className=\"bg-[color:var(--nl-canvas)] px-6 py-[var(--nl-section-y)] font-[family-name:var(--nl-font-sans)] text-[color:var(--nl-ink)]\">\n      <div className=\"mx-auto max-w-6xl\">\n        <dl className=\"grid gap-8 border-y border-[color:var(--nl-line)] py-10 sm:grid-cols-3 sm:gap-0 sm:divide-x sm:divide-[color:var(--nl-line)]\">\n          {stats.map((stat) => (\n            <div key={stat.label} className=\"flex flex-col-reverse gap-2 sm:px-8 sm:first:pl-0 sm:last:pr-0\">\n              <dt className=\"text-sm text-[color:var(--nl-muted)]\">{stat.label}</dt>\n              <dd className=\"font-[family-name:var(--nl-font-display)] text-4xl font-semibold tabular-nums sm:text-5xl\">{stat.value}</dd>\n            </div>\n          ))}\n        </dl>\n        <p className=\"mt-4 text-xs text-[color:var(--nl-muted)]\">{label}</p>\n      </div>\n    </section>\n  );\n}\n","tokens":["canvas","font-display","font-sans","ink","line","muted","section-y"],"requires":{"react":">=18","tailwindcss":">=4"}}],"styles":[{"id":"harbor","name":"Harbor","summary":"Cool blue-grey neutrals with a saturated blue accent and generous 12px corners. Written for Inter, which this package does not load.","colors":{"light":{"canvas":"#F7F9FC","surface":"#FFFFFF","ink":"#0E1726","muted":"#4A5568","line":"#D8DEE8","accent":"#1D4ED8","accent-ink":"#FFFFFF","focus":"#0369A1"},"dark":{"canvas":"#0B1220","surface":"#121B2E","ink":"#E6EDF7","muted":"#9AA8BD","line":"#24324A","accent":"#60A5FA","accent-ink":"#0B1220","focus":"#7DD3FC"}},"typography":{"display":{"family":"Inter","stack":"\"Inter\", ui-sans-serif, system-ui, sans-serif","weights":[600,700],"license":"SIL Open Font License 1.1. Not loaded by this package: install Inter yourself or the stack falls back to the system sans.","load":null},"sans":{"family":"Inter","stack":"\"Inter\", ui-sans-serif, system-ui, sans-serif","weights":[400,500],"license":"SIL Open Font License 1.1. Not loaded by this package: install Inter yourself or the stack falls back to the system sans.","load":null},"mono":{"family":"System mono","stack":"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace","weights":[400],"license":"Operating system font. Nothing is downloaded or redistributed.","load":null}},"radius":"12px","spacing":{"base":"4px","sectionY":"112px"},"guidelines":{"do":["Use blue for actions and links only, so blue always means clickable.","Keep cards on the white surface over the tinted canvas.","Use 12px corners on cards and buttons alike."],"dont":["Don't use blue for decoration, such as icons that do nothing.","Don't ship this style without loading Inter if the design depends on its exact widths."]},"inferred":[],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. Colors and rules are original. Inter is named as the intended face but is not bundled or loaded.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"99a4282efae6","missing":[]},{"id":"paper","name":"Paper","summary":"Warm off-white paper, near-black ink, and one terracotta accent. A serif display face over a system sans.","colors":{"light":{"canvas":"#F5F1E8","surface":"#FFFDF8","ink":"#1F1B16","muted":"#5E554A","line":"#D9D0C1","accent":"#B4462C","accent-ink":"#FFFFFF","focus":"#1F5FBF"},"dark":{"canvas":"#16130F","surface":"#211D18","ink":"#F2ECE1","muted":"#B3A999","line":"#3A342C","accent":"#E07A5F","accent-ink":"#1A0F0B","focus":"#8AB4F8"}},"typography":{"display":{"family":"Fraunces","stack":"\"Fraunces\", ui-serif, Georgia, serif","weights":[600],"license":"SIL Open Font License 1.1","load":"https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600&display=swap"},"sans":{"family":"System sans","stack":"ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif","weights":[400,500,600],"license":"Operating system font. Nothing is downloaded or redistributed.","load":null},"mono":{"family":"System mono","stack":"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace","weights":[400],"license":"Operating system font. Nothing is downloaded or redistributed.","load":null}},"radius":"6px","spacing":{"base":"4px","sectionY":"96px"},"guidelines":{"do":["Use the terracotta accent for one primary action per view.","Set headings in Fraunces at 600 and keep body copy in the system sans.","Separate sections with the line color instead of shadows."],"dont":["Don't put muted text on the surface color at sizes under 14px; use ink instead.","Don't add a second accent color. Use ink or muted for everything else."]},"inferred":[],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. Colors and rules are original. Fraunces is referenced, not bundled, and is licensed separately under the SIL Open Font License 1.1.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"9e029aa69c45","missing":[]},{"id":"signal","name":"Signal","summary":"White, black, and safety yellow with square corners. Light mode only, and no focus color defined.","colors":{"light":{"canvas":"#FFFFFF","surface":"#F4F4F0","ink":"#0A0A0A","muted":"#3F3F3F","line":"#0A0A0A","accent":"#FFD400","accent-ink":"#0A0A0A","focus":null},"dark":null},"typography":{"display":{"family":"Arial Black","stack":"\"Arial Black\", \"Helvetica Neue\", Arial, sans-serif","weights":[900],"license":"Operating system font where available. Nothing is downloaded or redistributed.","load":null},"sans":{"family":"Helvetica Neue","stack":"\"Helvetica Neue\", Arial, sans-serif","weights":[400,700],"license":"Operating system font where available. Nothing is downloaded or redistributed.","load":null},"mono":{"family":"System mono","stack":"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace","weights":[400],"license":"Operating system font. Nothing is downloaded or redistributed.","load":null}},"radius":"0px","spacing":{"base":"8px","sectionY":null},"guidelines":{"do":["Use yellow as a fill behind black text, never as text on white.","Give yellow buttons on white a black border so their edge is visible."],"dont":["Don't soften the corners. The style depends on square edges.","Don't use this style for long reading pages; the display face is heavy."]},"inferred":[],"provenance":{"author":"Neat Labs","origin":"original","license":"MIT","evidence":"Written for this repository on 2026-09-25. Left without a dark mode, a focus color, or a section spacing value on purpose, so the site and MCP show how missing values are reported.","permittedUses":["copy","modify","redistribute","commercial use"]},"revision":"5aa0ba0b4008","missing":["colors.light.focus","colors.dark","spacing.sectionY"]}],"siteUrl":"https://neatlabs.design"}