{
  "schemaVersion": 1,
  "generatedAt": "canonical",
  "sources": [
    {
      "id": "tavo-website",
      "kind": "website",
      "version": "workspace",
      "url": "https://tavojs.dev"
    },
    {
      "id": "tavo-framework",
      "kind": "framework",
      "version": "1.0.2",
      "url": "https://github.com/tavojs/core"
    },
    {
      "id": "tavo-cli",
      "kind": "cli",
      "version": "1.0.1",
      "url": "https://github.com/tavojs/core"
    },
    {
      "id": "tavo-ui",
      "kind": "ui",
      "version": "1.0.1",
      "url": "https://github.com/tavojs/ui"
    }
  ],
  "documents": [
    {
      "id": "getting-started:index",
      "section": "getting-started",
      "slug": "",
      "title": "Getting Started",
      "description": "Learn the Tavo.js application model from installation through production, one focused topic at a time.",
      "keywords": [
        "getting started",
        "learn",
        "first app",
        "tutorial"
      ],
      "kind": "quickstart",
      "prerequisites": [
        "HTML, CSS, TypeScript, and TSX fundamentals.",
        "Node.js 20.19+ or 22.12+, a terminal, an editor, and a modern browser."
      ],
      "outcomes": [
        "Choose a task-first guide or follow the complete beginner learning path.",
        "Understand how Tavo.js separates routes, request data, local behavior, server work, and build output."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Build your first Tavo.js app",
          "href": "/docs/getting-started/first-app",
          "description": "Build one Project Dashboard from scaffold through CSR and SSR."
        }
      ],
      "canonicalPath": "/docs/getting-started",
      "sections": [
        {
          "id": "prerequisites",
          "title": "Before you begin",
          "markdown": "These guides assume that you can read HTML, CSS, JavaScript or TypeScript, and TSX. You do not need previous Tavo.js experience. The examples use TypeScript, npm, and the generated project defaults.\n\n-   Node.js 20.19+ or 22.12+ for development, builds, and server rendering.\n    \n-   A terminal and editor with TypeScript support.\n    \n-   A modern browser for the client application and development tools.\n    \n\n**New to Tavo.js? Build one app first**\n\nFollow Build your first Tavo.js app for a cumulative path with a working checkpoint after every edit. The topic guides also stand alone when you need a specific answer."
        },
        {
          "id": "application-model",
          "title": "The Tavo.js application model",
          "markdown": "Files define the route tree. Loaders and middleware prepare request-scoped data. Models and controllers own interactive behavior, while stores share client state. The same route tree can render on the server, in the browser, or as static output.\n\nTavo.js UI supplies accessible interface primitives and a project-owned theme. The framework CLI creates, inspects, validates, builds, and packages the application. The guides keep these responsibilities visible so convenience never hides the runtime boundary."
        },
        {
          "id": "first-app-tutorial",
          "title": "Build one app from start to finish",
          "markdown": "Follow the dedicated first-app tutorial when you want one cumulative path with a checkpoint after every change. Its navigation stays focused on the app you are building.\n\n[\n\n## Build your first Tavo.js app\n\nBuild a Project Dashboard while learning routes, data, state, navigation, CSR, and SSR.Read guide →\n\n](/docs/getting-started/first-app)"
        },
        {
          "id": "start",
          "title": "Start with a focused guide",
          "markdown": "[\n\n## Installation\n\nCreate an application, add Tavo.js UI, and run it locally.Read guide →\n\n](/docs/getting-started/installation)[\n\n## Project structure\n\nUnderstand the generated files and choose where feature code belongs.Read guide →\n\n](/docs/getting-started/project-structure)"
        },
        {
          "id": "build",
          "title": "Build",
          "markdown": "[\n\n## Pages and layouts\n\nTurn files into typed routes, shared shells, and route-specific pending and error views.Read guide →\n\n](/docs/getting-started/pages-and-layouts)[\n\n## Linking and navigating\n\nMove through the route tree with responsive client navigation.Read guide →\n\n](/docs/getting-started/linking-and-navigating)[\n\n## Server and client execution\n\nChoose the correct runtime and keep hydration deterministic.Read guide →\n\n](/docs/getting-started/server-and-client-execution)[\n\n## Components, controllers, and stores\n\nStart with plain components, then add local behavior and shared state only when needed.Read guide →\n\n](/docs/getting-started/components-controllers-and-stores)"
        },
        {
          "id": "data",
          "title": "Data",
          "markdown": "[\n\n## Fetching data\n\nLoad route-critical data with useful pending, error, and cancellation behavior.Read guide →\n\n](/docs/getting-started/fetching-data)[\n\n## Mutating data\n\nValidate, authorize, and commit server changes through actions.Read guide →\n\n](/docs/getting-started/mutating-data)[\n\n## Caching\n\nChoose static output and safe response-cache boundaries.Read guide →\n\n](/docs/getting-started/caching)[\n\n## Revalidating\n\nRefresh cached routes by time or application-owned tags.Read guide →\n\n](/docs/getting-started/revalidating)[\n\n## Error handling\n\nChoose route, global, and component-level recovery boundaries.Read guide →\n\n](/docs/getting-started/error-handling)"
        },
        {
          "id": "interface",
          "title": "Interface",
          "markdown": "[\n\n## CSS and Tavo.js UI\n\nCombine local styles, design tokens, and accessible components.Read guide →\n\n](/docs/getting-started/css-and-tavo-ui)[\n\n## Image optimization\n\nDeliver stable, responsive local and remote images.Read guide →\n\n](/docs/getting-started/images)[\n\n## Font loading\n\nLoad local or external fonts without avoidable layout shift.Read guide →\n\n](/docs/getting-started/fonts)[\n\n## Metadata and social images\n\nDescribe routes for search engines, browsers, and social previews.Read guide →\n\n](/docs/getting-started/metadata-and-social-images)"
        },
        {
          "id": "server",
          "title": "Server",
          "markdown": "[\n\n## Server routes\n\nExpose deliberate HTTP endpoints through the plugin boundary.Read guide →\n\n](/docs/getting-started/server-routes)[\n\n## Middleware\n\nRun request-aware checks before route resolution.Read guide →\n\n](/docs/getting-started/middleware)"
        },
        {
          "id": "ship",
          "title": "Ship",
          "markdown": "[\n\n## Testing and diagnostics\n\nCatch failures at the fastest useful layer.Read guide →\n\n](/docs/getting-started/testing-and-diagnostics)[\n\n## Deploying\n\nMatch the build output to the runtime your application needs.Read guide →\n\n](/docs/getting-started/deploying)[\n\n## Upgrading\n\nUpdate the Tavo.js packages together and verify production behavior.Read guide →\n\n](/docs/getting-started/upgrading)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:first-app",
      "section": "getting-started",
      "slug": "first-app",
      "title": "Build your first Tavo.js app",
      "description": "Build a Project Dashboard while learning routes, loaders, local component state, controllers, Tavo.js UI, client navigation, CSR, and SSR.",
      "keywords": [
        "first app",
        "quickstart",
        "project dashboard",
        "route loader",
        "createTavo",
        "TavoController"
      ],
      "kind": "quickstart",
      "prerequisites": [
        "You can read HTML, CSS, TypeScript, and TSX; no Tavo.js experience is required.",
        "Node.js 20.19+ or 22.12+, npm, a terminal, and a code editor are available.",
        "Ports 5173 and 4174 are available, or you will use the URLs printed by the development servers."
      ],
      "outcomes": [
        "Create a Tavo.js project and identify what the generated starter demonstrates.",
        "Add a file route with browser-safe loader data.",
        "Add local interactive state and named behavior with createTavo and TavoController.",
        "Verify the same route in client and server development modes."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Project structure",
          "href": "/docs/getting-started/project-structure",
          "description": "Learn which folders Tavo.js enforces and where application code belongs."
        },
        {
          "title": "Server and client execution",
          "href": "/docs/getting-started/server-and-client-execution",
          "description": "Decide when data may run in both environments and when it must stay on the server."
        },
        {
          "title": "Fetching data",
          "href": "/docs/getting-started/fetching-data",
          "description": "Replace local sample data with abortable network requests and explicit failure handling."
        }
      ],
      "canonicalPath": "/docs/getting-started/first-app",
      "sections": [
        {
          "id": "before-you-begin",
          "title": "Before you begin",
          "markdown": "Quickstart · Runs in Browser, Server, Build\n\n### You will learn\n\n-   Create a `Tavo.js` project and identify what the generated starter demonstrates.\n    \n-   Add a file route with browser-safe loader data.\n    \n-   Add local interactive state and named behavior with `createTavo` and `TavoController`.\n    \n-   Verify the same route in client and server development modes.\n    \n\n### Starting point\n\n-   You can read HTML, CSS, `TypeScript`, and TSX; no `Tavo.js` experience is required.\n    \n-   `Node.js 20.19+ or 22.12+`, `npm`, a terminal, and a code editor are available.\n    \n-   Ports 5173 and 4174 are available, or you will use the URLs printed by the development servers."
        },
        {
          "id": "mental-model",
          "title": "Start with the application model",
          "markdown": "A `Tavo.js` application is a `TypeScript` program with a file-based route tree. A page file owns one URL, its loader prepares route data, and its TSX component renders that data. `createTavo` adds local reactive state when a view becomes interactive, while a `TavoController` gives that interaction named behavior.\n\nYou will build one feature in small working increments. Run the checkpoint after each increment before continuing; when something breaks, you then know which edit introduced it.\n\n**What this quickstart leaves for later**\n\nActions, authentication, caching, custom plugins, and deployment are separate guides. The first app stays focused on the route and rendering model you need before those topics."
        },
        {
          "id": "create-project",
          "title": "1. Create and inspect the starter",
          "markdown": "Create a project named `project-dashboard`, install its declared dependencies, and start the client development server.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnode --version\nnpx @tavojs/cli create app project-dashboard\ncd project-dashboard\nnpm install\nnpm run dev\n```\n\n**Checkpoint**\n\n**Expected:** The URL printed by Vite opens the generated counter. Increment, decrement, reset, and theme controls update immediately.\n\n**If it does not work:** If Vite rejects the Node version, install Node.js 20.19+ or 22.12+, remove the incomplete node\\_modules directory, and run npm install again.\n\nThe starter already demonstrates `Tavo.js` local state: `src/pages/index.tsx` defines a model and updates it with `model.patch()`. Keep that page and `src/styles.css`; the next steps add a second route without discarding the working starter. After trying the controls, stop the server with Ctrl+C before installing the next dependency."
        },
        {
          "id": "add-ui",
          "title": "2. Add Tavo.js UI through its plugin",
          "markdown": "Install the component package and ask its bundled `tavo-ui` command to create the project theme configuration. `@tavojs/ui-cli` is already a dependency of `@tavojs/ui`; do not install or version it separately.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpm install @tavojs/ui\nnpx tavo-ui web init\n```\n\nMerge `tavoUi()` into the configuration generated by the `Tavo.js` CLI. Keep `src/styles.css`, diagnostics, build settings, and every existing plugin. The UI plugin generates and injects theme variables during development and production builds, so this path does not add a generated theme file to `cssEntries`.\n\nMerge into `tavo.config.ts`\n\n**Merge tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { tavoUi } from \"@tavojs/ui/plugin\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false,\n  },\n  plugins: [tavoUi()],\n});\n```\n\n**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web check\nnpm run typecheck\nnpm run dev\n```\n\n**Expected:** The theme check reports success, TypeScript completes without errors, and Vite starts the client application again.\n\n**If it does not work:** If tavo-ui cannot find a config, confirm that the init command created tavo-ui.config.ts in the project root. If the page loses its starter styling, restore src/styles.css in cssEntries."
        },
        {
          "id": "create-route",
          "title": "3. Create the projects route",
          "markdown": "Create `src/pages/projects/index.tsx`. The path below is special: every non-underscore `TypeScript` or TSX module inside `src/pages` is treated as a route module. This file therefore creates `/projects`.\n\nStart with a plain TSX function. A page does not need a model, controller, store, or loader until its behavior requires one.\n\nCreate `src/pages/projects/index.tsx`\n\n**Create src/pages/projects/index.tsx**\n\n```tsx\nimport { Card, Page, Stack, Text } from \"@tavojs/ui\";\n\nexport default function ProjectsPage() {\n  return (\n    <Page>\n      <Stack gap=\"lg\">\n        <Text as=\"h1\" variant=\"h1\">\n          Project dashboard\n        </Text>\n        <Card title=\"Documentation\">\n          <Text>Make the learning path clear for a new Tavo.js developer.</Text>\n        </Card>\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Checkpoint**\n\n**Expected:** With npm run dev still running, http://localhost:5173/projects shows the Project dashboard heading and one Documentation card.\n\n**If it does not work:** If Tavo.js reports that a page module has no default component, check the default export and confirm the file is named index.tsx inside src/pages/projects."
        },
        {
          "id": "load-data",
          "title": "4. Load browser-safe route data",
          "markdown": "Create a normal source module for data that is safe to include in a browser bundle. This example contains public sample records—no database client, secret, session, or private API key.\n\nCreate `src/data/projects.ts`\n\n**Create src/data/projects.ts**\n\n```ts\nexport type Project = {\n  id: string;\n  name: string;\n  summary: string;\n  active: boolean;\n};\n\nexport const projects: Project[] = [\n  {\n    id: \"docs\",\n    name: \"Documentation\",\n    summary: \"Make the learning path clear for a new Tavo.js developer.\",\n    active: true,\n  },\n  {\n    id: \"website\",\n    name: \"Website\",\n    summary: \"Ship the next public release.\",\n    active: true,\n  },\n  {\n    id: \"mobile\",\n    name: \"Mobile\",\n    summary: \"Plan a later product experiment.\",\n    active: false,\n  },\n];\n```\n\nAdd a named `load` export to the functional route module. Its result becomes `data` for the default page component. Because this loader imports browser-safe data, it can run during both client navigation and SSR.\n\nReplace `src/pages/projects/index.tsx`\n\n**Replace src/pages/projects/index.tsx**\n\n```tsx\nimport type { PageProps } from \"@tavojs/core/router\";\nimport { Card, Grid, Page, Stack, Text } from \"@tavojs/ui\";\nimport { projects, type Project } from \"../../data/projects\";\n\ntype ProjectsData = { projects: Project[] };\n\nexport function load(): ProjectsData {\n  return { projects };\n}\n\nexport default function ProjectsPage({ data }: PageProps<ProjectsData>) {\n  return (\n    <Page>\n      <Stack gap=\"lg\">\n        <Text as=\"h1\" variant=\"h1\">\n          Project dashboard\n        </Text>\n        <Grid columns={{ base: 1, md: 2 }} spacing=\"md\">\n          {data?.projects.map((project) => (\n            <Card title={project.name}>\n              <Text>{project.summary}</Text>\n            </Card>\n          ))}\n        </Grid>\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Checkpoint**\n\n**Expected:** The projects route now shows Documentation, Website, and Mobile cards. A refresh keeps the same result.\n\n**If it does not work:** If the import cannot be resolved, check that projects.ts is under src/data and that the route uses the relative path ../../data/projects."
        },
        {
          "id": "add-state",
          "title": "5. Add local state and a controller",
          "markdown": "The filter belongs only to the dashboard currently on screen, so local model state is the narrowest owner. The controller gives each transition a clear name: `showAll()` and `showActive()` patch the model, while the view reads `state.filter` and delegates button events to those methods.\n\nCreate the component below. Pass `ProjectDashboardController` as the third `createTavo` type argument and register it with the `controller` option. `Tavo.js` creates the controller with access to the component model and disposes it with the mounted component.\n\nCreate `src/components/ProjectDashboard.tsx`\n\n**Create src/components/ProjectDashboard.tsx**\n\n```tsx\nimport { createTavo, TavoController } from \"@tavojs/core\";\nimport { Button, Card, Grid, Inline, Stack, Text } from \"@tavojs/ui\";\nimport type { Project } from \"../data/projects\";\n\ntype ProjectFilter = \"all\" | \"active\";\ntype ProjectDashboardProps = { projects: Project[] };\ntype ProjectDashboardState = { filter: ProjectFilter };\n\nclass ProjectDashboardController extends TavoController {\n  showAll() {\n    this.model.patch({ filter: \"all\" });\n  }\n\n  showActive() {\n    this.model.patch({ filter: \"active\" });\n  }\n}\n\nexport const ProjectDashboard = createTavo<\n  ProjectDashboardProps,\n  ProjectDashboardState,\n  ProjectDashboardController\n>({\n  model: () => ({ filter: \"all\" }),\n  controller: ProjectDashboardController,\n  view: ({ props, state, controller }) => {\n    const visibleProjects = props.projects.filter(\n      (project) => state.filter === \"all\" || project.active,\n    );\n\n    return (\n      <Stack gap=\"lg\">\n        <Inline gap=\"sm\" aria-label=\"Filter projects\">\n          <Button\n            aria-pressed={state.filter === \"all\" ? \"true\" : \"false\"}\n            onClick={() => controller?.showAll()}\n          >\n            All projects\n          </Button>\n          <Button\n            aria-pressed={state.filter === \"active\" ? \"true\" : \"false\"}\n            onClick={() => controller?.showActive()}\n          >\n            Active projects\n          </Button>\n        </Inline>\n        <Text aria-live=\"polite\">\n          Showing {visibleProjects.length} of {props.projects.length} projects\n        </Text>\n        <Grid columns={{ base: 1, md: 2 }} spacing=\"md\">\n          {visibleProjects.map((project) => (\n            <Card title={project.name}>\n              <Stack gap=\"sm\">\n                <Text>{project.summary}</Text>\n                <Text color=\"muted\">\n                  {project.active ? \"Active\" : \"Planned\"}\n                </Text>\n              </Stack>\n            </Card>\n          ))}\n        </Grid>\n      </Stack>\n    );\n  },\n});\n```\n\nReplace the route one final time so the loader still owns project data, the dashboard model owns the current filter, and the controller owns the filter-changing behavior. This separation prevents request data from being copied into a global client store.\n\nReplace `src/pages/projects/index.tsx`\n\n**Replace src/pages/projects/index.tsx**\n\n```tsx\nimport type { PageProps } from \"@tavojs/core/router\";\nimport { Page, Stack, Text } from \"@tavojs/ui\";\nimport { ProjectDashboard } from \"../../components/ProjectDashboard\";\nimport { projects, type Project } from \"../../data/projects\";\n\ntype ProjectsData = { projects: Project[] };\n\nexport function load(): ProjectsData {\n  return { projects };\n}\n\nexport default function ProjectsPage({ data }: PageProps<ProjectsData>) {\n  return (\n    <Page>\n      <Stack gap=\"lg\">\n        <Text as=\"h1\" variant=\"h1\">\n          Project dashboard\n        </Text>\n        <Text color=\"muted\">\n          Route data supplies the projects. Local model state controls the\n          visible filter.\n        </Text>\n        <ProjectDashboard projects={data?.projects ?? []} />\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Checkpoint**\n\n**Expected:** All projects shows three cards. Active projects shows two cards, updates the count, and marks the selected button with aria-pressed.\n\n**If it does not work:** If clicking does nothing, confirm the component registers ProjectDashboardController, passes it as the third createTavo type argument, and calls the controller methods from the button handlers."
        },
        {
          "id": "add-navigation",
          "title": "6. Link the starter to the dashboard",
          "markdown": "Create a small navigation component with the `Tavo.js` router `Link`. A link represents a destination and lets the pages runtime coordinate history, focus, scroll, loaders, and cancellation.\n\nCreate `src/components/ProjectDashboardLink.tsx`\n\n**Create src/components/ProjectDashboardLink.tsx**\n\n```tsx\nimport { Link } from \"@tavojs/core/router\";\n\nexport function ProjectDashboardLink() {\n  return <Link to=\"/projects\">Open the project dashboard</Link>;\n}\n```\n\nUpdate the generated home page in two small places while keeping the counter and its original styles intact. First, add this import beside the existing imports at the top of the file.\n\nUpdate `src/pages/index.tsx`\n\n**Patch src/pages/index.tsx**\n\n```tsx\nimport { ProjectDashboardLink } from \"../components/ProjectDashboardLink\";\n```\n\nNext, replace the existing one-line `app-footer` with this expanded footer.\n\nUpdate `src/pages/index.tsx`\n\n**Patch src/pages/index.tsx**\n\n```tsx\n<footer className=\"app-footer\">\n  <ProjectDashboardLink />\n  <span>Built with Tavo.js</span>\n  <code>src/pages/index.tsx</code>\n</footer>\n```\n\n**Checkpoint**\n\n**Expected:** Open http://localhost:5173, activate Open the project dashboard, and confirm the URL changes to /projects without a full document reload.\n\n**If it does not work:** If the link renders but navigation fails, verify that it imports Link from @tavojs/core/router and uses the to prop rather than href."
        },
        {
          "id": "verify-rendering",
          "title": "7. Verify client and server rendering",
          "markdown": "You have been using client-side rendering (CSR): Vite serves the document shell and the browser resolves the route. Stop that server, then start `Tavo.js`'s server-side rendering (SSR) development mode.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\n# Stop the CSR server with Ctrl+C, then run:\nnpm run dev:ssr\n\n# In another terminal, inspect the server-rendered HTML:\ncurl http://localhost:4174/projects\n```\n\n**Checkpoint**\n\n**Expected:** The curl response contains Project dashboard, and http://localhost:4174/projects hydrates into the same interactive filter in the browser.\n\n**If it does not work:** If port 4174 is occupied, use the URL printed by the SSR server for both the browser and curl. A hydration warning usually means the first browser render differs from the server HTML."
        },
        {
          "id": "result",
          "title": "What you built",
          "markdown": "Inspect `Final project tree`\n\n**Reference Final project tree**\n\n```text\nproject-dashboard/\n├── src/\n│   ├── components/\n│   │   ├── ProjectDashboard.tsx       local filter model, controller, and UI\n│   │   └── ProjectDashboardLink.tsx   client navigation\n│   ├── data/\n│   │   └── projects.ts                browser-safe sample data\n│   ├── pages/\n│   │   ├── index.tsx                  generated starter plus dashboard link\n│   │   └── projects/\n│   │       └── index.tsx              /projects route and loader\n│   └── styles.css                     preserved starter styles\n├── tavo-ui.config.ts                  project theme input\n└── tavo.config.ts                     framework and UI plugin configuration\n```\n\nThe route owns URL-level data and composition. The dashboard model owns state used only by that mounted view, and its controller owns named state transitions. The data module is ordinary browser-safe `TypeScript`. The UI plugin owns theme generation while the existing stylesheet remains part of the application."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Project structure\n\nLearn which folders Tavo.js enforces and where application code belongs.Read guide →\n\n](/docs/getting-started/project-structure)[\n\n## Server and client execution\n\nDecide when data may run in both environments and when it must stay on the server.Read guide →\n\n](/docs/getting-started/server-and-client-execution)[\n\n## Fetching data\n\nReplace local sample data with abortable network requests and explicit failure handling.Read guide →\n\n](/docs/getting-started/fetching-data)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:installation",
      "section": "getting-started",
      "slug": "installation",
      "title": "Installation",
      "description": "Create a Tavo.js application, add the integrated UI system, and run both client and server development modes.",
      "keywords": [
        "install",
        "create app",
        "Node.js",
        "dev server"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+, npm, a terminal, and a TypeScript-capable editor.",
        "An empty parent directory in which the CLI may create project-dashboard."
      ],
      "outcomes": [
        "Create and run the generated Tavo.js starter.",
        "Install @tavojs/ui and initialize its bundled theme CLI.",
        "Merge the UI plugin without removing starter styles or diagnostics.",
        "Start both client and server development modes."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Project structure",
          "href": "/docs/getting-started/project-structure",
          "description": "Learn what the generated files own."
        },
        {
          "title": "Tavo.js UI installation",
          "href": "/docs/ui/installation",
          "description": "Review theme and package options in depth."
        }
      ],
      "canonicalPath": "/docs/getting-started/installation",
      "sections": [
        {
          "id": "requirements",
          "title": "Check the development environment",
          "markdown": "Use `Node.js` 20.19 or newer (or 22.12 or newer) for `Tavo.js` development, builds, and server rendering. The application uses `TypeScript` and `npm` by default, but the CLI can record another package manager when your team has standardized on one.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnode --version\nnpm --version\n```"
        },
        {
          "id": "create",
          "title": "Create the application",
          "markdown": "The create command writes the route directory, application entry, `TypeScript` and Vite configuration, development scripts, starter page, and agent-facing project guidance. Install dependencies after reviewing the target directory.\n\nOpen the URL printed by Vite and try the counter. Stop the development server with Ctrl+C before continuing to the installation commands below.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx @tavojs/cli create app project-dashboard\ncd project-dashboard\nnpm install\nnpm run dev\n```\n\n**Generated files are a starting point**\n\nThe CLI protects existing files by default. Use force only when you have deliberately reviewed the files that will be replaced.\n\n**Checkpoint**\n\n**Expected:** The URL printed by Vite opens the generated counter, and its counter and theme controls update immediately.\n\n**If it does not work:** If Vite rejects the Node version, install Node.js 20.19+ or 22.12+, reinstall the dependencies, and rerun npm run dev. Stop the working server with Ctrl+C before continuing."
        },
        {
          "id": "package-managers",
          "title": "Use the team's package manager",
          "markdown": "The rest of this guide uses `npm` and runs project-local tools with `npx tavo` and `npx tavo-ui`. The equivalents are `pnpm exec tavo`, `yarn tavo`, or `bunx tavo` for the framework and `pnpm exec tavo-ui`, `yarn tavo-ui`, or `bunx tavo-ui` for UI tooling."
        },
        {
          "id": "ui",
          "title": "Add Tavo.js UI",
          "markdown": "`Tavo.js` Framework owns routing, data, rendering, and application behavior. `Tavo.js` UI supplies interface components and project theme tooling. Install `@tavojs/ui`, then initialize its theme configuration.\n\nThe `tavo-ui` command comes with `@tavojs/ui` through its package dependencies. Do not install or independently version `@tavojs/ui-cli` in the application.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpm install @tavojs/ui\nnpx tavo-ui web init\n```"
        },
        {
          "id": "configuration",
          "title": "Enable plugin-based theme generation",
          "markdown": "Merge `tavoUi()` into the generated configuration. Keep `src/styles.css`, diagnostics, build options, and every existing plugin. During development and production builds, the plugin reads the default `tavo-ui.config.ts` file and injects the generated theme variables; no generated theme file belongs in `cssEntries` for this setup.\n\nMerge into `tavo.config.ts`\n\n**Merge tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { tavoUi } from \"@tavojs/ui/plugin\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false,\n  },\n  plugins: [tavoUi()],\n});\n```\n\n**Merge; do not replace**\n\nThe example repeats the generated pages, styles, and diagnostics to make the final shape clear. If your configuration already contains other settings or plugins, preserve them and add `tavoUi()` to the existing plugins array."
        },
        {
          "id": "verify",
          "title": "Verify both rendering modes",
          "markdown": "The standard development command is the fastest client iteration loop. Use SSR development as soon as you add server loaders, actions, middleware, sessions, or request-time metadata.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpm run dev\n# Stop the CSR server, then start SSR development:\nnpm run dev:ssr\n```\n\n**Use the project-local CLI**\n\nKeep stable commands in package scripts or run them through `npx` so contributors and CI use the version declared by the application.\n\n**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web check\nnpm run typecheck\n```\n\n**Expected:** The theme check passes, TypeScript reports no errors, and both development modes print a local URL.\n\n**If it does not work:** If starter styling disappears, restore src/styles.css in cssEntries. If the theme config is missing, rerun the init command from the project root.\n\nLearn more\n\n-   [Server and client execution](/docs/getting-started/server-and-client-execution) — Understand which code runs in each rendering mode and where private work belongs."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Project structure\n\nLearn what the generated files own.Read guide →\n\n](/docs/getting-started/project-structure)[\n\n## Tavo.js UI installation\n\nReview theme and package options in depth.Read guide →\n\n](/docs/ui/installation)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:project-structure",
      "section": "getting-started",
      "slug": "project-structure",
      "title": "Project structure",
      "description": "Understand the generated application shape and organize route, feature, server, and asset code deliberately.",
      "keywords": [
        "folders",
        "files",
        "src",
        "pages",
        "configuration"
      ],
      "kind": "concept",
      "prerequisites": [
        "A project created with `tavo create app`.",
        "The project is open in an editor so you can compare its tree with this guide."
      ],
      "outcomes": [
        "Recognize the files created by the Tavo.js CLI.",
        "Know which files inside src/pages become public routes.",
        "Keep private modules inside the enforced src/server boundary.",
        "Choose simple shared and feature folders without inventing framework rules."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Pages and layouts",
          "href": "/docs/getting-started/pages-and-layouts",
          "description": "Turn the route tree into application UI."
        },
        {
          "title": "Create and generate",
          "href": "/docs/cli/create-and-generate",
          "description": "Use the CLI to add files that follow these conventions."
        }
      ],
      "canonicalPath": "/docs/getting-started/project-structure",
      "sections": [
        {
          "id": "generated-files",
          "title": "Read the generated project",
          "markdown": "The scaffold keeps configuration at the project root and application code under `src`. `Tavo.js` gives two source locations special safety or routing behavior: `src/pages` defines the route tree, and `src/server` is blocked from client bundles. Other source folders are application organization.\n\nInspect `Project tree`\n\n**Reference Project tree**\n\n```text\nproject-dashboard/\n├── public/                 static browser assets\n├── src/\n│   ├── pages/              file-based routes and layouts\n│   ├── server/             enforced server-only modules, when needed\n│   ├── components/         reusable interface and behavior\n│   ├── store/              shared client state\n│   ├── main.tsx            browser bootstrap\n│   └── styles.css          application-wide styles\n├── index.html              document shell\n├── tavo.config.ts          framework and plugin settings\n├── tavo-ui.config.ts       project theme input, after UI setup\n├── tsconfig.json           TypeScript contract\n└── vite.config.ts          build integration\n```"
        },
        {
          "id": "route-conventions",
          "title": "Know which names affect routing",
          "markdown": "Every non-underscore `TypeScript` or TSX module inside `src/pages` is treated as a route module. Normal folders add URL segments. Brackets create parameters, three dots create catch-all parameters, and parentheses group files without adding a public segment. A `_layout.tsx` file wraps its descendants.\n\nDo not place ordinary helpers, services, stores, or components in `src/pages` with a normal filename: `Tavo.js` will try to load them as routes. Move them to another source folder, or use an underscore-prefixed private file only for a small route-local helper.\n\nInspect `src/pages`\n\n**Reference src/pages**\n\n```text\nindex.tsx                    → /\nprojects/index.tsx           → /projects\nprojects/[id].tsx            → /projects/:id\ndocs/[[...slug]].tsx         → /docs/*?slug\n(marketing)/about.tsx        → /about\nprojects/_layout.tsx         → wraps /projects and descendants\nprojects/_format.ts          → private helper; not a route\nprojects/format.ts           → route module; do not use as a helper\n```\n\nLearn more\n\n-   [Pages and layouts](/docs/getting-started/pages-and-layouts) — See these route conventions in typed page and layout examples."
        },
        {
          "id": "organization",
          "title": "Decide where each file belongs",
          "markdown": "`src/pages` and `src/server` have framework meaning. Names such as `components` and `features` do not: they are folders you create to make browser-safe and shared code easy to find.\n\nStart with the simple structure below. A route file loads the data for its URL and assembles the page. Move code out of that file when it becomes reusable or when it must stay on the server.\n\n-   Used by one route? Keep it next to that route until the file becomes hard to read.\n    \n-   Used by several routes? Move it to `src/components`, `src/features`, or another clearly named shared folder.\n    \n-   Uses a database, secret, session, or private API key? Put it in `src/server`. `Tavo.js` treats that directory as server-only and blocks imports that reach a client bundle.\n    \n-   Needed directly by the browser, such as an image or font? Put it in `public`; `public/logo.svg` is available at `/logo.svg`.\n    \n-   Found in `.tavo/build` or `.tavo/generated`? Do not edit it. `Tavo.js` recreates generated files.\n    \n\nInspect `One possible structure`\n\n**Reference One possible structure**\n\n```text\nsrc/\n├── pages/\n│   └── projects/\n│       └── [id].tsx         route for /projects/:id\n├── features/\n│   └── projects/\n│       └── ProjectCard.tsx  UI used by project routes\n├── components/\n│   └── PageHeader.tsx       UI reused across the app\n└── server/\n    └── projects.ts          database code; never imported by browser code\n\npublic/\n└── logo.svg                 available in the app as /logo.svg\n```\n\n**You do not need the final folder structure on day one**\n\nBegin with `src/pages`, a shared `src/components` folder, and `src/server` if the application has private server code. Add feature folders only when they make files easier to find.\n\nLearn more\n\n-   [Server and client execution](/docs/getting-started/server-and-client-execution#server-boundary) — Learn what a server-only loader is and how to protect private dependencies.\n    \n-   [Fetching data](/docs/getting-started/fetching-data#route-loaders) — Learn how page and layout loaders provide route data.\n    \n-   [Mutating data](/docs/getting-started/mutating-data) — Learn how server actions validate, authorize, and commit changes.\n    \n-   [Middleware](/docs/getting-started/middleware#server-only) — Learn how server-only middleware handles sessions and private request checks."
        },
        {
          "id": "verify-structure",
          "title": "Check the route boundary",
          "markdown": "Use the CLI to inspect the route tree after adding or moving page files. The output should contain only URLs that the application intentionally exposes.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tavo routes\nnpm run typecheck\n```\n\n**Checkpoint**\n\n**Expected:** The route list contains the intended pages and no helper filenames, and TypeScript reports no errors.\n\n**If it does not work:** If a helper appears as a route, move it outside src/pages or prefix its filename with an underscore. If a client build reports a server-only import, move the private call behind a server loader, action, middleware, or server route."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Pages and layouts\n\nTurn the route tree into application UI.Read guide →\n\n](/docs/getting-started/pages-and-layouts)[\n\n## Create and generate\n\nUse the CLI to add files that follow these conventions.Read guide →\n\n](/docs/cli/create-and-generate)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:pages-and-layouts",
      "section": "getting-started",
      "slug": "pages-and-layouts",
      "title": "Pages and layouts",
      "description": "Turn the file tree into typed routes, nested application shells, and route-specific loading and error states.",
      "keywords": [
        "pages",
        "layouts",
        "dynamic routes",
        "file based route page",
        "defineRoutePage",
        "typed routes",
        "pending",
        "PagePendingProps",
        "PageErrorProps",
        "404",
        "error"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Turn the file tree into typed routes, nested application shells, and route-specific loading and error states."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Core pages and layouts",
          "href": "/docs/core/pages-and-layouts",
          "description": "Review the full route and layout contract."
        },
        {
          "title": "Linking and navigating",
          "href": "/docs/getting-started/linking-and-navigating",
          "description": "Connect the routes with client navigation."
        }
      ],
      "canonicalPath": "/docs/getting-started/pages-and-layouts",
      "sections": [
        {
          "id": "pages",
          "title": "Create a functional page",
          "markdown": "A page module describes one public route. The default function renders resolved page props, while optional named exports such as `load`, `pending`, `error`, `action`, `middleware`, `head`, and rendering or caching exports add route behavior. The file path remains the source of the public URL.\n\nCreate `src/pages/projects/[id].tsx`\n\n**Create src/pages/projects/[id].tsx**\n\n```tsx\nimport type { PageLoadContext, PageProps } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string };\ntype ProjectParams = { id: string };\n\nexport async function load({\n  params,\n  signal,\n  url,\n}: PageLoadContext): Promise<Project> {\n  const response = await fetch(\n    new URL(`/api/projects/${encodeURIComponent(params.id)}`, url),\n    { signal },\n  );\n  if (!response.ok) throw new Error(\"Project could not be loaded\");\n  return response.json() as Promise<Project>;\n}\n\nexport default function ProjectPage({\n  data,\n}: PageProps<Project, ProjectParams>) {\n  return (\n    <Page>\n      <Text as=\"h1\" variant=\"h1\">\n        {data?.name}\n      </Text>\n    </Page>\n  );\n}\n```\n\n**Keep route work abortable**\n\nNavigation supplies an `AbortSignal` to loaders. Pass it to `fetch` and downstream clients so an abandoned route cannot publish stale data."
        },
        {
          "id": "route-aware-typing",
          "title": "Add route-aware typing when it helps",
          "markdown": "`defineRoutePage` is an optional helper for keeping the loader, page component, and other route behaviors in one typed object. Its path literal infers dynamic parameters such as `id` and connects the loader data type to the default page.\n\nThe file tree still owns routing. The helper does not register or rename a route, so keep its path literal aligned with the page filename and confirm the result with `npx tavo routes`.\n\nCreate `src/pages/projects/[id].tsx`\n\n**Create src/pages/projects/[id].tsx**\n\n```tsx\nimport { defineRoutePage } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string };\n\nexport default defineRoutePage<\"/projects/[id]\", Project>(\"/projects/[id]\", {\n  load: async ({ params, signal, url }) => {\n    const response = await fetch(\n      new URL(`/api/projects/${encodeURIComponent(params.id)}`, url),\n      { signal },\n    );\n    if (!response.ok) throw new Error(\"Project could not be loaded\");\n    return response.json() as Promise<Project>;\n  },\n\n  default: function ProjectPage({ data }) {\n    return (\n      <Page>\n        <Text as=\"h1\" variant=\"h1\">\n          {data?.name}\n        </Text>\n      </Page>\n    );\n  },\n});\n```\n\n**The functional module remains the default**\n\nUse named exports for the clearest general-purpose page contract. Reach for `defineRoutePage` when its route-aware inference or grouped object form improves the page; the CLI offers it explicitly through `npx tavo generate page 'projects/[id]' --typed-route`."
        },
        {
          "id": "layouts",
          "title": "Share UI with layouts",
          "markdown": "A `_layout.tsx` file wraps every descendant page. Layouts compose from the root toward the leaf, so the root can own global navigation while a projects layout owns project-specific navigation and shared data.\n\nCreate `src/pages/projects/_layout.tsx`\n\n**Create src/pages/projects/_layout.tsx**\n\n```tsx\nimport type { Child } from \"@tavojs/core\";\nimport { Link } from \"@tavojs/core/router\";\nimport { Box, Stack } from \"@tavojs/ui\";\n\nexport default function ProjectsLayout({ children }: { children?: Child }) {\n  return (\n    <Box padding=\"lg\">\n      <Stack gap=\"lg\">\n        <Link to=\"/projects\">Projects</Link>\n        {children}\n      </Stack>\n    </Box>\n  );\n}\n```"
        },
        {
          "id": "route-loading-and-errors",
          "title": "Add route-specific loading and error UI",
          "markdown": "Export `pending` when a client navigation should replace the previous page with immediate route-specific feedback while the page loader runs. Export `error` when that page should own a contextual loader-failure view. Both exports are normal `Tavo.js` components and can be functions or components created with `createTavo()`.\n\nOn client navigation, `Tavo.js` resolves middleware and layout loaders first, renders `pending` inside the matched layouts, and then runs the page loader. The completed default page and its controller do not mount until the loader succeeds.\n\n-   `PagePendingProps` provides the target pathname, params, resolved layout layers, and layer data. Page loader data is unavailable because it is still loading.\n    \n-   `PageErrorProps` adds `data` and `error` for the failed route. Present a safe message instead of rendering raw server details.\n    \n-   Use `aria-busy=\"true\"` and a useful accessible label for pending content. Use `role=\"alert\"` or an equivalent announcement strategy for errors.\n    \n\nCreate `src/pages/dashboard.tsx`\n\n**Create src/pages/dashboard.tsx**\n\n```tsx\nimport type {\n  PageErrorProps,\n  PageLoadContext,\n  PagePendingProps,\n  PageProps,\n} from \"@tavojs/core/router\";\nimport { Page, Stack, Text } from \"@tavojs/ui\";\n\ntype DashboardData = {\n  projects: Array<{ id: string; name: string }>;\n  summary: { active: number };\n};\n\nexport function pending({ pathname }: PagePendingProps) {\n  return (\n    <Page aria-busy=\"true\" aria-label={`Loading ${pathname}`}>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          Loading dashboard…\n        </Text>\n        <Text color=\"muted\">Preparing projects and their summary.</Text>\n      </Stack>\n    </Page>\n  );\n}\n\nexport function error({ pathname }: PageErrorProps) {\n  return (\n    <Page>\n      <Stack gap=\"md\" role=\"alert\">\n        <Text as=\"h1\" variant=\"h1\">\n          Could not load the dashboard\n        </Text>\n        <Text color=\"muted\">\n          The data for {pathname} is unavailable. Try again.\n        </Text>\n      </Stack>\n    </Page>\n  );\n}\n\nexport async function load({\n  signal,\n  url,\n}: PageLoadContext): Promise<DashboardData> {\n  const [projectsResponse, summaryResponse] = await Promise.all([\n    fetch(new URL(\"/api/projects\", url), { signal }),\n    fetch(new URL(\"/api/projects/summary\", url), { signal }),\n  ]);\n  if (!projectsResponse.ok || !summaryResponse.ok) {\n    throw new Error(\"Dashboard data could not be loaded\");\n  }\n  return {\n    projects: await projectsResponse.json(),\n    summary: await summaryResponse.json(),\n  } as DashboardData;\n}\n\nexport default function DashboardPage({ data }: PageProps<DashboardData>) {\n  return (\n    <Page>\n      <Stack gap=\"md\">\n        <Text>Active projects: {data?.summary.active ?? 0}</Text>\n        {data?.projects.map((project) => (\n          <Text key={project.id}>{project.name}</Text>\n        ))}\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Pending UI is a browser-navigation state**\n\nNormal SSR, static prerendering, prefetching, and navigation satisfied from a fresh route cache wait for or already have the completed route, so they do not render the `pending` export."
        },
        {
          "id": "route-shapes",
          "title": "Use the route shape that matches the URL",
          "markdown": "Generate route types with a production build before relying on newly added dynamic paths throughout the application.\n\n-   Use `[id]` for one required segment.\n    \n-   Use `[...slug]` for one-or-more catch-all segments.\n    \n-   Use `[[...slug]]` when the catch-all route also owns its base URL.\n    \n-   Use `(group)` folders to organize routes or apply alternate layouts without changing the URL."
        },
        {
          "id": "failures",
          "title": "Provide route-level fallbacks",
          "markdown": "Add `src/pages/404.tsx` for URLs that do not match a route. Keep the message clear and provide a path back into the application.\n\nCreate `src/pages/404.tsx`\n\n**Create src/pages/404.tsx**\n\n```tsx\nimport { Link } from \"@tavojs/core/router\";\nimport { Page, Stack, Text } from \"@tavojs/ui\";\n\nexport const head = <title>Page not found</title>;\n\nexport default function NotFoundPage() {\n  return (\n    <Page>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          Page not found\n        </Text>\n        <Text color=\"muted\">\n          The page may have moved or the address may be incorrect.\n        </Text>\n        <Link to=\"/\">Return home</Link>\n      </Stack>\n    </Page>\n  );\n}\n```\n\nA page's `error` export is the first fallback for its page-loader failure. Add `src/pages/_error.tsx` as the application-wide fallback for routes that do not provide one. Show a stable recovery message without rendering server details, tokens, response bodies, or stack traces.\n\nCreate `src/pages/_error.tsx`\n\n**Create src/pages/_error.tsx**\n\n```tsx\nimport { Link } from \"@tavojs/core/router\";\nimport { Page, Stack, Text } from \"@tavojs/ui\";\n\nexport const head = <title>Something went wrong</title>;\n\nexport default function RouteErrorPage() {\n  return (\n    <Page>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          We could not load this page\n        </Text>\n        <Text color=\"muted\">\n          Try again, or return home if the problem continues.\n        </Text>\n        <Link to=\"/\">Return home</Link>\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Expected failures still belong in the page**\n\nA rejected form is normal application state. Use `notFound()` when route data is absent and should render `404.tsx`; it bypasses both route and global error views. Use a component `ErrorBoundary` for render-subtree failures."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Core pages and layouts\n\nReview the full route and layout contract.Read guide →\n\n](/docs/core/pages-and-layouts)[\n\n## Linking and navigating\n\nConnect the routes with client navigation.Read guide →\n\n](/docs/getting-started/linking-and-navigating)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:linking-and-navigating",
      "section": "getting-started",
      "slug": "linking-and-navigating",
      "title": "Linking and navigating",
      "description": "Move between routes while preserving browser history, focus, scroll position, and useful loading feedback.",
      "keywords": [
        "Link",
        "router",
        "prefetch",
        "history",
        "scroll"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Move between routes while preserving browser history, focus, scroll position, and useful loading feedback."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core routing",
          "href": "/docs/core/routing",
          "description": "See route status, prefetch, and standalone-router guidance."
        },
        {
          "title": "Fetching data",
          "href": "/docs/getting-started/fetching-data",
          "description": "Understand the work that navigation owns."
        }
      ],
      "canonicalPath": "/docs/getting-started/linking-and-navigating",
      "sections": [
        {
          "id": "links",
          "title": "Use links for application URLs",
          "markdown": "The Core Link component performs client navigation for internal destinations and keeps normal anchor behavior available to the browser. Use links for destinations and buttons for actions.\n\nCreate `src/components/ProjectNavigation.tsx`\n\n**Create src/components/ProjectNavigation.tsx**\n\n```tsx\nimport { Link } from \"@tavojs/core/router\";\nimport { Inline } from \"@tavojs/ui\";\n\nexport function ProjectNavigation() {\n  return (\n    <Inline as=\"nav\" gap=\"md\" aria-label=\"Projects\">\n      <Link to=\"/projects\">All projects</Link>\n      <Link to=\"/projects/active\" scroll={false}>\n        Active projects\n      </Link>\n    </Inline>\n  );\n}\n```"
        },
        {
          "id": "navigation-behavior",
          "title": "Let the pages runtime own navigation behavior",
          "markdown": "The pages runtime matches the route, resolves middleware and loaders, updates metadata, announces the new page, restores focus, and coordinates scroll. When the target page exports `pending`, the URL changes first, middleware and layout loaders resolve, and the pending component renders inside those layouts while the page loader runs.\n\n-   Use scroll={false} only when preserving the current position is part of the interaction.\n    \n-   Prefer route links over a second top-level standalone router.\n    \n-   Without a `pending` export, the previous page remains visible and the route content region is marked busy until the target resolves.\n    \n-   New routes start at the top, hashes target an element, and browser back or forward restores saved positions.\n    \n\n**Navigation is interruptible**\n\nA later navigation aborts loader and middleware work from the route it replaces, removes its pending component, and prevents obsolete data or errors from replacing the active route. Treat `AbortError` as control flow rather than an application failure."
        },
        {
          "id": "prefetching",
          "title": "Prefetch when intent is clear",
          "markdown": "`prefetchRoute` can resolve a likely destination before the click without changing the URL or rendering the route's `pending` component. Use it for focused or hovered high-probability links, not every route in the application. `getRouteStatus` exposes idle, loading, prefetching, ready, redirecting, and error states without duplicating the router state machine.\n\nCreate `src/navigation/prefetch-projects.ts`\n\n**Create src/navigation/prefetch-projects.ts**\n\n```ts\nimport { getRouteStatus, prefetchRoute } from \"@tavojs/core/router\";\n\nexport async function prefetchProjects() {\n  await prefetchRoute(\"/projects\");\n  return getRouteStatus(\"/projects\");\n}\n```"
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Core routing\n\nSee route status, prefetch, and standalone-router guidance.Read guide →\n\n](/docs/core/routing)[\n\n## Fetching data\n\nUnderstand the work that navigation owns.Read guide →\n\n](/docs/getting-started/fetching-data)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:server-and-client-execution",
      "section": "getting-started",
      "slug": "server-and-client-execution",
      "title": "Server and client execution",
      "description": "Choose where route work runs, protect private dependencies, and keep the first browser render consistent with server HTML.",
      "keywords": [
        "SSR",
        "CSR",
        "hydration",
        "server-only",
        "SSG",
        "ISR"
      ],
      "kind": "concept",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Choose where route work runs, protect private dependencies, and keep the first browser render consistent with server HTML."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Configure route output and debug hydration."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Protect server modules, sessions, hosts, and redirects."
        }
      ],
      "canonicalPath": "/docs/getting-started/server-and-client-execution",
      "sections": [
        {
          "id": "rendering-model",
          "title": "Understand the rendering model",
          "markdown": "`Tavo.js` renders the same TSX component model on the server and in the browser. In an SSR runtime, routes render on the server by default and hydrate in the browser. A route can opt into client-only rendering when its initial HTML is not important.\n\nCreate `src/pages/browser-only.tsx`\n\n**Create src/pages/browser-only.tsx**\n\n```tsx\nimport { Page } from \"@tavojs/ui\";\n\nexport const render = \"csr\";\n\nexport default function BrowserOnlyPage() {\n  return <Page>Rendered in the browser</Page>;\n}\n```\n\nStage\n\nRoute component\n\nUniversal loader\n\nServer-only loader\n\nInitial CSR request\n\nBrowser\n\nBrowser\n\nSkipped\n\nInitial SSR request\n\nServer, then browser hydration\n\nServer; result is serialized\n\nServer; safe result is serialized\n\nLater client navigation\n\nBrowser\n\nBrowser\n\nSkipped\n\nSSG build\n\nBuild process\n\nBuild process\n\nBuild process\n\nISR refresh\n\nServer runtime\n\nServer runtime\n\nServer runtime\n\n-   SSR renders for the current request.\n    \n-   CSR sends the document shell and resolves the route in the browser.\n    \n-   SSG prerenders selected static routes during the build.\n    \n-   ISR serves cached SSR output and refreshes it after a revalidation interval.\n    \n-   A route `pending` export can appear during browser route resolution, but normal SSR and static generation wait for the completed page or its error view."
        },
        {
          "id": "server-boundary",
          "title": "Keep private work behind a server boundary",
          "markdown": "`defineServerLoader` marks route data that must only resolve on the server. `Tavo.js` also enforces `src/server/**` as a server-only module boundary: the client build fails if code from that directory reaches its module graph. Put databases, sessions, private API clients, and secret-bearing code there, then reach it through server loaders, actions, middleware, or server routes.\n\nA server-only loader is skipped during browser route resolution. Its SSR result is available during initial hydration, but a later client navigation needs safe client auth state or a server endpoint such as /api/me when it must refresh that data.\n\nCreate `src/pages/account.tsx`\n\n**Create src/pages/account.tsx**\n\n```tsx\nimport { defineServerLoader } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Account = { name: string };\n\nexport const load = defineServerLoader(async ({ request, signal }) => {\n  const { getAccount, readSession } = await import(\"./session.server\");\n  const session = await readSession(request);\n  if (!session) throw new Error(\"Authentication required\");\n  return getAccount(session.accountId, { signal });\n});\n\nexport default function AccountPage({ data }: { data?: Account }) {\n  return (\n    <Page>\n      <Text>Welcome, {data?.name}</Text>\n    </Page>\n  );\n}\n```\n\n**Do not pass secrets through page data**\n\nLoader output is serialized for hydration. Return the minimum safe fields the interface needs, never session objects, credentials, private headers, or raw database records."
        },
        {
          "id": "hydration",
          "title": "Keep hydration deterministic",
          "markdown": "The browser hydrates against the route data and HTML resolved by the server. A hydration warning means the initial client tree did not reproduce that output.\n\n-   Guard browser-only globals such as window and `localStorage`.\n    \n-   Avoid time, randomness, and locale differences in the initial render.\n    \n-   Use deterministic IDs from framework helpers.\n    \n-   Test the production SSR build, not only the development server."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## SSR and hydration\n\nConfigure route output and debug hydration.Read guide →\n\n](/docs/core/ssr-and-hydration)[\n\n## Security\n\nProtect server modules, sessions, hosts, and redirects.Read guide →\n\n](/docs/core/security)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:components-controllers-and-stores",
      "section": "getting-started",
      "slug": "components-controllers-and-stores",
      "title": "Components, controllers, and stores",
      "description": "Give renderable state, application behavior, and shared client state one clear owner each.",
      "keywords": [
        "createTavo",
        "controller",
        "model",
        "store",
        "state"
      ],
      "kind": "concept",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Give renderable state, application behavior, and shared client state one clear owner each."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "MVC components",
          "href": "/docs/core/mvc",
          "description": "Learn controller lifecycle and component ownership in depth."
        },
        {
          "title": "Stores",
          "href": "/docs/core/stores",
          "description": "Choose store scope, subscriptions, and derived state."
        }
      ],
      "canonicalPath": "/docs/getting-started/components-controllers-and-stores",
      "sections": [
        {
          "id": "plain-components",
          "title": "Begin with a plain component",
          "markdown": "A component that only transforms props into TSX should be a normal function. It is easier to read, test, and reuse because it owns no hidden behavior.\n\nCreate `src/components/ProjectList.tsx`\n\n**Create src/components/ProjectList.tsx**\n\n```tsx\nimport { Stack, Text } from \"@tavojs/ui\";\n\ntype ProjectSummary = { id: string; name: string };\n\nexport function ProjectList({ projects }: { projects: ProjectSummary[] }) {\n  return (\n    <Stack as=\"ul\" gap=\"sm\">\n      {projects.map((project) => (\n        <li>\n          <Text>{project.name}</Text>\n        </li>\n      ))}\n    </Stack>\n  );\n}\n```"
        },
        {
          "id": "component-model",
          "title": "Add a local model for local interaction",
          "markdown": "When that mounted component needs renderable state, wrap it with `createTavo` and add a model. The filter below affects only this project list, so a global store would make ownership less clear.\n\nCreate `src/components/ProjectFilter.tsx`\n\n**Create src/components/ProjectFilter.tsx**\n\n```tsx\nimport { createTavo } from \"@tavojs/core\";\nimport { Button, Inline, Stack, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string; active: boolean };\ntype ProjectFilterProps = { projects: Project[] };\ntype ProjectFilterState = { filter: \"all\" | \"active\" };\n\nexport const ProjectFilter = createTavo<ProjectFilterProps, ProjectFilterState>(\n  {\n    model: () => ({ filter: \"all\" }),\n    view: ({ props, state, model }) => {\n      const visibleProjects = props.projects.filter(\n        (project) => state.filter === \"all\" || project.active,\n      );\n\n      return (\n        <Stack gap=\"md\">\n          <Inline gap=\"sm\">\n            <Button onClick={() => model.patch({ filter: \"all\" })}>All</Button>\n            <Button onClick={() => model.patch({ filter: \"active\" })}>\n              Active\n            </Button>\n          </Inline>\n          {visibleProjects.map((project) => (\n            <Text>{project.name}</Text>\n          ))}\n        </Stack>\n      );\n    },\n  },\n);\n```"
        },
        {
          "id": "controller",
          "title": "Add a controller only for coordinated behavior",
          "markdown": "A `Tavo.js` component has a required view and optional model and controller. Add a controller when behavior needs lifecycle, cleanup, services, routing, subscriptions, or side effects. Keep small event handlers that only patch local model state in the view."
        },
        {
          "id": "shared-state",
          "title": "Share client state through named stores",
          "markdown": "A global store is appropriate when several mounted components or routes need the same client preference. Keep mutation methods beside the state so callers express intent rather than coordinating partial writes.\n\nCreate `src/components/ActiveProjectButton.tsx`\n\n**Create src/components/ActiveProjectButton.tsx**\n\n```tsx\nimport { createTavo, defineGlobalStore, TavoController } from \"@tavojs/core\";\nimport { Button } from \"@tavojs/ui\";\n\ntype FilterState = {\n  status: \"all\" | \"active\";\n  showActive(): void;\n};\n\nexport const projectFilters = defineGlobalStore<FilterState>(\n  \"project-filters\",\n  (set) => ({\n    status: \"all\",\n    showActive: () => set({ status: \"active\" }),\n  }),\n);\n\nclass FilterController extends TavoController {\n  showActive() {\n    projectFilters.getState().showActive();\n  }\n}\n\nexport const ActiveProjectButton = createTavo({\n  controller: FilterController,\n  view: ({ controller }) => (\n    <Button onClick={() => controller?.showActive()}>Show active</Button>\n  ),\n});\n```\n\n**Global does not mean request-scoped**\n\nGlobal stores are process-wide during SSR. Never put the current user, tenant, token, session, or permissions in them; return safe request data from a loader instead."
        },
        {
          "id": "lifecycle",
          "title": "Make cleanup part of the behavior",
          "markdown": "Use `onInit` for subscriptions and initial model work, `onMount` or `onLayout` for DOM-dependent work, `afterRender` for post-commit behavior, and `onPropsChange` for explicit prop reactions. Return cleanup or register it with the controller so unmounting ends listeners and work.\n\n-   Prefer controller helpers for events, store selection, resize, and intersection observation.\n    \n-   Subscribe to the smallest store value the component needs.\n    \n-   Keep request data in page or layout props instead of mirroring it into a process-wide store."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## MVC components\n\nLearn controller lifecycle and component ownership in depth.Read guide →\n\n](/docs/core/mvc)[\n\n## Stores\n\nChoose store scope, subscriptions, and derived state.Read guide →\n\n](/docs/core/stores)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:fetching-data",
      "section": "getting-started",
      "slug": "fetching-data",
      "title": "Fetching data",
      "description": "Load route-critical data, design pending and error views, stream secondary content, and cancel obsolete work.",
      "keywords": [
        "loader",
        "pending",
        "PagePendingProps",
        "PageErrorProps",
        "fetch",
        "resource",
        "deferred",
        "AbortSignal"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Load route-critical data, design pending and error views, stream secondary content, and cancel obsolete work."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Data loading and middleware",
          "href": "/docs/core/data-and-middleware",
          "description": "Compare loaders, middleware, resources, and cancellation."
        },
        {
          "title": "Streaming and async work",
          "href": "/docs/core/streaming-and-async",
          "description": "Design deferred boundaries and timeout behavior."
        },
        {
          "title": "Error handling",
          "href": "/docs/getting-started/error-handling",
          "description": "Choose between route errors, the global error page, and component boundaries."
        }
      ],
      "canonicalPath": "/docs/getting-started/fetching-data",
      "sections": [
        {
          "id": "route-loaders",
          "title": "Load data the route needs",
          "markdown": "A page or layout loader runs during route resolution. Its return value becomes page data and is serialized into SSR output, so the browser can hydrate without immediately repeating the request. The page's default component and controller do not mount until its loader completes.\n\nCreate `src/pages/dashboard.tsx`\n\n**Create src/pages/dashboard.tsx**\n\n```tsx\nimport type {\n  PageErrorProps,\n  PageLoadContext,\n  PagePendingProps,\n  PageProps,\n} from \"@tavojs/core/router\";\nimport { Page, Stack, Text } from \"@tavojs/ui\";\n\ntype DashboardData = {\n  projects: Array<{ id: string; name: string }>;\n  summary: { active: number };\n};\n\nexport function pending({ pathname }: PagePendingProps) {\n  return (\n    <Page aria-busy=\"true\" aria-label={`Loading ${pathname}`}>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          Loading dashboard…\n        </Text>\n        <Text color=\"muted\">Preparing projects and their summary.</Text>\n      </Stack>\n    </Page>\n  );\n}\n\nexport function error({ pathname }: PageErrorProps) {\n  return (\n    <Page>\n      <Stack gap=\"md\" role=\"alert\">\n        <Text as=\"h1\" variant=\"h1\">\n          Could not load the dashboard\n        </Text>\n        <Text color=\"muted\">\n          The data for {pathname} is unavailable. Try again.\n        </Text>\n      </Stack>\n    </Page>\n  );\n}\n\nexport async function load({\n  signal,\n  url,\n}: PageLoadContext): Promise<DashboardData> {\n  const [projectsResponse, summaryResponse] = await Promise.all([\n    fetch(new URL(\"/api/projects\", url), { signal }),\n    fetch(new URL(\"/api/projects/summary\", url), { signal }),\n  ]);\n  if (!projectsResponse.ok || !summaryResponse.ok) {\n    throw new Error(\"Dashboard data could not be loaded\");\n  }\n  return {\n    projects: await projectsResponse.json(),\n    summary: await summaryResponse.json(),\n  } as DashboardData;\n}\n\nexport default function DashboardPage({ data }: PageProps<DashboardData>) {\n  return (\n    <Page>\n      <Stack gap=\"md\">\n        <Text>Active projects: {data?.summary.active ?? 0}</Text>\n        {data?.projects.map((project) => (\n          <Text key={project.id}>{project.name}</Text>\n        ))}\n      </Stack>\n    </Page>\n  );\n}\n```\n\n**Check every response**\n\nfetch resolves for HTTP error statuses. Check `response.ok` and turn expected failures into explicit page data before attempting to read a success shape."
        },
        {
          "id": "route-pending-and-error",
          "title": "Design the route while its loader is unresolved",
          "markdown": "The example above exports `pending` for immediate feedback during active browser resolution and `error` for a contextual page-loader failure. `Tavo.js` renders either component inside the target route's resolved layouts.\n\nThe browser changes the URL, runs route middleware, resolves layout loaders, renders `pending`, and then runs the page loader. Success replaces it with the default page; failure replaces it with the page's `error` component.\n\nResolution path\n\nPending export\n\nVisible result\n\nInitial CSR resolution\n\nRendered while the page loader runs\n\nCompleted page or route error\n\nLater client navigation\n\nRendered after layout loaders resolve\n\nCompleted page or route error\n\nNormal SSR or static generation\n\nNot rendered\n\nServer waits for the completed page or error\n\nPrefetch or fresh route-cache hit\n\nNot rendered\n\nNo visible route replacement during prefetch\n\n-   `PagePendingProps` contains `pathname`, `params`, `layers`, and `layerData`; page loader data is intentionally unavailable.\n    \n-   `PageErrorProps` contains those route fields plus `data` and `error`.\n    \n-   Layout data is available because `Tavo.js` resolves target layout loaders before showing the page pending component.\n    \n-   If the page has no `pending` export, the previous page remains visible and the route content region is marked busy.\n    \n\n**Route pending or component resource?**\n\nUse a route `pending` export when the page cannot render meaningfully before its loader completes. Use `createResource()` when the page shell can render immediately and only one section owns the asynchronous work."
        },
        {
          "id": "loader-execution",
          "title": "Know when the loader runs",
          "markdown": "A universal loader follows the route resolver. The table shows why its imports and return value must be safe in every environment that can execute or receive them.\n\nEntry path\n\nWhere load runs\n\nWhat the browser receives\n\nDirect CSR visit\n\nBrowser\n\nNo serialized loader result\n\nDirect SSR visit\n\nServer\n\nResult is serialized for hydration\n\nHydration\n\nBrowser reuses server data\n\nNo immediate repeat\n\nLater client navigation\n\nBrowser\n\nFresh result belongs to that navigation"
        },
        {
          "id": "loader-ownership",
          "title": "Choose the narrowest data owner",
          "markdown": "Avoid copying loader results into global stores. Page props already keep request data scoped to the navigation that produced it.\n\n-   Use a page loader when the route cannot render meaningfully without the data.\n    \n-   Use a layout loader for request data shared by its descendant routes.\n    \n-   Use `createResource` for component-scoped browser data that can load independently.\n    \n-   Use lazy when the asynchronous work is loading a component implementation."
        },
        {
          "id": "streaming",
          "title": "Stream secondary server content",
          "markdown": "Resolve data required for navigation, SEO, and the primary shell in the loader. Put slower optional server work behind Deferred boundaries with a stable ID, useful fallback, timeout behavior, and an error fallback.\n\nPromise-backed Deferred content progressively patches an SSR stream. For browser-only asynchronous work, use a loader, resource, controller, or store instead."
        },
        {
          "id": "cancellation",
          "title": "Pass cancellation through every layer",
          "markdown": "Navigation owns loader and middleware signals. Replacing a navigation aborts its route work, removes its pending component, and prevents obsolete data or errors from replacing the active route. A resource owns its current load. Deferred work belongs to its supplied signal or render lifecycle. Forward the signal to fetch, database wrappers that support it, and other cancellable clients.\n\n-   Treat `AbortError` as normal control flow.\n    \n-   Do not publish results after their owner has been replaced.\n    \n-   Use transactions or idempotency for side effects because cancellation cannot undo a committed mutation."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Data loading and middleware\n\nCompare loaders, middleware, resources, and cancellation.Read guide →\n\n](/docs/core/data-and-middleware)[\n\n## Streaming and async work\n\nDesign deferred boundaries and timeout behavior.Read guide →\n\n](/docs/core/streaming-and-async)[\n\n## Error handling\n\nChoose between route errors, the global error page, and component boundaries.Read guide →\n\n](/docs/getting-started/error-handling)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:mutating-data",
      "section": "getting-started",
      "slug": "mutating-data",
      "title": "Mutating data",
      "description": "Handle server changes through validated, authorized route actions with explicit pending and failure states.",
      "keywords": [
        "action",
        "form",
        "validation",
        "authorization",
        "idempotency"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Handle server changes through validated, authorized route actions with explicit pending and failure states."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Actions, forms, and validation",
          "href": "/docs/core/actions-and-forms",
          "description": "Review action responses, validation, and security order."
        },
        {
          "title": "Revalidating",
          "href": "/docs/getting-started/revalidating",
          "description": "Refresh cached reads after a successful change."
        }
      ],
      "canonicalPath": "/docs/getting-started/mutating-data",
      "sections": [
        {
          "id": "actions",
          "title": "Put server mutations in route actions",
          "markdown": "A route action handles non-GET requests in SSR mode. It receives a standard Request, so the handler can read JSON or form data, authorize the caller, perform the change, and return JSON, status, headers, or a redirect.\n\nCreate `src/pages/projects/new.tsx`\n\n**Create src/pages/projects/new.tsx**\n\n```ts\nimport {\n  createServerFormAction,\n  createTavo,\n  TavoController,\n} from \"@tavojs/core\";\nimport { defineValidatedAction } from \"@tavojs/core/dev\";\nimport {\n  Button,\n  Field,\n  FormControl,\n  Page,\n  Stack,\n  Text,\n  TextInput,\n} from \"@tavojs/ui\";\n\ntype ProjectInput = { name: string };\n\nconst projectSchema = {\n  parse(input: unknown): ProjectInput {\n    const name = String((input as { name?: unknown }).name ?? \"\").trim();\n    if (!name) throw new Error(\"Project name is required\");\n    return { name };\n  },\n};\n\nexport const action = defineValidatedAction(\n  projectSchema,\n  async ({ input, request }) => {\n    const { requireProjectPermission, saveProject } =\n      await import(\"./project-store.server\");\n    await requireProjectPermission(request);\n    const project = await saveProject(input);\n    return { redirect: `/projects/${project.id}` };\n  },\n);\n\ntype ProjectFormState = { pending: boolean; error: string };\n\nclass ProjectFormController extends TavoController {\n  formAction = createServerFormAction(\"/projects/new\");\n\n  async submit(event: Event) {\n    event.preventDefault();\n    this.model.patch({ pending: true, error: \"\" });\n    const result = await this.formAction.submit(\n      event.currentTarget as HTMLFormElement,\n    );\n    this.model.patch({\n      pending: false,\n      error:\n        result.status === \"error\"\n          ? result.error instanceof Error\n            ? result.error.message\n            : \"Project could not be created\"\n          : \"\",\n    });\n  }\n}\n\nexport default createTavo<{}, ProjectFormState, ProjectFormController>({\n  model: () => ({ pending: false, error: \"\" }),\n  controller: ProjectFormController,\n  view: ({ state, controller }) => (\n    <Page>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          New project\n        </Text>\n        <FormControl\n          method=\"post\"\n          onSubmit={(event: Event) => void controller?.submit(event)}\n        >\n          <Field label=\"Project name\" error={state.error} required>\n            <TextInput id=\"project-name\" name=\"name\" required />\n          </Field>\n          <Button type=\"submit\" disabled={state.pending}>\n            {state.pending ? \"Creating…\" : \"Create project\"}\n          </Button>\n        </FormControl>\n        {state.error ? (\n          <Text role=\"alert\" tone=\"danger\">\n            {state.error}\n          </Text>\n        ) : null}\n      </Stack>\n    </Page>\n  ),\n});\n```"
        },
        {
          "id": "action-execution",
          "title": "Separate browser and server responsibilities",
          "markdown": "Phase\n\nRuntime\n\nResponsibility\n\nRender form\n\nBrowser and SSR\n\nShow fields, current errors, and pending state.\n\nSubmit\n\nBrowser\n\nSerialize input and send the non-GET request.\n\nRoute action\n\nServer\n\nValidate, authenticate, authorize, and commit.\n\nApply response\n\nBrowser\n\nShow field errors, success data, or follow a redirect.\n\nStatic-only deployment\n\nUnavailable\n\nUse a server runtime or external API for mutations."
        },
        {
          "id": "validation",
          "title": "Validate before business logic",
          "markdown": "`defineValidatedAction` accepts Standard Schema and common parse-compatible validators. Invalid input receives a structured 400 response before the mutation handler runs.\n\n**Validation is not authorization**\n\nA valid payload can still come from the wrong user. Authenticate and verify permissions inside every server action before changing state."
        },
        {
          "id": "safe-order",
          "title": "Keep the mutation order predictable",
          "markdown": "-   Parse and validate the input shape.\n    \n-   Authenticate the request and authorize the specific resource operation.\n    \n-   Apply origin, CSRF, and idempotency rules appropriate to the endpoint.\n    \n-   Commit the database or external side effect.\n    \n-   Return only safe data, an explicit error shape, or a same-origin redirect."
        },
        {
          "id": "form-state",
          "title": "Show pending and expected failures",
          "markdown": "Use `createServerFormAction` when a controller should own browser submission state for a route action. Disable duplicate submission while pending, associate validation messages with their fields, and announce the result without moving focus unexpectedly.\n\n**Design retries before enabling them**\n\nA network timeout does not prove that a server mutation failed. Use idempotency keys for operations that users or infrastructure may safely retry."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Actions, forms, and validation\n\nReview action responses, validation, and security order.Read guide →\n\n](/docs/core/actions-and-forms)[\n\n## Revalidating\n\nRefresh cached reads after a successful change.Read guide →\n\n](/docs/getting-started/revalidating)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:caching",
      "section": "getting-started",
      "slug": "caching",
      "title": "Caching",
      "description": "Prebuild stable routes and cache safe SSR responses without crossing user or request boundaries.",
      "keywords": [
        "cache",
        "static",
        "SSG",
        "createTavo",
        "TavoController",
        "vary",
        "adapter"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Prebuild stable routes and cache safe SSR responses without crossing user or request boundaries."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Compare SSR, CSR, SSG, and revalidated output."
        },
        {
          "title": "Revalidating",
          "href": "/docs/getting-started/revalidating",
          "description": "Keep cached output fresh."
        }
      ],
      "canonicalPath": "/docs/getting-started/caching",
      "sections": [
        {
          "id": "static-routes",
          "title": "Mark routes that can be static",
          "markdown": "Export prerender when a route can safely reuse its rendered output. For a dynamic path, `generateStaticParams` lists the concrete URLs the production build should prerender.\n\nStatic generation renders the initial `createTavo` view during the build; the browser can then hydrate it and let its controller own later interactions. In this example, every visitor receives the same safe article HTML while save state remains local to the hydrated component.\n\nCreate `src/pages/articles/[slug].tsx`\n\n**Create src/pages/articles/[slug].tsx**\n\n```tsx\nimport { createTavo, TavoController } from \"@tavojs/core\";\nimport type { PageLoadContext, PageProps } from \"@tavojs/core/router\";\nimport { Button, Page, Stack, Text } from \"@tavojs/ui\";\n\ntype Article = { title: string };\ntype ArticleParams = { slug: string };\ntype ArticlePageState = { saved: boolean };\n\nconst articles: Record<string, Article> = {\n  \"getting-started\": { title: \"Getting started\" },\n  \"release-notes\": { title: \"Release notes\" },\n};\n\nfunction getArticle(slug: string): Article {\n  const article = articles[slug];\n  if (!article) throw new Error(`Unknown article: ${slug}`);\n  return article;\n}\n\nexport const prerender = true;\n\nexport function generateStaticParams(): ArticleParams[] {\n  return [{ slug: \"getting-started\" }, { slug: \"release-notes\" }];\n}\n\nexport function load({ params }: PageLoadContext): Article {\n  return getArticle(params.slug);\n}\n\nclass ArticlePageController extends TavoController {\n  toggleSaved() {\n    this.model.patch((state) => ({ saved: !state.saved }));\n  }\n}\n\nexport default createTavo<\n  PageProps<Article, ArticleParams>,\n  ArticlePageState,\n  ArticlePageController\n>({\n  model: () => ({ saved: false }),\n  controller: ArticlePageController,\n  view: ({ props, state, controller }) => (\n    <Page>\n      <Stack gap=\"md\">\n        <Text as=\"h1\" variant=\"h1\">\n          {props.data?.title}\n        </Text>\n        <Button\n          variant=\"outline\"\n          aria-pressed={state.saved ? \"true\" : \"false\"}\n          onClick={() => controller?.toggleSaved()}\n        >\n          {state.saved ? \"Saved for later\" : \"Save article\"}\n        </Button>\n      </Stack>\n    </Page>\n  ),\n});\n```\n\n**Static does not mean non-interactive**\n\nKeep the initial model deterministic and safe to share. Browser-only controller behavior can begin after hydration, but request users, sessions, permissions, and personalized defaults must not enter the prerendered output."
        },
        {
          "id": "cache-safety",
          "title": "Cache only shareable output",
          "markdown": "The route cache stores rendered HTML and resolved route data. Requests carrying Cookie or Authorization bypass static caching because their output may be user-specific.\n\n-   Do not mark personalized pages static.\n    \n-   Use vary only for a small, deliberate set of request headers that genuinely change safe output.\n    \n-   Keep request users, sessions, tenants, and permissions out of global stores and module variables.\n    \n\n**Static is a data contract**\n\nThe route must remain safe to share for every request that resolves to the same cache key. Treat that requirement as part of the route design, not only a performance switch."
        },
        {
          "id": "cache-execution",
          "title": "Separate rendering from caching",
          "markdown": "Mode or request\n\nWhere rendering happens\n\nCache behavior\n\nCSR\n\nBrowser on each visit\n\nNormal HTTP asset caching only\n\nSSR\n\nServer for each request\n\nNone unless route or adapter enables it\n\nSSG\n\nBuild process\n\nGenerated HTML and route data\n\nISR\n\nServer after expiry\n\nServe cached output, then replace it\n\nCookie or Authorization request\n\nServer\n\nShared static cache is bypassed"
        },
        {
          "id": "cache-adapters",
          "title": "Choose a production cache adapter",
          "markdown": "The Node runtime uses a bounded process-local memory cache by default. It is useful for one process, but it is not shared across replicas and disappears when the process restarts. Supply a cache adapter when the application needs shared persistence or coordinated invalidation."
        },
        {
          "id": "inspect",
          "title": "Inspect what the build decided",
          "markdown": "`tavo` build prints each route render mode and static policy. Use the JSON report and generated route manifest in CI when static output is an application requirement.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\ntavo build --report-json\ntavo inspect route /articles/getting-started --json\n```"
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## SSR and hydration\n\nCompare SSR, CSR, SSG, and revalidated output.Read guide →\n\n](/docs/core/ssr-and-hydration)[\n\n## Revalidating\n\nKeep cached output fresh.Read guide →\n\n](/docs/getting-started/revalidating)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:revalidating",
      "section": "getting-started",
      "slug": "revalidating",
      "title": "Revalidating",
      "description": "Refresh cached routes by time or application-owned tags while keeping deployment behavior explicit.",
      "keywords": [
        "revalidate",
        "cache tags",
        "invalidation",
        "ISR"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Refresh cached routes by time or application-owned tags while keeping deployment behavior explicit."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Deployment",
          "href": "/docs/core/deployment",
          "description": "Connect cache behavior to the selected runtime."
        },
        {
          "title": "Testing and diagnostics",
          "href": "/docs/getting-started/testing-and-diagnostics",
          "description": "Verify cache hits, misses, and invalidation."
        }
      ],
      "canonicalPath": "/docs/getting-started/revalidating",
      "sections": [
        {
          "id": "time-based",
          "title": "Refresh after a time interval",
          "markdown": "A numeric `revalidate` value automatically enables cached SSR and gives the cached output a lifetime in seconds. After it expires, the next resolution produces fresh output and replaces the stored entry.\n\nChoose the route-aware helper when you want typed path parameters and the route contract in one object. Choose named exports when you want each behavior visible at module scope. Both examples describe the same revalidated project route.\n\nCreate `src/pages/projects/[id].tsx`\n\n**Create src/pages/projects/[id].tsx**\n\n```tsx\nimport { defineRoutePage } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string };\n\nfunction getProject(id: string): Project {\n  return { id, name: `Project ${id}` };\n}\n\nexport default defineRoutePage<\"/projects/[id]\", Project>(\"/projects/[id]\", {\n  revalidate: 300,\n\n  cacheTags: ({ params }) => [\"projects\", `project:${params.id}`],\n\n  load: ({ params }) => getProject(params.id),\n\n  default: function ProjectPage({ data }) {\n    return (\n      <Page>\n        <Text>{data?.name}</Text>\n      </Page>\n    );\n  },\n});\n```\n\n**Create src/pages/projects/[id].tsx**\n\n```tsx\nimport type { PageLoadContext, PageProps } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string };\ntype ProjectParams = { id: string };\n\nfunction getProject(id: string): Project {\n  return { id, name: `Project ${id}` };\n}\n\nexport const revalidate = 300;\nexport const cacheTags = ({ params }: PageLoadContext) => [\n  \"projects\",\n  `project:${params.id}`,\n];\n\nexport function load({ params }: PageLoadContext): Project {\n  return getProject(params.id);\n}\n\nexport default function ProjectPage({\n  data,\n}: PageProps<Project, ProjectParams>) {\n  return (\n    <Page>\n      <Text>{data?.name}</Text>\n    </Page>\n  );\n}\n```\n\n**Revalidation already enables caching**\n\nDo not add `prerender = true` merely to enable cached SSR. Reserve `prerender = true` for build-time static HTML without timed revalidation; inside `defineRoutePage`, use its equivalent, `static: true`."
        },
        {
          "id": "cache-tags",
          "title": "Name related cached output",
          "markdown": "`cacheTags` attaches application-owned names to a route entry. Tags can be static or derived from route parameters, which lets one mutation target a collection, one record, or both.\n\n-   Use stable domain names such as projects and project:42.\n    \n-   Do not put secrets or personal data into a tag.\n    \n-   Keep tag production beside the route data contract so readers can see what invalidates it."
        },
        {
          "id": "on-demand",
          "title": "Invalidate through the runtime boundary",
          "markdown": "`PagesRuntime` exposes synchronous tag invalidation for its resolved-route cache. The Node request handler exposes asynchronous `invalidateCache` for both runtime and static adapter entries. Custom cache adapters may also implement `invalidateTags`.\n\nCreate `src/server/invalidate-project.ts`\n\n**Create src/server/invalidate-project.ts**\n\n```ts\ntype CacheInvalidator = {\n  invalidateCache(tags: string[]): Promise<number>;\n};\n\nexport async function invalidateProjectCache(\n  requestHandler: CacheInvalidator,\n  projectId: string,\n) {\n  return requestHandler.invalidateCache([\"projects\", `project:${projectId}`]);\n}\n```\n\n**Invalidation must reach every replica**\n\nProcess-local invalidation affects only that process. In a multi-instance deployment, connect tag invalidation to the shared cache or platform coordination mechanism."
        },
        {
          "id": "after-mutation",
          "title": "Invalidate only after the mutation commits",
          "markdown": "Trigger invalidation after the database or external write succeeds. If the mutation and cache live in different systems, record enough information to retry failed invalidation without repeating the business change."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Deployment\n\nConnect cache behavior to the selected runtime.Read guide →\n\n](/docs/core/deployment)[\n\n## Testing and diagnostics\n\nVerify cache hits, misses, and invalidation.Read guide →\n\n](/docs/getting-started/testing-and-diagnostics)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:error-handling",
      "section": "getting-started",
      "slug": "error-handling",
      "title": "Error handling",
      "description": "Choose route and global error views, model normal failures as state, and contain exceptions at the nearest useful boundary.",
      "keywords": [
        "errors",
        "PageErrorProps",
        "route error",
        "ErrorBoundary",
        "404",
        "retry",
        "diagnostics"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Choose route and global error views, model normal failures as state, and contain exceptions at the nearest useful boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Capture route, hydration, and runtime failures at the correct layer."
        },
        {
          "title": "Streaming and async work",
          "href": "/docs/core/streaming-and-async",
          "description": "Add deferred error and timeout behavior."
        }
      ],
      "canonicalPath": "/docs/getting-started/error-handling",
      "sections": [
        {
          "id": "expected-errors",
          "title": "Return expected failures explicitly",
          "markdown": "Validation failures, empty results, rejected permissions, and unavailable remote services can be normal application outcomes. Give them typed data or response shapes so the page can explain what happened and offer a useful next action.\n\n-   Associate form errors with the field that needs attention.\n    \n-   Use status codes and JSON shapes consistently across route actions and server routes.\n    \n-   Call `notFound()` when missing route data should render `404.tsx`; unmatched URLs use the same page."
        },
        {
          "id": "unexpected-errors",
          "title": "Contain unexpected render failures",
          "markdown": "`ErrorBoundary` protects a component subtree and renders fallback UI when rendering fails. Place boundaries around areas that can recover independently instead of replacing the entire application for one failed panel.\n\nCreate `src/components/ProjectPanel.tsx`\n\n**Create src/components/ProjectPanel.tsx**\n\n```tsx\nimport { ErrorBoundary, type Child } from \"@tavojs/core\";\nimport { Button, Stack, Text } from \"@tavojs/ui\";\n\nexport function ProjectPanel({ children }: { children?: Child }) {\n  return (\n    <ErrorBoundary\n      resetKey=\"projects\"\n      fallback={(error) => (\n        <Stack gap=\"sm\">\n          <Text role=\"alert\">Projects could not be displayed.</Text>\n          <Button onClick={() => console.error(error)}>Report problem</Button>\n        </Stack>\n      )}\n    >\n      {children}\n    </ErrorBoundary>\n  );\n}\n```\n\n**Do not expose private error details**\n\nShow a stable user-facing message and send diagnostic details to controlled logging. Stack traces, request headers, loader data, and tokens do not belong in rendered fallback UI."
        },
        {
          "id": "route-failures",
          "title": "Choose the closest route error view",
          "markdown": "A page can export an `error` component for its own loader failures. It receives `PageErrorProps`, including the target pathname, params, data and error fields, resolved layers, and layer data, and it renders inside the matched layout chain.\n\nIf the target page does not export `error`, `Tavo.js` uses `src/pages/_error.tsx` as the application-wide fallback. A layout-loader failure enters this error-resolution path instead of showing the page pending component with invalid layout data.\n\n-   Use a page `error` export when the recovery message or next action is specific to that route.\n    \n-   Keep `_error.tsx` broad enough to handle any remaining page or layout loader failure.\n    \n-   `notFound()` bypasses both route and global error views and renders `404.tsx` with status 404.\n    \n-   Render failures belong in the nearest component `ErrorBoundary` because they happen after route resolution.\n    \n\n**Treat the error value as sensitive**\n\nUse the `error` prop for safe classification and controlled diagnostics. Do not render stack traces, request headers, tokens, raw response bodies, or private loader data."
        },
        {
          "id": "async-errors",
          "title": "Design asynchronous failure states",
          "markdown": "Resources expose idle, loading, success, and error states. Deferred boundaries accept error and timeout fallbacks. A retry should start a new owned operation and replace the old signal rather than reusing abandoned work.\n\n-   Do not report deliberate cancellation as an error.\n    \n-   Set timeouts for optional dependencies that should not hold a stream open.\n    \n-   Instrument the route, loader, action, cache, or boundary phase without recording private payloads."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Testing and diagnostics\n\nCapture route, hydration, and runtime failures at the correct layer.Read guide →\n\n](/docs/core/testing-and-diagnostics)[\n\n## Streaming and async work\n\nAdd deferred error and timeout behavior.Read guide →\n\n](/docs/core/streaming-and-async)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:css-and-tavo-ui",
      "section": "getting-started",
      "slug": "css-and-tavo-ui",
      "title": "CSS and Tavo.js UI",
      "description": "Combine application styles, locally scoped CSS, design tokens, and accessible interface components.",
      "keywords": [
        "CSS",
        "CSS Modules",
        "Tavo.js UI",
        "theme",
        "tokens"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Combine application styles, locally scoped CSS, design tokens, and accessible interface components."
      ],
      "runtime": [
        "browser",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js UI overview",
          "href": "/docs/ui",
          "description": "Choose theming, responsive, composition, and accessibility guides."
        },
        {
          "title": "Design tokens",
          "href": "/docs/ui/tokens",
          "description": "Use generated tokens in product-specific styles."
        }
      ],
      "canonicalPath": "/docs/getting-started/css-and-tavo-ui",
      "sections": [
        {
          "id": "style-boundaries",
          "title": "Give each style layer one job",
          "markdown": "Use application-wide CSS for document defaults and product-wide rules, CSS Modules for component-specific presentation, `Tavo.js` UI props for supported component behavior, and generated theme tokens for shared design decisions.\n\n-   List deliberate global entry files in `tavo.config.ts` `cssEntries`.\n    \n-   Name local files \\*`.module.css` so class names remain scoped. Install sass-embedded before choosing \\*`.module.scss` for application code.\n    \n-   Keep third-party global styles in one documented application entry.\n    \n-   Use tokens instead of repeating product colors, spacing, radii, and typography values."
        },
        {
          "id": "ui-components",
          "title": "Compose with Tavo.js UI",
          "markdown": "`Tavo.js` UI components provide semantic defaults, states, responsive props, and theme integration. They do not own your application data or business behavior; route modules, controllers, and stores remain responsible for those concerns.\n\nCreate `src/pages/projects/index.tsx`\n\n**Create src/pages/projects/index.tsx**\n\n```tsx\nimport { Button, Card, Grid, Page, Text } from \"@tavojs/ui\";\n\nexport default function ProjectsPage() {\n  return (\n    <Page>\n      <Grid columns={{ base: 1, md: 2 }} spacing=\"md\">\n        <Card title=\"Documentation\">\n          <Text>Refresh the getting started guide.</Text>\n          <Button variant=\"solid\">Open project</Button>\n        </Card>\n      </Grid>\n    </Page>\n  );\n}\n```"
        },
        {
          "id": "theme",
          "title": "Generate a project-owned theme",
          "markdown": "`tavo-ui.config.ts` describes the light and dark brand colors, default mode, numeric scale, typography, and token overrides the product needs. The `Tavo.js` UI plugin resolves that input and injects generated variables during development and production builds.\n\nMerge into `tavo-ui.config.ts`\n\n**Merge tavo-ui.config.ts**\n\n```ts\nimport type { TavoUiThemeConfig } from \"@tavojs/ui\";\n\nexport default {\n  $schema: \"./node_modules/@tavojs/ui/schema.json\",\n  defaultTheme: \"system\",\n  color: {\n    light: { primary: \"#3157d5\" },\n    dark: { primary: \"#9bb1ff\" },\n  },\n  scale: { radius: 8 },\n} satisfies TavoUiThemeConfig;\n```\n\n**The application owns the theme**\n\nRegenerate theme output through the UI CLI instead of editing generated variables by hand. Commit the input configuration that expresses the product decision."
        },
        {
          "id": "responsive-and-order",
          "title": "Keep responsive behavior and order predictable",
          "markdown": "Responsive values are mobile-first: base applies everywhere, then larger breakpoint values override it. Import order still controls global CSS, so keep one deliberate sequence and avoid relying on incidental module discovery.\n\n-   Use component responsive props for supported layout behavior.\n    \n-   Use CSS Modules for product-specific selectors and states.\n    \n-   Use the exported breakpoint mixins when custom CSS must align with the UI system."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Tavo.js UI overview\n\nChoose theming, responsive, composition, and accessibility guides.Read guide →\n\n](/docs/ui)[\n\n## Design tokens\n\nUse generated tokens in product-specific styles.Read guide →\n\n](/docs/ui/tokens)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:images",
      "section": "getting-started",
      "slug": "images",
      "title": "Image optimization",
      "description": "Render stable responsive images and opt into tightly controlled server optimization for local or remote assets.",
      "keywords": [
        "Image",
        "responsive",
        "sharp",
        "remote images",
        "assets"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Render stable responsive images and opt into tightly controlled server optimization for local or remote assets."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "SEO, assets, and styling",
          "href": "/docs/core/seo-assets-and-styling",
          "description": "Review Image, Font, Script, and metadata boundaries."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Harden remote media and production SSR configuration."
        }
      ],
      "canonicalPath": "/docs/getting-started/images",
      "sections": [
        {
          "id": "image-component",
          "title": "Describe the image layout",
          "markdown": "The Image component emits an img element with responsive optimizer URLs during SSR. Supply accurate dimensions to reserve space, a meaningful alt description, widths that match the design, and sizes that explain the rendered width to the browser.\n\nCreate `src/components/ProjectHero.tsx`\n\n**Create src/components/ProjectHero.tsx**\n\n```tsx\nimport { Image } from \"@tavojs/core\";\nimport { Page } from \"@tavojs/ui\";\n\nexport function ProjectHero() {\n  return (\n    <Page>\n      <Image\n        src=\"/images/project-dashboard.png\"\n        alt=\"Project dashboard showing active work\"\n        width={1280}\n        height={720}\n        widths={[640, 960, 1280]}\n        sizes=\"(min-width: 60rem) 60rem, 100vw\"\n        priority\n      />\n    </Page>\n  );\n}\n```\n\n**Priority is exceptional**\n\nMark only an above-the-fold image that materially affects the initial view as priority. Lazy loading remains the better default for the rest of the page."
        },
        {
          "id": "local-assets",
          "title": "Serve local assets from public",
          "markdown": "Files under public have root-relative browser URLs. Keep the source path inside that directory so the optimizer cannot read arbitrary server files. Use unoptimized when the source is already transformed or the deployment has no image optimizer."
        },
        {
          "id": "remote-assets",
          "title": "Allow remote sources narrowly",
          "markdown": "Remote optimization is disabled until the application enables it and supplies an HTTPS allowlist. Restrict hostnames and paths to the product's actual media origins.\n\nMerge into `tavo.config.ts`\n\n**Merge tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nexport default defineConfig({\n  ssr: {\n    images: {\n      allowRemote: true,\n      remotePatterns: [\n        {\n          protocol: \"https:\",\n          hostname: \"media.example.com\",\n          pathname: \"/projects/\",\n        },\n      ],\n    },\n  },\n});\n```\n\n**Remote media is a server security boundary**\n\nKeep the allowlist exact, preserve request-size and timeout limits, and do not enable insecure HTTP sources in production."
        },
        {
          "id": "sharp",
          "title": "Install the production transformer when needed",
          "markdown": "The SSR optimizer uses the optional sharp dependency for transformations. Install it in the application that runs the server, then verify the /\\_tavo/image endpoint in production preview and on the selected platform.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpm install sharp\nnpm run build\nnpm run preview:ssr\n```"
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## SEO, assets, and styling\n\nReview Image, Font, Script, and metadata boundaries.Read guide →\n\n](/docs/core/seo-assets-and-styling)[\n\n## Security\n\nHarden remote media and production SSR configuration.Read guide →\n\n](/docs/core/security)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:fonts",
      "section": "getting-started",
      "slug": "fonts",
      "title": "Font loading",
      "description": "Load self-hosted or external fonts deliberately while controlling privacy, fallback behavior, and layout stability.",
      "keywords": [
        "Font",
        "woff2",
        "preload",
        "preconnect",
        "font-display"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Load self-hosted or external fonts deliberately while controlling privacy, fallback behavior, and layout stability."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "SEO, assets, and styling",
          "href": "/docs/core/seo-assets-and-styling",
          "description": "See the complete document-asset model."
        },
        {
          "title": "Theming",
          "href": "/docs/ui/theming",
          "description": "Connect the font variable to the product theme."
        }
      ],
      "canonicalPath": "/docs/getting-started/fonts",
      "sections": [
        {
          "id": "local-fonts",
          "title": "Prefer a self-hosted font when possible",
          "markdown": "Place licensed font files under public and render Font from a root layout head export. The component creates the preload and @font-face rules for SSR and CSR, while a CSS variable makes the family available to the theme or application styles.\n\nCreate `src/pages/_layout.tsx`\n\n**Create src/pages/_layout.tsx**\n\n```tsx\nimport { Font, type Child } from \"@tavojs/core\";\n\nexport const head = (\n  <Font\n    src=\"/fonts/inter-variable.woff2\"\n    family=\"Inter\"\n    type=\"font/woff2\"\n    display=\"swap\"\n    variable=\"--font-sans\"\n    fallback=\"system-ui, sans-serif\"\n  />\n);\n\nexport default function RootLayout({ children }: { children?: Child }) {\n  return <>{children}</>;\n}\n```\n\n**Use the smallest useful font set**\n\nA variable WOFF2 file often replaces several individual weights. Preload only fonts required by the initial view; extra preloads compete with more important resources."
        },
        {
          "id": "display-and-fallback",
          "title": "Choose a visible fallback strategy",
          "markdown": "font-display controls whether text waits for the custom file. swap keeps content visible immediately, while optional lets the browser retain the fallback on slow connections. Choose a fallback family with similar metrics to reduce movement when the custom font appears."
        },
        {
          "id": "external-fonts",
          "title": "Treat external fonts as third-party requests",
          "markdown": "Font can emit stylesheet and preconnect links for an external provider. That request exposes the visitor's network metadata to another origin and adds a runtime dependency, so confirm the privacy and availability tradeoff before using it.\n\n-   Preconnect only to origins used by the selected stylesheet.\n    \n-   Keep integrity and CSP requirements aligned with the provider.\n    \n-   Prefer self-hosting when privacy, reliability, or offline behavior matters."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## SEO, assets, and styling\n\nSee the complete document-asset model.Read guide →\n\n](/docs/core/seo-assets-and-styling)[\n\n## Theming\n\nConnect the font variable to the product theme.Read guide →\n\n](/docs/ui/theming)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:metadata-and-social-images",
      "section": "getting-started",
      "slug": "metadata-and-social-images",
      "title": "Metadata and social images",
      "description": "Describe each route for browsers, search engines, link previews, and assistive navigation.",
      "keywords": [
        "Seo",
        "metadata",
        "Open Graph",
        "Twitter",
        "canonical"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Describe each route for browsers, search engines, link previews, and assistive navigation."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "SEO, assets, and styling",
          "href": "/docs/core/seo-assets-and-styling",
          "description": "Review head exports, Seo, and document assets."
        },
        {
          "title": "Deploying",
          "href": "/docs/getting-started/deploying",
          "description": "Confirm canonical origins and metadata in production."
        }
      ],
      "canonicalPath": "/docs/getting-started/metadata-and-social-images",
      "sections": [
        {
          "id": "route-head",
          "title": "Keep metadata beside the route",
          "markdown": "Export a static head value when every visit shares the same metadata. Use a head function when the title, description, status, or social image depends on route parameters or loader data.\n\nCreate `src/pages/projects/[id].tsx`\n\n**Create src/pages/projects/[id].tsx**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\nimport type { PageLoadContext, PageProps } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { name: string; summary: string; image: string };\ntype ProjectParams = { id: string };\n\nexport function load({ params }: PageLoadContext): Promise<Project> {\n  return getProject(params.id);\n}\n\nexport function head({ data, params }: PageLoadContext & { data?: Project }) {\n  return (\n    <Seo\n      title={data ? `${data.name} - Projects` : \"Project\"}\n      description={data?.summary}\n      canonical={`https://example.com/projects/${encodeURIComponent(params.id)}`}\n      openGraph={{ type: \"website\", image: data?.image }}\n      twitter={{ card: \"summary_large_image\", image: data?.image }}\n    />\n  );\n}\n\nexport default function ProjectPage({\n  data,\n}: PageProps<Project, ProjectParams>) {\n  return (\n    <Page>\n      <Text as=\"h1\" variant=\"h1\">\n        {data?.name}\n      </Text>\n    </Page>\n  );\n}\n\nasync function getProject(id: string): Promise<Project> {\n  return {\n    name: `Project ${id}`,\n    summary: \"A project managed with Tavo.js.\",\n    image: \"https://media.example.com/projects/social.png\",\n  };\n}\n```"
        },
        {
          "id": "seo-fields",
          "title": "Publish the fields consumers need",
          "markdown": "-   Use one specific title and plain-language description per public route.\n    \n-   Set a canonical URL when multiple URLs can expose equivalent content.\n    \n-   Use robots, `noIndex`, and `noFollow` intentionally for non-public routes.\n    \n-   Provide Open Graph and Twitter images with stable HTTPS URLs and useful source dimensions.\n    \n-   Set theme-color when the browser chrome should follow the product theme."
        },
        {
          "id": "social-images",
          "title": "Serve social images as public assets",
          "markdown": "Store static share images under public or point Seo at a trusted media origin. `Tavo.js` does not generate Open Graph artwork from route code; create the image through your asset pipeline and publish the final URL.\n\n**Metadata is server output**\n\nRequest-time metadata can use safe loader data, but it must not expose session values, private record fields, internal hostnames, or untrusted raw HTML."
        },
        {
          "id": "verify",
          "title": "Verify the rendered document",
          "markdown": "Inspect the production SSR HTML, not only the browser DOM after navigation. Confirm the title, canonical URL, description, robots policy, and social tags for static, dynamic, success, and not-found routes."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## SEO, assets, and styling\n\nReview head exports, Seo, and document assets.Read guide →\n\n](/docs/core/seo-assets-and-styling)[\n\n## Deploying\n\nConfirm canonical origins and metadata in production.Read guide →\n\n](/docs/getting-started/deploying)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:server-routes",
      "section": "getting-started",
      "slug": "server-routes",
      "title": "Server routes",
      "description": "Expose deliberate HTTP endpoints through the plugin server boundary using standard web requests and responses.",
      "keywords": [
        "server route",
        "plugin",
        "Request",
        "Response",
        "API"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Expose deliberate HTTP endpoints through the plugin server boundary using standard web requests and responses."
      ],
      "runtime": [
        "server"
      ],
      "related": [
        {
          "title": "Plugins and localization",
          "href": "/docs/core/plugins-and-localization",
          "description": "Understand plugin services, ordering, routes, and request scope."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Configure origins, hosts, redirects, bodies, and secrets."
        }
      ],
      "canonicalPath": "/docs/getting-started/server-routes",
      "sections": [
        {
          "id": "when-to-use",
          "title": "Choose a server route for an HTTP endpoint",
          "markdown": "Use a page action when a mutation belongs to one application route. Use a plugin server route for a reusable API, webhook, health check, or integration endpoint that should respond before page rendering.\n\n**Server routes require an SSR runtime**\n\nStatic hosting and a client-only Vite server cannot execute these handlers. Run the generated `.tavo/build/server/start.mjs` entry with Node."
        },
        {
          "id": "register",
          "title": "Register methods in a plugin",
          "markdown": "Declare every endpoint in the plugin manifest, then implement the same endpoint keys in a lazy server phase. Handlers receive a standard Request and return a terminal Response.\n\nCreate `project-api.ts`\n\n**Create project-api.ts**\n\n```ts\nimport { definePlugin, definePluginPhase } from \"@tavojs/core/plugin\";\n\nexport const projectApi = definePlugin({\n  id: \"@project/api\",\n  version: \"1.0.0\",\n  apiVersion: 1,\n  manifest: {\n    endpoints: [\n      {\n        id: \"summary\",\n        methods: [\"GET\"],\n        match: { kind: \"exact\", path: \"/api/projects/summary\" },\n      },\n      {\n        id: \"collection\",\n        methods: [\"GET\", \"POST\"],\n        match: { kind: \"exact\", path: \"/api/projects\" },\n      },\n      {\n        id: \"project\",\n        methods: [\"GET\"],\n        match: { kind: \"subtree\", path: \"/api/projects\" },\n      },\n    ],\n    exposure: [\n      {\n        target: \"server\",\n        from: \"/api/projects\",\n        to: \"/api/projects\",\n        reason: \"Expose the documented project API.\",\n      },\n    ],\n  },\n  server: () =>\n    definePluginPhase({\n      endpoints: {\n        summary: async () => {\n          const { projectSummary } = await import(\"./project-store.server\");\n          return Response.json(await projectSummary());\n        },\n        collection: async ({ request }) => {\n          const store = await import(\"./project-store.server\");\n          if (request.method === \"POST\") {\n            await store.requireProjectPermission(request);\n            const input = store.parseProjectInput(await request.json());\n            return Response.json(await store.createProject(input), {\n              status: 201,\n            });\n          }\n\n          const status =\n            new URL(request.url).searchParams.get(\"status\") ?? \"all\";\n          return Response.json(await store.listProjects(status));\n        },\n        project: async ({ request }) => {\n          const { getProject } = await import(\"./project-store.server\");\n          const id = decodeURIComponent(\n            new URL(request.url).pathname.split(\"/\").at(-1)!,\n          );\n          const project = await getProject(id);\n          return project\n            ? Response.json(project)\n            : Response.json({ error: \"Project not found\" }, { status: 404 });\n        },\n      },\n    }),\n});\n```"
        },
        {
          "id": "enable-plugin",
          "title": "Enable the plugin",
          "markdown": "Defining a plugin does not expose it by itself. Add it to the top-level plugins array in `tavo.config.ts`; the manifest exposure maps its declared server path onto the application's public URL tree.\n\nMerge into `tavo.config.ts`\n\n**Merge tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { projectApi } from \"./project-api\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  plugins: [projectApi],\n});\n```"
        },
        {
          "id": "matching",
          "title": "Keep route matching explicit",
          "markdown": "Use exact matchers for individual URLs and subtree matchers for a deliberate route tree. Read query values and dynamic path pieces from `request.url`, validate them before use, and keep response formats stable for clients.\n\n-   Return 405 when an endpoint does not support the incoming method.\n    \n-   Return deliberate content-type and cache headers.\n    \n-   Keep database and secret-bearing clients in server-only modules.\n    \n-   Bound request bodies and remote work with deployment-appropriate limits."
        },
        {
          "id": "security",
          "title": "Preserve the request security boundary",
          "markdown": "Unsafe methods validate their origin by default. Disable that check only for independently authenticated endpoints such as verified webhooks, and authenticate and authorize every protected operation inside the handler.\n\n**A route is reachable without your UI**\n\nTreat every server route and page action as a public network surface. Client-side visibility and button state are not access control."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Plugins and localization\n\nUnderstand plugin services, ordering, routes, and request scope.Read guide →\n\n](/docs/core/plugins-and-localization)[\n\n## Security\n\nConfigure origins, hosts, redirects, bodies, and secrets.Read guide →\n\n](/docs/core/security)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:middleware",
      "section": "getting-started",
      "slug": "middleware",
      "title": "Middleware",
      "description": "Run fast request-aware checks before route loading and keep authentication data scoped to the active request.",
      "keywords": [
        "middleware",
        "redirect",
        "authentication",
        "request",
        "server"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Run fast request-aware checks before route loading and keep authentication data scoped to the active request."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Data loading and middleware",
          "href": "/docs/core/data-and-middleware",
          "description": "Compare loader, resource, and middleware responsibilities."
        },
        {
          "title": "Mutating data",
          "href": "/docs/getting-started/mutating-data",
          "description": "Enforce authorization again at the mutation boundary."
        }
      ],
      "canonicalPath": "/docs/getting-started/middleware",
      "sections": [
        {
          "id": "role",
          "title": "Use middleware to control route flow",
          "markdown": "Middleware runs before loaders and rendering. It can allow navigation or redirect to another same-origin path with an optional redirect status. Use it for fast routing decisions rather than slow page data.\n\n-   Use page middleware when the check belongs to one route.\n    \n-   Use layout middleware when descendants share the check.\n    \n-   Register plugin middleware for application-wide integration behavior.\n    \n-   Prefer hosting or platform redirect rules for unconditional redirects that do not need application request data."
        },
        {
          "id": "server-only",
          "title": "Keep session checks on the server",
          "markdown": "`defineServerMiddleware` prevents the check from running during browser navigation. It is the right boundary for `HttpOnly` cookies, server sessions, private clients, and permission prechecks.\n\nBecause it is skipped during SPA navigation, server-only middleware is not a client navigation gate. Pair it with safe hydrated auth state or client navigation handling, and keep the real authorization check in every protected loader, action, and server route.\n\nCreate `src/pages/account.tsx`\n\n**Create src/pages/account.tsx**\n\n```tsx\nimport { defineServerMiddleware } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\nexport const middleware = defineServerMiddleware(async ({ request }) => {\n  const { readSession } = await import(\"./session.server\");\n  const session = await readSession(request);\n  if (!session) return { redirect: \"/login\" };\n});\n\nexport default function AccountPage() {\n  return (\n    <Page>\n      <Text>Account</Text>\n    </Page>\n  );\n}\n```\n\n**Prechecks are not complete authorization**\n\nRepeat resource-specific authorization inside the loader, action, or server route that reads or changes protected data. Middleware redirects improve flow; they do not make downstream code trusted."
        },
        {
          "id": "middleware-execution",
          "title": "Know which middleware guards each entry path",
          "markdown": "Entry path\n\nPage middleware\n\nServer-only middleware\n\nFinal authorization\n\nDirect SSR request\n\nRuns\n\nRuns\n\nRepeat in loader or action\n\nHydration\n\nUses resolved route state\n\nDoes not rerun\n\nUse only safe serialized identity\n\nLater SPA navigation\n\nRuns\n\nSkipped\n\nProtected loader or endpoint decides\n\nDirect action or API request\n\nNot a security boundary\n\nDepends on registered request pipeline\n\nAction or handler must enforce it"
        },
        {
          "id": "request-scope",
          "title": "Keep request data request-scoped",
          "markdown": "Read headers, cookies, and the URL from the supplied context. Pass only safe derived values through loader results or server services designed for the active request. Do not write the current user into a global store or module variable."
        },
        {
          "id": "cancellation",
          "title": "Keep middleware fast and abortable",
          "markdown": "Middleware receives the navigation `AbortSignal`. Pass it to downstream work and stop promptly when navigation changes. Move route-critical data into a loader and avoid remote calls in middleware when a local cookie or claim is enough for the routing decision."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Data loading and middleware\n\nCompare loader, resource, and middleware responsibilities.Read guide →\n\n](/docs/core/data-and-middleware)[\n\n## Mutating data\n\nEnforce authorization again at the mutation boundary.Read guide →\n\n](/docs/getting-started/mutating-data)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:testing-and-diagnostics",
      "section": "getting-started",
      "slug": "testing-and-diagnostics",
      "title": "Testing and diagnostics",
      "description": "Check route behavior, project health, production rendering, and browser flows before a change reaches users.",
      "keywords": [
        "testing",
        "doctor",
        "check",
        "routes",
        "bundle report",
        "browser tests"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Check route behavior, project health, production rendering, and browser flows before a change reaches users."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Configure framework diagnostics, instrumentation, and test helpers."
        },
        {
          "title": "Build and preview",
          "href": "/docs/cli/build-and-preview",
          "description": "Inspect build reports, bundle budgets, and production previews."
        }
      ],
      "canonicalPath": "/docs/getting-started/testing-and-diagnostics",
      "sections": [
        {
          "id": "feedback-loop",
          "title": "Run the narrowest useful check",
          "markdown": "Use `TypeScript` and focused tests while editing, then widen the feedback loop as a change approaches release. `Tavo.js` diagnostics check the application shape and generated route contract without replacing tests for your product behavior.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tsc --noEmit\nnpx tavo doctor\nnpx tavo check\nnpx tavo routes\n```\n\n**Read the first useful failure**\n\nLater failures often follow from one invalid import, route, or configuration value. Fix the earliest actionable diagnostic, then run the checks again instead of treating the output as independent errors."
        },
        {
          "id": "route-tests",
          "title": "Test routes without a browser",
          "markdown": "`createPagesTestHarness` resolves an in-memory page map with the same route conventions used by the application. Use it for fast route, loader, middleware, and error-path tests; keep DOM interaction and hydration assertions in a real browser.\n\nCreate `tests/pages/index.test.tsx`\n\n**Create tests/pages/index.test.tsx**\n\n```tsx\nimport { createPagesTestHarness } from \"@tavojs/core/dev\";\nimport { Text } from \"@tavojs/ui\";\n\nconst app = createPagesTestHarness({\n  \"/src/pages/index.tsx\": {\n    default: () => <Text>Project dashboard</Text>,\n  },\n});\n\nexport async function homePageResolves() {\n  const result = await app.runtime.resolvePathAsync(\"/\");\n  if (\n    result.status !== 200 ||\n    result.pathname !== \"/\" ||\n    result.route?.path !== \"/\"\n  ) {\n    throw new Error(\"Home page did not resolve successfully\");\n  }\n}\n```"
        },
        {
          "id": "production-checks",
          "title": "Test the production shape",
          "markdown": "A production build discovers routes, compiles client and server output, prerenders static pages, and reports `JavaScript` cost. SSR preview exercises the generated server entry rather than the development transform pipeline.\n\n-   Exercise direct requests, client navigation, actions, 404 and error pages, and hydration in browser tests.\n    \n-   Start `npx` `tavo` preview `--ssr` in a separate terminal for manual SSR checks, or configure it as Playwright's `webServer`.\n    \n-   Inspect `.tavo/generated/build-report.json` when a route or shared first load grows unexpectedly.\n    \n-   Add `--max-first-load-js` and `--max-route-js` limits when CI should enforce bundle budgets.\n    \n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tavo build --report-json\nnpx playwright test\n```"
        },
        {
          "id": "diagnose-runtime",
          "title": "Keep runtime evidence actionable",
          "markdown": "Development diagnostics identify route, mount, patch, and hydration phases. Start with the first server-client divergence and its DOM path; suppressing the warning leaves the underlying ownership or rendering mismatch in place.\n\nProduction logs and instrumentation should record route patterns, phases, timing, and stable diagnostic codes. Exclude request bodies, cookies, tokens, and loader results unless the application has an explicit redaction policy."
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Testing and diagnostics\n\nConfigure framework diagnostics, instrumentation, and test helpers.Read guide →\n\n](/docs/core/testing-and-diagnostics)[\n\n## Build and preview\n\nInspect build reports, bundle budgets, and production previews.Read guide →\n\n](/docs/cli/build-and-preview)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:deploying",
      "section": "getting-started",
      "slug": "deploying",
      "title": "Deploying",
      "description": "Choose a runtime that matches the route contract, inspect generated output, and verify the real hosting boundary.",
      "keywords": [
        "deployment",
        "static hosting",
        "Node"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Choose a runtime that matches the route contract, inspect generated output, and verify the real hosting boundary."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Deployment",
          "href": "/docs/core/deployment",
          "description": "Review artifacts, cache boundaries, security, and runtime requirements."
        },
        {
          "title": "Deploy and monitor",
          "href": "/docs/cli/deploy-and-monitor",
          "description": "Build provider-neutral output and protect production monitoring endpoints."
        }
      ],
      "canonicalPath": "/docs/getting-started/deploying",
      "sections": [
        {
          "id": "runtime-contract",
          "title": "Choose the runtime from application behavior",
          "markdown": "Static hosting can serve client-rendered assets and prerendered routes. Request-time features need a server runtime that can execute `Tavo.js`'s generated handler.\n\n-   Use static hosting for CSR and fully prerendered output that has no request-time loader, action, session, or middleware work.\n    \n-   Use the generated Node production server for SSR, server loaders, route actions, sessions, and server routes.\n    \n-   Treat revalidation and shared cache invalidation as deployment capabilities; the process-local default is neither durable nor coordinated across replicas.\n    \n\n**Static hosting cannot run server features**\n\nA successful static upload does not make loaders or actions available. Select a server target whenever correctness depends on work performed for each request."
        },
        {
          "id": "build-output",
          "title": "Build once and inspect the artifacts",
          "markdown": "`tavo` build produces provider-neutral static and Node outputs. Do not edit generated files by hand or deploy stale artifacts.\n\nInspect `Generated output`\n\n**Reference Generated output**\n\n```text\n.tavo/build/client/              static assets and prerendered HTML\n.tavo/build/server/start.mjs       generated Node production server\n```"
        },
        {
          "id": "run-node-output",
          "title": "Run the Node output",
          "markdown": "Start the generated server directly when request-time behavior is required. Static-only applications can publish the client directory to any static host.\n\n-   Keep authentication, loaders, actions, and business rules in application modules.\n    \n-   Rebuild after every application change.\n    \n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tavo build\nPORT=4174 node .tavo/build/server/start.mjs\n```"
        },
        {
          "id": "production-boundary",
          "title": "Verify the production boundary",
          "markdown": "Configure secrets, trusted hosts, canonical origin, request limits, cookies, CSP, remote image allowlists, and cache storage in the actual platform. Then smoke-test a direct SSR request, client navigation, mutation, error response, and static or revalidated route as applicable.\n\nProtect runtime monitoring with `TAVO_MONITOR_TOKEN` and send the token through the Authorization header. Use `tavo` monitor against the deployed URL to inspect a snapshot or watch the application after release.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tavo monitor --url https://app.example.com --token $MONITOR_TOKEN --once\n```"
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Deployment\n\nReview artifacts, cache boundaries, security, and runtime requirements.Read guide →\n\n](/docs/core/deployment)[\n\n## Deploy and monitor\n\nBuild provider-neutral output and protect production monitoring endpoints.Read guide →\n\n](/docs/cli/deploy-and-monitor)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "getting-started:upgrading",
      "section": "getting-started",
      "slug": "upgrading",
      "title": "Upgrading",
      "description": "Update the framework, framework CLI, and UI as one reviewed change, then validate production behavior.",
      "keywords": [
        "upgrade",
        "dependencies",
        "release notes",
        "stability",
        "migration"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application created with the current CLI.",
        "Node.js 20.19+ or 22.12+ and the project dependencies installed."
      ],
      "outcomes": [
        "Update the framework, framework CLI, and UI as one reviewed change, then validate production behavior."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Review public entry points and the stability contract used by the application."
        },
        {
          "title": "Web UI CLI",
          "href": "/docs/ui/cli",
          "description": "Validate theme configuration and inspect the installed UI tooling."
        }
      ],
      "canonicalPath": "/docs/getting-started/upgrading",
      "sections": [
        {
          "id": "review-release",
          "title": "Review compatibility before changing versions",
          "markdown": "`Tavo.js` Framework 1.0 establishes the stable baseline. Read the Core and UI release notes for every version crossed, including configuration, generated-artifact, runtime, and experimental-API changes.\n\nCore publishes machine-readable stable and experimental labels from `@tavojs/core`. Stable entry points follow semantic versioning from 1.0 onward; experimental entry points may evolve more quickly.\n\n**Review experimental boundaries**\n\nCheck the release notes and every experimental entry point the application imports before updating the lockfile."
        },
        {
          "id": "update-packages",
          "title": "Update the application packages together",
          "markdown": "Keep `@tavojs/core`, `@tavojs/cli`, and `@tavojs/ui` on compatible releases. The generated application installs `@tavojs/cli` as a development dependency and exposes its project-local `tavo` binary. The `tavo-ui` command is supplied through `@tavojs/ui`; do not install or upgrade `@tavojs/ui-cli` separately.\n\n-   With `pnpm`, add `@tavojs/core` and `@tavojs/ui`, then add `@tavojs/cli` with `--save-dev`.\n    \n-   With Yarn, add the same three package names and keep `@tavojs/cli` in `devDependencies`.\n    \n-   With Bun, add the same three package names and keep `@tavojs/cli` in `devDependencies`.\n    \n-   Commit the manifest and lockfile together so CI and contributors install the reviewed dependency graph.\n    \n\nRun in `Terminal — npm`\n\n**Run Terminal — npm**\n\n```bash\nnpm install @tavojs/core@latest @tavojs/ui@latest\nnpm install --save-dev @tavojs/cli@latest\n```"
        },
        {
          "id": "diagnose-upgrade",
          "title": "Regenerate, then diagnose the project",
          "markdown": "Build once with the project-local CLI after installation so generated route types and manifests use the same version that will ship. Then diagnose the result. Treat doctor suggestions as reviewable changes; doctor `--fix-dry-run` reports proposed low-risk fixes without editing files.\n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tavo build\nnpx tavo doctor --fix-dry-run\nnpx tavo check\nnpx tavo routes\nnpx tavo-ui web check\n```"
        },
        {
          "id": "release-gate",
          "title": "Run the full release gate",
          "markdown": "Typecheck and test the application, then create a production report and exercise the SSR output in a browser. Give extra attention to routing, hydration, actions, caching, error boundaries, theme output, and any API called out by the release notes.\n\n-   Compare bundle reports and route manifests with the previous release when performance or static output is contractual.\n    \n-   Run `npx` `tavo` preview `--ssr` in a separate terminal and smoke-test direct production-rendered requests before release.\n    \n-   Deploy through the normal staging path and verify the generated output, secrets, caches, sessions, and monitor endpoint.\n    \n-   Keep the previous lockfile and deploy artifact available until the new release passes production smoke checks.\n    \n\nRun in `Terminal`\n\n**Run Terminal**\n\n```bash\nnpx tsc --noEmit\nnpx tavo build --report-json\nnpx tavo verify --smoke --json\nnpx playwright test\n```"
        },
        {
          "id": "checkpoint",
          "title": "Checkpoint",
          "markdown": "**Checkpoint**\n\n**Run Terminal**\n\n```bash\nnpm run typecheck\n```\n\n**Expected:** TypeScript completes without errors. The route or component reproduces the behavior described in this guide.\n\n**If it does not work:** Start with the first TypeScript error, confirm every shown file is in the documented location, and compare imports before changing runtime configuration."
        },
        {
          "id": "next-steps",
          "title": "Next steps",
          "markdown": "[\n\n## Core API reference\n\nReview public entry points and the stability contract used by the application.Read guide →\n\n](/docs/core/api)[\n\n## Web UI CLI\n\nValidate theme configuration and inspect the installed UI tooling.Read guide →\n\n](/docs/ui/cli)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "mcp:index",
      "section": "mcp",
      "slug": "",
      "title": "Use Tavo.js with AI coding agents",
      "description": "Connect MCP-compatible AI agents to versioned Tavo.js documentation, API metadata, component guidance, and optional read-only project inspection.",
      "keywords": [
        "MCP",
        "AI agents",
        "Codex",
        "documentation",
        "project inspection",
        "@tavojs/mcp"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+.",
        "An MCP-compatible AI client.",
        "A Tavo.js application with a project-local @tavojs/cli package when project inspection is enabled."
      ],
      "outcomes": [
        "Connect an AI client to @tavojs/mcp over local stdio.",
        "Choose between documentation-only and project-aware operation.",
        "Use Tavo.js knowledge and project tools within their read-only safety boundary."
      ],
      "runtime": [
        "server"
      ],
      "related": [
        {
          "title": "Framework CLI",
          "href": "/docs/cli",
          "description": "Understand the project-local inspection and verification commands used by MCP."
        },
        {
          "title": "Tavo.js Framework overview",
          "href": "/docs/core",
          "description": "Learn the application model exposed through Tavo.js docs."
        }
      ],
      "canonicalPath": "/docs/mcp",
      "sections": [
        {
          "id": "overview",
          "title": "Give agents exact Tavo.js context",
          "markdown": "Tavo.js MCP gives an AI coding agent a structured, searchable view of Tavo.js. The agent can discover Framework APIs, Tavo.js UI components, semantic tokens, and task-oriented guides instead of relying on generic framework assumptions.\n\nLocal mode can also inspect and verify a Tavo.js application through its project-local CLI. Model Context Protocol (MCP) is the connection between the AI client and Tavo.js; it does not replace the AI client or edit source code itself.\n\n**Read-only by design**\n\nEvery Tavo.js MCP capability is read-only. The AI host remains responsible for proposed code changes and user approval."
        },
        {
          "id": "connect-locally",
          "title": "Connect locally",
          "markdown": "Tavo.js MCP runs through npm without a global installation. Add the following server definition to the configuration used by your MCP client:\n\n**Reference mcp.json**\n\n```json\n{\n  \"mcpServers\": {\n    \"tavo\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"--yes\",\n        \"@tavojs/mcp\",\n        \"--project\",\n        \"/absolute/path/to/tavo-app\"\n      ]\n    }\n  }\n}\n```\n\nMCP client configuration formats differ, but the command and arguments are portable. Replace the example path with an absolute path to the target application. The application must provide a project-local `@tavojs/cli` package, which exposes the `tavo` binary.\n\nOmit `--project` and its path to keep the local server documentation-only.\n\n[View @tavojs/mcp on npm](https://www.npmjs.com/package/@tavojs/mcp)\n\n**Try the connection**\n\nAsk your agent: “Use the Tavo.js MCP server to inspect this project, find the documented pattern for a settings page, and tell me which files you would change. Do not edit anything.”"
        },
        {
          "id": "connection-modes",
          "title": "Choose a connection mode",
          "markdown": "Mode\n\nBest for\n\nProject data\n\nCapabilities\n\nLocal stdio\n\nWorking inside a Tavo.js application\n\nRemains on the developer's machine\n\nPublic knowledge plus project context, inspection, and verification\n\nSelf-hosted Streamable HTTP\n\nServing public Tavo.js knowledge to remote clients\n\nNo project data accepted\n\nPublic documentation, APIs, components, and prompts\n\nUse local stdio for coding work because it can align guidance with the installed Tavo.js version and actual project structure. The npm package also includes a stateless HTTP transport for operators who want to host public documentation access. HTTP mode never accepts a project path or exposes project tools."
        },
        {
          "id": "capabilities",
          "title": "What agents can use",
          "markdown": "### Public Tavo.js knowledge\n\nTool\n\nPurpose\n\n`search_tavo`\n\nSearch guides, APIs, components, and tokens by task.\n\n`get_tavo_document`\n\nRead one documentation record by stable ID.\n\n`find_tavo_components`\n\nFind UI components by intent, behavior, or accessibility need.\n\n`lookup_tavo_api`\n\nFind public Framework or Tavo.js UI symbols and package entry points.\n\n### Local project context\n\nTool\n\nPurpose\n\nSafety boundary\n\n`get_tavo_project_context`\n\nRead compact, task-bounded project conventions.\n\nAllowlisted agent-context CLI command\n\n`inspect_tavo_project`\n\nInspect a route, component, store, file, plugin, or API.\n\nAllowlisted inspect command and path validation\n\n`verify_tavo_project`\n\nRun diagnostics for the project or selected changed files.\n\nRestricted verification without project scripts\n\nThe server also exposes versioned resources under `tavo://` and reusable prompts for building features, choosing UI components, and diagnosing projects. Tool responses default to 2,048 tokens and accept a `maxTokens` budget from 256 to 8,192."
        },
        {
          "id": "verification-safety",
          "title": "Keep project verification read-only",
          "markdown": "A normal project typecheck script is arbitrary project code: despite its name, it can write files, access the network, or perform another side effect.\n\n**Restricted verification**\n\nTavo.js MCP delegates project verification only to `tavo verify --no-project-scripts --json`. This performs Tavo.js diagnostics without invoking package scripts and reports that project scripts were disabled.\n\nThe adapter rejects incompatible Framework CLI versions rather than silently falling back to verification that could execute project scripts. Documentation compatibility is reported alongside project tool results."
        },
        {
          "id": "documentation-sync",
          "title": "How documentation reaches the server",
          "markdown": "The server bundles a validated public documentation snapshot and never reads the Tavo.js Website repository at runtime:\n\n**Reference Reference snippet**\n\n```text\nTavo.js Website editorial source\n  → export a validated public documentation manifest\n  → bundle and index the snapshot in @tavojs/mcp\n  → expose version and content hash to the MCP client\n```\n\nDocumentation updates require a new validated snapshot and MCP release. The runtime needs neither Website source nor Website credentials."
        },
        {
          "id": "safety-and-privacy",
          "title": "Safety and privacy",
          "markdown": "-   All MCP tools are read-only; the AI host remains responsible for changes and user approval.\n    \n-   HTTP mode never accepts --project and cannot inspect a developer's application.\n    \n-   Local inspection uses validated project-relative paths and only the allowlisted agent-context, inspect, and verify CLI machine commands.\n    \n-   Internal documentation and credentials are excluded from the bundled public content manifest.\n    \n-   Custom content manifests must pass schema and size validation before indexing.\n    \n-   The server cannot generate, change, build, or install project code."
        },
        {
          "id": "troubleshooting",
          "title": "Troubleshooting",
          "markdown": "Problem\n\nWhat to check\n\nNo project tools\n\nUse local stdio and pass an absolute application path with --project.\n\nProject configuration fails\n\nConfirm the application has a compatible project-local @tavojs/cli package and can run its tavo machine commands.\n\nGuidance looks stale\n\nRead tavo://status and compare the content hash and package compatibility report.\n\nA response is truncated\n\nFollow its continuation resource or request a larger maxTokens value."
        },
        {
          "id": "resources",
          "title": "Resources",
          "markdown": "-   [@tavojs/mcp on npm](https://www.npmjs.com/package/@tavojs/mcp)\n-   [Tavo.js MCP source](https://github.com/tavojs/tavo-mcp)\n-   [Model Context Protocol specification](https://modelcontextprotocol.io/specification/latest)\n-   [Tavo.js Framework documentation](/docs/core)\n-   [Tavo.js UI documentation](/docs/ui)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:index",
      "section": "core",
      "slug": "",
      "title": "Tavo.js Framework documentation",
      "description": "The complete source of truth for building, rendering, extending, securing, testing, and operating a Tavo.js application.",
      "keywords": [
        "framework",
        "runtime",
        "core",
        "architecture"
      ],
      "kind": "concept",
      "prerequisites": [
        "Familiarity with TypeScript, TSX, and browser application development."
      ],
      "outcomes": [
        "Explain how Tavo.js, its TSX runtime, Vite, file routes, loaders, rendering, and hydration fit together.",
        "Choose the correct Framework guide or exact API reference for a concrete development task."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Build your first Tavo.js app",
          "href": "/docs/getting-started/first-app",
          "description": "Apply the mental model in a cumulative project."
        },
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up Tavo.js-specific terms and rendering acronyms."
        }
      ],
      "canonicalPath": "/docs/core",
      "sections": [
        {
          "id": "choose-documentation-flow",
          "title": "Choose the documentation flow",
          "markdown": "[\n\n## Learn by building\n\nBuild your first Tavo.js application as one cumulative project. Use this when you are new to the Framework.Read guide →\n\n](/docs/getting-started/first-app)[\n\n## Understand a subsystem\n\nUse the Framework guides for mental models, complete workflows, defaults, lifecycle, cleanup, security, and production behavior.Read guide →\n\n](/docs/core/pages-and-layouts)[\n\n## Look up an exact API\n\nUse the generated reference for canonical imports, TypeScript signatures, runtime boundaries, stability, and owning guides.Read guide →\n\n](/docs/core/api)"
        },
        {
          "id": "mental-model",
          "title": "How a Tavo.js application fits together",
          "markdown": "Tavo.js is a TypeScript and TSX framework with its own component runtime; it is not a React wrapper. Vite supplies the development server and bundling pipeline, while Tavo.js adds file routes, request data, server rendering, hydration, state, and production output.\n\nFiles in src/pages define the route tree. Middleware decides whether resolution continues, loaders prepare route data, and layouts compose the visible shell. Plain TSX components render interface; createTavo adds component-local state and controller behavior; stores share client state between consumers."
        },
        {
          "id": "request-lifecycle",
          "title": "Follow one URL through Tavo.js",
          "markdown": "**Reference Reference snippet**\n\n```text\nURL\n  → match a file route\n  → run global, layout, and page middleware\n  → load layout data from root to leaf, then page data\n  → resolve route metadata\n  → render or reuse SSR/static output, optionally stream deferred sections\n  → send HTML and serialized route state\n  → hydrate the same tree in the browser\n  → handle later client navigation or server actions\n```\n\nThe exact work depends on the route mode. A CSR route sends a server shell and resolves in the browser. An SSR route renders for the request. Static and revalidated routes reuse SSR output according to their cache policy.\n\n**Keep request state inside the request**\n\nLoader results, sessions, users, and deferred work belong to one route resolution. Module variables, global stores, and runtime plugin capabilities may be shared by concurrent SSR requests."
        },
        {
          "id": "choose",
          "title": "Browse the Framework by system",
          "markdown": "[\n\n## Fundamentals\n\nApplication configuration, environment boundaries, TSX components, DOM behavior, and the public package map.Read guide →\n\n](/docs/core/configuration)[\n\n## Routing and data\n\nFile routes, layouts, navigation, loaders, middleware, actions, forms, cancellation, pending UI, and route failures.Read guide →\n\n](/docs/core/pages-and-layouts)[\n\n## Application model\n\ncreateTavo, controllers, Stores, services, resources, async ownership, and shared application state.Read guide →\n\n](/docs/core/mvc)[\n\n## Rendering\n\nSSR, CSR, hydration, streaming, cache policy, metadata, styling, images, fonts, scripts, and localization.Read guide →\n\n](/docs/core/ssr-and-hydration)[\n\n## Server and security\n\nNode request handling, sessions, origins, trusted hosts, CSP, hydration exposure, remote assets, and failure containment.Read guide →\n\n](/docs/core/security)[\n\n## Extensions\n\nPlugin API v1, manifests, permissions, capabilities, installation instances, lifecycle phases, collisions, and inspection.Read guide →\n\n](/docs/core/plugins)[\n\n## Quality and tooling\n\nTesting, validation, diagnostics, scheduling, instrumentation, devtools, and development inspection.Read guide →\n\n](/docs/core/testing-and-diagnostics)[\n\n## Production\n\nBuild artifacts, static and Node delivery, monitoring, verification, and production troubleshooting.Read guide →\n\n](/docs/core/deployment)[\n\n## Reference\n\nRoute-module, configuration, runtime, diagnostic, stability, and canonical package API contracts.Read guide →\n\n](/docs/core/api)"
        },
        {
          "id": "source-of-truth-contract",
          "title": "How to read this reference",
          "markdown": "Each focused guide explains ownership and lifecycle, provides a complete example, states defaults and failure behavior, and ends with a way to verify the result. Reference pages describe the exact public contract; the generated API inventory mirrors the declarations in the connected Framework checkout.\n\n**Public imports are the compatibility boundary**\n\nImport only from @tavojs/core, /router, /server, /config, /plugin, or the experimental /dev entry point. The /server-only and JSX runtime paths exist for their technical boundaries. Source implementation paths are not public APIs."
        },
        {
          "id": "first-production-loop",
          "title": "Use the production loop early",
          "markdown": "Development mode optimizes iteration. A production build verifies route discovery, generated types, SSR output, static generation, and bundle boundaries.\n\n**Run Terminal**\n\n```bash\nnpx tavo check\nnpx tavo build --report-json\nnpx tavo preview --ssr\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:configuration",
      "section": "core",
      "slug": "configuration",
      "title": "Application configuration",
      "description": "Understand what belongs in tavo.config.ts, what belongs in vite.config.ts, and how to extend either file without discarding existing behavior.",
      "keywords": [
        "configuration",
        "tavo.config",
        "vite.config",
        "plugins"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project created by the current CLI.",
        "Node.js 20.19+ or 22.12+ with project dependencies installed."
      ],
      "outcomes": [
        "Place Framework and Vite settings in the correct file.",
        "Merge plugins and build settings without deleting generated configuration.",
        "Verify configuration with the local CLI and a production build."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Environment variables",
          "href": "/docs/core/environment-variables",
          "description": "Separate server secrets from browser-safe configuration."
        },
        {
          "title": "Runtime configuration reference",
          "href": "/docs/core/runtime-configuration",
          "description": "Inspect detailed SSR and handler defaults."
        },
        {
          "title": "Plugins",
          "href": "/docs/core/plugins",
          "description": "Install and configure Plugin API v1 integrations."
        }
      ],
      "canonicalPath": "/docs/core/configuration",
      "sections": [
        {
          "id": "starting-state",
          "title": "Start from the generated configuration",
          "markdown": "Use `Node.js 20.19+ or 22.12+` and run commands from the project root. A generated project already contains both configuration files. Edit those files in place instead of replacing them with an example from another project.\n\nFile\n\nRead by\n\nResponsibility\n\n`tavo.config.ts`\n\nTavo.js\n\nRoutes, CSS entries, plugins, diagnostics, build policy, and SSR behavior.\n\n`vite.config.ts`\n\nVite through Tavo.js\n\nVite server, resolve, dependency, and bundler settings while preserving Tavo.js's TSX and build plugins.\n\n`tsconfig.json`\n\nTypeScript\n\nTypechecking and Tavo.js's automatic TSX runtime configuration."
        },
        {
          "id": "tavo-config",
          "title": "Configure framework behavior in tavo.config.ts",
          "markdown": "`defineConfig` preserves literal types and catches unsupported top-level fields. Paths are relative to the project root. Keep every existing plugin and CSS entry when adding another integration. `Tavo.js` has one framework configuration file at the project root; imported and computed values are evaluated consistently by development, build, inspection, and production.\n\n**Merge tavo.config.ts — merge with the existing file**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { tavoUi } from \"@tavojs/ui/plugin\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false\n  },\n  build: {\n    prerenderStyles: \"inline\",\n    budgets: {\n      firstLoadJs: \"150kb\",\n      routeJs: \"40kb\"\n    }\n  },\n  ssr: {\n    trustedHosts: [\"example.com\"],\n    canonicalOrigin: \"https://example.com\"\n  },\n  plugins: [tavoUi()]\n});\n```\n\n**Route modules have a separate contract**\n\nRendering mode, loaders, metadata, static output, and revalidation belong to page and layout modules. Do not move route-specific exports into tavo.config.ts.\n\n**Keep configuration in one file**\n\nExport defineConfig as the default from root tavo.config.ts. Plugins stay at the top level and server options stay inside the nested ssr object. Configuration load errors are reported instead of silently ignored."
        },
        {
          "id": "top-level-reference",
          "title": "Top-level TavoConfig reference",
          "markdown": "These are all accepted top-level `TavoConfig` properties in `tavo.config.ts`. `defineConfig` rejects any other top-level key at typecheck time. Every property is optional, but the file and its default `defineConfig` export are required.\n\n**Reference tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles/app.scss\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false\n  },\n  ssr: {\n    canonicalOrigin: \"https://example.com\"\n  }\n});\n```\n\nProperty\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`pagesDir`\n\n`string`\n\nsrc/pages\n\nSets the project-root-relative directory scanned for pages, layouts, route groups, and special route modules.\n\n`cssEntries`\n\n`string[]`\n\nExisting files among src/styles.css, src/styles.scss, src/app.css, and src/app.scss\n\nSets project-root-relative global CSS or Sass entries loaded by development, client build, and SSR.\n\n`plugins`\n\n[`PluginUse`](/docs/core/api/plugin#api-tavojs-core-plugin--pluginuse)`[``]` `|` `{` `use``:` [`PluginUse`](/docs/core/api/plugin#api-tavojs-core-plugin--pluginuse)`[``]``;` `overrides``?``:` [`PluginOverride`](/docs/core/api/plugin#api-tavojs-core-plugin--pluginoverride)`[``]` `}`\n\nNo app plugins\n\nInstalls Plugin API v1 integrations. Use the array form for normal installs and the object form only when public overrides are needed.\n\n`diagnostics`\n\n`{ devOverlay?: boolean; traces?: boolean }`\n\nOmitted; generated apps set { devOverlay: true, traces: false }\n\nSets development error-overlay and framework trace preferences.\n\n`build`\n\n`{ prerenderStyles?: \"inline\" | \"external\"; budgets?: { … } }`\n\n{ prerenderStyles: \"inline\", budgets: {} }\n\nControls prerendered CSS delivery and JavaScript budget enforcement.\n\n`ssr`\n\n`Tavo.js SSR options`\n\nRuntime defaults shown below\n\nConfigures page-runtime behavior, Node requests, response caching, the HTML document, and image optimization.\n\n**Paths are project-root relative**\n\npagesDir, cssEntries, ssr.images.publicDir, and the root used by normal build commands resolve from the application root. A configured CSS entry that does not exist is skipped by the production build; npx tavo check reports missing entries before release."
        },
        {
          "id": "diagnostics-build-reference",
          "title": "Diagnostics and build properties",
          "markdown": "Property\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`diagnostics.devOverlay`\n\n`boolean`\n\nGenerated apps: true\n\nEnables or disables the development error-overlay preference.\n\n`diagnostics.traces`\n\n`boolean`\n\nGenerated apps: false\n\nEnables or disables detailed framework diagnostic traces.\n\n`build.prerenderStyles`\n\n`\"inline\" | \"external\"`\n\ninline\n\nInlines collected route styles into prerendered HTML or writes references to external build assets.\n\n`build.budgets.firstLoadJs`\n\n`number | byte-size string`\n\nNo limit\n\nFails the production build when JavaScript needed for a route's first load exceeds this number of bytes.\n\n`build.budgets.routeJs`\n\n`number | byte-size string`\n\nNo limit\n\nFails the production build when JavaScript attributed to one route exceeds this number of bytes.\n\nBudget strings accept bytes or the case-insensitive units b, kb, kib, mb, and mib; decimal strings such as 1.5mb are valid. Numeric values are bytes. CLI flags override the file for one build.\n\n**Run Terminal**\n\n```bash\nnpx tavo build --max-first-load-js 150kb --max-route-js 40kb\nnpx tavo build --prerender-styles external\n```"
        },
        {
          "id": "ssr-reference",
          "title": "SSR and page-runtime properties",
          "markdown": "The ssr object accepts the following properties. The CLI supplies discovered route modules and compiles top-level plugins, so most applications configure only origin security, rendering, caches, or images here.\n\nProperty\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`ssr.canonicalOrigin`\n\n`absolute HTTP(S) origin string`\n\nOrigin derived from the request Host over HTTP\n\nSets the public origin behind TLS termination. Credentials, paths, queries, and fragments are rejected; its host is also trusted for actions.\n\n`ssr.trustedHosts`\n\n`string[]`\n\nLocalhost variants, plus canonicalOrigin when configured\n\nAllows Host values used to validate Node action and plugin mutation requests. Entries may include a hostname or host with port.\n\n`ssr.allowExternalRedirects`\n\n`boolean`\n\nfalse\n\nAllows route and middleware redirects to absolute HTTP(S) URLs. Relative same-origin paths remain allowed without it.\n\n`ssr.stream`\n\n`boolean`\n\nfalse\n\nStreams the SSR response instead of buffering the completed document.\n\n`ssr.maxRequestBodyBytes`\n\n`number`\n\n10 MiB\n\nLimits buffered non-GET request bodies in the Node handler. Requests above the limit receive 413.\n\n`ssr.maxResolvedCacheEntries`\n\n`finite non-negative number`\n\n1,024\n\nLimits the process-local route-resolution data cache. Values are floored; 0 disables reuse.\n\n`ssr.staticCache`\n\n[`SsrStaticCache`](#ssr-static-cache)\n\nProcess-local memory cache with 1,024 entries\n\nStores rendered responses for static and revalidated routes. Supply an adapter for shared or durable caching.\n\n`ssr.document`\n\n[`RenderDocumentOptions`](#render-document-options)\n\nDocument defaults shown below\n\nSets the shared HTML shell, attributes, serialized initial state, CSP nonce, and style registry.\n\n`ssr.images`\n\n[`ImageOptimizerOptions`](#image-optimizer-options)\n\nOptimizer defaults shown below\n\nConfigures /\\_tavo/image, local and remote sources, transform limits, formats, and memory caching.\n\n`ssr.getPageProps`\n\n`() => Record<string, unknown>`\n\nNo extra props\n\nAdds application-owned props to page components on each runtime render.\n\n`ssr.notFound`\n\n[`Component`](/docs/core/api/components-and-dom#api-tavojs-core--component)`<``{` `pathname``:` `string` `}``>`\n\nDiscovered src/pages/404 module\n\nOverrides the application-wide not-found component supplied by file routing.\n\n`ssr.csrFallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child) `|` `(``{` `pathname``,` `params` `}``)` `=>` [`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child)\n\nnull\n\nRenders fallback content when a CSR route is resolved by the browser before its route module is ready.\n\n`ssr.csrActions`\n\n[`CsrActionsOptions`](#csr-actions-options)\n\nDisabled\n\nMaps browser form submissions for static CSR delivery to an action backend. Nested properties are listed below.\n\n`ssr.middleware`\n\n[`PageMiddleware`](/docs/core/api/router#api-tavojs-core-router--pagemiddleware)`[``]`\n\n\\[\\]\n\nRuns application-wide middleware around every route in addition to discovered layout and page middleware.\n\n`ssr.i18n`\n\n[`I18nService`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--i18nservice)\n\nRegistered default i18n service, otherwise none\n\nSupplies locale detection, localized path resolution, and locale state to the pages runtime.\n\n`ssr.instrumentation`\n\n[`{ emit(event: TavoInstrumentationEvent): void }`](/docs/core/scheduling-and-instrumentation#event-contract)\n\nNone\n\nReceives route resolve, middleware, loader, action, and cache lifecycle events. Listener failures do not interrupt framework work.\n\n`ssr.modules`\n\n`PageModules`\n\nGenerated route-module map\n\nOverrides file-discovered modules. This is an advanced manual-runtime hook; normal applications leave it unset.\n\n**Plugins do not belong under ssr**\n\nssr.plugins is intentionally not part of TavoConfig. Install plugins with the top-level plugins array or the public { use, overrides } form. Plugin graph compilation and runtime construction are framework host responsibilities."
        },
        {
          "id": "csr-actions-options",
          "title": "CSR action properties",
          "markdown": "Configure ssr.csrActions when a statically hosted CSR application should submit Tavo.js forms to a separate action server. resolveUrl takes precedence over baseUrl.\n\nProperty\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`ssr.csrActions.enabled`\n\n`boolean`\n\nfalse\n\nIntercepts eligible non-GET forms and enables action URL mapping.\n\n`ssr.csrActions.baseUrl`\n\n`string`\n\nCurrent origin and route path\n\nResolves the route pathname and query against a separate action-server base URL.\n\n`ssr.csrActions.resolveUrl`\n\n`({ pathname, search, form? }) => string`\n\nUses baseUrl, then the route path\n\nComputes the complete action request URL for each route or form.\n\n`ssr.csrActions.credentials`\n\n`RequestCredentials`\n\ninclude\n\nSets the Fetch credentials mode used for intercepted form submissions.\n\n`ssr.csrActions.headers`\n\n`HeadersInit | ({ pathname, form }) => HeadersInit`\n\nNo additional headers\n\nAdds fixed or per-form request headers to the action fetch.\n\n**Reference tavo.config.ts — send static-site forms to an action service**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nexport default defineConfig({\n  ssr: {\n    csrActions: {\n      enabled: true,\n      baseUrl: \"https://actions.example.com\",\n      credentials: \"include\",\n      headers: ({ pathname }) => ({\n        \"X-Tavo.js-Route\": pathname\n      })\n    }\n  }\n});\n```"
        },
        {
          "id": "render-document-options",
          "title": "HTML document properties",
          "markdown": "ssr.document sets defaults for the server-rendered document shell. Route head exports and Tavo.js SEO components can refine metadata per route.\n\nProperty\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`ssr.document.lang`\n\n`string`\n\nen\n\nSets the escaped html lang attribute.\n\n`ssr.document.title`\n\n`string`\n\nNo title\n\nSets the escaped fallback document title. Route SEO metadata takes precedence.\n\n`ssr.document.unsafeHeadHtml`\n\n`string`\n\nEmpty\n\nAppends trusted raw HTML to head. It is not escaped; prefer TSX metadata for all structured head content.\n\n`ssr.document.htmlAttributes`\n\n`Record<string, string | number | boolean>`\n\n{}\n\nAdds escaped safe-name attributes to html. false omits an attribute and true renders a boolean attribute.\n\n`ssr.document.bodyAttributes`\n\n`Record<string, string | number | boolean>`\n\n{}\n\nAdds escaped attributes to body.\n\n`ssr.document.appAttributes`\n\n`Record<string, string | number | boolean>`\n\n{}\n\nAdds escaped attributes to the application container.\n\n`ssr.document.doctype`\n\n`string`\n\n<!doctype html>\n\nSets the exact doctype prefix written before the html element.\n\n`ssr.document.appContainerId`\n\n`string`\n\napp\n\nSets the escaped id of the application container used by hydration.\n\n`ssr.document.initialState`\n\n`unknown`\n\nOmitted\n\nSerializes JSON into a protected application/json script after the app container.\n\n`ssr.document.stateScriptId`\n\n`string`\n\n\\_\\_TAVO\\_STATE\\_\\_\n\nSets the escaped id of the serialized initial-state script.\n\n`ssr.document.nonce`\n\n`string`\n\nNone\n\nAdds a CSP nonce to generated state and style elements.\n\n`ssr.document.beforeRender`\n\n`() => void`\n\nNone\n\nRuns immediately before server rendering. Use only for request-safe setup.\n\n`ssr.document.styleRegistry`\n\n[`StyleRegistry`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--styleregistry)\n\nA new registry for each render\n\nSupplies a custom style collector with add, has, and entries methods.\n\n**Raw HTML is always explicit**\n\nThere is no head string alias. Use escaped TSX metadata first, and use unsafeHeadHtml only when an integration truly requires trusted raw markup."
        },
        {
          "id": "image-optimizer-options",
          "title": "Image optimizer properties",
          "markdown": "Property\n\nAccepted value\n\nDefault\n\nWhat it changes\n\n`ssr.images.enabled`\n\n`boolean`\n\ntrue\n\nEnables the /\\_tavo/image optimization endpoint.\n\n`ssr.images.allowRemote`\n\n`boolean`\n\nfalse\n\nAllows remote HTTP(S) image sources, still subject to remotePatterns and network safety checks.\n\n`ssr.images.remotePatterns`\n\n`Array<string | { protocol?, hostname, port?, pathname? }>`\n\n\\[\\]\n\nAllowlists remote origins or host/path patterns. A hostname beginning with \\*. matches subdomains only.\n\n`ssr.images.publicDir`\n\n`string`\n\npublic\n\nSets the project-root-relative source directory for local images.\n\n`ssr.images.quality`\n\n`number`\n\n75\n\nSets fallback output quality; request values are clamped from 1 through 100.\n\n`ssr.images.cacheMaxAge`\n\n`number`\n\n31,536,000 seconds\n\nSets the Cache-Control max-age of transformed image responses.\n\n`ssr.images.defaultFormat`\n\n`\"webp\" | \"avif\" | \"jpeg\" | \"png\" | \"original\"`\n\nwebp\n\nSets the output format when the optimization URL does not request one.\n\n`ssr.images.sizes`\n\n`number[]`\n\n\\[320, 640, 960, 1280, 1600\\]\n\nSets the candidate widths and supplies the fallback width for an optimization request.\n\n`ssr.images.timeoutMs`\n\n`number`\n\n5,000\n\nLimits remote fetch duration.\n\n`ssr.images.maxBytes`\n\n`number`\n\n10 MiB\n\nRejects local or remote source images larger than this byte limit.\n\n`ssr.images.memoryCacheMaxEntries`\n\n`number`\n\n128\n\nLimits transformed images stored in process memory. Values are floored; 0 disables storage.\n\n`ssr.images.maxConcurrentTransforms`\n\n`number`\n\n4\n\nLimits simultaneous Sharp transforms; values are floored with a minimum of 1.\n\n`ssr.images.maxPendingTransforms`\n\n`number`\n\n64\n\nLimits queued transforms before the optimizer returns a busy error.\n\n`ssr.images.allowInsecureRemote`\n\n`boolean`\n\nfalse\n\nAllows HTTP remote image URLs. Keep disabled unless the transport risk is explicitly accepted.\n\n`ssr.images.resolveHostname`\n\n`(hostname: string) => Promise<Array<{ address: string }>>`\n\nNode DNS lookup\n\nOverrides DNS resolution used by private-network protection. Intended for adapters and controlled tests.\n\n**Reference tavo.config.ts — allow a narrow remote image source**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nexport default defineConfig({\n  ssr: {\n    images: {\n      allowRemote: true,\n      remotePatterns: [\n        {\n          protocol: \"https:\",\n          hostname: \"images.example.com\",\n          pathname: \"/products\"\n        }\n      ],\n      defaultFormat: \"avif\",\n      quality: 80\n    }\n  }\n});\n```\n\nServer image transforms require the optional sharp dependency in the application that runs SSR. Remote requests are checked against the allowlist, redirects, DNS results, private-network addresses, timeout, and byte limit."
        },
        {
          "id": "ssr-static-cache",
          "title": "SsrStaticCache adapter",
          "markdown": "Use the public SsrStaticCache interface from @tavojs/core/server when rendered static and revalidated responses must be shared across processes or persisted outside Node memory. Methods may return values directly or through promises.\n\n**Reference src/server/static-cache.ts — minimal adapter**\n\n```ts\nimport type {\n  SsrStaticCache,\n  SsrStaticCacheEntry\n} from \"@tavojs/core/server\";\n\nconst entries = new Map<string, SsrStaticCacheEntry>();\n\nexport const staticCache: SsrStaticCache = {\n  get(key) {\n    return entries.get(key) ?? null;\n  },\n\n  set(key, entry) {\n    entries.set(key, entry);\n  },\n\n  delete(key) {\n    entries.delete(key);\n  },\n\n  invalidateTags(tags) {\n    const requested = new Set(tags);\n    let deleted = 0;\n\n    for (const [key, entry] of entries) {\n      if (entry.tags.some((tag) => requested.has(tag))) {\n        entries.delete(key);\n        deleted += 1;\n      }\n    }\n\n    return deleted;\n  },\n\n  clear() {\n    entries.clear();\n  }\n};\n```\n\n`SsrStaticCacheEntry` contains the rendered response, an absolute `expiresAt` timestamp or null, and its cache tags. The built-in `createMemoryStaticCache` is available from `@tavojs/core/server`. The Map above illustrates the contract; use a shared cache implementation for multi-process production deployments.\n\n**Tag invalidation is optional but operationally important**\n\nWithout invalidateTags, cache-tag invalidation returns zero and cannot remove matching entries. Maintain a tag index in production adapters when invalidation volume makes a full scan inappropriate."
        },
        {
          "id": "loading-behavior",
          "title": "Configuration loading behavior",
          "markdown": "**Reference scripts/read-config.ts**\n\n```ts\nimport { loadTavoConfig } from \"@tavojs/core/dev\";\n\nconst config = await loadTavoConfig(process.cwd(), {\n  mode: \"development\"\n});\n\nconsole.log(config.pagesDir);\n```\n\nConcern\n\nContract\n\nLocation\n\nExactly one tavo.config.ts at the project root.\n\nExport\n\nA default export returned by defineConfig({ … }). A plain object is rejected.\n\nEvaluation\n\nImported and computed values are supported. The file is evaluated once per project root and process.\n\nEnvironment\n\n.env files are loaded before evaluation. The explicit mode wins, then NODE\\_ENV, then production.\n\nMode safety\n\nOne project root cannot be reevaluated in a different mode in the same process.\n\nFailure\n\nA failed load is not cached, so the next command or retry can load a corrected file."
        },
        {
          "id": "vite-config",
          "title": "Keep Tavo.js's Vite wrapper",
          "markdown": "defineTavoViteConfig installs Tavo.js's TSX transform, file-route build guards, SVG support, localization splitting, and plugin build contributions. Pass your Vite settings into the wrapper rather than replacing it with Vite's defineConfig.\n\n**Replace vite.config.ts — replace only the empty wrapper call**\n\n```ts\nimport { defineTavoViteConfig } from \"@tavojs/core/config\";\n\nexport default defineTavoViteConfig(({ mode }) => ({\n  server: {\n    port: mode === \"development\" ? 4174 : undefined\n  },\n  build: {\n    sourcemap: mode !== \"production\"\n  }\n}));\n```"
        },
        {
          "id": "verify-configuration",
          "title": "Verify the result",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo info\nnpx tavo check\nnpm run build\n```\n\ninfo shows the resolved pages and CSS configuration, check reports route and project-shape problems, and the production build exercises both client and server configuration. If a plugin was added, run `npx tavo inspect plugins` as well."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:environment-variables",
      "section": "core",
      "slug": "environment-variables",
      "title": "Environment variables",
      "description": "Load server configuration safely, expose only deliberate public values to browser code, and understand mode-specific .env files.",
      "keywords": [
        "environment",
        ".env",
        "VITE_",
        "secrets",
        "server-only"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with server rendering or build-time configuration."
      ],
      "outcomes": [
        "Choose a server, browser, or build boundary for each environment value.",
        "Understand Tavo.js's .env file precedence.",
        "Keep secrets behind an enforced server-only module boundary."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Configure Framework and Vite behavior."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Harden secrets, sessions, and request boundaries."
        }
      ],
      "canonicalPath": "/docs/core/environment-variables",
      "sections": [
        {
          "id": "server-and-browser",
          "title": "Choose the boundary before naming the variable",
          "markdown": "Boundary\n\nExample\n\nRead it from\n\nServer only\n\n`process.env.DATABASE_URL`\n\nsrc/server, a server loader, action, middleware, or server plugin phase\n\nBrowser safe\n\n`import.meta.env.VITE_PUBLIC_API_ORIGIN`\n\nA normal source module used by browser code\n\nBuild/configuration\n\n`process.env.TAVO_SITE_URL`\n\ntavo.config.ts or server-side build tooling\n\n**VITE\\_ means public**\n\nVite replaces VITE\\_-prefixed values in browser bundles. Never use that prefix for passwords, signing keys, database URLs, private tokens, or any value that must remain secret."
        },
        {
          "id": "env-files",
          "title": "Use mode-specific files deliberately",
          "markdown": "Tavo.js's server runtime reads these files from the project root. Later files override earlier files, while an environment variable already supplied by the shell or hosting platform wins over every file.\n\n**Reference Environment load order**\n\n```text\n.env\n.env.local\n.env.development\n.env.development.local\n\n# A production run uses .env.production and .env.production.local instead.\n```\n\nCommit non-secret defaults in .env when appropriate. Keep .env.local and mode-local files out of source control. Commit an .env.example containing names and safe placeholders so new developers know what the application requires."
        },
        {
          "id": "server-example",
          "title": "Read secrets behind a server-only boundary",
          "markdown": "**Create src/server/projects.ts — create this server-only module**\n\n```ts\nimport \"@tavojs/core/server-only\";\n\nconst databaseUrl = process.env.DATABASE_URL;\n\nif (!databaseUrl) {\n  throw new Error(\"DATABASE_URL is required\");\n}\n\nexport function getProjectsDatabaseUrl(): string {\n  return databaseUrl;\n}\n```\n\nFiles under src/server and modules importing the server-only marker are framework-enforced client-build boundaries. Import them from a server loader, action, middleware, or server plugin phase. Do not statically import them into a component or universal loader."
        },
        {
          "id": "public-example",
          "title": "Expose only browser-safe configuration",
          "markdown": "**Run .env.example — add the required public name**\n\n```bash\nVITE_PUBLIC_API_ORIGIN=https://api.example.com\n```\n\n**Create src/config/public.ts — create this shared module**\n\n```ts\nexport const publicConfig = {\n  apiOrigin: import.meta.env.VITE_PUBLIC_API_ORIGIN\n};\n```\n\nRestart the development server after changing an environment file. Verify a server value through the route or handler that consumes it; verify a public value in the browser without printing unrelated environment data."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:components-and-jsx",
      "section": "core",
      "slug": "components-and-jsx",
      "title": "Components and JSX",
      "description": "Build functional Tavo.js components, understand the JSX contract, and choose when local behavior belongs in createTavo.",
      "keywords": [
        "component",
        "JSX",
        "TSX",
        "Fragment",
        "children",
        "events",
        "controlled input"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application configured for the automatic JSX runtime.",
        "Familiarity with TypeScript functions and HTML attributes."
      ],
      "outcomes": [
        "Write plain functional components with typed props and children.",
        "Use intrinsic attributes, events, class names, and controlled values correctly.",
        "Choose a function component, createTavo model, controller, or shared Store deliberately."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "MVC components",
          "href": "/docs/core/mvc",
          "description": "Add component-local state, controller behavior, and managed lifecycle work."
        },
        {
          "title": "DOM and accessibility",
          "href": "/docs/core/dom-and-accessibility",
          "description": "Use refs, directives, focus management, transitions, and observers."
        },
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Keep the first browser render aligned with server output."
        }
      ],
      "canonicalPath": "/docs/core/components-and-jsx",
      "sections": [
        {
          "id": "functional-components",
          "title": "Start with a function component",
          "markdown": "A Tavo.js component is a function that receives props and returns a renderable [`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child \"View Child in the Core API reference\"). Use a plain function when output depends only on props, children, or application services that are already reactive.\n\nThe automatic JSX runtime compiles TSX for you. Import runtime values such as [`Fragment`](/docs/core/api/components-and-dom#api-tavojs-core--fragment \"View Fragment in the Core API reference\") only when you reference them explicitly.\n\n-   Strings, numbers, elements, nested child arrays, null, undefined, and booleans are valid children. Nullish and boolean children do not produce HTML.\n    \n-   [`Fragment`](/docs/core/api/components-and-dom#api-tavojs-core--fragment \"View Fragment in the Core API reference\") groups siblings without adding a DOM element.\n    \n-   Explicit children passed between component tags are available through `props.children`.\n    \n-   A `className` may be one string or an array of strings; arrays are joined with spaces.\n    \n-   A style value may be a CSS string or an object. Object keys written in camel case become kebab-case CSS properties during SSR.\n    \n\n**Reference src/components/StatusBadge.tsx**\n\n```tsx\nimport type { PropsWithChildren } from \"@tavojs/core\";\n\ntype StatusBadgeProps = PropsWithChildren<{\n  tone: \"neutral\" | \"success\" | \"danger\";\n}>;\n\nexport function StatusBadge({\n  tone,\n  children,\n}: StatusBadgeProps) {\n  return (\n    <span className={[\"statusBadge\", `statusBadge--${tone}`]}>\n      {children}\n    </span>\n  );\n}\n```"
        },
        {
          "id": "choose-state-owner",
          "title": "Choose the smallest state owner",
          "markdown": "Rendering and state ownership are separate decisions. Keep a component functional until it needs local reactive state, behavior, lifecycle, or cleanup.\n\n-   Use a plain function component for render-only output.\n    \n-   Use [`createTavo`](/docs/core/api/application#api-tavojs-core--createtavo \"View createTavo in the Core API reference\") with a model for state owned by one mounted component.\n    \n-   Add a [`TavoController`](/docs/core/api/application#api-tavojs-core--tavocontroller \"View TavoController in the Core API reference\") for behavior, routing, services, refs, async actions, or managed side effects.\n    \n-   Use a global [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") for browser state intentionally shared by multiple routes or component owners.\n    \n-   Use a route loader for request-specific and route-critical data; do not place request identity in global state.\n    \n\n**Reference src/components/NameField.tsx**\n\n```tsx\nimport { createTavo, TavoController } from \"@tavojs/core\";\n\ntype NameFieldState = {\n  name: string;\n};\n\nclass NameFieldController extends TavoController {\n  updateName(event: Event) {\n    const input = event.currentTarget as HTMLInputElement;\n    this.model.patch({ name: input.value });\n  }\n}\n\nexport const NameField = createTavo<\n  Record<string, never>,\n  NameFieldState,\n  NameFieldController\n>({\n  model() {\n    return { name: \"\" };\n  },\n  controller: NameFieldController,\n  view({ state, controller }) {\n    return (\n      <label>\n        Project name\n        <input\n          name=\"name\"\n          value={state.name}\n          onChange={(event: Event) => {\n            controller?.updateName(event);\n          }}\n        />\n      </label>\n    );\n  },\n});\n```"
        },
        {
          "id": "intrinsic-runtime",
          "title": "Understand intrinsic element behavior",
          "markdown": "-   Text and attribute values are escaped. Unsafe attribute names and javascript-style URL protocols are rejected.\n    \n-   Event props begin with on and are attached by the browser runtime; they are not serialized into server HTML.\n    \n-   ref, use, transition, and key are runtime instructions rather than HTML attributes.\n    \n-   Boolean true emits a boolean attribute; false, null, and undefined omit the attribute.\n    \n-   HTML void elements such as input, img, and br render without closing tags.\n    \n-   Unknown safe intrinsic attributes pass through, which keeps data-\\* and aria-\\* attributes available.\n    \n\n**Reference src/components/ProfileLink.tsx**\n\n```tsx\nexport function ProfileLink({\n  active,\n  userId,\n}: {\n  active: boolean;\n  userId: string;\n}) {\n  return (\n    <a\n      href={`/users/${encodeURIComponent(userId)}`}\n      className={[\"profileLink\", active ? \"profileLink--active\" : \"\"]}\n      aria-current={active ? \"page\" : undefined}\n      data-user-id={userId}\n    >\n      View profile\n    </a>\n  );\n}\n```\n\n**Render purity keeps hydration predictable**\n\nA component may render on the server and again in the browser. Do not read window, document, time, randomness, or browser storage while producing initial output. Move browser work to a controller lifecycle hook."
        },
        {
          "id": "manual-rendering",
          "title": "Mount outside the Pages runtime",
          "markdown": "Most applications let Auto Pages create and hydrate the root. Use [`createRoot`](/docs/core/api/components-and-dom#api-tavojs-core--createroot \"View createRoot in the Core API reference\") when Tavo.js is embedded in an existing page, widget host, test shell, or other manually owned DOM container.\n\n-   `root.render`(node) owns repeat renders; `root.unmount`() removes the tree and releases refs, directives, listeners, and controller cleanup.\n    \n-   Use `root.hydrate`(node) only when the container already holds matching server-rendered `Tavo.js` markup.\n    \n-   render(node, container) is the convenience form for a one-off browser mount when you do not need the [`Root`](/docs/core/api/components-and-dom#api-tavojs-core--root \"View Root in the Core API reference\") handle.\n    \n-   `renderToString`(node) returns escaped static HTML. Use the server rendering APIs instead when you need a complete document, route resolution, status, headers, head output, streaming, or hydration state.\n    \n-   The automatic JSX transform normally creates [`VNode`](/docs/core/api/components-and-dom#api-tavojs-core--vnode \"View VNode in the Core API reference\") values. [`h`](/docs/core/api/components-and-dom#api-tavojs-core--h \"View h in the Core API reference\") is the lower-level explicit constructor for tooling or non-JSX integrations.\n    \n\n**Reference src/widget.tsx**\n\n```tsx\nimport { createRoot } from \"@tavojs/core\";\nimport { SupportWidget } from \"./SupportWidget\";\n\nconst container = document.querySelector(\"#support-widget\");\n\nif (!(container instanceof HTMLElement)) {\n  throw new Error(\"Missing #support-widget container.\");\n}\n\nconst root = createRoot(container);\nroot.render(<SupportWidget />);\n\n// Call this when the host removes the widget.\nexport function unmountSupportWidget() {\n  root.unmount();\n}\n```\n\n**Reference src/render-card.tsx**\n\n```tsx\nimport { renderToString } from \"@tavojs/core\";\nimport { ReceiptCard } from \"./ReceiptCard\";\n\nexport function renderReceiptCard(total: string) {\n  return renderToString(<ReceiptCard total={total} />);\n}\n```\n\n**Do not create a second application root**\n\nInside an Auto Pages application, render normal components from the route tree. A manual root is for a separately owned DOM container, not for replacing the route runtime."
        },
        {
          "id": "controlled-fields",
          "title": "Treat value and checked as controlled",
          "markdown": "When value or checked comes from model state, update that same state from the corresponding event. The browser runtime restores the rendered value after an input event, so a static controlled value intentionally remains pinned.\n\n-   Use `onChange` for live text-entry updates; `Tavo.js` maps the browser input event into the controlled-field flow.\n    \n-   Read `event.currentTarget` or `event.target` as the correct input element before updating the model.\n    \n-   Give every field an accessible label and expose validation with normal HTML constraints and `aria-describedby` where needed.\n    \n-   Use [`focusFirstInvalid`](/docs/core/api/components-and-dom#api-tavojs-core--focusfirstinvalid \"View focusFirstInvalid in the Core API reference\") after a failed client validation pass when moving focus is helpful and expected."
        },
        {
          "id": "component-verification",
          "title": "Verify both render environments",
          "markdown": "-   Render the component to HTML and confirm text, escaping, boolean attributes, class names, styles, and void elements.\n    \n-   Mount it in a browser test and confirm event updates, controlled values, focus, and cleanup.\n    \n-   Hydrate server markup and check that the first browser output matches without a hydration diagnostic.\n    \n-   Typecheck public props and event targets; do not rely on casts hidden inside application callers."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:dom-and-accessibility",
      "section": "core",
      "slug": "dom-and-accessibility",
      "title": "DOM and accessibility",
      "description": "Own DOM handles safely with refs, directives, focus utilities, transitions, observers, and explicit cleanup.",
      "keywords": [
        "ref",
        "directive",
        "focus",
        "accessibility",
        "transition",
        "observer",
        "cleanup"
      ],
      "kind": "guide",
      "prerequisites": [
        "A client-rendered or hydrated Tavo.js component.",
        "A DOM behavior that cannot be expressed through declarative props alone."
      ],
      "outcomes": [
        "Use object, callback, merged, and keyed-list refs.",
        "Attach reusable directives and understand their cleanup timing.",
        "Build accessible focus ownership and managed observation."
      ],
      "runtime": [
        "browser"
      ],
      "related": [
        {
          "title": "Components and JSX",
          "href": "/docs/core/components-and-jsx",
          "description": "Review intrinsic props and client-only runtime behavior."
        },
        {
          "title": "MVC components",
          "href": "/docs/core/mvc",
          "description": "Use controller lifecycle and managed side-effect helpers."
        },
        {
          "title": "Routing and navigation",
          "href": "/docs/core/routing",
          "description": "Understand route focus restoration and accessible navigation."
        }
      ],
      "canonicalPath": "/docs/core/dom-and-accessibility",
      "sections": [
        {
          "id": "ref-lifecycle",
          "title": "Use refs for direct DOM ownership",
          "markdown": "[`createRef`](/docs/core/api/components-and-dom#api-tavojs-core--createref \"View createRef in the Core API reference\") returns a mutable object whose current value follows one intrinsic element. Tavo.js assigns it on mount and hydration, moves it when the backing node changes, and clears it on replacement or unmount.\n\n-   Object refs are convenient controller fields. Callback refs receive the node and later receive null during cleanup.\n    \n-   [`mergeRefs`](/docs/core/api/components-and-dom#api-tavojs-core--mergerefs \"View mergeRefs in the Core API reference\") combines multiple ref owners into one callback ref.\n    \n-   [`createListRefs`](/docs/core/api/components-and-dom#api-tavojs-core--createlistrefs \"View createListRefs in the Core API reference\") creates stable object refs by a string or numeric key; delete removed keys and clear the collection when its owner is disposed.\n    \n-   [`setRef`](/docs/core/api/components-and-dom#api-tavojs-core--setref \"View setRef in the Core API reference\") is useful when composing a higher-level component or adapter that forwards a DOM node.\n    \n-   Refs are never serialized into server HTML and remain null during server rendering.\n    \n\n**Reference src/components/SearchField.tsx**\n\n```tsx\nimport {\n  createRef,\n  createTavo,\n  TavoController,\n} from \"@tavojs/core\";\n\nclass SearchFieldController extends TavoController {\n  input = createRef<HTMLInputElement>();\n\n  onMount() {\n    this.input.current?.select();\n  }\n}\n\nexport const SearchField = createTavo({\n  controller: SearchFieldController,\n  view({ controller }) {\n    return (\n      <label>\n        Search\n        <input ref={controller?.input} type=\"search\" />\n      </label>\n    );\n  },\n});\n```\n\n**Reference src/components/ResultList.tsx**\n\n```tsx\nimport {\n  createListRefs,\n  createRef,\n  createTavo,\n  mergeRefs,\n  TavoController,\n} from \"@tavojs/core\";\n\ntype Result = { id: string; label: string };\n\nclass ResultListController extends TavoController {\n  items = createListRefs<string, HTMLLIElement>();\n  measuredItem = createRef<HTMLLIElement>();\n  featuredItem = mergeRefs(\n    this.items.get(\"featured\"),\n    this.measuredItem,\n  );\n\n  onUnmount() {\n    this.items.clear();\n  }\n}\n\nexport const ResultList = createTavo<\n  { results: Result[] },\n  Record<string, never>,\n  ResultListController\n>({\n  controller: ResultListController,\n  view({ props, controller }) {\n    return (\n      <ul>\n        {props.results.map((result) => (\n          <li\n            key={result.id}\n            ref={\n              result.id === \"featured\"\n                ? controller?.featuredItem\n                : controller?.items.get(result.id)\n            }\n          >\n            {result.label}\n          </li>\n        ))}\n      </ul>\n    );\n  },\n});\n```"
        },
        {
          "id": "directives",
          "title": "Attach reusable behavior with directives",
          "markdown": "An [`ElementDirective`](/docs/core/api/components-and-dom#api-tavojs-core--elementdirective \"View ElementDirective in the Core API reference\") receives an HTMLElement after it mounts and may return cleanup. Pass one directive or an array through the intrinsic use prop. When the directive value changes, Tavo.js cleans up the old value before applying the new one; unmount also runs cleanup.\n\n-   [`autoFocus`](/docs/core/api/components-and-dom#api-tavojs-core--autofocus \"View autoFocus in the Core API reference\") queues focus after mount and accepts normal FocusOptions.\n    \n-   [`transition`](/docs/core/api/components-and-dom#api-tavojs-core--transition \"View transition in the Core API reference\") applies enter immediately, enterActive in a microtask, and leave classes/callbacks during cleanup.\n    \n-   transition does not wait for a CSS duration before removing a node. Use it for state classes and callbacks, not as an exit-animation coordinator.\n    \n-   Create reusable behavior with `createDirective` and attach it through the intrinsic use prop. Use `setRef` when a component or adapter must forward a DOM node to another ref owner.\n    \n\n**Reference src/components/LiveNotice.tsx**\n\n```tsx\nimport {\n  autoFocus,\n  createDirective,\n  transition,\n} from \"@tavojs/core\";\n\nconst announce = createDirective<HTMLElement>((element) => {\n  element.setAttribute(\"aria-live\", \"polite\");\n\n  return () => {\n    element.removeAttribute(\"aria-live\");\n  };\n});\n\nconst focusNotice = autoFocus();\nconst revealNotice = transition({\n  classes: {\n    enter: \"notice--enter\",\n    enterActive: \"notice--visible\",\n    leave: \"notice--leave\",\n  },\n});\n\nexport function LiveNotice({ message }: { message: string }) {\n  return (\n    <div\n      tabIndex={-1}\n      use={[announce, focusNotice, revealNotice]}\n    >\n      {message}\n    </div>\n  );\n}\n```"
        },
        {
          "id": "focus-ownership",
          "title": "Give dialogs explicit focus ownership",
          "markdown": "Accessible overlays need an initial focus target, contained Tab navigation, and restoration when the overlay closes. Keep every listener and restoration function under the same component owner.\n\n-   [`getFocusableElements`](/docs/core/api/components-and-dom#api-tavojs-core--getfocusableelements \"View getFocusableElements in the Core API reference\") returns visible links, buttons, enabled form controls, and eligible tabindex elements in DOM order.\n    \n-   [`focusFirst`](/docs/core/api/components-and-dom#api-tavojs-core--focusfirst \"View focusFirst in the Core API reference\") returns the focused element or null. [`focusFirstInvalid`](/docs/core/api/components-and-dom#api-tavojs-core--focusfirstinvalid \"View focusFirstInvalid in the Core API reference\") targets the first control matching :invalid.\n    \n-   [`trapFocus`](/docs/core/api/components-and-dom#api-tavojs-core--trapfocus \"View trapFocus in the Core API reference\") returns the keydown-listener cleanup. If no child is focusable, the container itself must be focusable.\n    \n-   Focus trapping alone does not provide a complete modal: also label the dialog, prevent background interaction, support Escape where appropriate, and restore focus.\n    \n\n**Reference src/components/Dialog.tsx**\n\n```tsx\nimport {\n  captureFocusRestore,\n  createRef,\n  createTavo,\n  focusFirst,\n  TavoController,\n  trapFocus,\n} from \"@tavojs/core\";\nimport type { PropsWithChildren } from \"@tavojs/core\";\n\nclass DialogController extends TavoController {\n  dialog = createRef<HTMLDivElement>();\n\n  onMount() {\n    const restoreFocus = captureFocusRestore();\n    const dialog = this.dialog.current;\n\n    if (!dialog) {\n      return restoreFocus;\n    }\n\n    focusFirst(dialog);\n    const stopTrap = trapFocus(dialog);\n\n    return () => {\n      stopTrap();\n      restoreFocus();\n    };\n  }\n}\n\nexport const Dialog = createTavo<\n  PropsWithChildren<{ label: string }>,\n  Record<string, never>,\n  DialogController\n>({\n  controller: DialogController,\n  view({ props, controller }) {\n    return (\n      <div\n        ref={controller?.dialog}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-label={props.label}\n        tabIndex={-1}\n      >\n        {props.children}\n      </div>\n    );\n  },\n});\n```"
        },
        {
          "id": "managed-observers",
          "title": "Observe elements with a managed owner",
          "markdown": "The standalone observer helpers [`observeResize`](/docs/core/api/components-and-dom#api-tavojs-core--observeresize \"View observeResize in the Core API reference\"), [`observeIntersection`](/docs/core/api/components-and-dom#api-tavojs-core--observeintersection \"View observeIntersection in the Core API reference\"), and [`observeMutation`](/docs/core/api/components-and-dom#api-tavojs-core--observemutation \"View observeMutation in the Core API reference\") accept an element or ref and return a disconnect function. Inside a [`TavoController`](/docs/core/api/application#api-tavojs-core--tavocontroller \"View TavoController in the Core API reference\"), the matching methods automatically register that disconnect function for component teardown.\n\n-   `observeResize` and `observeIntersection` accept an Element or `DomRefObject`.\n    \n-   `observeMutation` accepts a Node or a ref object.\n    \n-   Browser support failures surface from the platform constructors; add a feature check or polyfill when supporting older environments.\n    \n-   Do not start observers during model creation, controller construction, or SSR.\n    \n\n**Reference Reference snippet**\n\n```tsx\nclass ChartController extends TavoController {\n  chart = createRef<HTMLDivElement>();\n\n  onMount() {\n    this.observeResize(this.chart, () => {\n      this.measureChart();\n    });\n\n    this.observeIntersection(this.chart, (entries) => {\n      this.model.patch({ visible: entries[0]?.isIntersecting ?? false });\n    });\n  }\n\n  measureChart() {\n    // Read the committed chart dimensions.\n  }\n}\n```"
        },
        {
          "id": "dom-verification",
          "title": "Verify cleanup and keyboard behavior",
          "markdown": "-   Mount, replace, and unmount the element; assert object refs and callback refs are cleared.\n    \n-   Change a use prop and confirm the previous directive cleanup runs before the new directive.\n    \n-   Tab forward and backward through a focus trap, test an empty trap, and confirm focus restoration.\n    \n-   Unmount an observed component and assert the observer disconnects.\n    \n-   Run the same component through SSR and confirm ref, use, transition, and event instructions do not become HTML attributes."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:pages-and-layouts",
      "section": "core",
      "slug": "pages-and-layouts",
      "title": "Pages and layouts",
      "description": "Turn files into routes, compose nested application shells, and provide route-specific pending and error views.",
      "keywords": [
        "pages",
        "layouts",
        "route groups",
        "pending",
        "PagePendingProps",
        "PageErrorProps",
        "404"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Turn files into routes, compose nested application shells, and provide route-specific pending and error views."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/pages-and-layouts",
      "sections": [
        {
          "id": "route-files",
          "title": "Start with the route tree",
          "markdown": "`Tavo.js` derives application routes from src/pages. Keep route modules focused on route concerns: loader data, metadata, render mode, and the page component. Move reusable interface and business behavior into components, controllers, and stores.\n\nDynamic segments use brackets, catch-all segments use three dots, and folders wrapped in parentheses organize files without changing the public URL.\n\n**Reference src/pages/ — example route tree**\n\n```text\nsrc/pages/index.tsx                 → /\nsrc/pages/dashboard/index.tsx       → /dashboard\nsrc/pages/blog/[id].tsx              → /blog/:id\nsrc/pages/docs/[[...slug]].tsx       → /docs/*?slug\nsrc/pages/(marketing)/about.tsx     → /about\n```"
        },
        {
          "id": "functional-page",
          "title": "Define a functional page",
          "markdown": "Export route behavior as named functions and render the completed result from the default component. The filename determines the URL; `PageProps`, `PagePendingProps`, `PageErrorProps`, and `PageLoadContext` provide explicit data and parameter types without wrapping the module.\n\n**Create src/pages/projects/[id].tsx — create this route module**\n\n```tsx\nimport type {\n  PageErrorProps,\n  PageLoadContext,\n  PagePendingProps,\n  PageProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { name: string };\ntype ProjectParams = { id: string };\n\nexport async function load({ params, signal, url }: PageLoadContext): Promise<Project> {\n  const endpoint = new URL(`/api/projects/${params.id}`, url);\n  const response = await fetch(endpoint, { signal });\n  if (!response.ok) throw new Error(\"Project could not be loaded\");\n  return response.json();\n}\n\nexport function pending({ params }: PagePendingProps<ProjectParams>) {\n  return <Page aria-busy=\"true\"><Text>Loading project {params.id}…</Text></Page>;\n}\n\nexport function error({ pathname }: PageErrorProps<ProjectParams>) {\n  return <Page><Text role=\"alert\">Could not load {pathname}.</Text></Page>;\n}\n\nexport default function ProjectPage({ data }: PageProps<Project, ProjectParams>) {\n  return <Page><Text as=\"h1\" variant=\"h1\">{data?.name}</Text></Page>;\n}\n```"
        },
        {
          "id": "layout-boundaries",
          "title": "Compose layouts and failures",
          "markdown": "A `_layout.tsx` file wraps every descendant route. Layouts compose from root to leaf, so the root can own global navigation while a dashboard layout owns its sidebar and shared loader data. Each layout receives its own loader result as data and its own loader failure as error.\n\n-   Use route groups for alternate shells without adding a URL segment.\n    \n-   Add `src/pages/404.tsx` for unmatched URLs.\n    \n-   Export pending from a page for active client-navigation feedback after its layout loaders resolve.\n    \n-   Export error from a page for its contextual loader-failure view; otherwise `src/pages/_error.tsx` is the application-wide fallback.\n    \n-   A `notFound`() signal bypasses both error views and renders `src/pages/404.tsx`.\n    \n-   Handle a layout-loader failure from that layout's error prop; descendant loaders continue unless the loader signals not found.\n    \n-   Keep request-specific data in layout loader results, not process-wide stores during SSR."
        },
        {
          "id": "page-module-reference",
          "title": "Page module reference",
          "markdown": "A page or layout is a functional default export with optional named route exports. The filename determines the public route, while load, action, middleware, head, render, prerender, revalidate, vary, `cacheTags`, and `generateStaticParams` add route behavior. Page modules can additionally export pending and error components.\n\nPage and layout components receive the resolved URL params and their own loader data. The layers array preserves every layout and page result, while `layerData` exposes those results by layer ID.\n\n**Reference Reference snippet**\n\n```ts\ntype PageModuleRecord = {\n  default: Component<Record<string, unknown>>;\n  pending?: Component<PagePendingProps>;\n  error?: Component<PageErrorProps>;\n  load?: PageLoader;\n  action?: PageAction;\n  head?: PageHeadExport | ((context: PageLoadContext & {\n    data: unknown; error: unknown;\n  }) => PageHeadExport);\n  middleware?: PageMiddleware | PageMiddleware[];\n  render?: \"csr\";\n  prerender?: boolean;\n  static?: boolean;\n  revalidate?: number | false;\n  vary?: string | string[];\n  cacheTags?: string | string[] | ((context: PageLoadContext) => MaybePromise<string | string[]>);\n  generateStaticParams?: () => MaybePromise<Record<string, string>[]>;\n};\n\ntype PageProps<TData = unknown, TParams = Record<string, string | undefined>> = {\n  pathname?: string;\n  params: TParams;\n  data?: TData;\n  error?: unknown;\n  layers?: Array<{ id: string; kind: \"layout\" | \"page\"; data: unknown; error: unknown }>;\n  layerData?: Record<string, unknown>;\n};\n\ntype PagePendingProps<TParams = Record<string, string | undefined>> = {\n  pathname: string;\n  params: TParams;\n  layers: RouteDataLayer[];\n  layerData: Record<string, unknown>;\n};\n\ntype PageErrorProps<TParams = Record<string, string | undefined>> =\n  PagePendingProps<TParams> & {\n    data: unknown;\n    error: unknown;\n};\n```"
        },
        {
          "id": "route-conventions-reference",
          "title": "Route conventions and matching",
          "markdown": "-   `index.tsx` maps to its folder path; `_layout.tsx` wraps descendants; `404.tsx` handles unmatched paths; a page error export handles its loader failure before the global `_error.tsx` fallback.\n    \n-   \\[id\\] is a required dynamic segment, \\[\\[id\\]\\] is optional, \\[...all\\] is a required catch-all, and \\[\\[...all\\]\\] is an optional catch-all.\n    \n-   Folders in parentheses are route groups: they organize files and select layouts without adding a URL segment.\n    \n-   `RouteParamsFromPath`<TPath> derives string parameters. Optional parameters are string | undefined. `LoaderData`<TLoader> unwraps the loader's awaited return type.\n    \n-   [`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\") is optional route-aware typing assistance. It does not register or rename a route; keep its path literal aligned with the filename and confirm the result with tavo routes.\n    \n-   `defineRoutePage` also infers route params for pending and error components when the helper form is useful.\n    \n-   The CLI generates functional modules by default. Use `tavo` generate page <name> `--typed-route` only when the helper form is useful.\n    \n-   Routes are sorted by segment specificity before matching: static segments win over dynamic segments, required parameters win over optional ones, and catch-all segments come last. Equivalent patterns use a lexical path tie-break, so filesystem discovery order never changes the result.\n    \n\n**Reference Reference snippet**\n\n```tsx\n// src/pages/projects/[projectId]/tasks/[[taskId]].tsx\nimport type { PageProps } from \"@tavojs/core/router\";\n\ntype Params = {\n  projectId: string;\n  taskId?: string;\n};\n\nexport default function TaskPage({ params }: PageProps<unknown, Params>) {\n  return (\n    <main>\n      Project {params.projectId}; task {params.taskId ?? \"overview\"}\n    </main>\n  );\n}\n```\n\n**Inspect the generated route graph**\n\nRoute collisions, invalid files, CSR-incompatible static options, and dynamic head on CSR routes become manifest diagnostics. Run tavo routes and tavo check before relying on route order."
        },
        {
          "id": "route-pending-error-reference",
          "title": "Route pending and error reference",
          "markdown": "A page can export pending for unresolved browser navigation and error for a contextual page-loader failure. Both exports are normal `Tavo.js` components: use a function component for render-only feedback or `createTavo` when the state needs a model, controller, lifecycle, or cleanup.\n\n-   Client navigation changes the URL, runs middleware, resolves target layout loaders, renders pending inside those layouts, runs the page loader, and then renders the completed page or route error.\n    \n-   The default page component and controller do not mount until the page loader completes. Pending props intentionally omit page loader data but include resolved layout layers and `layerData`.\n    \n-   A `createTavo` pending component's controller receives the target route through `this.page`, including pathname, route, status, params, layers, and `layerData`; `this.page.data` is unavailable while the loader is unresolved.\n    \n-   Without pending, the previous page stays visible while the target content region is marked busy.\n    \n-   The target page error export wins for its loader failure; otherwise `Tavo.js` renders `src/pages/_error.tsx`. `notFound`() bypasses both and renders `src/pages/404.tsx` with status 404.\n    \n-   A layout-loader failure enters error handling instead of rendering pending with invalid layout data.\n    \n-   Normal SSR, static prerendering, prefetching, and fresh route-cache hits do not render pending.\n    \n-   A replaced navigation aborts obsolete resolution, removes its pending view, and prevents stale data or errors from becoming active.\n    \n-   Use `aria-busy` and an accessible label for pending UI, avoid moving focus into a skeleton, and announce route errors without exposing private diagnostic details.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport type {\n  PageErrorProps,\n  PagePendingProps\n} from \"@tavojs/core/router\";\n\nexport function pending({ params }: PagePendingProps<{ id: string }>) {\n  return <main aria-busy=\"true\">Loading report {params.id}…</main>;\n}\n\nexport function error({ pathname }: PageErrorProps<{ id: string }>) {\n  return <main role=\"alert\">Could not load {pathname}.</main>;\n}\n```"
        },
        {
          "id": "route-output-reference",
          "title": "Rendering, static output, and cache options",
          "markdown": "SSR is the normal server render mode. A route becomes CSR when its module chain selects render: \"csr\". Static and revalidation policy composes across root, layouts, and page rather than belonging only to the leaf page.\n\n-   In functional modules, export const prerender = true enables static output. false or revalidate = false disables an inherited static policy.\n    \n-   revalidate is measured in seconds, rounded down, clamped to zero, and the shortest finite value in the module chain wins.\n    \n-   vary header names are lowercased and deduplicated. Localization also varies cached output by Accept-Language.\n    \n-   `cacheTags` can be static strings or request-aware resolvers. Tags support targeted invalidation in runtimes that expose it.\n    \n-   CSR routes ignore static, revalidate, vary, cache tags, and `generateStaticParams`. The manifest reports incompatible declarations.\n    \n-   `generateStaticParams` is required to enumerate build-time paths for a dynamic static route.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { defineRoutePage } from \"@tavojs/core/router\";\n\nexport default defineRoutePage(\"/catalog/[id]\", {\n  static: true,\n  revalidate: 300,\n  vary: \"accept-language\",\n  cacheTags: ({ params }) => [\"catalog\", `product:${params.id}`],\n  generateStaticParams: async () => [{ id: \"starter\" }],\n  load: ({ params, signal }) => getProduct(params.id, { signal }),\n  default: ({ data }) => <ProductPage product={data} />\n});\n```\n\n**Choose one static form**\n\nUse named prerender in a functional module or static inside defineRoutePage. Declaring both forms in one route is rejected."
        },
        {
          "id": "pages-runtime-reference",
          "title": "Configure shared route behavior",
          "markdown": "-   Put application-wide page props, not-found UI, CSR fallback content, middleware, localization, redirect policy, trusted hosts, and cache limits under ssr in `tavo.config.ts`.\n    \n-   Configure `ssr.csrFallback` through `defineConfig`; normal applications use the framework boot flow and do not construct a pages runtime.\n    \n-   Install plugins through the top-level plugins configuration. Plugin graph compilation and runtime construction are framework host responsibilities.\n    \n-   Use `tavo` routes and `tavo` inspect route <path> `--json` for route inspection. Experimental tooling can use the supported `@tavojs/core/dev` inspection exports.\n    \n\n**Reference Reference snippet**\n\n```ts\n// tavo.config.ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nexport default defineConfig({\n  ssr: {\n    csrFallback: \"Loading application…\",\n    maxResolvedCacheEntries: 512\n  }\n});\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:route-files-and-matching",
      "section": "core",
      "slug": "route-files-and-matching",
      "title": "Route files and matching",
      "description": "Use the exact src/pages conventions, understand deterministic route precedence, and place route-level failure UI correctly.",
      "keywords": [
        "routes",
        "pages",
        "layouts",
        "dynamic segments",
        "route groups",
        "404",
        "error",
        "precedence"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with its route modules under src/pages.",
        "Familiarity with functional TSX components."
      ],
      "outcomes": [
        "Map files and folders to public paths without route collisions.",
        "Predict which route wins when several patterns could match.",
        "Choose page error, global error, or 404 UI for each failure."
      ],
      "runtime": [
        "build",
        "server",
        "browser"
      ],
      "related": [
        {
          "title": "Pages and layouts",
          "href": "/docs/core/pages-and-layouts",
          "description": "Learn the route-module composition model."
        },
        {
          "title": "Route data lifecycle",
          "href": "/docs/core/route-data-lifecycle",
          "description": "Follow middleware and loaders after a route matches."
        }
      ],
      "canonicalPath": "/docs/core/route-files-and-matching",
      "sections": [
        {
          "id": "file-to-url",
          "title": "Map src/pages to URLs",
          "markdown": "Tavo.js discovers route modules below src/pages. A normal page file contributes a URL; a special module changes how matching, layout, or failure rendering works. Route groups organize files and select layouts without adding a path segment.\n\n**Reference src/pages — route map**\n\n```text\nsrc/pages/\n  index.tsx                    → /\n  about.tsx                    → /about\n  projects/\n    _layout.tsx                → wraps project descendants\n    index.tsx                  → /projects\n    new.tsx                    → /projects/new\n    [id].tsx                   → /projects/:id\n    [[tab]].tsx                → /projects/:?tab\n    [...path].tsx              → /projects/*path\n  (account)/\n    _layout.tsx                → selects a layout; no URL segment\n    settings.tsx               → /settings\n  404.tsx                      → unmatched and notFound() UI\n  _error.tsx                  → fallback for page-loader errors\n```\n\nFile syntax\n\nWhat it matches\n\nResult\n\n`[id]`\n\nExactly one required segment.\n\nparams.id is a decoded string.\n\n`[[tab]]`\n\nZero or one segment.\n\nparams.tab is string | undefined.\n\n`[...path]`\n\nOne or more remaining segments.\n\nparams.path contains the decoded slash-joined value.\n\n`[[...path]]`\n\nZero or more remaining segments.\n\nparams.path is string | undefined.\n\n`(account)`\n\nNo URL segment.\n\nThe group remains part of layout identity.\n\n**Malformed encoded paths do not match**\n\nRoute parameters are decoded before they are published. If a path segment cannot be decoded, that candidate does not match. Do not decode params a second time in application code."
        },
        {
          "id": "module-shape",
          "title": "Keep route modules functional and explicit",
          "markdown": "The default export renders the page. Named exports add behavior without changing the route path. [`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\") is optional route-aware typing; it does not register the route or override its filename. Its path literal is checked with [`RouteParamsFromPath`](/docs/core/api/router#api-tavojs-core-router--routeparamsfrompath \"View RouteParamsFromPath in the Core API reference\"), while the filesystem remains authoritative.\n\n**Reference src/pages/projects/[id].tsx**\n\n```tsx\nimport type {\n  PageLoadContext,\n  PageProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { id: string; name: string };\ntype ProjectParams = { id: string };\n\nexport async function load({\n  params,\n  signal,\n  url\n}: PageLoadContext): Promise<Project> {\n  const response = await fetch(\n    new URL(`/api/projects/${params.id}`, url),\n    { signal }\n  );\n  if (!response.ok) {\n    throw new Error(\"Could not load project\");\n  }\n  return response.json() as Promise<Project>;\n}\n\nexport function head({ data }: { data: Project | null }) {\n  return <title>{data ? data.name : \"Project\"}</title>;\n}\n\nexport default function ProjectPage({\n  data\n}: PageProps<Project, ProjectParams>) {\n  return (\n    <Page>\n      <Text as=\"h1\" variant=\"h1\">\n        {data?.name}\n      </Text>\n    </Page>\n  );\n}\n```\n\n-   Page modules may export load, action, middleware, head, pending, error, render, prerender, revalidate, vary, `cacheTags`, and `generateStaticParams`.\n    \n-   Layout modules use the same data, middleware, head, and rendering exports and receive children from the route beneath them.\n    \n-   Use [`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\") from @tavojs/core/router later when path-derived params and one object are clearer for a complex route.\n    \n-   Keep the helper path literal aligned with the file path and inspect the generated manifest; the filesystem remains authoritative."
        },
        {
          "id": "precedence",
          "title": "Predict deterministic route precedence",
          "markdown": "Matching is independent of filesystem discovery order. Tavo.js compares each segment from left to right and tries the more specific pattern first.\n\n**Reference Matching precedence — highest to lowest**\n\n```text\nstatic\n  → required dynamic [id]\n  → optional dynamic [[id]]\n  → required catch-all [...path]\n  → optional catch-all [[...path]]\n\n/projects/new       wins over /projects/[id]\n/docs/[version]     wins over /docs/[...path]\n/files/[...path]    wins over /files/[[...path]]\n```\n\nWhen two compiled patterns have identical specificity, Tavo.js uses a lexical path tie-break. Treat equivalent patterns as a collision to fix, not as a way to choose behavior by declaration order.\n\n**Inspect collisions before deployment**\n\nRun tavo routes and tavo check after adding or renaming route files. The generated route order is the behavior that development, build, and production share."
        },
        {
          "id": "special-modules",
          "title": "Place 404 and error UI at the correct boundary",
          "markdown": "-   src/pages/404.tsx renders when no route matches and when a loader or middleware calls [`notFound()`](/docs/core/api/router#api-tavojs-core-router--notfound \"View notFound in the Core API reference\"). The response status is 404.\n    \n-   A page-local error export handles that page loader's failure and implements the [`PageErrorProps`](/docs/core/api/router#api-tavojs-core-router--pageerrorprops \"View PageErrorProps in the Core API reference\") contract: pathname, params, route layers, page data, and the error.\n    \n-   `src/pages/_error.tsx` is the fallback when a page loader fails and the page has no local error export.\n    \n-   A layout receives its own loader error through its error prop. Descendant loaders still run unless the failure is `notFound`(), and page pending UI is skipped while a layout error exists.\n    \n-   Files whose stem begins with an underscore are not public routes. Only documented special filenames receive special behavior.\n    \n\n**Reference src/pages/404.tsx**\n\n```tsx\nimport { Page, Text } from \"@tavojs/ui\";\n\nexport default function NotFoundPage({\n  pathname\n}: {\n  pathname?: string;\n}) {\n  return (\n    <Page>\n      <Text as=\"h1\" variant=\"h1\">\n        Page not found\n      </Text>\n      <Text>The path {pathname ?? \"you requested\"} does not exist.</Text>\n    </Page>\n  );\n}\n```\n\n**Do not expose private failure details**\n\nRender a stable user-facing message and report the original error through server diagnostics or instrumentation. Serialized hydration errors are redacted, but route data and custom error UI still require deliberate privacy review."
        },
        {
          "id": "advanced-status",
          "title": "Treat two implemented conventions as contract work in progress",
          "markdown": "Current Core source and tests recognize a top-level \\_root.tsx and a page-level layout = false export. Their final public 1.0 semantics are not yet ratified.\n\n-   `_root.tsx` currently wraps every matched route before directory layouts and uses the layer ID \\_root.\n    \n-   layout = false currently skips directory `_layout.tsx` modules for that page while retaining `_root.tsx`.\n    \n-   Do not make reusable application architecture depend on either convention until Core publishes its stable contract, inheritance rules, and migration guarantees.\n    \n-   Use explicit directory layouts for production documentation and examples in the meantime."
        },
        {
          "id": "verification",
          "title": "Verify the route graph",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo routes\nnpx tavo inspect route /projects/new --json\nnpx tavo inspect route /projects/example --json\nnpx tavo check\n```\n\nVerify both the static and dynamic examples so precedence is observable. Also request an unknown path and a loader path that calls `notFound`() to confirm the same 404 module and status are used."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:routing",
      "section": "core",
      "slug": "routing",
      "title": "Routing and navigation",
      "description": "Navigate between typed file routes while preserving browser history, focus, scroll, and pending state.",
      "keywords": [
        "router",
        "navigation",
        "Link",
        "prefetch"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Navigate between typed file routes while preserving browser history, focus, scroll, and pending state."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/routing",
      "sections": [
        {
          "id": "navigation-model",
          "title": "Use Auto Pages for application routes",
          "markdown": "Auto Pages discovers application routes from src/pages and owns matching, layouts, loaders, route pending and error views, metadata, focus restoration, accessibility announcements, and scroll restoration. Route folders, dynamic segments, groups, 404 pages, and error pages all participate in the same generated route graph.\n\n**Standalone router**\n\nThe router entry point also exposes createRouter for small client-only or embedded flows. Most file-routed applications should use Auto Pages instead of creating a second top-level router."
        },
        {
          "id": "links-and-scroll",
          "title": "Link and scroll behavior",
          "markdown": "The Core [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") performs SPA navigation and sets `aria-current` on the active destination. New routes begin at the top, hashes scroll into view, and browser back or forward restores saved positions.\n\n**Create src/components/AccountNavigation.tsx — create this component**\n\n```tsx\nimport { Link } from \"@tavojs/core/router\";\nimport { Inline } from \"@tavojs/ui\";\n\nexport function AccountNavigation() {\n  return <Inline as=\"nav\" aria-label=\"Account\">\n    <Link to=\"/account/profile\">Profile</Link>\n    <Link to=\"/account/security\" scroll={false}>Security</Link>\n  </Inline>;\n}\n```"
        },
        {
          "id": "prefetch-and-status",
          "title": "Prefetch intentionally",
          "markdown": "Prefetch routes when intent is clear, such as pointer hover or focus on a high-probability destination. Prefetching resolves work without changing the URL or rendering the target page's pending component. Route status APIs let interface code show loading, prefetching, ready, or error states without duplicating the router state machine.\n\n**Create src/navigation/reports.ts — create this browser-safe helper**\n\n```ts\nimport { getRouteStatus, prefetchRoute } from \"@tavojs/core/router\";\n\nexport async function prepareReports() {\n  await prefetchRoute(\"/reports\");\n  return getRouteStatus(\"/reports\");\n}\n```"
        },
        {
          "id": "subscriptions-and-inspection",
          "title": "Subscribe and inspect responsibly",
          "markdown": "Auto Pages exposes synchronous route state and disposable subscriptions from `@tavojs/core/router`. Development inspection lives under `@tavojs/core/dev`, while `tavo` routes and `tavo` inspect route show the generated graph without adding application code.\n\n-   Use `getResolvedRoute` and `getRouteStatus` for current resolution state.\n    \n-   Use `subscribeAvailableRoutes` and `subscribeRouteStatus` when interface state must react to route changes.\n    \n-   Run `tavo` routes, `tavo` inspect route <path> `--json`, or import `getAutoPagesInspection` from `@tavojs/core/dev` during development.\n    \n\n**Reference src/navigation/route-observer.ts**\n\n```ts\nimport {\n  getAvailableRoutes,\n  getCurrentPathname,\n  subscribePathname\n} from \"@tavojs/core/router\";\n\nconsole.log(getCurrentPathname(), getAvailableRoutes());\n\nconst unsubscribe = subscribePathname((pathname) => {\n  console.log(\"Route changed:\", pathname);\n});\n\n// Call when this observer's owner is disposed.\nunsubscribe();\n```"
        },
        {
          "id": "auto-pages-navigation-reference",
          "title": "File-router navigation API",
          "markdown": "Auto Pages discovers application routes from src/pages. Import its navigation and route-state APIs from `@tavojs/core/router`. Reads are synchronous; subscribe functions return an unsubscribe callback; `prefetchRoute` resolves route middleware and loaders without changing browser history.\n\n-   Route status is idle, loading, prefetching, ready, redirecting, or error.\n    \n-   A page pending export is visible only during active client-side route resolution; `prefetchRoute` never renders it.\n    \n-   Without an active resolver, `prefetchRoute` leaves the route idle rather than throwing.\n    \n-   Pass an `AbortSignal` when hover, focus, or another owner should be able to cancel a prefetch.\n    \n-   Call every returned unsubscribe function when its component, controller, or external owner is disposed.\n    \n-   Import `getAutoPagesInspection` from `@tavojs/core/dev` for development inspection, or use `tavo` routes and `tavo` inspect route <path> `--json`.\n    \n\n**Reference Reference snippet**\n\n```ts\nnavigate(to: string, options?: { replace?: boolean; scroll?: boolean }): void\nprefetchRoute(pathname: string, options?: { signal?: AbortSignal }): Promise<void>\ngetCurrentPathname(): string\nsubscribePathname(listener: (pathname: string) => void): () => void\ngetAvailableRoutes(): PageRouteDefinition[]\nsubscribeAvailableRoutes(listener: (routes: PageRouteDefinition[]) => void): () => void\ngetResolvedRoute(pathname?: string)\ngetRouteStatus(pathname?: string): RouteStatus\nsubscribeRouteStatus(listener: (status: RouteStatus, all: RouteStatusState) => void, pathname?: string): () => void\n```"
        },
        {
          "id": "link-reference",
          "title": "Link behavior and accessibility",
          "markdown": "-   [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") renders a real anchor and adds `aria-current`\\=\"page\" when its resolved route is active.\n    \n-   Only an unmodified primary click to the same origin is intercepted. External URLs, downloads, modified clicks, new-window targets, and same-page hashes keep browser behavior.\n    \n-   replace defaults to false. Navigation scrolls to the top or hash by default; scroll: false preserves the current position. Back and forward restore saved positions.\n    \n-   When an i18n service is registered, internal destinations are localized and active matching ignores the locale prefix.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype LinkProps = {\n  to: string;\n  replace?: boolean;\n  scroll?: boolean;\n  className?: string;\n  children?: Child;\n};\n```"
        },
        {
          "id": "standalone-router-reference",
          "title": "Standalone router reference",
          "markdown": "The standalone router is intended for embedded or client-only route areas. Do not create a second top-level router inside a file-routed application.\n\n-   `RouterProvider` can render explicit children or the matched route component.\n    \n-   After navigation it announces status, focuses `data-tavo-route-focus`, main, h1, or role=main, and restores scroll.\n    \n-   [`navigate`](/docs/core/api/router#api-tavojs-core-router--navigate \"View navigate in the Core API reference\") is a no-op during server rendering. [`Router`](/docs/core/api/router#api-tavojs-core-router--router \"View Router in the Core API reference\") params are decoded strings.\n    \n\n**Reference Reference snippet**\n\n```tsx\nconst router = createRouter([\n  { path: \"/\", component: Home },\n  { path: \"/teams/:id\", component: Team }\n]);\n\nrouter.navigate(\"/teams/core\", { replace: false, scroll: true });\nrouter.getPathname();\nrouter.match(\"/teams/core\"); // { route, params: { id: \"core\" } }\n\n<RouterProvider\n  router={router}\n  notFound={<NotFound />}\n  busy={false}\n  contentId=\"route-content\"\n/>\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:navigation-and-route-state",
      "section": "core",
      "slug": "navigation-and-route-state",
      "title": "Navigation and route state",
      "description": "Navigate, prefetch, inspect route resolution, and own route subscriptions without leaking browser listeners.",
      "keywords": [
        "navigation",
        "Link",
        "prefetch",
        "route status",
        "subscriptions",
        "pathname"
      ],
      "kind": "reference",
      "prerequisites": [
        "A file-routed Tavo.js application.",
        "Client-side code that needs navigation or route progress."
      ],
      "outcomes": [
        "Choose Link or navigate without breaking browser behavior.",
        "Interpret every route status and prefetch outcome.",
        "Read initial state and clean up every route subscription."
      ],
      "runtime": [
        "browser"
      ],
      "related": [
        {
          "title": "Route files and matching",
          "href": "/docs/core/route-files-and-matching",
          "description": "Understand the route catalog exposed to navigation."
        },
        {
          "title": "MVC and controllers",
          "href": "/docs/core/mvc",
          "description": "Own subscriptions and async work with createTavo."
        }
      ],
      "canonicalPath": "/docs/core/navigation-and-route-state",
      "sections": [
        {
          "id": "navigation",
          "title": "Use anchors first and navigate for imperative transitions",
          "markdown": "**Reference src/components/ProjectNavigation.tsx**\n\n```tsx\nimport { Link, navigate } from \"@tavojs/core/router\";\nimport { Button, Stack } from \"@tavojs/ui\";\n\nexport function ProjectNavigation() {\n  function openLatestProject() {\n    navigate(\"/projects/latest\");\n  }\n\n  return (\n    <Stack>\n      <Link to=\"/projects\">All projects</Link>\n      <Button onClick={openLatestProject}>\n        Open latest project\n      </Button>\n    </Stack>\n  );\n}\n```\n\n-   [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") renders a real anchor, supports keyboard and assistive technology behavior, and marks the active route with aria-current.\n    \n-   Same-origin, unmodified primary clicks become client navigation. External links, downloads, modified clicks, new-window targets, and same-page hashes retain native browser behavior.\n    \n-   [`navigate`](/docs/core/api/router#api-tavojs-core-router--navigate)`(``to``,` `{` `replace``,` `scroll` `}``)` is for event-driven transitions. replace defaults to false and scroll defaults to true.\n    \n-   Back and forward navigation follows browser history and restores recorded scroll positions."
        },
        {
          "id": "status",
          "title": "Read route status as a state machine",
          "markdown": "**Reference src/navigation/progress.ts**\n\n```ts\nimport {\n  getRouteStatus,\n  subscribeRouteStatus,\n} from \"@tavojs/core/router\";\n\nconsole.debug(getRouteStatus(\"/reports\").status);\n\nconst stop = subscribeRouteStatus((status) => {\n  document.documentElement.dataset.routeStatus = status.status;\n}, \"/reports\");\n\n// Return stop from the lifecycle owner.\n```\n\nStatus\n\nMeaning\n\n`idle`\n\nNo active or reusable resolution is recorded for the path.\n\n`loading`\n\nAn active navigation is running middleware and loaders.\n\n`prefetching`\n\nBackground resolution is running without changing history.\n\n`ready`\n\nA resolved result is available for the path.\n\n`redirecting`\n\nMiddleware or route resolution selected another location.\n\n`error`\n\nResolution failed; inspect the status error for reporting.\n\nEach record follows [`RouteStatus`](/docs/core/api/router#api-tavojs-core-router--routestatus \"View RouteStatus in the Core API reference\"). Read a path with [`getRouteStatus`](/docs/core/api/router#api-tavojs-core-router--getroutestatus)`(``pathname``)` and observe future transitions with [`subscribeRouteStatus`](/docs/core/api/router#api-tavojs-core-router--subscriberoutestatus)`(``listener``,` `pathname``?``)`.\n\n-   [`getCurrentPathname`](/docs/core/api/router#api-tavojs-core-router--getcurrentpathname)`(``)` reads the current browser path.\n    \n-   [`getAvailableRoutes`](/docs/core/api/router#api-tavojs-core-router--getavailableroutes)`(``)` returns discovered [`PageRouteDefinition`](/docs/core/api/router#api-tavojs-core-router--pageroutedefinition \"View PageRouteDefinition in the Core API reference\") records; the catalog is not an authorization boundary.\n    \n-   [`getResolvedRoute`](/docs/core/api/router#api-tavojs-core-router--getresolvedroute)`(``pathname``)` returns the current resolved route snapshot when available. Pass the path explicitly when inspecting anything other than the active route. The renderer-state shape is intentionally not a separately importable route-author contract."
        },
        {
          "id": "subscriptions",
          "title": "Read once, subscribe, and return cleanup",
          "markdown": "[`subscribePathname`](/docs/core/api/router#api-tavojs-core-router--subscribepathname \"View subscribePathname in the Core API reference\"), [`subscribeAvailableRoutes`](/docs/core/api/router#api-tavojs-core-router--subscribeavailableroutes \"View subscribeAvailableRoutes in the Core API reference\"), and [`subscribeRouteStatus`](/docs/core/api/router#api-tavojs-core-router--subscriberoutestatus \"View subscribeRouteStatus in the Core API reference\") publish future changes; they do not replace the initial synchronous read. A [`createTavo`](/docs/core/api/application#api-tavojs-core--createtavo \"View createTavo in the Core API reference\") controller is a natural owner because onMount can return one cleanup that releases every subscription.\n\n**Reference src/components/RouteProgress.tsx**\n\n```tsx\nimport {\n  createTavo,\n  TavoController\n} from \"@tavojs/core\";\nimport {\n  getCurrentPathname,\n  getRouteStatus,\n  subscribePathname,\n  subscribeRouteStatus,\n  type RouteStatus\n} from \"@tavojs/core/router\";\nimport { Text } from \"@tavojs/ui\";\n\ntype RouteProgressState = {\n  pathname: string;\n  status: RouteStatus[\"status\"];\n};\n\nclass RouteProgressController extends TavoController {\n  sync(pathname = getCurrentPathname()) {\n    this.model.patch({\n      pathname,\n      status: getRouteStatus(pathname).status\n    });\n  }\n\n  onMount() {\n    this.sync();\n    const stopPathname = subscribePathname((pathname) => {\n      this.sync(pathname);\n    });\n    const stopStatus = subscribeRouteStatus((status) => {\n      this.model.patch({\n        pathname: status.pathname,\n        status: status.status\n      });\n    });\n\n    return function cleanupRouteProgress() {\n      stopPathname();\n      stopStatus();\n    };\n  }\n}\n\nexport const RouteProgress = createTavo<\n  Record<string, never>,\n  RouteProgressState,\n  RouteProgressController\n>({\n  model: () => ({\n    pathname: \"/\",\n    status: \"idle\"\n  }),\n  controller: RouteProgressController,\n  view: ({ state }) => {\n    return (\n      <Text aria-live=\"polite\">\n        {state.pathname}: {state.status}\n      </Text>\n    );\n  }\n});\n```\n\n**Scope status subscriptions when possible**\n\nPass a pathname to [`subscribeRouteStatus`](/docs/core/api/router#api-tavojs-core-router--subscriberoutestatus \"View subscribeRouteStatus in the Core API reference\") when one component owns one destination. An unscoped subscription receives all route transitions and should be reserved for global progress or diagnostics UI."
        },
        {
          "id": "prefetch",
          "title": "Prefetch without navigating",
          "markdown": "**Reference src/components/ProjectLink.tsx**\n\n```tsx\nimport { Link, prefetchRoute } from \"@tavojs/core/router\";\n\nexport function ProjectLink({ id }: { id: string }) {\n  const pathname = `/projects/${id}`;\n  let prefetch: AbortController | null = null;\n\n  function startPrefetch() {\n    prefetch?.abort();\n    prefetch = new AbortController();\n    void prefetchRoute(pathname, {\n      signal: prefetch.signal\n    });\n  }\n\n  function stopPrefetch() {\n    prefetch?.abort();\n    prefetch = null;\n  }\n\n  return (\n    <span\n      onMouseEnter={startPrefetch}\n      onMouseLeave={stopPrefetch}\n      onFocus={startPrefetch}\n      onBlur={stopPrefetch}\n    >\n      <Link to={pathname}>\n        Open project {id}\n      </Link>\n    </span>\n  );\n}\n```\n\n-   `prefetchRoute` runs the target's client-eligible middleware and loaders but does not change history or render the target pending component.\n    \n-   Status moves through prefetching and then ready or error. Cancellation returns the prefetch to idle.\n    \n-   Pass an `AbortSignal` when hover, focus, a controller, or another owner can stop needing the result.\n    \n-   Prefetch is an optimization. Navigation must still work when no prefetch ran, failed, or was evicted."
        },
        {
          "id": "failure-and-verification",
          "title": "Verify navigation and cancellation",
          "markdown": "-   Replace a slow navigation with a second destination and confirm the obsolete result never becomes active.\n    \n-   Abort a hover prefetch and confirm it neither changes the URL nor displays pending UI.\n    \n-   Mount and unmount subscription-owning components repeatedly while checking that each cleanup runs.\n    \n-   Test [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") with keyboard activation, modifier keys, downloads, external URLs, hashes, and browser back/forward.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo routes\nnpx tavo inspect route /projects/example --json\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:data-and-middleware",
      "section": "core",
      "slug": "data-and-middleware",
      "title": "Data loading and middleware",
      "description": "Load route data, provide route-specific pending and error states, redirect or gate navigation, and cancel obsolete work.",
      "keywords": [
        "loader",
        "pending",
        "error",
        "middleware",
        "resource",
        "AbortSignal"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Load route data, provide route-specific pending and error states, redirect or gate navigation, and cancel obsolete work."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/data-and-middleware",
      "sections": [
        {
          "id": "route-loaders",
          "title": "Load route-critical data",
          "markdown": "Page and layout loaders run during route resolution. Their result becomes page data and is available to route-aware controllers. A page can export pending for active browser resolution and error for its loader failure. Pass the provided `AbortSignal` to downstream work so superseded navigation cannot publish stale results.\n\n**Replace src/pages/projects/[id].tsx — replace the route module**\n\n```tsx\nimport type {\n  PageErrorProps,\n  PageLoadContext,\n  PagePendingProps,\n  PageProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Project = { name: string };\n\nexport async function load({ params, signal, url }: PageLoadContext): Promise<Project> {\n  const endpoint = new URL(`/api/projects/${params.id}`, url);\n  const response = await fetch(endpoint, { signal });\n  if (!response.ok) throw new Error(\"Project could not be loaded\");\n  return response.json();\n}\n\nexport function pending({ params }: PagePendingProps) {\n  return <Page aria-busy=\"true\"><Text>Loading project {params.id}…</Text></Page>;\n}\n\nexport function error({ pathname }: PageErrorProps) {\n  return <Page><Text role=\"alert\">Could not load {pathname}.</Text></Page>;\n}\n\nexport default function ProjectPage({ data }: PageProps<Project>) {\n  return <Page><Text>{data?.name}</Text></Page>;\n}\n```"
        },
        {
          "id": "middleware-boundary",
          "title": "Keep middleware request-scoped",
          "markdown": "Middleware runs before loaders and can continue or redirect route resolution. Return nothing to continue, or return an object with redirect and an optional status. A status without redirect does not stop the route. This example normalizes a redundant query before the loader runs. Use `defineServerMiddleware` plus a server-only helper for sessions, secrets, or other policy that must never run during browser navigation.\n\n**Merge src/pages/projects/_layout.tsx — merge this middleware export**\n\n```ts\nimport { defineServerMiddleware } from \"@tavojs/core/router\";\n\nexport const middleware = defineServerMiddleware(({ request }) => {\n  const url = new URL(request.url);\n  if (url.searchParams.get(\"view\") === \"all\") {\n    return { redirect: \"/projects\", status: 308 };\n  }\n});\n```"
        },
        {
          "id": "route-vs-resource",
          "title": "Route loader or resource?",
          "markdown": "Starting a new resource load aborts the previous one. Treat cancellation as expected control flow rather than an application error.\n\n-   Use a loader when the route cannot render meaningfully without the data.\n    \n-   Use a layout loader for data shared by descendant routes.\n    \n-   Use `createResource` for component-scoped async data that can load independently.\n    \n-   Use lazy when the async work is loading a component implementation."
        },
        {
          "id": "loader-contract-reference",
          "title": "Loader contract",
          "markdown": "-   Loader runtime defaults to both. `defineServerLoader` is equivalent to a server-only loader and is skipped during browser resolution.\n    \n-   request, URL, Headers, and `AbortSignal` are portable Fetch APIs. Build application-relative fetch URLs with new URL(path, url) so the same loader works in Node and the browser. Use `rawRequest` only at an adapter integration boundary.\n    \n-   Pass signal to fetch and every abort-aware dependency. Superseded navigation is expected cancellation and must not publish stale data.\n    \n-   Layout loaders resolve from root to leaf, followed by the page loader. Later loader contexts receive successful earlier results through the optional keyed `context.layers` record. Rendered page, pending, and error props use a different shape: ordered layers plus keyed `layerData`.\n    \n-   A layout-loader failure stays on that layout layer and enters route error handling rather than rendering the page pending view with invalid layout data.\n    \n-   A page-loader failure renders the target page's error export when present, then falls back to `src/pages/_error.tsx`.\n    \n-   An aborted obsolete resolution returns to idle rather than rendering an error.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype PageLoadContext = {\n  pathname: string;\n  params: Record<string, string>;\n  request: Request;\n  rawRequest?: unknown;\n  url: URL;\n  headers: Headers;\n  method: string;\n  signal: AbortSignal;\n  layers?: Record<string, unknown>;\n};\n\ndefineLoader(handler, { runtime?: \"server\" | \"client\" | \"both\" })\ndefineServerLoader(handler)\n```"
        },
        {
          "id": "middleware-contract-reference",
          "title": "Middleware contract and order",
          "markdown": "-   Middleware can be declared globally, by plugins, on layouts, and on pages. Runtime-wide middleware runs first, then layout middleware from root to leaf, then page middleware.\n    \n-   Return nothing to continue. Return redirect to stop normal resolution; status defaults to 302 and only has an effect when redirect is present. Returning status alone does not block a route.\n    \n-   Middleware runtime defaults to both. Use `defineServerMiddleware` for `HttpOnly` cookies, secrets, databases, and server sessions.\n    \n-   Redirect targets are same-origin by default. External redirects require an explicit runtime opt-in and application validation.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype PageMiddleware = ((context: {\n  to: string;\n  from?: string;\n  params: Record<string, string>;\n  request: Request;\n  rawRequest?: unknown;\n  url: URL;\n  headers: Headers;\n  method: string;\n  signal: AbortSignal;\n}) => void | { redirect?: string; status?: number } | Promise<...>) & {\n  __tavo_middleware_options__?: { runtime?: \"server\" | \"client\" | \"both\" };\n};\n```"
        },
        {
          "id": "resource-reference",
          "title": "Component resource reference",
          "markdown": "-   A resource starts idle with null data, error, and `updatedAt`. A new load aborts the previous load.\n    \n-   preload deduplicates the current pending operation. load always starts a new one.\n    \n-   abort returns to idle, clears error and `updatedAt`, and preserves the last data. reset also clears data.\n    \n-   An aborted operation resolves to idle state even if the loader ignores its signal. Non-abort failures resolve to error state rather than throwing from load.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype ResourceState<T> = {\n  status: \"idle\" | \"loading\" | \"success\" | \"error\";\n  data: T | null;\n  error: unknown;\n  updatedAt: number | null;\n};\n\ntype Resource<T> = {\n  store: Store<ResourceState<T>>;\n  read(): ResourceState<T>;\n  load(options?: { signal?: AbortSignal }): Promise<ResourceState<T>>;\n  preload(options?: { signal?: AbortSignal }): Promise<ResourceState<T>>;\n  abort(reason?: unknown): void;\n  reset(): void;\n};\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:route-data-lifecycle",
      "section": "core",
      "slug": "route-data-lifecycle",
      "title": "Route data lifecycle",
      "description": "Follow middleware, layout loaders, page loaders, pending UI, cancellation, and layer data through one route resolution.",
      "keywords": [
        "loaders",
        "middleware",
        "layers",
        "layerData",
        "pending",
        "AbortSignal",
        "notFound"
      ],
      "kind": "reference",
      "prerequisites": [
        "A route with a page module and, optionally, directory layouts.",
        "Familiarity with Fetch Request, Response, URL, Headers, and AbortSignal."
      ],
      "outcomes": [
        "Predict middleware and loader order.",
        "Use the exact layer names available to loaders and components.",
        "Handle cancellation and each loader failure at the correct boundary."
      ],
      "runtime": [
        "server",
        "browser"
      ],
      "related": [
        {
          "title": "Data and middleware",
          "href": "/docs/core/data-and-middleware",
          "description": "See the broader data-fetching guide."
        },
        {
          "title": "Navigation and route state",
          "href": "/docs/core/navigation-and-route-state",
          "description": "Observe the client resolution state machine."
        }
      ],
      "canonicalPath": "/docs/core/route-data-lifecycle",
      "sections": [
        {
          "id": "request-order",
          "title": "Follow the route resolution order",
          "markdown": "**Reference Reference snippet**\n\n```text\nmatched route\n  → runtime-wide middleware\n  → plugin middleware\n  → root and layout middleware, outer to inner\n  → page middleware\n  → root and layout loaders, outer to inner\n  → page pending UI, only for eligible client navigation\n  → page loader\n  → layout and page head\n  → page or page error, wrapped by resolved layouts\n```\n\n-   Middleware may continue or redirect before data work starts. A redirect stops normal route resolution.\n    \n-   Layout loaders run sequentially from outermost to innermost. The page loader runs last.\n    \n-   Pending renders only during an active client navigation with a client-eligible page loader and no layout-loader error.\n    \n-   SSR, static generation, prefetching, fresh resolved-cache hits, and routes without pending do not render page pending UI."
        },
        {
          "id": "context",
          "title": "Use the portable request context",
          "markdown": "Loaders implement [`PageLoader`](/docs/core/api/router#api-tavojs-core-router--pageloader \"View PageLoader in the Core API reference\") and receive one [`PageLoadContext`](/docs/core/api/router#api-tavojs-core-router--pageloadcontext \"View PageLoadContext in the Core API reference\"). The same portable request fields are inherited by [`PageActionContext`](/docs/core/api/router#api-tavojs-core-router--pageactioncontext \"View PageActionContext in the Core API reference\").\n\n**Reference PageLoadContext**\n\n```ts\ntype PageLoadContext = {\n  pathname: string;\n  params: Record<string, string>;\n  request: Request;\n  rawRequest?: unknown;\n  url: URL;\n  headers: Headers;\n  method: string;\n  signal: AbortSignal;\n  layers?: Record<string, unknown>;\n};\n```\n\n-   request, url, headers, and signal are portable Fetch APIs and work across supported server and browser execution.\n    \n-   Build application-relative URLs with new URL(path, url), then pass signal to fetch and every abort-aware dependency.\n    \n-   Use `rawRequest` only at an adapter integration boundary. It is not portable application state.\n    \n-   A loader runs in both environments unless `defineLoader` selects another runtime. Use `defineServerLoader` for secrets, databases, server sessions, and `HttpOnly` cookies.\n    \n-   Treat params and request data as untrusted input even when the route pattern constrained their shape."
        },
        {
          "id": "layer-names",
          "title": "Distinguish loader layers from component layers",
          "markdown": "The same resolved data is exposed in two shapes for different jobs. Loader context uses the property name layers for a keyed record of successful earlier layout results. Component props use layers for the ordered diagnostic list and layerData for the keyed record.\n\nPublic contract\n\nProperty\n\nShape\n\nContents\n\n[`PageLoadContext`](/docs/core/api/router#api-tavojs-core-router--pageloadcontext)\n\n`layers`\n\n`Record<string, unknown>`\n\nSuccessful earlier layout results only.\n\n[`PageProps`](/docs/core/api/router#api-tavojs-core-router--pageprops) `/` [`PagePendingProps`](/docs/core/api/router#api-tavojs-core-router--pagependingprops) `/` [`PageErrorProps`](/docs/core/api/router#api-tavojs-core-router--pageerrorprops)\n\n`layers`\n\n`RouteDataLayer[]`\n\nOrdered layout layers and, after completion, the page layer; each has id, kind, data, and error.\n\n[`PageProps`](/docs/core/api/router#api-tavojs-core-router--pageprops) `/` [`PagePendingProps`](/docs/core/api/router#api-tavojs-core-router--pagependingprops) `/` [`PageErrorProps`](/docs/core/api/router#api-tavojs-core-router--pageerrorprops)\n\n`layerData`\n\n`Record<string, unknown>`\n\nSuccessful results keyed by layer ID.\n\n-   The current root layer ID is \\_root.\n    \n-   A directory layout ID is its src/pages-relative directory key. The root directory layout is /; `src/pages/projects/_layout.tsx` is projects; route-group names remain in the key.\n    \n-   The page layer ID is the compiled route path, such as /projects/:id.\n    \n-   A failed loader remains in the ordered layers array but is omitted from the successful `layerData` record.\n    \n\n**Reference src/pages/projects/[id].tsx**\n\n```tsx\nimport type {\n  PageLoadContext,\n  PageProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Workspace = { id: string };\ntype Project = { id: string; name: string };\n\nexport async function load({\n  params,\n  layers,\n  signal,\n  url\n}: PageLoadContext): Promise<Project> {\n  const workspace = layers?.projects as Workspace | undefined;\n  const response = await fetch(\n    new URL(\n      `/api/workspaces/${workspace?.id}/projects/${params.id}`,\n      url\n    ),\n    { signal }\n  );\n  if (!response.ok) {\n    throw new Error(\"Could not load project\");\n  }\n  return response.json() as Promise<Project>;\n}\n\nexport default function ProjectPage({\n  data,\n  layerData\n}: PageProps<Project, { id: string }>) {\n  const workspace = layerData?.projects as Workspace | undefined;\n  return (\n    <Page>\n      <Text>{workspace?.id}: {data?.name}</Text>\n    </Page>\n  );\n}\n```\n\n**Layer IDs are framework identities**\n\nDirectory moves and route-group renames can change layout IDs. Keep cross-layout reads local and deliberate, and cover each expected key with route inspection and integration tests."
        },
        {
          "id": "failure-cancellation",
          "title": "Handle failure and cancellation separately",
          "markdown": "-   A layout-loader failure is stored on that layout layer. The failed value is not added to downstream `context.layers`, descendants continue, and the layout receives its own data and error props.\n    \n-   A page-loader failure renders the page's error export when present, then `src/pages/_error.tsx`. The response defaults to status 500 unless head selects another status.\n    \n-   `notFound`() from middleware or any loader stops normal output, renders `404.tsx`, and returns status 404.\n    \n-   A superseding navigation aborts obsolete work. Pass signal onward and do not translate `AbortError` into user-facing route failure UI.\n    \n-   A server-only loader is skipped during browser resolution; design the browser path so it already has the required hydrated or independently fetched data.\n    \n\n**Reference src/pages/projects/[id].tsx — failure exports**\n\n```tsx\nimport {\n  notFound,\n  type PageErrorProps,\n  type PagePendingProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype ProjectParams = { id: string };\n\nexport async function load({ params, signal, url }) {\n  const response = await fetch(\n    new URL(`/api/projects/${params.id}`, url),\n    { signal }\n  );\n  if (response.status === 404) {\n    notFound();\n  }\n  if (!response.ok) {\n    throw new Error(\"Could not load project\");\n  }\n  return response.json();\n}\n\nexport function pending({\n  params\n}: PagePendingProps<ProjectParams>) {\n  return (\n    <Page aria-busy=\"true\">\n      <Text>Loading project {params.id}…</Text>\n    </Page>\n  );\n}\n\nexport function error({\n  pathname\n}: PageErrorProps<ProjectParams>) {\n  return (\n    <Page>\n      <Text role=\"alert\">\n        Could not load {pathname}.\n      </Text>\n    </Page>\n  );\n}\n```"
        },
        {
          "id": "middleware",
          "title": "Keep middleware decisions small and auditable",
          "markdown": "A route middleware export implements [`PageMiddleware`](/docs/core/api/router#api-tavojs-core-router--pagemiddleware \"View PageMiddleware in the Core API reference\"). Use [`defineMiddleware`](/docs/core/api/router#api-tavojs-core-router--definemiddleware \"View defineMiddleware in the Core API reference\") for portable work and [`defineServerMiddleware`](/docs/core/api/router#api-tavojs-core-router--defineservermiddleware \"View defineServerMiddleware in the Core API reference\") when the decision requires server-only state.\n\n**Reference src/pages/account/_layout.tsx — named export**\n\n```ts\nimport {\n  defineServerMiddleware\n} from \"@tavojs/core/router\";\n\nexport const middleware = defineServerMiddleware(\n  async ({ request, signal }) => {\n    signal.throwIfAborted();\n    const { readAuthenticatedUser } = await import(\"src/server/auth\");\n    const user = await readAuthenticatedUser(request, { signal });\n    if (!user) {\n      return {\n        redirect: \"/sign-in\",\n        status: 302\n      };\n    }\n  }\n);\n```\n\n-   Middleware runtime defaults to both. Use `defineServerMiddleware` whenever the decision reads secrets or server-only credentials.\n    \n-   Return nothing to continue. Return redirect to stop resolution; its status defaults to 302.\n    \n-   A status without redirect does not block or replace the route.\n    \n-   External redirects are disabled by default. Keep them disabled for targets derived from request data."
        },
        {
          "id": "verification",
          "title": "Verify order, layers, and cancellation",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo inspect route /projects/example --json\nnpx tavo check\nnpx tavo build\n```\n\nTest successful layout and page loads, each loader failing independently, notFound(), a redirect, and an aborted slow navigation. Assert both response status and the exact visible boundary rather than checking only rendered text."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:actions-and-forms",
      "section": "core",
      "slug": "actions-and-forms",
      "title": "Actions, forms, and validation",
      "description": "Handle mutations with route actions, schema validation, explicit response shapes, and server-owned sessions.",
      "keywords": [
        "action",
        "form",
        "validation",
        "session"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Handle mutations with route actions, schema validation, explicit response shapes, and server-owned sessions."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/actions-and-forms",
      "sections": [
        {
          "id": "mutation-boundary",
          "title": "Put server mutations in actions",
          "markdown": "A route action handles non-GET requests in SSR mode. Parse the normalized Fetch Request, authorize the caller, perform the mutation, and return JSON, status, headers, or a redirect.\n\n**Merge src/pages/projects/index.tsx — merge this action export**\n\n```ts\nimport { defineAction } from \"@tavojs/core/router\";\n\nexport const action = defineAction(async ({ request }) => {\n  const form = await request.formData();\n  const name = String(form.get(\"name\") ?? \"\").trim();\n  if (!name) {\n    return { status: 400, json: { error: \"Project name is required\" } };\n  }\n\n  return {\n    status: 201,\n    json: { id: crypto.randomUUID(), name }\n  };\n});\n```"
        },
        {
          "id": "validated-actions",
          "title": "Validate input before business logic",
          "markdown": "`Tavo.js` accepts Standard Schema validators and common parse contracts. `defineValidatedAction` parses JSON or form input, returns HTTP 400 for invalid input, and passes typed input to the handler.\n\n**Merge src/pages/projects/new.tsx — merge this action export**\n\n```ts\nimport { defineValidatedAction } from \"@tavojs/core/dev\";\n\ntype ProjectInput = { name: string };\ntype ProjectParseResult =\n  | { success: true; data: ProjectInput }\n  | { success: false; error: { issues: Array<{ message: string; path: string[] }> } };\n\nconst projectSchema = {\n  safeParse(value: unknown): ProjectParseResult {\n    const name =\n      value && typeof value === \"object\"\n        ? (value as Record<string, unknown>).name\n        : undefined;\n    if (typeof name !== \"string\" || name.trim().length < 2) {\n      return {\n        success: false,\n        error: {\n          issues: [{\n            message: \"Project name must contain at least two characters\",\n            path: [\"name\"]\n          }]\n        }\n      };\n    }\n    return { success: true, data: { name: name.trim() } };\n  }\n};\n\nexport const action = defineValidatedAction(projectSchema, async ({ input }) => {\n  return {\n    status: 201,\n    json: { id: crypto.randomUUID(), name: input.name }\n  };\n});\n```"
        },
        {
          "id": "security-order",
          "title": "Use a safe mutation order",
          "markdown": "-   Validate the input shape.\n    \n-   Authenticate and authorize the request.\n    \n-   Apply origin, CSRF, and idempotency rules appropriate to the endpoint.\n    \n-   Commit the database or external side effect.\n    \n-   Return only safe response data.\n    \n\n**Validation is not authorization**\n\nA valid payload can still come from the wrong user. Keep permissions and session checks inside the server action before state changes."
        },
        {
          "id": "route-action-reference",
          "title": "Route action contract",
          "markdown": "-   Route actions handle non-GET requests during SSR route handling. The context is the same portable request context used by loaders.\n    \n-   Return a Response directly or an `ActionResult`. redirect creates a Location response; json serializes a JSON body; status and headers customize the response.\n    \n-   Unsafe methods validate browser Origin by default. Set `validateOrigin`: false only for endpoints with independent authentication such as signed webhooks.\n    \n-   When `contentType` is declared, a mismatched request receives 415 Unsupported Media Type before the handler runs.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype ActionResult = {\n  body?: BodyInit | null;\n  headers?: HeadersInit | Record<string, string | string[]>;\n  json?: unknown;\n  redirect?: string;\n  status?: number;\n};\n\ndefineAction(handler, {\n  contentType?: \"form-data\" | \"json\";\n  validateOrigin?: boolean;\n});\n```"
        },
        {
          "id": "action-primitive-reference",
          "title": "Client action state",
          "markdown": "-   run aborts an older run and resolves to the final `ActionState`. Handler failures become error state; run does not rethrow them.\n    \n-   abort returns to idle, clears error and `completedAt`, and preserves existing data. reset aborts and clears the complete state.\n    \n-   Subscribe through `action.store` or a controller's listen/select helpers.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype ActionState<TResult> = {\n  status: \"idle\" | \"running\" | \"success\" | \"error\";\n  data: TResult | null;\n  error: unknown;\n  submittedAt: number | null;\n  completedAt: number | null;\n};\n\nconst save = createAction(async ({ input, signal }) => saveProject(input, { signal }));\nsave.store;        // observable Store<ActionState<TResult>>\nsave.getState();\nawait save.run(input);\nsave.abort();\nsave.reset();\n```"
        },
        {
          "id": "form-action-reference",
          "title": "Form helpers and transport defaults",
          "markdown": "-   Repeated `FormData` field names become arrays; single fields remain one `FormDataEntryValue`.\n    \n-   Server forms default to POST, multipart `FormData`, and same-origin credentials. JSON mode adds application/json unless a content type already exists.\n    \n-   The default parser throws for a non-ok response, otherwise returns JSON when declared by the response and text for other content types.\n    \n-   body and `contentType` may be selected by boot mode. A redirected browser response is followed with `window.location.assign`.\n    \n\n**Reference Reference snippet**\n\n```ts\nformDataToObject(data: FormData): FormValues\ncreateFormAction(handler): FormAction<TResult>\ncreateServerFormAction(url, {\n  body?: \"form-data\" | \"json\" | ((values, context) => BodyInit);\n  contentType?: \"form-data\" | \"json\";\n  credentials?: RequestCredentials;\n  fetch?: typeof fetch;\n  headers?: HeadersInit;\n  method?: string;\n  parseResponse?: (response: Response) => MaybePromise<TResult>;\n}): FormAction<TResult>\n\ntype FormAction<TResult> = {\n  action: Action<FormValues, TResult>;\n  store: Store<FormState<TResult>>;\n  submit(form: HTMLFormElement | FormData | FormValues): Promise<FormState<TResult>>;\n  reset(): void;\n};\n```"
        },
        {
          "id": "validation-reference",
          "title": "Validation schemas and failures",
          "markdown": "`validateInput` accepts Standard Schema, `safeParse` or `safeParseAsync`, and parse or `parseAsync` contracts. `defineValidatedAction` reads JSON when Content-Type includes application/json and otherwise converts `FormData` while preserving repeated fields.\n\n**Reference Reference snippet**\n\n```ts\nconst result = await validateInput(schema, unknownInput);\n// { ok: true, value } | { ok: false, issues: [{ message, path? }] }\n\nexport const action = defineValidatedAction(schema, async ({ input, request }) => {\n  await authorize(request, input);\n  return { status: 201, json: await createRecord(input) };\n});\n\n// Invalid input response, status 400:\n// { error: \"validation_failed\", issues: [{ message, path? }] }\n```\n\n**Validation is not authorization**\n\nSchema validation proves the payload shape only. Authenticate, authorize, apply CSRF or idempotency rules, and then commit the mutation inside the server action."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:route-actions-and-csr-forms",
      "section": "core",
      "slug": "route-actions-and-csr-forms",
      "title": "Route actions and CSR forms",
      "description": "Handle mutations with route actions, predictable response defaults, origin checks, and explicit pure-CSR form transport.",
      "keywords": [
        "actions",
        "forms",
        "CSR",
        "POST",
        "origin",
        "content type",
        "redirect"
      ],
      "kind": "reference",
      "prerequisites": [
        "A route that accepts a non-GET request.",
        "Understanding of HTTP methods, status codes, origins, and form encoding."
      ],
      "outcomes": [
        "Return the intended HTTP response from every action result form.",
        "Preserve origin, content-type, authentication, and authorization checks.",
        "Configure form transport for a pure CSR deployment without double handling."
      ],
      "runtime": [
        "server",
        "browser"
      ],
      "related": [
        {
          "title": "Actions and forms",
          "href": "/docs/core/actions-and-forms",
          "description": "Learn form state, validation, and reusable action helpers."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Harden request origins, sessions, CSP, and output."
        }
      ],
      "canonicalPath": "/docs/core/route-actions-and-csr-forms",
      "sections": [
        {
          "id": "server-action",
          "title": "Define the mutation beside its route",
          "markdown": "A route action implements [`PageAction`](/docs/core/api/router#api-tavojs-core-router--pageaction \"View PageAction in the Core API reference\"), receives [`PageActionContext`](/docs/core/api/router#api-tavojs-core-router--pageactioncontext \"View PageActionContext in the Core API reference\"), and may return a native Response or the documented data, redirect, or error object forms. [`defineAction`](/docs/core/api/router#api-tavojs-core-router--defineaction \"View defineAction in the Core API reference\") adds origin and content-type policy to that handler.\n\n**Reference src/pages/projects/new.tsx**\n\n```tsx\nimport {\n  defineAction,\n  type PageActionContext\n} from \"@tavojs/core/router\";\nimport { Button, Page, Stack, TextField } from \"@tavojs/ui\";\ntype NewProjectInput = { name: string };\n\nexport const action = defineAction(\n  async ({ request }: PageActionContext) => {\n    const {\n      authorizeProjectCreation,\n      createProject,\n      requireUser\n    } = await import(\"src/server/projects\");\n    const form = await request.formData();\n    const input: NewProjectInput = {\n      name: String(form.get(\"name\") ?? \"\").trim()\n    };\n\n    const user = await requireUser(request);\n    authorizeProjectCreation(user);\n    const project = await createProject(input);\n\n    return {\n      redirect: `/projects/${project.id}`\n    };\n  },\n  {\n    contentType: \"form-data\"\n  }\n);\n\nexport default function NewProjectPage() {\n  return (\n    <Page>\n      <form method=\"post\">\n        <Stack>\n          <TextField name=\"name\" label=\"Project name\" required />\n          <Button type=\"submit\">Create project</Button>\n        </Stack>\n      </form>\n    </Page>\n  );\n}\n```\n\n-   The Node route handler sends non-GET and non-HEAD requests to the matched page action before normal page rendering.\n    \n-   If the route has no action, the handler returns 405 Method Not Allowed with Allow: GET, HEAD.\n    \n-   A body above the configured request limit returns 413. An unhandled action failure becomes a generic 500 response.\n    \n-   Return a Response to control the full response, or return an `ActionResult` for `Tavo.js` to normalize and harden."
        },
        {
          "id": "response-defaults",
          "title": "Know the action response defaults",
          "markdown": "Handler result\n\nDefault response\n\n`undefined`\n\n204 with an empty body\n\n`{ redirect }`\n\n303 with Location\n\n`{ json }`\n\n200 with application/json; charset=utf-8 and a serialized body\n\n`{ body }`\n\n200 when body is present; otherwise 204\n\n`Response`\n\nIts status, body, and headers are preserved; default security headers are added when absent\n\nAn explicit status or headers value in these object forms overrides the corresponding default. External redirect targets are rejected unless the runtime explicitly enables them; validate any user-derived redirect again at the application boundary."
        },
        {
          "id": "request-safety",
          "title": "Apply transport checks before business logic",
          "markdown": "-   Unsafe action methods validate Origin against the request origin by default. Node-like requests also require a local or configured trusted host.\n    \n-   Do not set `validateOrigin`: false for a browser form. Reserve it for endpoints with an independent authenticity mechanism, such as a verified webhook signature.\n    \n-   `contentType`: \"json\" accepts application/json and +json media types. `contentType`: \"form-data\" accepts multipart/form-data and application/x-www-form-urlencoded.\n    \n-   A declared content-type mismatch returns 415 before the handler runs.\n    \n-   Parsing or schema validation proves shape, not identity or permission. Authenticate, authorize, enforce CSRF or idempotency policy, and then commit the mutation.\n    \n-   Do not return secrets, private exception messages, or raw database failures in action bodies.\n    \n\n**Trusted hosts are not user authorization**\n\ntrustedHosts establishes which request host is acceptable for origin comparison. It does not authenticate the caller or grant permission to mutate a record."
        },
        {
          "id": "csr-transport",
          "title": "Configure delegated forms only for pure CSR boot",
          "markdown": "In a server-rendered document, a normal form posts to its matched route action. A pure CSR document can opt into delegated action transport through [`bootTavo`](/docs/core/api/application#api-tavojs-core--boottavo \"View bootTavo in the Core API reference\") and its `csrActions` option so the browser submits to an available backend endpoint.\n\n**Reference src/main.tsx — pure CSR entry**\n\n```tsx\nimport { bootTavo } from \"@tavojs/core\";\n\nvoid bootTavo({\n  csrActions: {\n    enabled: true,\n    baseUrl: \"https://api.example.com\",\n    credentials: \"include\",\n    headers: {\n      \"X-Requested-With\": \"Tavo.js\"\n    }\n  }\n});\n```\n\n**Reference CsrActionsOptions — developer-supplied callbacks**\n\n```ts\ntype CsrActionContext = {\n  pathname: string;\n  search: string;\n  form?: HTMLFormElement;\n};\n\ntype CsrActionsOptions = {\n  enabled?: boolean;\n  baseUrl?: string;\n  resolveUrl?: (context: CsrActionContext) => string;\n  credentials?: RequestCredentials;\n  headers?:\n    | HeadersInit\n    | ((context: {\n        pathname: string;\n        form: HTMLFormElement;\n      }) => HeadersInit);\n};\n```\n\n-   Delegation applies to non-GET, same-window forms that are not explicitly external.\n    \n-   The browser sends `FormData` with the form method. credentials defaults to include when not configured.\n    \n-   `data-tavo-native` opts one form out so the browser performs its native submission.\n    \n-   A same-origin redirect becomes replace navigation. Other redirect destinations use a full browser navigation.\n    \n-   CSR action delegation is not enabled during SSR hydration. This prevents the hydrated application from installing a competing form transport.\n    \n-   A pure CSR form without `csrActions` emits a development warning unless it is marked `data-tavo-native`.\n    \n\n**CORS does not replace action security**\n\nA cross-origin CSR backend must deliberately allow the app origin and credentials. The action still needs origin or signature validation, authentication, authorization, and safe cookie settings."
        },
        {
          "id": "verification",
          "title": "Verify the complete mutation path",
          "markdown": "-   Submit valid multipart and URL-encoded forms, then test the wrong media type and expect 415.\n    \n-   Send a missing or cross-origin Origin header according to the deployment contract and verify 403 where required.\n    \n-   Verify no action returns 405, an oversized body returns 413, and internal failures return a generic 500.\n    \n-   Test redirect, JSON, body, empty, and direct Response results with their exact status and headers.\n    \n-   For pure CSR, verify endpoint mapping, credentials, native opt-out, same-origin replace navigation, and full external navigation.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo inspect route /projects/new --json\nnpx tavo build\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:mvc",
      "section": "core",
      "slug": "mvc",
      "title": "MVC components",
      "description": "Separate local reactive state, business behavior, and TSX rendering with createTavo.",
      "keywords": [
        "createTavo",
        "controller",
        "model",
        "lifecycle"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Separate local reactive state, business behavior, and TSX rendering with createTavo."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/mvc",
      "sections": [
        {
          "id": "mental-model",
          "title": "Give each concern one home",
          "markdown": "A `Tavo.js` component has an optional model, an optional controller, and a required view. The model stores renderable local state, the controller coordinates behavior and side effects, and the view describes output from props and state.\n\n-   Render-only components can provide only a view.\n    \n-   Small interactions can patch the model directly.\n    \n-   Use a controller when behavior needs lifecycle, services, stores, routing, refs, or managed cleanup."
        },
        {
          "id": "controller-example",
          "title": "Build a controller-backed component",
          "markdown": "Controllers receive the component model and current props automatically. They also have access to page, router, stores, and services supplied by the runtime.\n\n**Create src/components/Counter.tsx — create this component**\n\n```tsx\nimport { createTavo, TavoController } from \"@tavojs/core\";\nimport { Button } from \"@tavojs/ui\";\n\nclass CounterController extends TavoController {\n  increment() {\n    this.model.patch((state) => ({ count: state.count + 1 }));\n  }\n}\n\nexport const Counter = createTavo({\n  model: () => ({ count: 0 }),\n  controller: CounterController,\n  view: ({ state, controller }) => (\n    <Button onClick={() => controller?.increment()}>Count: {state.count}</Button>\n  )\n});\n```"
        },
        {
          "id": "lifecycle-and-cleanup",
          "title": "Own lifecycle work",
          "markdown": "Use `onInit` for subscriptions and initial model work, `onMount` or `onLayout` for DOM-dependent behavior, `afterRender` for post-commit work, and `onPropsChange` for explicit prop reactions.\n\n**Reference src/components/Clock/controller.ts**\n\n```ts\nimport { TavoController } from \"@tavojs/core\";\n\nexport class ClockController extends TavoController {\n  onMount() {\n    const timer = window.setInterval(() => {\n      this.model.patch({ now: new Date() });\n    }, 1000);\n\n    return () => window.clearInterval(timer);\n  }\n}\n```\n\n**Cleanup is part of the feature**\n\nReturn cleanup from mount methods or register it with this.cleanup(). Prefer controller helpers such as listen, select, observeResize, and observeIntersection so teardown follows the component lifecycle."
        },
        {
          "id": "definition-contract",
          "title": "Understand the complete createTavo contract",
          "markdown": "[`createTavo`](/docs/core/api/application#api-tavojs-core--createtavo \"View createTavo in the Core API reference\") returns a typed component. Only view is required. A model owns reactive state, while a controller owns behavior and managed side effects. Each mounted component keeps one model and one controller instance across rerenders.\n\n**Reference Reference snippet**\n\n```ts\ncreateTavo<Props, State, Controller>({\n  model?: (props: Props) => State | Store<State>,\n  controller?: new (ctx: MvcControllerContext<Props, State>) => Controller,\n  createController?: (ctx: MvcControllerContext<Props, State>) => Controller,\n  view: (ctx: {\n    props: Props;\n    state: State;\n    model: Store<State>;\n    controller: Controller | null;\n  }) => Child\n}): Component<Props>\n```\n\n## model\n\nRuns once for a mounted component, using its initial props. Return a plain object for Tavo.js to wrap with createStore, or return an existing Store. When omitted, Tavo.js creates an empty Store.\n\n## controller\n\nA class constructor that receives the complete controller context. Use it for reusable behavior, lifecycle methods, and managed work.\n\n## createController\n\nA factory alternative for functional or object-based controllers. If both controller fields are supplied, the class controller is used.\n\n## view\n\nReceives current props, the state snapshot, the model Store, and the controller instance. Without a controller, controller is null.\n\n**Reference Reference snippet**\n\n```tsx\nimport { createTavo } from \"@tavojs/core\";\nimport { Button } from \"@tavojs/ui\";\n\nexport const Counter = createTavo({\n  model: ({ initial = 0 }: { initial?: number }) => ({ count: initial }),\n  view: ({ state, model }) => (\n    <Button onClick={() => model.set(\"count\", (count) => count + 1)}>\n      Count: {state.count}\n    </Button>\n  )\n});\n```\n\n**Initial props and current props are different concerns**\n\nmodel(props) runs only when the component instance is created. Use controller.props or onPropsChange when behavior must follow later prop updates."
        },
        {
          "id": "controller-context",
          "title": "Use the context injected into every controller",
          "markdown": "[`TavoController`](/docs/core/api/application#api-tavojs-core--tavocontroller \"View TavoController in the Core API reference\") receives six developer-facing context groups. They are also available on the ctx constructor argument and on controllers returned by createController.\n\nProperty\n\nValue\n\nUse\n\n`model`\n\n[`Store`](/docs/core/api/application#api-tavojs-core--store)`<``State``>`\n\nRead and update the component-local reactive model.\n\n`props`\n\n`Props`\n\nRead the latest props; Tavo.js refreshes them before each view call.\n\n`router`\n\n[`Router`](/docs/core/api/router#api-tavojs-core-router--router) `helpers`\n\nNavigate, update the URL, prefetch, and inspect available routes.\n\n`stores`\n\n`Global store registry`\n\nGet, test, and list stores previously created with defineGlobalStore.\n\n`services`\n\n`Service registry`\n\nGet, optionally resolve, test, and list named or typed services.\n\n`page`\n\n`Current route state`\n\nRead pathname, status, params, data, errors, and layout-layer data.\n\n**Reference Reference snippet**\n\n```ts\nclass ProjectController extends TavoController {\n  openSettings() {\n    this.router.navigate(`/projects/${this.page.params.id}/settings`);\n  }\n\n  rememberTab(tab: string) {\n    // Changes browser history without running route navigation or remounting.\n    this.router.pushUrl(`?tab=${encodeURIComponent(tab)}`);\n  }\n\n  prefetchReports(signal?: AbortSignal) {\n    return this.router.prefetch(\"/reports\", { signal });\n  }\n}\n```\n\nContext\n\nAvailable members\n\n`router`\n\n[`navigate`](/docs/core/api/router#api-tavojs-core-router--navigate)`(``to``,` `options``?``)``,` `pushUrl``(``to``)``,` `replaceUrl``(``to``)``,` `prefetch``(``pathname``,` `{` `signal``?` `}``?``)``,` `routes`\n\n`stores`\n\n`get<T>(name), has(name), list()`\n\n`services`\n\n`get<T>(identifier), tryGet<T>(identifier), has(identifier), list()`\n\n`page`\n\n`pathname, route, status, data, params, error, layers, layerData`\n\n**Lookup does not register**\n\nController stores and services expose lookup APIs only. Define a global store with defineGlobalStore and register a service before a controller resolves it. stores.get and services.get throw when a name is missing; services.tryGet returns undefined."
        },
        {
          "id": "managed-methods",
          "title": "Let the controller manage side effects",
          "markdown": "Controller helpers return unsubscribe functions. You can call one early to cancel the work; otherwise Tavo.js disposes it when the component is destroyed.\n\nMethod\n\nBehavior\n\n`cleanup(fn)`\n\nRegister any cleanup and receive an idempotent wrapped unsubscribe.\n\n`createId(prefix?)`\n\nCreate an instance-scoped sequential ID. The default prefix is id.\n\n`setTimeout(fn, delay?)`\n\nSchedule a timeout that is removed after firing and cancelled on destroy.\n\n`setInterval(fn, delay?)`\n\nSchedule an interval that is cancelled on destroy.\n\n`scheduleLayoutEffect(fn)`\n\nQueue managed microtask work that may return cleanup.\n\n`scheduleAfterRender(fn)`\n\nQueue one-shot microtask work and unregister after it runs.\n\n`scheduleOnMount(fn)`\n\nQueue managed mount work that may return cleanup.\n\n`listen(store, listener, options?)`\n\nSubscribe to a complete Tavo.js Store snapshot.\n\n`select(store, selector, listener, options?)`\n\nSubscribe to a selected value with optional equality.\n\n`watch(store, target, listener, options?)`\n\nWatch a key, nested path, or selector.\n\n`listenExternal(store, listener, options?)`\n\nSubscribe to an ExternalStore snapshot with optional equality.\n\n[`observeResize`](/docs/core/api/components-and-dom#api-tavojs-core--observeresize)`(``target``,` `listener``,` `options``?``)`\n\nCreate a managed ResizeObserver.\n\n[`observeIntersection`](/docs/core/api/components-and-dom#api-tavojs-core--observeintersection)`(``target``,` `listener``,` `options``?``)`\n\nCreate a managed IntersectionObserver.\n\n[`observeMutation`](/docs/core/api/components-and-dom#api-tavojs-core--observemutation)`(``target``,` `listener``,` `options``?``)`\n\nCreate a managed MutationObserver for a Node or ref object.\n\n`action(fn)`\n\nWrap sync or async work with reactive pending, result, and error state.\n\n**Reference Reference snippet**\n\n```tsx\nclass PanelController extends TavoController {\n  declare panel: { current: HTMLElement | null };\n\n  onMount() {\n    this.setInterval(() => this.refresh(), 30_000);\n    this.observeResize(this.panel, () => this.measure());\n    return this.listen(filters, (state) => this.applyFilters(state));\n  }\n\n  refresh() {}\n  measure() {}\n  applyFilters(_state: FilterState) {}\n}\n```"
        },
        {
          "id": "lifecycle-reference",
          "title": "Choose the lifecycle hook by timing",
          "markdown": "Hook\n\nWhen it runs\n\nReturn\n\nSSR\n\n`onInit()`\n\nOnce in the first passive mount task, immediately before onMount.\n\nNo\n\nNo\n\n`onMount()`\n\nOnce in the first passive mount task.\n\nMay return cleanup\n\nNo\n\n`onLayout()`\n\nAfter every client commit, before passive hooks.\n\nMay return cleanup\n\nNo\n\n`afterRender()`\n\nAs a passive task after every client commit.\n\nNo\n\nNo\n\n`onPropsChange(props)`\n\nInitial client render and later shallowly changed props.\n\nNo\n\nNo\n\n`onDestroy()`\n\nOnce during teardown, before managed controller cleanups flush.\n\nNo\n\nNo\n\nonLayout cleanup follows layout rerenders and unmount. An onMount cleanup is registered with the controller automatically. Controller props are updated synchronously before view renders; onPropsChange is the later passive notification and uses top-level shallow equality.\n\n**Reference Reference snippet**\n\n```ts\nclass DialogController extends TavoController {\n  onInit() {\n    this.model.patch({ phase: \"ready\" });\n  }\n\n  onLayout() {\n    const restore = captureFocusRestore();\n    return () => restore();\n  }\n\n  onMount() {\n    return this.listen(preferences, ({ reducedMotion }) => {\n      this.model.patch({ reducedMotion });\n    }, { immediate: true });\n  }\n\n  afterRender() {\n    // Observe the committed client view.\n  }\n\n  onPropsChange(props: DialogProps) {\n    if (!props.open) this.model.patch({ phase: \"closed\" });\n  }\n\n  onDestroy() {\n    // Final controller-owned work. Managed helpers are cleaned next.\n  }\n}\n```\n\n**What participates in server rendering**\n\nModel creation, controller construction, view rendering, and IDs created from the constructor context participate in SSR. Client lifecycle hooks, timers, observers, and DOM-dependent work do not."
        },
        {
          "id": "controller-actions",
          "title": "Represent async work with controller actions",
          "markdown": "**Reference Reference snippet**\n\n```tsx\nclass ProfileController extends TavoController {\n  save = this.action(async (name: string) => {\n    const response = await fetch(\"/api/profile\", {\n      method: \"POST\",\n      body: JSON.stringify({ name })\n    });\n    if (!response.ok) throw new Error(\"Could not save profile\");\n    return response.json() as Promise<{ name: string }>;\n  });\n}\n\nexport const Profile = createTavo({\n  controller: ProfileController,\n  view: ({ controller }) => <Stack>\n    <Button\n      loading={controller?.save.pending}\n      onClick={() => controller?.save.run(\"Ada\").catch(() => {})}\n    >\n      Save\n    </Button>\n    {controller?.save.error ? <Text color=\"danger\">Save failed</Text> : null}\n    {controller?.save.result ? <Text>Saved {controller.save.result.name}</Text> : null}\n  </Stack>\n});\n```\n\n-   An action starts with pending false, error null, and result null.\n    \n-   run sets pending true and clears error. It resolves with the function result or rethrows the caught error.\n    \n-   Only the most recently started run may update action state, so an older response cannot overwrite a newer one.\n    \n-   Starting another run keeps the previous result visible while pending.\n    \n-   reset clears pending, error, and result and prevents in-flight completions from changing action state.\n    \n-   Every action-state transition rerenders the owning MVC component.\n    \n\n**Actions are safe as class fields**\n\naction is the one TavoController helper designed to run from a class-field initializer before normal controller attachment. Await or catch run because rejected work is rethrown to its caller."
        },
        {
          "id": "controller-construction",
          "title": "Use constructor context before attachment",
          "markdown": "Tavo.js constructs a class with the complete ctx argument, then attaches model, props, framework context, and managed methods to the instance. Use ctx for constructor-time IDs or reads. Use this.model, this.props, and the other instance helpers from lifecycle hooks and normal methods.\n\n**Reference Reference snippet**\n\n```tsx\nimport { Box, TextInput } from \"@tavojs/ui\";\n\nclass FieldController extends TavoController {\n  id: string;\n\n  constructor(ctx: { createId(prefix?: string): string }) {\n    super();\n    this.id = ctx.createId(\"field\");\n  }\n}\n\nexport const Field = createTavo<Record<string, never>, Record<string, never>, FieldController>({\n  controller: FieldController,\n  view: ({ controller }) => (\n    <Box as=\"label\" for={controller?.id}>\n      Email\n      <TextInput id={controller?.id} type=\"email\" />\n    </Box>\n  )\n});\n```\n\n**Do not call most this helpers in the constructor**\n\nthis.createId, cleanup, timers, schedulers, listeners, and observers are unavailable until createTavo finishes attachment and will throw. Use ctx in the constructor, or move the work to a lifecycle hook."
        },
        {
          "id": "mvc-common-mistakes",
          "title": "Avoid common MVC mistakes",
          "markdown": "## Recreating state from new props\n\nmodel runs once per component instance. React to later props through current controller.props or onPropsChange.\n\n## Leaking manual subscriptions\n\nPrefer listen, select, watch, listenExternal, and observer helpers. Otherwise pass the unsubscribe to cleanup.\n\n## Using URL updates as navigation\n\npushUrl and replaceUrl only change browser history. Use navigate when the application should resolve and render another route.\n\n## Ignoring action rejection\n\nAction error state is reactive, but run still rejects. Await it in a try/catch or attach a catch handler from an event callback.\n\n## Doing DOM work during SSR\n\nPut element measurement, focus, observers, and browser timers in onLayout or onMount rather than constructors or model factories.\n\n## Duplicating model state\n\nRead renderable state from view.state and mutate through view.model or controller.model instead of copying snapshots into controller fields."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:stores",
      "section": "core",
      "slug": "stores",
      "title": "Stores",
      "description": "Model shared state with explicit actions, precise subscriptions, derived values, and optional persistence.",
      "keywords": [
        "state",
        "store",
        "computed",
        "persist"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Model shared state with explicit actions, precise subscriptions, derived values, and optional persistence."
      ],
      "runtime": [
        "browser"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/stores",
      "sections": [
        {
          "id": "store-shape",
          "title": "Keep state and mutations together",
          "markdown": "`createStore` accepts an object or an initializer. Prefer an initializer when the store owns actions: callers then express intent through methods instead of coordinating partial state writes throughout the application.\n\n**Create src/stores/filters.ts — create this store**\n\n```ts\nimport { createStore } from \"@tavojs/core\";\n\nexport const filters = createStore((set, get) => ({\n  status: \"all\",\n  setStatus(status: string) { set({ status }); },\n  reset() { set({ status: \"all\" }); },\n  isActive() { return get().status !== \"all\"; }\n}));\n```"
        },
        {
          "id": "updates-and-subscriptions",
          "title": "Subscribe to the smallest useful value",
          "markdown": "Use patch for top-level partial updates, set for a key or nested path, and `setState` only when replacing the complete state value. `subscribeSelector` and watch prevent unrelated changes from waking application behavior.\n\n**Reference src/stores/filters.ts — append while learning subscriptions**\n\n```ts\nconst stop = filters.subscribeSelector(\n  (state) => state.status,\n  (nextStatus, previousStatus) => console.log({ nextStatus, previousStatus })\n);\n\nfilters.set(\"status\", \"active\");\nstop();\n```"
        },
        {
          "id": "scope-and-derived-state",
          "title": "Choose the correct scope",
          "markdown": "Use a component model for state owned by one component, a global store for client state shared across routes, and a computed store for a derived value consumed by multiple subscribers.\n\n**SSR safety**\n\nGlobal stores are process-wide on the server. Never place the current request user, session, token, tenant, or permissions in them. Return safe request data from a server loader instead."
        },
        {
          "id": "store-contract",
          "title": "Use the complete Store contract",
          "markdown": "**Reference Reference snippet**\n\n```ts\ntype Store<State> = {\n  getState(): State;\n  setState(next: State | ((previous: State) => State)): State;\n  set(path, valueOrUpdater): State;\n  patch(partial: Partial<State> | ((previous: State) => Partial<State>)): State;\n  subscribe(listener, options?): Unsubscribe;\n  subscribeSelector(selector, listener, options?): Unsubscribe;\n  watch(pathOrSelector, listener, options?): Unsubscribe;\n};\n```\n\nMethod\n\nUse it to\n\n`getState()`\n\nRead the current complete snapshot.\n\n`setState(next)`\n\nReplace the complete state with a value or updater result.\n\n`patch(partial)`\n\nShallow-merge a top-level partial value or updater result.\n\n`set(path, value)`\n\nImmutably update one key or nested path; the updater receives the previous value and whole state.\n\n`subscribe(listener)`\n\nObserve every emitted complete-state write.\n\n`subscribeSelector(selector, listener)`\n\nObserve a computed selection and ignore equal results.\n\n`watch(target, listener)`\n\nObserve a key, nested path, or selector with complete previous-state context.\n\n**Reference Reference snippet**\n\n```ts\nconst settings = createStore({\n  theme: \"system\" as \"light\" | \"dark\" | \"system\",\n  profile: { name: \"Ada\", notifications: true }\n});\n\nsettings.set(\"theme\", \"dark\");\nsettings.set(\"profile.notifications\", (enabled) => !enabled);\nsettings.patch((state) => ({\n  profile: { ...state.profile, name: \"Grace\" }\n}));\nsettings.setState({\n  theme: \"system\",\n  profile: { name: \"Ada\", notifications: true }\n});\n```\n\n**Replacement and patching are not interchangeable**\n\nsetState replaces the entire state. patch merges only the top level. set clones the containers on one path. All update methods return the resulting snapshot."
        },
        {
          "id": "store-initializers",
          "title": "Keep state and actions together",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport { createStore } from \"@tavojs/core\";\n\nexport const cart = createStore((set, get) => ({\n  items: [] as Array<{ id: string; quantity: number }>,\n\n  add(id: string) {\n    const current = get().items;\n    set({ items: [...current, { id, quantity: 1 }] });\n  },\n\n  clear() {\n    set({ items: [] });\n  }\n}));\n\ncart.getState().add(\"keyboard\");\n```\n\nIn an initializer, set is the Store's top-level patch function and get reads the complete snapshot. Capture them in action methods that run later. Action functions remain part of the Store state at runtime.\n\n**Do not call set or get while creating initial state**\n\nThe Store is not initialized until the initializer returns. Calling set() or get() synchronously inside the initializer throws. Defining methods that call them later is the intended pattern."
        },
        {
          "id": "nested-store-paths",
          "title": "Update nested paths immutably",
          "markdown": "**Reference Reference snippet**\n\n```ts\nconst board = createStore({\n  columns: [\n    { title: \"Todo\", cards: [{ id: \"a\", done: false }] }\n  ]\n});\n\nboard.set([\"columns\", 0, \"title\"], \"In progress\");\nboard.set([\"columns\", 0, \"cards\", 0, \"done\"], true);\nboard.set(\"columns.0.cards.0.done\", (done) => !done);\n```\n\n-   set accepts a top-level key, a dot-separated path, a number, or a readonly segment array.\n    \n-   The updater receives the previous selected value and the complete state.\n    \n-   `Tavo.js` clones every ancestor on the path and preserves unrelated references.\n    \n-   Missing containers become arrays when the next segment is numeric and objects otherwise.\n    \n-   If the selected value is unchanged under `Object.is`, `Tavo.js` returns the original state and emits nothing.\n    \n-   A real top-level key containing dots takes precedence over interpreting that string as a path.\n    \n\n**Unsafe path segments are rejected**\n\n\\_\\_proto\\_\\_, prototype, and constructor are not allowed in Store paths. This prevents nested writes from becoming prototype pollution."
        },
        {
          "id": "store-subscriptions",
          "title": "Subscribe at the smallest useful level",
          "markdown": "API\n\nTarget\n\nListener\n\nNotification\n\n`subscribe`\n\nComplete state\n\n`(state, previousState)`\n\nEvery emitted write\n\n`subscribeSelector`\n\nSelector\n\n`(selected, previousSelected, state)`\n\nObject.is by default\n\n`watch`\n\nKey, path, or selector\n\n`(selected, previousSelected, state, previousState)`\n\nObject.is by default\n\n**Reference Reference snippet**\n\n```ts\nconst stopName = account.watch(\n  \"user.profile.name\",\n  (name, previousName, state, previousState) => {\n    console.log({ name, previousName, state, previousState });\n  },\n  { immediate: true }\n);\n\nconst stopSummary = account.subscribeSelector(\n  (state) => ({ name: state.user.profile.name, plan: state.plan }),\n  (summary, previousSummary) => console.log(summary, previousSummary),\n  { isEqual: shallowEqual }\n);\n\nstopName();\nstopSummary();\n```\n\nWith immediate enabled, Tavo.js invokes the listener at subscription time. Current and previous selected values are the same current value; state and previousState are also the same current snapshot where supplied.\n\n**Selectors that return objects need equality**\n\nObject.is treats each newly created object as different. Supply shallowEqual or a domain-specific comparator when a selector returns an object or array and unrelated writes should be ignored."
        },
        {
          "id": "derived-and-persistent-stores",
          "title": "Derive and persist focused state",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport { computedStore, persistStore } from \"@tavojs/core\";\n\nconst account = createStore({ first: \"Ada\", last: \"Lovelace\", token: \"secret\" });\n\nexport const displayName = computedStore(account, (state) => ({\n  value: `${state.first} ${state.last}`\n}));\n\nconst stopPersistence = persistStore(account, {\n  key: \"account-preferences\",\n  pick: ({ first, last }) => ({ first, last })\n});\n\n// Stop writing future changes when this persistence owner is disposed.\nstopPersistence();\n```\n\n## computedStore\n\nCreates a Store from the selector's current result and updates it when the source selection changes. Pass isEqual when the selection needs custom comparison.\n\n## persistStore\n\nReads an existing saved value immediately, patches it into the Store, and subscribes future writes. It defaults to localStorage and JSON.\n\n-   `persistStore` requires key and accepts storage, serialize, deserialize, and pick overrides.\n    \n-   Without browser storage or a supplied storage adapter, it returns a no-op unsubscribe.\n    \n-   It does not save initial state until a [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") write emits.\n    \n-   Storage and parse errors are not swallowed; handle them in a custom adapter when recovery is required.\n    \n-   `computedStore` returns the normal [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") interface. Treat it as derived output and update its source instead.\n    \n\n**Persist preferences, not secrets**\n\nBrowser storage is readable by client JavaScript. Use pick to exclude tokens, private server data, and fields that should expire with the session."
        },
        {
          "id": "external-stores",
          "title": "Adapt state owned outside Tavo.js",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport { createExternalStore } from \"@tavojs/core\";\n\nexport const colorScheme = createExternalStore({\n  getSnapshot: () => matchMedia(\"(prefers-color-scheme: dark)\").matches,\n  getServerSnapshot: () => false,\n  subscribe(listener) {\n    const query = matchMedia(\"(prefers-color-scheme: dark)\");\n    query.addEventListener(\"change\", listener);\n    return () => query.removeEventListener(\"change\", listener);\n  }\n});\n\nclass ThemeController extends TavoController {\n  onMount() {\n    return this.listenExternal(\n      colorScheme,\n      (dark) => this.model.patch({ dark }),\n      { immediate: true }\n    );\n  }\n}\n```\n\nAn ExternalStore provides getSnapshot, subscribe, and an optional getServerSnapshot. createExternalStore returns that interface unchanged. Controller listenExternal reads getSnapshot, suppresses equal values with Object.is by default, and manages unsubscription."
        },
        {
          "id": "global-stores",
          "title": "Share named client state across routes",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport {\n  defineGlobalStore,\n  getGlobalStore,\n  hasGlobalStore,\n  listGlobalStores\n} from \"@tavojs/core\";\n\nexport const preferences = defineGlobalStore(\"preferences\", (set) => ({\n  density: \"comfortable\" as \"comfortable\" | \"compact\",\n  setDensity(density: \"comfortable\" | \"compact\") {\n    set({ density });\n  }\n}));\n\nclass ToolbarController extends TavoController {\n  compact() {\n    this.stores.get<ReturnType<typeof preferences.getState>>(\"preferences\")\n      .getState()\n      .setDensity(\"compact\");\n  }\n}\n```\n\n-   `defineGlobalStore` creates a name once. A later definition returns the existing [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") and ignores the new initial state.\n    \n-   `getGlobalStore` throws for an unknown name; `hasGlobalStore` checks first and `listGlobalStores` returns registered names.\n    \n-   Controller `this.stores` exposes get, has, and list but does not define stores.\n    \n-   Use the `@tavojs/core` package root for the complete global-store API.\n    \n\n**Global means process-wide during SSR**\n\nNever write the current user, session, token, tenant, or permissions into a global Store during server rendering. Tavo.js warns once per global Store name when setState, set, or patch writes during SSR, but the write can still leak request data. Return request-scoped values from loaders instead."
        },
        {
          "id": "store-ssr-snapshots",
          "title": "Understand automatic Store hydration",
          "markdown": "Tavo.js serializes written Store state during SSR, embeds it in the page, and hydrates matching client Stores. Top-level function values are excluded from the serialized snapshot. This lifecycle is automatic; snapshot scopes and document-state hydration are framework internals, not application APIs.\n\n**Keep request values request-scoped**\n\nUse route loader data for the current user, session, token, tenant, permissions, and other request-specific values. Never write those values to a process-wide global Store during server rendering."
        },
        {
          "id": "store-common-mistakes",
          "title": "Avoid common Store mistakes",
          "markdown": "## Mutating nested state\n\nUse set with a path or replace ancestors in patch. Direct mutation bypasses immutable comparison and notifications.\n\n## Replacing state with patch\n\npatch preserves unspecified top-level fields. Use setState only when the complete snapshot is intentionally replaced.\n\n## Object selectors without equality\n\nA new object fails Object.is on every write. Pass shallowEqual or a focused comparator.\n\n## Forgetting unsubscribe\n\nKeep the function returned by subscriptions and persistence. Inside controllers, prefer managed listen, select, and watch helpers.\n\n## Calling initializer helpers immediately\n\nDefine action functions that call set and get later. The Store is not readable or writable until its initializer returns.\n\n## Putting request data in a global Store\n\nGlobal Stores are process-wide on the server. Keep identity and authorization data in request-scoped loader results."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:services-and-dependencies",
      "section": "core",
      "slug": "services-and-dependencies",
      "title": "Services and dependency lifetimes",
      "description": "Register typed application dependencies, resolve them through controllers, and keep process-wide services free of request identity.",
      "keywords": [
        "service",
        "dependency injection",
        "createServiceKey",
        "registerService",
        "lifetime",
        "SSR safety"
      ],
      "kind": "guide",
      "prerequisites": [
        "An application dependency that is not component state or request data."
      ],
      "outcomes": [
        "Register and resolve named or typed application services.",
        "Choose between models, Stores, services, and plugin capabilities.",
        "Keep server request state isolated from process-wide registries."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "MVC components",
          "href": "/docs/core/mvc",
          "description": "Resolve services and plugin capabilities in controllers."
        },
        {
          "title": "Stores",
          "href": "/docs/core/stores",
          "description": "Use observable state instead of a service registry."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Keep authentication and authorization request-scoped."
        }
      ],
      "canonicalPath": "/docs/core/services-and-dependencies",
      "sections": [
        {
          "id": "selection",
          "title": "Choose the dependency owner first",
          "markdown": "-   Use a [`createTavo`](/docs/core/api/application#api-tavojs-core--createtavo \"View createTavo in the Core API reference\") model for reactive state owned by one mounted component.\n    \n-   Use a global [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") for observable browser state shared across multiple component or route owners.\n    \n-   Use an application service for a stable dependency such as a client SDK, stateless formatter, telemetry sink, or feature client.\n    \n-   Use a plugin capability for behavior owned and declared by a Plugin API v1 installation.\n    \n-   Use loader, middleware, action, endpoint, or session context for the current request, user, tenant, token, or permissions.\n    \n\n**Reference src/services/clock.ts**\n\n```ts\nimport {\n  createServiceKey,\n  registerService,\n} from \"@tavojs/core\";\n\nexport type Clock = {\n  now(): Date;\n};\n\nexport const clockKey = createServiceKey<Clock>(\"app.clock\");\n\nregisterService(clockKey, {\n  now: () => new Date(),\n});\n```"
        },
        {
          "id": "typed-services",
          "title": "Register and resolve a typed service",
          "markdown": "[`createServiceKey`](/docs/core/api/application#api-tavojs-core--createservicekey \"View createServiceKey in the Core API reference\") carries the service type while retaining a stable string name. Register once in the runtime that owns the dependency with [`registerService`](/docs/core/api/application#api-tavojs-core--registerservice \"View registerService in the Core API reference\"), then resolve by the same key.\n\n-   [`getService`](/docs/core/api/application#api-tavojs-core--getservice \"View getService in the Core API reference\") and controller services.get throw when the identifier is missing.\n    \n-   [`tryGetService`](/docs/core/api/application#api-tavojs-core--trygetservice \"View tryGetService in the Core API reference\") and controller services.tryGet return undefined for an optional dependency.\n    \n-   [`hasService`](/docs/core/api/application#api-tavojs-core--hasservice \"View hasService in the Core API reference\") checks one identifier; [`listServices`](/docs/core/api/application#api-tavojs-core--listservices \"View listServices in the Core API reference\") returns every registered name.\n    \n-   String names are supported, but a typed key keeps registration and lookup aligned without repeated generic arguments.\n    \n\n**Reference src/services/metrics.ts**\n\n```ts\nimport {\n  createServiceKey,\n  getService,\n  hasService,\n  registerService,\n} from \"@tavojs/core\";\n\nexport type MetricsService = {\n  increment(name: string): void;\n};\n\nexport const metricsKey =\n  createServiceKey<MetricsService>(\"app:metrics\");\n\nfunction createMetricsService(): MetricsService {\n  return {\n    increment(name) {\n      navigator.sendBeacon(\n        \"/api/metrics\",\n        JSON.stringify({ name }),\n      );\n    },\n  };\n}\n\nexport function installMetricsService(): MetricsService {\n  if (!hasService(metricsKey)) {\n    registerService(metricsKey, createMetricsService());\n  }\n\n  return getService(metricsKey);\n}\n```\n\n**Reference src/main.tsx**\n\n```tsx\nimport { bootTavo } from \"@tavojs/core\";\nimport { installMetricsService } from \"./services/metrics\";\n\ninstallMetricsService();\n\nvoid bootTavo().catch((error: unknown) => {\n  console.error(\"Tavo.js failed to start.\", error);\n});\n```\n\n**Reference src/components/TrackedButton.tsx**\n\n```tsx\nimport {\n  createTavo,\n  TavoController,\n} from \"@tavojs/core\";\nimport { metricsKey } from \"../services/metrics\";\n\nclass TrackedButtonController extends TavoController {\n  track() {\n    this.services.get(metricsKey).increment(\"project_created\");\n  }\n}\n\nexport const TrackedButton = createTavo({\n  controller: TrackedButtonController,\n  view({ controller }) {\n    return (\n      <button\n        type=\"button\"\n        onClick={() => {\n          controller?.track();\n        }}\n      >\n        Create project\n      </button>\n    );\n  },\n});\n```"
        },
        {
          "id": "registration",
          "title": "Make replacement intentional",
          "markdown": "-   `registerService` returns the same service instance it registers.\n    \n-   A duplicate name still replaces the previous value. Core warns once unless { override: true } declares that replacement is intentional.\n    \n-   The default i18n service uses the reserved `tavo`:i18n name and participates in framework discovery.\n    \n-   `unregisterService` and `clearServices` are development/testing helpers from `@tavojs/core/dev`; use them to isolate tests rather than as normal application lifecycle.\n    \n\n**Reference tests/metrics.test.ts**\n\n```ts\nimport {\n  clearServices,\n  unregisterService,\n} from \"@tavojs/core/dev\";\nimport {\n  metricsKey,\n  installMetricsService,\n} from \"../src/services/metrics\";\n\nexport function beforeEachServiceTest() {\n  clearServices();\n  installMetricsService();\n}\n\nexport function afterEachServiceTest() {\n  unregisterService(metricsKey);\n}\n```"
        },
        {
          "id": "server-lifetime",
          "title": "Treat the registry as process-wide during SSR",
          "markdown": "The service registry lives on `globalThis`. A Node process can serve concurrent requests through the same service instance, so registration during SSR emits a warning that asks you to audit the lifetime.\n\n-   A shared service may be immutable or internally concurrency-safe, but it must not store the current request identity.\n    \n-   Never attach a user, tenant, session, token, cart, permissions, or request headers to a registered service.\n    \n-   Pass request values into stateless service methods, or create the request-bound client inside the loader/action/middleware that owns it.\n    \n-   Do not silence a duplicate or SSR warning with override until the replacement and lifetime are intentional.\n    \n\n**A typed singleton is still a singleton**\n\ncreateServiceKey improves type safety; it does not make a service request-scoped. Authentication and authorization must remain in the server request path."
        },
        {
          "id": "plugin-capabilities",
          "title": "Distinguish services from capabilities",
          "markdown": "Controllers expose both `this.services` and `this.capabilities`. Services are registered directly by the application. Capabilities are contracts contributed by installed plugins and resolved through the active Pages runtime.\n\n-   Use `capabilities.resolve` for a required plugin capability and `tryResolve` for an optional one.\n    \n-   Required capability resolution without an active Pages runtime fails with `TAVO_PLUGIN_004`.\n    \n-   Keep plugin ownership, permissions, and replacement rules in the Plugin API v1 manifest instead of recreating them in the service registry."
        },
        {
          "id": "service-verification",
          "title": "Verify registration and isolation",
          "markdown": "-   Resolve the typed key after installation and assert the same instance is returned.\n    \n-   Verify get throws and `tryGet` returns undefined before installation.\n    \n-   Register a duplicate in a focused test and confirm intentional override behavior.\n    \n-   Clear services between tests that share a process.\n    \n-   Run concurrent SSR requests and confirm no request-specific value is retained by a service."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:async-ownership",
      "section": "core",
      "slug": "async-ownership",
      "title": "Async ownership and cancellation",
      "description": "Choose route loaders, resources, actions, forms, Deferred boundaries, and controller actions by lifetime and cancellation behavior.",
      "keywords": [
        "async",
        "AbortSignal",
        "cancellation",
        "resource",
        "action",
        "Deferred",
        "stale result"
      ],
      "kind": "guide",
      "prerequisites": [
        "An asynchronous read, mutation, component task, or streamed value."
      ],
      "outcomes": [
        "Assign each asynchronous task to one clear owner.",
        "Propagate AbortSignal and prevent stale completions from publishing.",
        "Distinguish abort, failure, reset, and committed side effects."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Data loading and middleware",
          "href": "/docs/core/data-and-middleware",
          "description": "Load route-critical data and use component resources."
        },
        {
          "title": "Actions, forms, and validation",
          "href": "/docs/core/actions-and-forms",
          "description": "Handle mutations and form transport."
        },
        {
          "title": "Streaming and async work",
          "href": "/docs/core/streaming-and-async",
          "description": "Stream secondary server values with Deferred."
        }
      ],
      "canonicalPath": "/docs/core/async-ownership",
      "sections": [
        {
          "id": "choose-owner",
          "title": "Choose the owner before the primitive",
          "markdown": "-   Use a route load export when navigation cannot render the route correctly without the data.\n    \n-   Use [`createResource`](/docs/core/api/data-actions-and-async#api-tavojs-core--createresource \"View createResource in the Core API reference\") when one mounted feature owns independently refreshable read data.\n    \n-   Use a route action for a server mutation and its HTTP response.\n    \n-   Use [`createAction`](/docs/core/api/data-actions-and-async#api-tavojs-core--createaction \"View createAction in the Core API reference\") or [`createFormAction`](/docs/core/api/data-actions-and-async#api-tavojs-core--createformaction \"View createFormAction in the Core API reference\") for observable client mutation state.\n    \n-   Use [`TavoController`](/docs/core/api/application#api-tavojs-core--tavocontroller \"View TavoController in the Core API reference\").action for controller-owned work whose pending/result/error state should rerender that component.\n    \n-   Use [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") when the server can send meaningful fallback HTML before a secondary value resolves."
        },
        {
          "id": "resource-owner",
          "title": "Give a component resource explicit cleanup",
          "markdown": "-   load always starts a new operation and aborts the previous one. preload deduplicates the current pending operation.\n    \n-   Forward the supplied signal to fetch and every abort-aware dependency.\n    \n-   A stale completion cannot overwrite a newer load.\n    \n-   An abort resolves the resource back to idle, clears error and `updatedAt`, and preserves the last data. reset also clears data.\n    \n-   [`Resource`](/docs/core/api/data-actions-and-async#api-tavojs-core--resource \"View Resource in the Core API reference\") failures become error state; load resolves to that state instead of rethrowing the loader error.\n    \n\n**Reference src/components/ActivityPanel.tsx**\n\n```tsx\nimport {\n  createResource,\n  createTavo,\n  TavoController,\n} from \"@tavojs/core\";\n\ntype Activity = {\n  id: string;\n  summary: string;\n};\n\nclass ActivityController extends TavoController {\n  activity = createResource<Activity[]>(async ({ signal }) => {\n    const response = await fetch(\"/api/activity\", { signal });\n\n    if (!response.ok) {\n      throw new Error(\"Activity could not be loaded.\");\n    }\n\n    return response.json();\n  });\n\n  onMount() {\n    this.listen(this.activity.store, () => {\n      this.model.patch({});\n    });\n    this.cleanup(() => {\n      this.activity.abort(\"Activity panel unmounted.\");\n    });\n    void this.activity.load();\n  }\n\n  reload() {\n    void this.activity.load();\n  }\n}\n\nexport const ActivityPanel = createTavo({\n  controller: ActivityController,\n  view({ controller }) {\n    const activity = controller?.activity.read();\n\n    if (!activity || activity.status === \"idle\") {\n      return <p>Activity is idle.</p>;\n    }\n\n    if (activity.status === \"loading\") {\n      return <p aria-busy=\"true\">Loading activity…</p>;\n    }\n\n    if (activity.status === \"error\") {\n      return <p role=\"alert\">Activity failed to load.</p>;\n    }\n\n    return (\n      <ul>\n        {activity.data?.map((item) => {\n          return <li key={item.id}>{item.summary}</li>;\n        })}\n      </ul>\n    );\n  },\n});\n```"
        },
        {
          "id": "mutation-semantics",
          "title": "Know whether a mutation rejects",
          "markdown": "The two client action primitives intentionally expose different caller behavior. Choose based on who owns control flow, then handle both the observable state and returned promise.\n\n-   `createAction.run` resolves to `ActionState` on success or handler failure. The failure is stored with status error.\n    \n-   `TavoController.action.run` resolves with the handler result and rethrows a caught error while also exposing reactive error state.\n    \n-   `createFormAction` mirrors `createAction` state and also records submitted values.\n    \n-   Starting a newer run prevents an older completion from replacing the latest observable state.\n    \n-   reset invalidates an in-flight completion and clears the complete state.\n    \n\n**Cancellation cannot undo a committed mutation**\n\nAbortSignal stops waiting and can prevent later publication, but a database, payment, email, or remote API may already have committed. Use authorization, idempotency keys, and a server-side transaction where the business operation requires them."
        },
        {
          "id": "controller-action",
          "title": "Handle controller action rejection",
          "markdown": "-   A controller action is safe to create as a class field.\n    \n-   Its pending, result, and error transitions rerender the owning `createTavo` component.\n    \n-   Catch or await run from event handlers so a handled UI failure does not become an unhandled rejection.\n    \n\n**Reference Reference snippet**\n\n```tsx\nclass SaveController extends TavoController {\n  save = this.action(async (name: string) => {\n    const response = await fetch(\"/projects\", {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\" },\n      body: JSON.stringify({ name }),\n    });\n\n    if (!response.ok) {\n      throw new Error(\"Project could not be saved.\");\n    }\n\n    return response.json() as Promise<{ id: string }>;\n  });\n\n  submit(name: string) {\n    void this.save.run(name).catch(() => {\n      // The view renders save.error.\n    });\n  }\n}\n```"
        },
        {
          "id": "deferred-ownership",
          "title": "Propagate cancellation into Deferred work",
          "markdown": "[`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") owns rendering of a promise-backed value; it does not create the underlying request. Pass one `AbortSignal` through `createDeferredValue` or [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") and into the operation that produces the promise.\n\n-   Give every [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") value a stable id when the server result should be serialized and reused during hydration.\n    \n-   Use `timeoutFallback` for the typed `TAVO_DEFERRED_TIMEOUT` case and `errorFallback` for other rejection.\n    \n-   A pure CSR document renders fallback for a promise-backed [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") value; progressive patching is an SSR capability.\n    \n-   Do not share request-specific promises through module variables or process-wide registries."
        },
        {
          "id": "async-verification",
          "title": "Test race, abort, and cleanup paths",
          "markdown": "-   Hold two operations pending, resolve the newer one first, and assert the older completion cannot replace state.\n    \n-   Abort before start, while pending, and during component unmount.\n    \n-   Assert the semantic difference between abort and reset, especially whether previous data remains.\n    \n-   Reject every action/resource path and verify both observable state and promise behavior.\n    \n-   For server mutations, retry with the same idempotency key and verify one committed effect."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:ssr-and-hydration",
      "section": "core",
      "slug": "ssr-and-hydration",
      "title": "SSR and hydration",
      "description": "Choose SSR, CSR, SSG, or revalidated output and keep the initial client tree consistent with server HTML.",
      "keywords": [
        "server rendering",
        "hydration",
        "static",
        "ISR"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Choose SSR, CSR, SSG, or revalidated output and keep the initial client tree consistent with server HTML."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/ssr-and-hydration",
      "sections": [
        {
          "id": "render-modes",
          "title": "Choose rendering per route",
          "markdown": "The same page and component code can render on the server or client. SSR is the default in SSR development, preview, and the generated Node server. Use CSR only when the route depends on browser-only behavior and its initial HTML is not important.\n\n-   SSR renders for each request.\n    \n-   CSR sends the document shell and resolves the route in the browser.\n    \n-   SSG prerenders static routes during build.\n    \n-   ISR caches SSR output and refreshes it after a revalidation interval."
        },
        {
          "id": "route-configuration",
          "title": "Configure route output",
          "markdown": "Static routes may provide `generateStaticParams` for dynamic paths. Revalidated output uses a runtime process-local cache by default, while Cookie or Authorization requests bypass static caching.\n\n**Create src/pages/blog/[id].tsx — create this static route**\n\n```tsx\nimport { notFound, type PageLoadContext, type PageProps } from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\nconst posts: Record<string, { title: string }> = {\n  hello: { title: \"Hello from Tavo.js\" },\n  \"release-notes\": { title: \"Release notes\" }\n};\n\nexport const prerender = true;\nexport const generateStaticParams = () => [{ id: \"hello\" }, { id: \"release-notes\" }];\nexport const load = ({ params }: PageLoadContext) => posts[params.id] ?? notFound();\n\nexport default function BlogPost({ data }: PageProps<{ title: string }>) {\n  return <Page><Text as=\"h1\" variant=\"h1\">{data?.title}</Text></Page>;\n}\n```"
        },
        {
          "id": "hydration-contract",
          "title": "Keep hydration deterministic",
          "markdown": "`Tavo.js` serializes resolved route data so the browser can hydrate against the same route tree without immediately loading it again. Hydration warnings mean server and client produced different initial output.\n\n-   Do not read browser-only globals during the initial render without a guard.\n    \n-   Use deterministic IDs from controller helpers.\n    \n-   Avoid time, randomness, and locale differences between server and client output.\n    \n-   Test the production SSR build, not only development mode."
        },
        {
          "id": "render-mode-reference",
          "title": "Rendering mode reference",
          "markdown": "Every route resolves to either SSR or CSR. SSR is the default. Static generation and revalidation are cache policies applied to SSR routes; they are not separate component runtimes.\n\n**Reference src/pages/account.tsx**\n\n```tsx\n// Browser-rendered route with a useful server shell.\nexport const render = \"csr\";\n\nexport default function AccountPage() {\n  return <main>Account settings</main>;\n}\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n[`render`](/docs/core/api/components-and-dom#api-tavojs-core--render)\n\n`\"csr\"`\n\nSSR\n\nExport render = \"csr\" to opt the route subtree out of server body rendering.\n\n`prerender`\n\n`boolean`\n\nfalse\n\nMarks a functional SSR route for build-time prerendering or runtime static caching. false disables an inherited static policy.\n\n`revalidate`\n\n`number | false`\n\nunset\n\nEnables static SSR caching for the given number of seconds. Values are floored and clamped to zero; false disables inherited caching.\n\n`generateStaticParams`\n\n`() => params[] | Promise<params[]>`\n\nunset\n\nLists build-time paths for a dynamic static route.\n\n`csrFallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child) `|` `(``context``)` `=>` [`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child)\n\nempty route node\n\nProvides meaningful server-shell content for a CSR route without executing its client loader.\n\n**CSR ignores static-only exports**\n\nOn a CSR route, Tavo.js ignores static, revalidate, vary, and generateStaticParams. A dynamic head function also runs only when the browser resolves the route, so it cannot change the initial response. The route manifest reports these combinations as diagnostics.\n\nLayout and page cache settings compose from root to leaf. Vary headers are trimmed, lowercased, and merged. Static cache tags are merged. If several layers provide numeric revalidation intervals, the shortest interval wins."
        },
        {
          "id": "boot-and-hydration-reference",
          "title": "Boot and hydration reference",
          "markdown": "[](/docs/core/api/application#api-tavojs-core--boottavo \"View bootTavo in the Core API reference\")detects server, hydrated SSR, and browser-only documents. It returns a discriminated result so application entrypoints can inspect what actually started.\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`root`\n\n`Element | null`\n\nunset\n\nUses a specific client mount element.\n\n`rootSelector`\n\n`string`\n\n\"#app\"\n\nLocates the client root when root is not provided.\n\n`hydrate`\n\n`boolean`\n\ndetected\n\nDefaults to true when \\_\\_`TAVO_SSR__` or \\_\\_`TAVO_STATE__` exists. A root marked `data-tavo-render-mode`\\=\"csr\" always renders instead.\n\n`serverFile`\n\n`string`\n\n\"server.mjs\"\n\nServer boot returns none when this file is absent.\n\n`modules / node.modules`\n\n`PageModules`\n\nrequired on server\n\nSupplies the server route module map. Missing modules throw `TAVO_PAGES_005`.\n\n[`getTavoBootMode`](/docs/core/api/application#api-tavojs-core--gettavobootmode)\n\n`() => \"server\" | \"ssr\" | \"csr\" | \"none\"`\n\n—\n\nReports the planned mode without starting the app.\n\n**Reference Reference snippet**\n\n```ts\nimport { bootTavo, getTavoBootMode } from \"@tavojs/core\";\n\nconsole.log(getTavoBootMode());\nconst result = await bootTavo();\n\nif (result.mode === \"client\") {\n  // result.root exposes render, hydrate, and unmount.\n}\n```\n\n-   A missing client root throws `TAVO_PAGES_002` and names the expected selector.\n    \n-   Hydration restores serialized page, layout, and store state instead of rerunning the initial loaders.\n    \n-   CSR boot resolves the initial loaders and same-origin redirects before mounting the route.\n    \n-   Initial redirect resolution stops after eight redirects and warns about a likely middleware loop."
        },
        {
          "id": "server-rendering-methods",
          "title": "Server rendering methods",
          "markdown": "**Reference Reference snippet**\n\n```tsx\nimport {\n  renderDocument,\n  renderDocumentStream,\n} from \"@tavojs/core/server\";\n\nconst html = renderDocument(<App />, {\n  title: \"Dashboard\",\n  initialState: { locale: \"en\" },\n});\n\nconst stream = renderDocumentStream(<App />, {\n  title: \"Dashboard\",\n});\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n[`renderDocument`](/docs/core/api/server#api-tavojs-core-server--renderdocument)`(``node``,` `options``)`\n\n`string`\n\n—\n\nRenders the complete HTML document and serialized initial state.\n\n[`renderDocumentStream`](/docs/core/api/server#api-tavojs-core-server--renderdocumentstream)`(``node``,` `options``)`\n\n`ReadableStream<Uint8Array>`\n\n—\n\nStreams the shell followed by deferred patch chunks.\n\n[`createPagesRuntimeAsync`](/docs/core/api/server#api-tavojs-core-server--createpagesruntimeasync)`(``modules``,` `options``)`\n\n`Promise<PagesRuntime>`\n\n—\n\nCreates the technical server runtime used by generated CLI SSR templates.\n\n[`renderPagesResponseFromRuntimeAsync`](/docs/core/api/server#api-tavojs-core-server--renderpagesresponsefromruntimeasync)`(``runtime``,` `pathname``,` `options``)`\n\n`Promise<RenderPagesResponse>`\n\n—\n\nRenders a response from that server runtime. Import it only from `@tavojs/core/server`.\n\n**Use handlers for applications**\n\n[](/docs/core/api/server#api-tavojs-core-server--createnoderequesthandler \"View createNodeRequestHandler in the Core API reference\")adds actions, plugins, image optimization, security headers, static response caching, and contained HTTP failures. Low-level render functions are intended for custom Node integrations."
        },
        {
          "id": "static-cache-contract",
          "title": "Static cache and invalidation contract",
          "markdown": "Tavo.js keeps a resolved route-data cache and a rendered-response cache. Both default to 1,024 process-local entries and evict the oldest entry when full. Set maxResolvedCacheEntries to 0 to disable route-data reuse, or provide a custom [`staticCache`](/docs/core/api/server#api-tavojs-core-server--ssrstaticcache \"View SsrStaticCache in the Core API reference\") for shared rendered output.\n\n-   Cache keys include request origin, pathname, query string, and declared vary headers.\n    \n-   Localized routes also vary by Accept-Language automatically.\n    \n-   Requests with Cookie or Authorization bypass shared static response caching and do not evict an existing public entry.\n    \n-   Redirects and responses with status 500 or greater are not stored.\n    \n-   Concurrent public renders for the same cache key share one in-flight render.\n    \n-   Cache adapter read, write, and delete failures degrade to an uncached response instead of failing SSR.\n    \n\n**Reference Reference snippet**\n\n```ts\nconst handler = createNodeRequestHandler({ modules, staticCache });\n\nawait handler.invalidateCache(\"post:hello\");\nawait handler.invalidateCache([\"posts\", \"homepage\"]);\nawait handler.clearCache();\n```\n\nFor process-local caching, use [](/docs/core/api/server#api-tavojs-core-server--creatememorystaticcache \"View createMemoryStaticCache in the Core API reference\"). A custom [](/docs/core/api/server#api-tavojs-core-server--ssrstaticcache \"View SsrStaticCache in the Core API reference\")adapter has the following complete contract, including optional tag invalidation and clearing:\n\n**Reference Reference snippet**\n\n```ts\nimport type {\n  SsrStaticCache,\n  SsrStaticCacheEntry,\n} from \"@tavojs/core/server\";\n\nexport function createInspectableStaticCache(): SsrStaticCache {\n  const entries = new Map<string, SsrStaticCacheEntry>();\n\n  return {\n    get(key) {\n      return entries.get(key) ?? null;\n    },\n    set(key, entry) {\n      entries.set(key, entry);\n    },\n    delete(key) {\n      entries.delete(key);\n    },\n    invalidateTags(tags) {\n      const requested = new Set(tags);\n      let deleted = 0;\n\n      for (const [key, entry] of entries) {\n        if (!entry.tags.some((tag) => requested.has(tag))) continue;\n        entries.delete(key);\n        deleted += 1;\n      }\n\n      return deleted;\n    },\n    clear() {\n      entries.clear();\n    },\n  };\n}\n```\n\ninvalidateCache removes matching loader-resolution entries and rendered responses. clearCache clears both layers. A custom cache can implement invalidateTags and clear; otherwise the handler deletes the entries it has observed in the current process."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:rendering-head-and-hydration",
      "section": "core",
      "slug": "rendering-head-and-hydration",
      "title": "Rendering, head, and hydration",
      "description": "Choose SSR or CSR, compose escaped route metadata, understand head cleanup, and keep private values out of browser-readable hydration state.",
      "keywords": [
        "SSR",
        "CSR",
        "head",
        "metadata",
        "hydration",
        "unsafeHeadHtml",
        "serialization"
      ],
      "kind": "reference",
      "prerequisites": [
        "A route with functional page and layout modules.",
        "Understanding of server rendering and browser hydration."
      ],
      "outcomes": [
        "Choose a rendering mode and predict where loaders and head functions run.",
        "Compose route metadata without introducing HTML injection.",
        "Audit every value serialized into the hydration document."
      ],
      "runtime": [
        "server",
        "browser",
        "build"
      ],
      "related": [
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Configure the document and Node rendering pipeline."
        },
        {
          "title": "SEO, assets, and styling",
          "href": "/docs/core/seo-assets-and-styling",
          "description": "Use Seo, Head, images, fonts, scripts, and styles."
        }
      ],
      "canonicalPath": "/docs/core/rendering-head-and-hydration",
      "sections": [
        {
          "id": "render-mode",
          "title": "Treat SSR as the default",
          "markdown": "The route chain resolves to one [`PageRenderMode`](/docs/core/api/router#api-tavojs-core-router--pagerendermode \"View PageRenderMode in the Core API reference\"). Omitting the named render export selects SSR; only [`render`](/docs/core/api/components-and-dom#api-tavojs-core--render) `=` `\"csr\"` selects client-only route rendering.\n\nMode\n\nRoute declaration\n\nServer\n\nBrowser\n\nSSR\n\n`No render export`\n\nMiddleware, eligible loaders, head, layouts, and the page render for the request.\n\nThe same tree hydrates, then later navigation resolves in the browser.\n\nCSR\n\n`export const render = \"csr\"`\n\nTavo.js renders the configured CSR fallback and static head contributions only.\n\nThe route resolves and renders after client boot.\n\n-   A CSR selection anywhere in the route module chain makes the resolved route CSR.\n    \n-   Static generation, revalidation, vary, cache tags, and static params are incompatible with CSR and are ignored with manifest diagnostics.\n    \n-   Use CSR only when the route cannot produce useful request HTML. Client interactivity does not require CSR; SSR pages hydrate into interactive components.\n    \n-   Dynamic head functions do not run on the server for CSR routes because route data is not resolved there."
        },
        {
          "id": "head-contract",
          "title": "Return escaped TSX from head",
          "markdown": "A named head export returns [`PageHeadExport`](/docs/core/api/router#api-tavojs-core-router--pageheadexport \"View PageHeadExport in the Core API reference\"): escaped TSX for normal metadata or a [`PageHead`](/docs/core/api/router#api-tavojs-core-router--pagehead \"View PageHead in the Core API reference\") object for response status and document attributes.\n\n**Reference src/pages/projects/[id].tsx — named head export**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\n\ntype Project = {\n  name: string;\n  summary: string;\n};\n\nexport function head({\n  data\n}: {\n  data: Project | null;\n}) {\n  const title = data ? `${data.name} · Projects` : \"Project\";\n  return (\n    <>\n      <title>{title}</title>\n      <Seo\n        title={title}\n        description={data?.summary}\n        robots=\"index,follow\"\n      />\n    </>\n  );\n}\n```\n\n-   TSX children and attributes are escaped by the renderer. Prefer TSX and [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") for every normal metadata contribution.\n    \n-   The hard raw-string boundary is `unsafeHeadHtml` in a `PageHead` object or [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") component. There is no raw head string alias.\n    \n-   `unsafeHeadHtml` is inserted without escaping. Never concatenate user, loader, request, database, translation, or CMS values into it unless a trusted sanitizer establishes the complete HTML policy.\n    \n-   head may also return title, status, `htmlAttributes`, and `bodyAttributes` in a `PageHead` object.\n    \n\n**The unsafe name is the security review**\n\nTreat every [`PageHead`](/docs/core/api/router#api-tavojs-core-router--pagehead)`.``unsafeHeadHtml` occurrence like an HTML injection sink. Require a narrow owner, a documented sanitizer or trusted constant, and a test that prevents request data from reaching it."
        },
        {
          "id": "head-precedence",
          "title": "Predict head precedence and browser cleanup",
          "markdown": "-   [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") contributions resolve from outer layouts to inner layouts, then the page.\n    \n-   A dynamic layout head receives that layout's own loader data and error. The page head receives page data and the page-loader error.\n    \n-   Later title, status, `htmlAttributes`, and `bodyAttributes` values win for the same field.\n    \n-   Managed [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") entries are deduplicated by their framework key with the later value winning. Unkeyed head nodes preserve contribution order.\n    \n-   On browser navigation, `Tavo.js` removes nodes owned by the previous route, applies the next route's nodes and attributes, and restores the document fallback title when the next route has no title.\n    \n\n**Status belongs to the HTTP response**\n\nOn SSR, head.status becomes the route response status. Do not use a visual heading or client-only metadata update as a substitute for returning the correct server status."
        },
        {
          "id": "hydration-exposure",
          "title": "Assume hydration state is public",
          "markdown": "SSR sends enough state for the browser to adopt the server-rendered tree. Anyone who receives the HTML can read this serialized state, including values that are not visibly rendered. Its ordered route data entries describe the resolved layout and page layers.\n\nState\n\nBrowser exposure\n\nPage data\n\nSerialized for the resolved page.\n\nlayers and layerData\n\nSerialized layout and page loader results, both ordered and keyed.\n\nStore snapshots\n\nSerialized when included in the document hydration state.\n\nPlugin state\n\nSerialized when a plugin contributes hydration state.\n\nErrors\n\nHydration error details are redacted to a generic internal-server message.\n\n-   Return the minimum browser-safe shape from loaders. Keep tokens, session internals, credentials, private profile fields, and database records on the server.\n    \n-   Server-only execution does not make a returned loader value secret; SSR loader output can still be serialized.\n    \n-   Review nested layout data as carefully as page data because `layerData` exposes successful results by ID.\n    \n-   Redaction is a failure safeguard, not a reason to pass rich server exceptions into view props or custom error output."
        },
        {
          "id": "hydration-failure",
          "title": "Keep the server and client trees compatible",
          "markdown": "-   Render deterministic initial output from the same route data and serialized store state on both sides.\n    \n-   Move DOM reads, browser storage, timers, observers, and subscriptions into client lifecycle hooks.\n    \n-   Do not branch initial markup on `Date.now`(), `Math.random`(), locale defaults, viewport measurements, or undocumented globals.\n    \n-   A hydration mismatch is a correctness failure: fix the divergent input instead of suppressing the warning.\n    \n-   Clean up head ownership, controller work, and subscriptions when navigation replaces the route."
        },
        {
          "id": "verification",
          "title": "Verify source HTML and hydrated behavior",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo inspect route /projects/example --json\nnpx tavo build\nPORT=4174 node .tavo/build/server/start.mjs\n```\n\n-   Inspect the raw document response to confirm SSR content, status, escaped metadata, and the absence of private values.\n    \n-   Inspect the live head before and after client navigation to confirm stale title, meta, html attributes, and body attributes are removed or replaced.\n    \n-   Hydrate with browser console errors treated as test failures.\n    \n-   Test a CSR route separately: the raw response should contain the chosen fallback and only static head contributions."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:static-output-and-cache",
      "section": "core",
      "slug": "static-output-and-cache",
      "title": "Static output and route cache",
      "description": "Use revalidated SSR, build-time parameter enumeration, vary keys, and cache tags while avoiding unresolved permanent-cache behavior.",
      "keywords": [
        "prerender",
        "revalidate",
        "cache",
        "generateStaticParams",
        "vary",
        "cacheTags",
        "ISR"
      ],
      "kind": "reference",
      "prerequisites": [
        "An SSR route whose output is safe to share between requests.",
        "A deployment that serves Tavo.js's generated client and Node output."
      ],
      "outcomes": [
        "Enable cached SSR with the minimum non-redundant declaration.",
        "Enumerate dynamic paths and compose inherited cache policy.",
        "Verify cache headers, variation, privacy bypasses, and tags."
      ],
      "runtime": [
        "build",
        "server"
      ],
      "related": [
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Understand the server-rendered response being cached."
        },
        {
          "title": "Deployment",
          "href": "/docs/core/deployment",
          "description": "Serve the canonical client and Node build outputs."
        }
      ],
      "canonicalPath": "/docs/core/static-output-and-cache",
      "sections": [
        {
          "id": "choose-policy",
          "title": "Choose one settled cache policy",
          "markdown": "**Reference src/pages/catalog.tsx**\n\n```tsx\nexport const revalidate = 300;\nexport const cacheTags = [\"catalog\"];\n\nexport default function CatalogPage() {\n  return <main>Catalog</main>;\n}\n```\n\nIntent\n\nFunctional module\n\n[`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\")\n\nBehavior\n\nCached SSR with regeneration\n\n`export const revalidate = 300`\n\n`revalidate: 300`\n\nNumeric revalidate automatically enables static caching.\n\nBuild-time static HTML without revalidation\n\n`export const prerender = true`\n\n`static: true`\n\nUse one form only; see the permanent-cache contract note below.\n\nDisable inherited static policy\n\n`export const revalidate = false`\n\n`revalidate: false`\n\nResets inherited static and revalidation policy.\n\n**Do not combine redundant static declarations**\n\nA numeric revalidate already enables cached SSR, so prerender = true is redundant. In [`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\"), static: true is the helper equivalent of the named prerender export. A route that declares both static and prerender forms is rejected."
        },
        {
          "id": "revalidated-route",
          "title": "Declare revalidated dynamic output",
          "markdown": "For a dynamic cached route, `generateStaticParams()` returns [`PageStaticParams`](/docs/core/api/router#api-tavojs-core-router--pagestaticparams \"View PageStaticParams in the Core API reference\") for the paths the build should materialize. The loader and cache-tag resolver receive [`PageLoadContext`](/docs/core/api/router#api-tavojs-core-router--pageloadcontext \"View PageLoadContext in the Core API reference\").\n\n**Reference src/pages/catalog/[id].tsx**\n\n```tsx\nimport type {\n  PageLoadContext,\n  PageProps\n} from \"@tavojs/core/router\";\nimport { Page, Text } from \"@tavojs/ui\";\n\ntype Product = { id: string; name: string };\ntype ProductParams = { id: string };\n\nexport const revalidate = 300;\nexport const vary = \"accept-language\";\n\nexport function cacheTags({\n  params\n}: PageLoadContext): string[] {\n  return [\"catalog\", `product:${params.id}`];\n}\n\nexport function generateStaticParams(): ProductParams[] {\n  return [{ id: \"starter\" }, { id: \"team\" }];\n}\n\nexport async function load({\n  params,\n  signal,\n  url\n}: PageLoadContext): Promise<Product> {\n  const response = await fetch(\n    new URL(`/api/catalog/${params.id}`, url),\n    { signal }\n  );\n  if (!response.ok) {\n    throw new Error(\"Could not load product\");\n  }\n  return response.json() as Promise<Product>;\n}\n\nexport default function ProductPage({\n  data\n}: PageProps<Product, ProductParams>) {\n  return (\n    <Page>\n      <Text as=\"h1\" variant=\"h1\">\n        {data?.name}\n      </Text>\n    </Page>\n  );\n}\n```\n\n-   `generateStaticParams` returns parameter records for dynamic paths the build must enumerate. Every record must provide values expected by that route pattern.\n    \n-   A numeric revalidate is measured in seconds, rounded down, and clamped to zero.\n    \n-   Static policy composes through the route chain. The shortest finite revalidate value wins.\n    \n-   vary names are lowercased and deduplicated. Localization also adds Accept-Language variation.\n    \n-   CSR routes ignore static policy and static params with a manifest diagnostic."
        },
        {
          "id": "http-cache",
          "title": "Understand Node cache behavior",
          "markdown": "Inspection exposes the composed [`PageCachePolicy`](/docs/core/api/router#api-tavojs-core-router--pagecachepolicy \"View PageCachePolicy in the Core API reference\"). Each static or request-aware tag declaration follows [`PageCacheTags`](/docs/core/api/router#api-tavojs-core-router--pagecachetags \"View PageCacheTags in the Core API reference\").\n\n-   A successful route with numeric revalidate emits Cache-Control: public, max-age=0, s-maxage=N.\n    \n-   `Tavo.js` uses the static cache only for responses eligible under the composed route policy.\n    \n-   Non-200 responses, resolved route errors, and requests with personal headers do not receive shared static cache headers.\n    \n-   Vary values must cover every request header that can change shared output. Missing variation can serve one user's representation to another.\n    \n-   Cache tags support targeted invalidation where the selected runtime exposes it. Attach tags to the page or documented directory layouts.\n    \n\n**Root cache tags are not yet a settled contract**\n\nCurrent manifest composition does not reliably carry cacheTags from \\_root into route policy. Do not depend on root-level tags; place them on a documented layout or page and verify the inspected route until Core closes this gap."
        },
        {
          "id": "permanent-cache-status",
          "title": "Keep permanent static caching behind verification",
          "markdown": "The public intent of both prerender = true and static: true in [`defineRoutePage`](/docs/core/api/router#api-tavojs-core-router--defineroutepage \"View defineRoutePage in the Core API reference\") is build-time static HTML without revalidation. Current Core also gives a non-revalidated static route a long-lived immutable runtime cache response. That permanent runtime behavior is still under contract review.\n\n-   Use numeric revalidate when the Node runtime must refresh content; its cache behavior is explicit and settled.\n    \n-   Use prerender or helper static only when build-time output is the intended source and the deployed asset/cache layer has been verified.\n    \n-   Do not document the current immutable Node response as a permanent application guarantee until Core resolves the contract.\n    \n-   A change to this behavior may require a Core migration note even if the authored route export stays the same."
        },
        {
          "id": "privacy-and-failure",
          "title": "Cache only shareable successful output",
          "markdown": "-   Do not statically cache a route whose output depends on a session, authorization decision, private cookie, or user-specific request header.\n    \n-   A cache tag identifies related entries; it does not make private output safe to share.\n    \n-   Return the correct non-200 status for failures and not-found output so they are not mistaken for a successful reusable document.\n    \n-   Keep cache keys and tags bounded. Never place secret values in either one because operational tooling may expose them.\n    \n-   When variation or privacy is uncertain, prefer uncached SSR and add caching only after request-level tests prove isolation."
        },
        {
          "id": "verification",
          "title": "Inspect generation and response headers",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo inspect route /catalog/starter --json\nnpx tavo build\nPORT=4174 node .tavo/build/server/start.mjs\ncurl -i http://127.0.0.1:4174/catalog/starter\n```\n\n-   Confirm the inspected route has the expected static, revalidate, vary, and tag policy.\n    \n-   Confirm every generated dynamic parameter produces output at the intended path.\n    \n-   Assert Cache-Control and Vary for a successful anonymous request.\n    \n-   Repeat with the deployment's personal headers and failure cases and confirm shared cache headers are absent.\n    \n-   Exercise tag invalidation only through a runtime that explicitly exposes and documents it."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:streaming-and-async",
      "section": "core",
      "slug": "streaming-and-async",
      "title": "Streaming and async work",
      "description": "Deliver the route shell first, defer secondary server content, and give every async operation an owner.",
      "keywords": [
        "deferred",
        "async",
        "streaming",
        "cancellation"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Deliver the route shell first, defer secondary server content, and give every async operation an owner."
      ],
      "runtime": [
        "server"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/streaming-and-async",
      "sections": [
        {
          "id": "what-to-defer",
          "title": "Defer secondary content",
          "markdown": "Route loaders should resolve data required for navigation, SEO, and the primary shell. [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") boundaries are for slower, optional server content such as analytics summaries, recommendations, or below-the-fold panels.\n\n**SSR-only progression**\n\nPromise-backed Deferred boundaries progressively patch an SSR stream. For browser-only async work, use route loaders, resources, controllers, or stores."
        },
        {
          "id": "deferred-boundary",
          "title": "Create a meaningful boundary",
          "markdown": "Give each boundary a stable ID, a lightweight fallback, and timeout behavior when the content is optional. Create the deferred value inside request-owned rendering work. A value created at module scope would be shared by every SSR request handled by that process.\n\n**Create src/components/Stats.tsx — create this component**\n\n```tsx\nimport { Deferred, createDeferredValue } from \"@tavojs/core\";\nimport { Card, Skeleton, Text } from \"@tavojs/ui\";\n\nasync function loadStats(): Promise<{ total: number }> {\n  await new Promise<void>((resolve) => setTimeout(resolve, 250));\n  return { total: 12 };\n}\n\nexport function Stats() {\n  const stats = createDeferredValue(loadStats(), {\n    id: \"dashboard-stats\",\n    timeoutMs: 1500\n  });\n\n  return <Deferred value={stats} fallback={<Skeleton height=\"6rem\" />}>\n    {(value) => <Card title=\"Projects\"><Text>{value.total} active projects</Text></Card>}\n  </Deferred>;\n}\n```"
        },
        {
          "id": "cancellation",
          "title": "Give work an owner",
          "markdown": "Navigation owns loaders and middleware, a resource owns its current load, and deferred work belongs to its signal or render lifecycle. Pass `AbortSignal` through every supported layer and never publish results after the owner is gone.\n\n-   Treat `AbortError` as control flow, not a user-facing failure.\n    \n-   Use transactions or idempotency keys for side effects; cancellation cannot undo a committed mutation.\n    \n-   Set timeouts for optional remote dependencies that should not hold a stream open."
        },
        {
          "id": "deferred-api-reference",
          "title": "Deferred API reference",
          "markdown": "**Reference Reference snippet**\n\n```tsx\nimport {\n  createDeferredValue,\n  Deferred,\n} from \"@tavojs/core\";\n\nconst recommendations = createDeferredValue(loadRecommendations(), {\n  id: \"recommendations\",\n  timeoutMs: 1500,\n});\n\nexport function Recommendations() {\n  return (\n    <Deferred\n      value={recommendations}\n      fallback={<p aria-busy=\"true\">Loading recommendations…</p>}\n      errorFallback={<p role=\"alert\">Recommendations are unavailable.</p>}\n    >\n      {(items) => <RecommendationList items={items} />}\n    </Deferred>\n  );\n}\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`value`\n\n`T` `|` `Promise``<``T``>` `|` [`DeferredValue`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferredvalue)`<``T``>`\n\nrequired\n\nThe immediate or deferred value rendered by the boundary.\n\n`fallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child)\n\nnull\n\nInitial SSR and pending content.\n\n`errorFallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child) `|` `(``error``)` `=>` [`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child)\n\nfallback\n\nReplaces the boundary when the promise rejects.\n\n`timeoutFallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child) `|` `(``error``)` `=>` [`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child)\n\nerrorFallback\n\nUsed specifically for `TAVO_DEFERRED_TIMEOUT`.\n\n`id`\n\n`string`\n\ngenerated\n\nStable sharing and hydration key. Reusing an ID coordinates one promise across boundaries.\n\n`timeoutMs`\n\n`number`\n\ndisabled\n\nPositive finite timeout in milliseconds; other values do not create a timer.\n\n`signal`\n\n`AbortSignal`\n\nunset\n\nRejects pending work with the signal reason or `AbortError`.\n\n`serialize / deserialize`\n\n`functions`\n\nidentity\n\nControls the value stored in and restored from the hydration registry.\n\n**Value options take precedence**\n\nOptions stored by createDeferredValue take precedence over the same props on Deferred. This lets a shared async unit own its ID, serialization, timeout, fallback, and signal once."
        },
        {
          "id": "streaming-behavior-matrix",
          "title": "SSR, CSR, and hydration behavior",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`SSR` `string` [`render`](/docs/core/api/components-and-dom#api-tavojs-core--render)\n\n`HTML string`\n\nfallback\n\nPromise-backed boundaries render fallback content synchronously.\n\n`SSR stream`\n\n`HTML chunks`\n\nstream: false\n\nWith streaming enabled, fallback arrives first and patch scripts follow as work settles.\n\n`CSR`\n\n`DOM` [`render`](/docs/core/api/components-and-dom#api-tavojs-core--render)\n\nfallback\n\nPromise-backed [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") does not coordinate browser data loading; use loaders, resources, controllers, or stores.\n\n`Hydration`\n\n`DOM hydrate`\n\nreuse server state\n\nResolved, rejected, and timed-out streamed state is reused without restarting the client promise.\n\nA timeout rejects with code TAVO\\_DEFERRED\\_TIMEOUT plus id, timeoutMs, and a safe message. Other rejections are serialized as a generic failure string; application error objects are not copied into the client document."
        },
        {
          "id": "production-streaming",
          "title": "Production streaming contract",
          "markdown": "**Reference Reference snippet**\n\n```ts\ncreateNodeRequestHandler({\n  modules,\n  stream: true,\n  document: { nonce: requestNonce }\n});\n```\n\n-   Streaming is disabled unless stream: true is passed to the handler.\n    \n-   [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") patch scripts and serialized state receive `document.nonce` for a strict Content Security Policy.\n    \n-   The Node handler waits for drain when response backpressure is signaled.\n    \n-   A disconnected Node request aborts route work and cancels the stream reader.\n    \n-   Redirects are returned as a complete one-chunk document with Location metadata.\n    \n-   Use timeouts for optional dependencies so one remote service cannot hold the response open indefinitely."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:errors-and-code-splitting",
      "section": "core",
      "slug": "errors-and-code-splitting",
      "title": "Errors and code splitting",
      "description": "Recover from component render failures, load component code on demand, and choose ErrorBoundary, lazy, or Deferred correctly.",
      "keywords": [
        "ErrorBoundary",
        "lazy",
        "code splitting",
        "fallback",
        "resetKey",
        "Deferred"
      ],
      "kind": "guide",
      "prerequisites": [
        "A component subtree that may fail while rendering or load code asynchronously."
      ],
      "outcomes": [
        "Catch descendant render errors with an explicit recovery boundary.",
        "Load a component implementation lazily in browser and server workflows.",
        "Choose code loading separately from data streaming."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Streaming and async work",
          "href": "/docs/core/streaming-and-async",
          "description": "Stream promise-backed values with Deferred and progressive SSR."
        },
        {
          "title": "Pages and layouts",
          "href": "/docs/core/pages-and-layouts",
          "description": "Handle route-loader failures with page error exports and _error.tsx."
        },
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Capture runtime failures and hydration diagnostics."
        }
      ],
      "canonicalPath": "/docs/core/errors-and-code-splitting",
      "sections": [
        {
          "id": "choose-boundary",
          "title": "Choose the boundary by what is pending",
          "markdown": "-   Use a page error export for a contextual route-loader failure.\n    \n-   Use [`ErrorBoundary`](/docs/core/api/errors-and-code-splitting#api-tavojs-core--errorboundary \"View ErrorBoundary in the Core API reference\") for a descendant component that throws while rendering.\n    \n-   Use [`lazy`](/docs/core/api/errors-and-code-splitting#api-tavojs-core--lazy \"View lazy in the Core API reference\") when the component implementation should come from a dynamic import.\n    \n-   Use [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") or [`createDeferredValue`](/docs/core/api/data-actions-and-async#api-tavojs-core--createdeferredvalue \"View createDeferredValue in the Core API reference\") when a promise-backed data value should render fallback UI and participate in progressive SSR.\n    \n-   `Tavo.js` does not publish a Suspense component. Use the primitive that owns the actual failure or asynchronous work."
        },
        {
          "id": "error-boundary",
          "title": "Recover from descendant render errors",
          "markdown": "[`ErrorBoundary`](/docs/core/api/errors-and-code-splitting#api-tavojs-core--errorboundary \"View ErrorBoundary in the Core API reference\") renders its children until a descendant render throws. It then renders a static fallback or calls a fallback function with the error. Static and progressive server rendering apply the same fallback contract.\n\n-   Changing `resetKey` under `Object.is` clears a captured client error and retries the current children.\n    \n-   Changing `resetKey` does not fix the underlying state and does not reset an unrelated lazy-loader cache.\n    \n-   If rendering the fallback also fails, the error continues to the parent boundary or runtime error reporting.\n    \n-   A boundary is not a replacement for route error exports, rejected action state, or expected form validation.\n    \n-   Fallback UI should be accessible, concise, and offer only recovery that can actually change the failing condition.\n    \n\n**Reference src/components/ProjectSummary.tsx**\n\n```tsx\nimport { ErrorBoundary } from \"@tavojs/core\";\n\nfunction ProjectSummary({\n  project,\n}: {\n  project: { name: string } | null;\n}) {\n  if (!project) {\n    throw new Error(\"Project data is unavailable.\");\n  }\n\n  return <h2>{project.name}</h2>;\n}\n\nexport function ProjectPanel({\n  project,\n  version,\n}: {\n  project: { name: string } | null;\n  version: number;\n}) {\n  return (\n    <ErrorBoundary\n      resetKey={version}\n      fallback={(error: unknown) => {\n        const message =\n          error instanceof Error ? error.message : \"Project failed to render.\";\n\n        return <p role=\"alert\">{message}</p>;\n      }}\n    >\n      <ProjectSummary project={project} />\n    </ErrorBoundary>\n  );\n}\n```"
        },
        {
          "id": "lazy-components",
          "title": "Load component code on demand",
          "markdown": "[`lazy`](/docs/core/api/errors-and-code-splitting#api-tavojs-core--lazy \"View lazy in the Core API reference\") accepts a loader that resolves either a component or a module with a default component. Browser rendering starts one shared pending load, shows fallback UI, and rerenders mounted subscribers when the loader settles.\n\n-   fallback receives idle or loading. `errorFallback` receives error status and the caught loader error.\n    \n-   If `errorFallback` is omitted, a failed load is thrown during the next render so the nearest `ErrorBoundary` can capture it.\n    \n-   preload deduplicates the active load and resolves to the loaded component. `getStatus` reports idle, loading, loaded, or error.\n    \n-   Synchronous SSR does not start the loader; it renders fallback. Call preload before rendering when loaded server output is required.\n    \n-   A successful load is cached on that lazy component definition. A failed definition stays in error state; create a new definition or reload the owning module for a real retry.\n    \n\n**Reference src/pages/reports.tsx**\n\n```tsx\nimport { lazy } from \"@tavojs/core\";\nimport type { PageProps } from \"@tavojs/core/router\";\n\ntype ReportsData = {\n  points: number[];\n};\n\nconst ReportsChart = lazy(\n  () => import(\"../components/ReportsChart\"),\n  {\n    fallback: ({ status }) => {\n      return <p aria-busy=\"true\">Chart {status}…</p>;\n    },\n    errorFallback: ({ error }) => {\n      const message =\n        error instanceof Error ? error.message : \"Chart code failed to load.\";\n\n      return <p role=\"alert\">{message}</p>;\n    },\n  },\n);\n\nexport async function load(): Promise<ReportsData> {\n  return { points: [12, 18, 25] };\n}\n\nexport default function ReportsPage({\n  data,\n}: PageProps<ReportsData>) {\n  return (\n    <main>\n      <h1>Reports</h1>\n      <ReportsChart points={data?.points ?? []} />\n    </main>\n  );\n}\n```\n\n**Code loading and data loading are separate**\n\nlazy loads a component implementation. Keep route-critical data in load, independently refreshable component data in createResource, and streamed server data in Deferred."
        },
        {
          "id": "preload-for-ssr",
          "title": "Preload only when the server needs loaded output",
          "markdown": "-   Call preload from an explicit server preparation path before render, not from the component render function.\n    \n-   When fallback HTML is acceptable, let SSR render it and allow the browser to start loading after hydration.\n    \n-   Preloading changes code availability, not [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") data state or route-loader caching.\n    \n\n**Reference Reference snippet**\n\n```tsx\nconst InvoicePreview = lazy(\n  () => import(\"../components/InvoicePreview\"),\n);\n\nexport async function prepareInvoicePreview() {\n  await InvoicePreview.preload();\n}\n\nexport function InvoiceSection() {\n  return <InvoicePreview />;\n}\n```"
        },
        {
          "id": "failure-verification",
          "title": "Verify every state and recovery path",
          "markdown": "-   Render a throwing child on the server and in the browser; assert the boundary fallback receives the error.\n    \n-   Change `resetKey` with corrected child inputs and confirm the subtree renders again.\n    \n-   Hold a lazy loader pending and assert both idle/loading fallback behavior and final replacement.\n    \n-   Reject a lazy loader with and without `errorFallback`; verify the local fallback or parent `ErrorBoundary` owns the error.\n    \n-   Render lazy synchronously during SSR to confirm the loader is not called, then preload and confirm loaded output."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:seo-assets-and-styling",
      "section": "core",
      "slug": "seo-assets-and-styling",
      "title": "SEO, assets, and styling",
      "description": "Own route metadata, optimized media, fonts, scripts, and component styling without losing SSR safety.",
      "keywords": [
        "seo",
        "image",
        "font",
        "css"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Own route metadata, optimized media, fonts, scripts, and component styling without losing SSR safety."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/seo-assets-and-styling",
      "sections": [
        {
          "id": "metadata",
          "title": "Put metadata next to the route",
          "markdown": "Use a page head export when metadata belongs to one route. Use [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") for structured title, description, canonical URL, robots, Open Graph, Twitter, and theme-color values. Dynamic head functions can read route params and loader data.\n\n**Merge src/pages/dashboard/index.tsx — merge this head export**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\n\nexport const head = <Seo\n  title=\"Project dashboard\"\n  description=\"Track active projects and delivery status.\"\n  canonical=\"https://example.com/dashboard\"\n  openGraph={{ type: \"website\", image: \"https://example.com/og/dashboard.png\" }}\n/>;\n```"
        },
        {
          "id": "assets",
          "title": "Use framework asset components",
          "markdown": "[`Image`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--image \"View Image in the Core API reference\") provides one API for CSR assets and optional SSR optimization. Optimized remote images require an explicit HTTPS host allowlist; local assets must remain inside the public directory.\n\n-   Install the optional sharp dependency only when the server performs image optimization.\n    \n-   Mark only above-the-fold images as priority.\n    \n-   Use the ?component query when an SVG should render inline and accept component props.\n    \n-   Use [`Font`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--font \"View Font in the Core API reference\") and [`Script`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--script \"View Script in the Core API reference\") when loading behavior and document placement matter."
        },
        {
          "id": "styling",
          "title": "Keep styling boundaries clear",
          "markdown": "Use CSS modules or `Tavo.js` UI component props for ordinary local presentation. The lower-level style registry is for libraries that must register deduplicated CSS during both SSR and browser rendering.\n\n-   Call style(id, css) while an SSR registry is active; repeated IDs are emitted once.\n    \n-   Use `ensureClientStyle`(id, css) when a browser-only integration must install one managed style element.\n    \n-   Keep IDs stable across server and browser rendering so hydration does not duplicate CSS.\n    \n\n**Reference src/server/render-badge.tsx**\n\n```tsx\nimport {\n  createStyleRegistry,\n  renderStyleTags,\n  renderToString,\n  style,\n  withStyleRegistry,\n} from \"@tavojs/core\";\n\nfunction StatusBadge({ label }: { label: string }) {\n  style(\n    \"status-badge\",\n    \".status-badge{border-radius:999px;padding:.25rem .5rem}\"\n  );\n  return <span className=\"status-badge\">{label}</span>;\n}\n\nconst registry = createStyleRegistry();\nconst body = withStyleRegistry(registry, () => {\n  return renderToString(<StatusBadge label=\"Ready\" />);\n});\n\nconst styles = renderStyleTags(registry);\nconst html = `${styles}${body}`;\n```\n\n**Prefer application-level styling**\n\nDo not build a parallel styling system for ordinary pages. Use this registry only when reusable framework-level code needs SSR collection and client deduplication."
        },
        {
          "id": "head-seo-reference",
          "title": "Head and SEO properties",
          "markdown": "-   Use the route head export for route-owned metadata and [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") for component-owned insertion. Raw HTML is accepted only through `unsafeHeadHtml`; there is no head string alias.\n    \n-   An explicit robots string takes precedence over `noIndex` and `noFollow`. Arrays of keywords become a comma-separated meta value.\n    \n-   SEO title, description, canonical, and Open Graph image provide fallbacks for corresponding Open Graph and Twitter fields.\n    \n-   `unsafeHeadHtml` is not escaped. Never place user-controlled data in it.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype PageHead = {\n  title?: string;\n  unsafeHeadHtml?: string;\n  status?: number;\n  htmlAttributes?: Record<string, string | number | boolean>;\n  bodyAttributes?: Record<string, string | number | boolean>;\n};\n\ntype HeadProps = {\n  title?: string;\n  unsafeHeadHtml?: string;\n  children?: Child;\n};\n\ntype SeoProps = {\n  title?: string; description?: string; canonical?: string;\n  robots?: string; noIndex?: boolean; noFollow?: boolean;\n  keywords?: string | string[]; author?: string; themeColor?: string;\n  openGraph?: SeoOpenGraph; twitter?: SeoTwitter;\n};\n```"
        },
        {
          "id": "image-reference",
          "title": "Image properties and optimizer defaults",
          "markdown": "-   Default candidate widths are 320, 640, 960, 1280, and 1600. A supplied width also adds its 2x candidate; values above 3840 or at most zero are removed.\n    \n-   Quality defaults to 75 and is rounded and clamped from 1 to 100. Format defaults to webp and generated sizes defaults to 100vw.\n    \n-   priority selects eager loading and high fetch priority. Other images default to lazy loading; decoding defaults to async.\n    \n-   Set unoptimized to keep the original URL. Remote optimization requires an HTTPS allowlist; local sources must stay inside `publicDir`.\n    \n\n**Reference Reference snippet**\n\n```tsx\n<Image\n  src=\"/images/hero.jpg\"\n  alt=\"Team reviewing a release\"\n  width={1280}\n  height={720}\n  widths={[640, 960, 1280]}\n  sizes=\"(max-width: 48rem) 100vw, 60vw\"\n  quality={80}\n  format=\"webp\"\n  priority\n/>\n```\n\n**Remote images are untrusted input**\n\nThe optimizer rejects private hosts, revalidates redirects, and applies file limits. Keep remote patterns exact and do not enable insecure remote fetching without a controlled network boundary."
        },
        {
          "id": "font-script-reference",
          "title": "Font and Script properties",
          "markdown": "-   [`Font`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--font \"View Font in the Core API reference\") uses href for an external stylesheet or src plus family for a self-hosted @font-face. Self-hosted fonts preload by default; external stylesheet preload is opt-in.\n    \n-   Self-hosted format is inferred from woff2, woff, ttf, or otf when type is omitted. `crossOrigin` defaults to anonymous for font preloads.\n    \n-   [`Font`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--font \"View Font in the Core API reference\") variable must be a CSS custom property name. fallback is appended to the generated variable value.\n    \n-   [`Script`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--script \"View Script in the Core API reference\") supports src, type, async, defer, module, `noModule`, preload, content, json, id, nonce, integrity, `crossOrigin`, `referrerPolicy`, and `fetchPriority`.\n    \n-   A json value without src defaults to application/ld+json. Inline content escapes less-than signs and closing script sequences.\n    \n\n**Reference Reference snippet**\n\n```tsx\n<Font\n  src=\"/fonts/brand.woff2\"\n  family=\"Brand Sans\"\n  display=\"swap\"\n  variable=\"--font-brand\"\n/>\n\n<Script\n  json={{ \"@context\": \"https://schema.org\", \"@type\": \"WebSite\", name: \"Acme\" }}\n  nonce={nonce}\n/>\n\n<Script src=\"https://cdn.example.com/widget.js\" defer integrity={integrity} />\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:seo-and-head",
      "section": "core",
      "slug": "seo-and-head",
      "title": "SEO and document head",
      "description": "Compose escaped route metadata across layouts and pages, understand managed SEO precedence, and update the client document safely.",
      "keywords": [
        "SEO",
        "head",
        "metadata",
        "Open Graph",
        "Twitter",
        "canonical",
        "unsafeHeadHtml"
      ],
      "kind": "guide",
      "prerequisites": [
        "A page or layout that contributes route-owned metadata."
      ],
      "outcomes": [
        "Choose route head, Seo, or component Head by ownership.",
        "Predict layout/page precedence and managed metadata replacement.",
        "Verify SSR and client-navigation cleanup without raw HTML."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Pages and layouts",
          "href": "/docs/core/pages-and-layouts",
          "description": "Place metadata next to the route that owns it."
        },
        {
          "title": "SEO, assets, and styling",
          "href": "/docs/core/seo-assets-and-styling",
          "description": "Review Image, Font, Script, and styling APIs."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Keep raw HTML and CSP boundaries explicit."
        }
      ],
      "canonicalPath": "/docs/core/seo-and-head",
      "sections": [
        {
          "id": "choose-owner",
          "title": "Choose metadata ownership",
          "markdown": "-   Use a route head export for metadata owned by one page or layout.\n    \n-   Return escaped TSX, including [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\"), when possible.\n    \n-   Use [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") for title, description, canonical URL, robots, keywords, author, theme color, Open Graph, and Twitter fields.\n    \n-   Use the [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") component for metadata owned by the mounted lifetime of a reusable component outside route head composition.\n    \n-   Use `unsafeHeadHtml` only for a raw-string boundary that cannot be expressed as TSX. It is not escaped and must never contain user-controlled input."
        },
        {
          "id": "route-head",
          "title": "Return escaped TSX from a route",
          "markdown": "-   A head function may read route params, loader data, the URL, headers, signal, layout data, and the route error.\n    \n-   A title element is normalized into the document title; other escaped nodes become head contributions.\n    \n-   `PageHead` objects may additionally set status, `htmlAttributes`, `bodyAttributes`, and `unsafeHeadHtml`.\n    \n-   CSR-only routes cannot depend on a dynamic server head result; route inspection reports invalid combinations.\n    \n\n**Reference src/pages/projects/[id].tsx**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\nimport type {\n  PageLoadContext,\n  PageProps,\n} from \"@tavojs/core/router\";\n\ntype Project = {\n  id: string;\n  name: string;\n  summary: string;\n};\n\nexport async function load({\n  params,\n}: PageLoadContext): Promise<Project> {\n  return {\n    id: params.id ?? \"\",\n    name: `Project ${params.id}`,\n    summary: \"A Tavo.js project.\",\n  };\n}\n\nexport function head({\n  data,\n}: {\n  data: Project;\n}) {\n  return (\n    <Seo\n      title={data.name}\n      description={data.summary}\n      canonical={`https://example.com/projects/${data.id}`}\n      openGraph={{\n        type: \"website\",\n        image: \"https://example.com/project-card.png\",\n      }}\n      twitter={{ card: \"summary_large_image\" }}\n    />\n  );\n}\n\nexport default function ProjectPage({\n  data,\n}: PageProps<Project>) {\n  return <main><h1>{data?.name}</h1></main>;\n}\n```"
        },
        {
          "id": "layer-precedence",
          "title": "Predict layout and page precedence",
          "markdown": "[`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") layers merge from the root layout toward the page. Later scalar and attribute values override earlier defaults. Escaped nodes retain contribution order, while [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") fields use stable managed identities.\n\n-   The page title and status override layout values when present.\n    \n-   `htmlAttributes` and `bodyAttributes` merge by attribute name, with the later layer winning.\n    \n-   A later [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") value replaces an earlier managed value for the same standard meta, Open Graph property, Twitter field, or canonical link.\n    \n-   An unkeyed raw TSX node remains an ordered contribution; `Tavo.js` does not silently deduplicate arbitrary duplicate meta tags.\n    \n-   Multiple [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") declarations retain their position relative to surrounding raw nodes while their defined fields merge.\n    \n-   An explicit nested Open Graph or Twitter field survives a later top-level fallback that does not replace that nested field.\n    \n\n**Reference src/pages/_layout.tsx**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\nimport type { PropsWithChildren } from \"@tavojs/core\";\n\nexport function head() {\n  return (\n    <Seo\n      title=\"Acme\"\n      description=\"Acme project workspace.\"\n      openGraph={{ siteName: \"Acme\" }}\n    />\n  );\n}\n\nexport default function RootLayout({\n  children,\n}: PropsWithChildren) {\n  return <div>{children}</div>;\n}\n```\n\n**Reference src/pages/about.tsx**\n\n```tsx\nimport { Seo } from \"@tavojs/core\";\n\nexport function head() {\n  return [\n    <Seo\n      title=\"About Acme\"\n      description=\"How Acme builds project software.\"\n    />,\n    <meta\n      name=\"release-channel\"\n      content=\"stable\"\n    />,\n  ];\n}\n\nexport default function AboutPage() {\n  return <main><h1>About Acme</h1></main>;\n}\n```"
        },
        {
          "id": "client-navigation",
          "title": "Replace managed metadata during navigation",
          "markdown": "-   Client navigation removes stale route-managed metadata before applying the resolved route head.\n    \n-   When the next route contributes no title, `Tavo.js` restores the document title configured before route metadata was applied.\n    \n-   [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") renders the same managed fields in SSR and client navigation, preventing standard metadata from accumulating across routes.\n    \n-   [`Component`](/docs/core/api/components-and-dom#api-tavojs-core--component \"View Component in the Core API reference\") [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") inserts its children for the mounted lifetime and removes those nodes during cleanup. A supplied title is restored when that [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") owner is disposed."
        },
        {
          "id": "seo-defaults",
          "title": "Understand Seo field fallbacks",
          "markdown": "-   An explicit robots string takes precedence over `noIndex` and `noFollow`.\n    \n-   Keyword arrays become one comma-separated meta value.\n    \n-   Open Graph title and description fall back to top-level title and description; Open Graph URL falls back to canonical.\n    \n-   Twitter title and description fall back to top-level values; Twitter image falls back to the Open Graph image.\n    \n-   Empty optional values do not emit metadata."
        },
        {
          "id": "raw-boundary",
          "title": "Keep raw HTML visibly unsafe",
          "markdown": "**Reference Reference snippet**\n\n```tsx\nexport function head() {\n  return {\n    title: \"Trusted vendor integration\",\n    unsafeHeadHtml:\n      '<meta name=\"partner-widget\" content=\"enabled\">',\n  };\n}\n```\n\n**Prefer TSX first**\n\nunsafeHeadHtml bypasses escaping. Do not interpolate route params, loader data, query values, user content, or third-party responses into it. Plugin raw head contributions additionally require the unsafeHeadHtml permission and reason."
        },
        {
          "id": "metadata-verification",
          "title": "Verify SSR and navigation output",
          "markdown": "-   Render the route through SSR and assert exactly one title and one expected managed tag per [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") field.\n    \n-   Compose a layout default with a page override and confirm the page wins without losing unrelated nested metadata.\n    \n-   Mix [`Seo`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--seo \"View Seo in the Core API reference\") and raw TSX nodes and verify their intended order.\n    \n-   Navigate between routes and confirm stale description, canonical, robots, Open Graph, and Twitter fields are removed.\n    \n-   Navigate to a route without a title and confirm the configured document title returns.\n    \n-   Inspect the application root and confirm title, meta, and canonical nodes were hoisted into head rather than left in page content."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:localization",
      "section": "core",
      "slug": "localization",
      "title": "Localization",
      "description": "Create locale-aware messages, detection, document direction, and localized application links.",
      "keywords": [
        "i18n",
        "locale",
        "translation",
        "localized routes"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Create locale-aware messages, detection, document direction, and localized application links."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/localization",
      "sections": [
        {
          "id": "localization-model",
          "title": "Use one application i18n service",
          "markdown": "`createI18n` owns supported locales, nested messages, the current locale, and optional locale prefixes. Register the same service with the pages runtime so initial SSR, hydration, links, and later navigation agree on the active locale."
        },
        {
          "id": "localization-example",
          "title": "Define locales and messages together",
          "markdown": "The default locale is also the fallback unless you configure another. Locale detection can use the path, cookie, and Accept-Language header.\n\n**Create src/i18n.ts — create this localization service**\n\n```ts\nimport { createI18n } from \"@tavojs/core\";\n\nexport const i18n = createI18n({\n  defaultLocale: \"en\",\n  routing: { enabled: true },\n  locales: {\n    en: { label: \"English\", dir: \"ltr\" },\n    es: { label: \"Español\", dir: \"ltr\" }\n  },\n  messages: {\n    en: { projects: { title: \"Projects\" } },\n    es: { projects: { title: \"Proyectos\" } }\n  }\n});\n```"
        },
        {
          "id": "localization-boundaries",
          "title": "Keep server and browser locale state aligned",
          "markdown": "-   Resolve the request locale before rendering route loaders and metadata.\n    \n-   Use the `Tavo.js` [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") integration so internal destinations receive the active locale prefix.\n    \n-   Set document language and direction from the resolved locale.\n    \n-   Do not read a browser-only locale during the first render of an SSR page."
        },
        {
          "id": "i18n-options-reference",
          "title": "Localization options and defaults",
          "markdown": "-   locale and `fallbackLocale` default to `defaultLocale`. Direction defaults to ltr.\n    \n-   The locale cookie defaults to tavo\\_locale and detection order defaults to path, cookie, then Accept-Language.\n    \n-   The default locale has no URL prefix unless `defaultLocalePrefix` is always or `localizePath` requests `includeDefaultLocale`.\n    \n-   The service registers as `tavo`:i18n by default so [`Link`](/docs/core/api/router#api-tavojs-core-router--link \"View Link in the Core API reference\") and the pages runtime can discover it. Set `serviceName`: false to avoid registration.\n    \n\n**Reference Reference snippet**\n\n```ts\ncreateI18n({\n  defaultLocale,\n  locale?,\n  fallbackLocale?,\n  messages,\n  locales?: { [locale]: { label?: string; dir?: \"ltr\" | \"rtl\" | \"auto\" } },\n  routing?: false | {\n    enabled?: boolean;\n    defaultLocalePrefix?: \"always\" | \"never\";\n    cookieName?: string;\n    detectFrom?: Array<\"path\" | \"cookie\" | \"header\">;\n  },\n  serviceName?: string | false,\n  onMissingKey?: ({ key, locale, fallbackLocale }) => string | void\n});\n```"
        },
        {
          "id": "i18n-service-reference",
          "title": "Localization service reference",
          "markdown": "-   text and t are reactive when read during component rendering. t interpolates string parameters and stringifies non-string leaf values.\n    \n-   `setLocale` persists by default when cookie detection is enabled; pass persist: false for a temporary selection.\n    \n-   A missing key uses `onMissingKey` when supplied and otherwise returns the key itself.\n    \n-   `defineMessages` marks the central catalog for build-time locale splitting. Generated locale chunks are applied automatically by the framework runtime.\n    \n\n**Reference Reference snippet**\n\n```ts\ni18n.locale; i18n.defaultLocale; i18n.fallbackLocale; i18n.locales; i18n.dir;\ni18n.messages; i18n.text; i18n.store;\ni18n.setLocale(locale, { persist?: boolean });\ni18n.setMessages(locale, messages, { merge?: boolean });\ni18n.getLocaleInfo(locale?);\ni18n.detectLocale({ pathname?, request?, headers?, cookie? });\ni18n.resolvePath(pathname);\ni18n.localizePath(pathname, locale?, { includeDefaultLocale?: boolean });\ni18n.setLocaleFromRequest(input?); i18n.setLocaleFromPath(pathname);\ni18n[\"t\"](key, params?);\ni18n.subscribe(listener, { immediate?: boolean });\ni18n.watchLocale(listener, { immediate?: boolean });\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:security",
      "section": "core",
      "slug": "security",
      "title": "Security",
      "description": "Keep request data isolated, validate mutation origins, protect secrets, and harden production SSR boundaries.",
      "keywords": [
        "csp",
        "auth",
        "session",
        "origin"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Keep request data isolated, validate mutation origins, protect secrets, and harden production SSR boundaries."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/security",
      "sections": [
        {
          "id": "safe-defaults",
          "title": "Understand the secure defaults",
          "markdown": "`Tavo.js` escapes TSX text and attributes, rejects unsafe URL protocols, validates action origins for unsafe methods, applies baseline SSR headers, blocks external redirects by default, and disables remote image optimization until hosts are allowlisted.\n\n-   Keep raw HTML escape hatches free of user input.\n    \n-   Set `trustedHosts` and `canonicalOrigin` behind a reverse proxy.\n    \n-   Tune `maxRequestBodyBytes` for mutation endpoints.\n    \n-   Add a deployment-specific Content Security Policy at the edge or adapter."
        },
        {
          "id": "request-scope",
          "title": "Keep authentication request-scoped",
          "markdown": "Read cookies and sessions inside server middleware, loaders, and actions. Return only safe user fields to the rendered page. The memory store below makes the example runnable in local development; replace it with a shared production session store before deploying multiple processes. Global stores, services, and module variables may be shared between concurrent SSR requests.\n\n**Create src/server/sessions.ts — create this server-only session module**\n\n```ts\nimport \"@tavojs/core/server-only\";\nimport { createSessionStorage } from \"@tavojs/core/server\";\n\nconst secret = process.env.SESSION_SECRET;\nif (!secret) throw new Error(\"SESSION_SECRET is required\");\n\nexport const sessions = createSessionStorage<{ userId?: string }>({\n  cookie: {\n    name: \"__session\",\n    secrets: [secret],\n    maxAge: 60 * 60 * 24 * 7,\n    sameSite: \"lax\"\n  }\n});\n```\n\n**Merge src/pages/account/_layout.tsx — merge this loader export**\n\n```ts\nimport { defineServerLoader } from \"@tavojs/core/router\";\n\nexport const load = defineServerLoader(async ({ request }) => {\n  const { sessions } = await import(\"../../server/sessions\");\n  const session = await sessions.getSession(request);\n  const userId = session.get(\"userId\");\n  return {\n    user: userId ? { id: userId, name: \"Signed-in developer\" } : null\n  };\n});\n```"
        },
        {
          "id": "production-checklist",
          "title": "Review production boundaries",
          "markdown": "Security is a deployment property as well as a framework property. Recheck proxy headers, host validation, cookies, CSP, and secret injection in the actual hosting environment.\n\n-   [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") signing keys and API secrets outside source control.\n    \n-   Use server-only modules for databases, sessions, and private clients.\n    \n-   Authenticate webhooks independently before disabling origin validation.\n    \n-   Protect the monitor endpoint with `TAVO_MONITOR_TOKEN`.\n    \n-   Allow only exact remote image hosts and paths that the product needs."
        },
        {
          "id": "security-defaults-reference",
          "title": "Framework security defaults",
          "markdown": "-   TSX text and attribute values are escaped. Unsafe attribute names and javascript-style URL protocols are rejected.\n    \n-   External redirects are blocked by default. Validate any target before enabling `allowExternalRedirects`.\n    \n-   Unsafe route actions and plugin handlers validate Origin by default. Node handlers also require a local or trusted inbound host.\n    \n-   SSR HTML and optimized image responses include nosniff, strict-origin-when-cross-origin, a restrictive camera/microphone/geolocation policy, and SAMEORIGIN framing.\n    \n-   Node mutation bodies are limited to 10 `MiB` by default. Tune `maxRequestBodyBytes` or use direct-to-storage uploads for large files.\n    \n-   Remote image optimization is disabled until hosts are explicitly allowlisted. Private hosts, unsafe redirects, path escapes, and oversized inputs are rejected."
        },
        {
          "id": "hydration-data-boundary",
          "title": "Treat hydration state as browser-readable data",
          "markdown": "Successful page loader results, layout loader results, [`Store`](/docs/core/api/application#api-tavojs-core--store \"View Store in the Core API reference\") snapshots selected for hydration, and plugin hydration contributions are serialized into the HTML response so the browser can resume the same application state. Escaping protects the document from script injection; it does not make those values private.\n\n-   Return display DTOs with only the fields that the rendered interface needs.\n    \n-   Never return session IDs, access tokens, signing secrets, database records with private columns, or authorization-only policy details.\n    \n-   Keep private values in server loaders, actions, middleware, sessions, or request-scoped plugin resources and derive a separate browser-safe result.\n    \n-   Inspect the production HTML and \\_\\_`TAVO_STATE__` payload during security review; do not rely only on what is visibly rendered.\n    \n\n**Server-loaded does not mean server-private**\n\nIf a value becomes page or layout data used for hydration, a browser user can read it even when no component prints it."
        },
        {
          "id": "server-only-reference",
          "title": "Server-only module boundaries",
          "markdown": "Place databases, session storage, secrets, and private clients under src/server or import the server-only marker. Use `defineServerOnly` to add a runtime assertion around an exported function.\n\n-   The server-only marker has no runtime exports; the build guard uses the import boundary to keep the module out of client bundles.\n    \n-   `defineServerOnly` throws if the wrapped function is called in a browser.\n    \n-   A shared route module can dynamically import a server module from an action, server loader, or server middleware.\n    \n\n**Reference src/server/auth.ts**\n\n```ts\nimport \"@tavojs/core/server-only\";\nimport { defineServerOnly } from \"@tavojs/core/server\";\n\nexport const getPrivateClient = defineServerOnly(() => createPrivateClient({\n  token: process.env.PRIVATE_API_TOKEN\n}));\n```"
        },
        {
          "id": "mutation-security-reference",
          "title": "Safe mutation and authentication order",
          "markdown": "-   Enforce the expected content type and request body limit.\n    \n-   Validate the payload shape, then authenticate and authorize the current request.\n    \n-   Keep origin validation enabled for browser mutations. Authenticate webhooks with a signature before opting out.\n    \n-   Use idempotency keys or a transaction for retries. `AbortSignal` cancellation cannot undo a committed side effect.\n    \n-   Return only safe fields. Never serialize access tokens, session IDs, or private service responses into route data.\n    \n-   Keep request identity out of global stores, plugin runtime stores or capabilities, application services, and module variables because server processes handle concurrent requests."
        },
        {
          "id": "csp-reference",
          "title": "Content Security Policy and raw content",
          "markdown": "`Tavo.js` does not set one universal Content Security Policy because allowed scripts, styles, images, fonts, and analytics differ by application. Add a policy at the deployment edge or adapter and test the production SSR response.\n\n**Reference Reference snippet**\n\n```text\nContent-Security-Policy:\n  default-src 'self';\n  base-uri 'self';\n  object-src 'none';\n  frame-ancestors 'self';\n  img-src 'self' data:;\n  script-src 'self' 'nonce-{nonce}';\n  style-src 'self';\n  font-src 'self'\n```\n\n**Use one nonce through the render**\n\nProgressive streaming patches and intentional inline Script content need the same request nonce passed through document rendering and allowed by script-src. Raw head HTML must never contain user input."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:sessions-and-authentication",
      "section": "core",
      "slug": "sessions-and-authentication",
      "title": "Sessions and authentication",
      "description": "Store opaque signed sessions, rotate credentials, protect authentication boundaries, and keep request identity isolated during SSR.",
      "keywords": [
        "session",
        "authentication",
        "cookie",
        "auth",
        "security"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application using SSR for protected requests.",
        "A server-side session store or a development-only memory store."
      ],
      "outcomes": [
        "Create signed opaque sessions and rotate their identifiers.",
        "Authenticate and authorize every protected server request.",
        "Keep request identity out of process-wide state."
      ],
      "runtime": [
        "server"
      ],
      "related": [
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Review request, origin, secret, and deployment boundaries."
        },
        {
          "title": "Environment variables",
          "href": "/docs/core/environment-variables",
          "description": "Load session signing secrets safely."
        }
      ],
      "canonicalPath": "/docs/core/sessions-and-authentication",
      "sections": [
        {
          "id": "session-storage-reference",
          "title": "Create session storage",
          "markdown": "`Tavo.js` stores only a signed opaque session ID in the cookie. [`Session`](/docs/core/api/server#api-tavojs-core-server--session \"View Session in the Core API reference\") data stays in a `SessionStore` such as a database or Redis adapter. The built-in memory store is bounded but process-local, so reserve it for tests and local development.\n\n-   `cookie.name` and at least one non-empty secret are required. Every secret must contain at least 32 UTF-8 bytes.\n    \n-   Cookie defaults are Path=/, `HttpOnly` enabled, and `SameSite`\\=Lax. Secure is inferred from an HTTPS request unless explicitly configured.\n    \n-   Secrets are checked in array order and new cookies are signed with the first secret. Put the new secret first and retain old secrets during a rotation window.\n    \n\n**Reference src/server/sessions.ts**\n\n```ts\nimport \"@tavojs/core/server-only\";\nimport { createSessionStorage } from \"@tavojs/core/server\";\n\nexport const sessions = createSessionStorage<{ userId?: string }>({\n  cookie: {\n    name: \"__session\",\n    secrets: [process.env.SESSION_SECRET!],\n    maxAge: 60 * 60 * 24 * 7,\n    sameSite: \"lax\"\n  },\n  store: databaseSessionStore\n});\n```"
        },
        {
          "id": "session-api-reference",
          "title": "Session and storage API",
          "markdown": "-   `getSession` accepts a Request or an object with a request property. Missing, invalid, or expired cookies create a new empty session.\n    \n-   rotate replaces the opaque ID at the next commit and deletes the old store entry. Use it after login or a privilege change.\n    \n-   destroy marks the session for deletion. A later commit returns an expired cookie and removes the store entry.\n    \n-   redirect commits the session, appends Set-Cookie, normalizes the Location target, and defaults to status 303.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype Session<T> = {\n  readonly data: T;\n  readonly id: string;\n  readonly isNew: boolean;\n  readonly rotated: boolean;\n  readonly secure: boolean;\n  get(key): T[key] | undefined;\n  has(key): boolean;\n  set(key, value): void;\n  delete(key): void;\n  rotate(): void;\n  destroy(): void;\n};\n\nsessions.getSession(request): Promise<Session<T>>\nsessions.commitSession(session, { maxAge? }): Promise<string>\nsessions.destroySession(session, { maxAge? }): Promise<string>\nsessions.redirect(to, session, init?): Promise<Response>\n```"
        },
        {
          "id": "session-store-reference",
          "title": "Custom and memory stores",
          "markdown": "-   The memory limit defaults to 10,000. Oldest entries are evicted when capacity is exceeded; expired entries are removed when read.\n    \n-   Set `maxEntries` to zero to disable persistence. A negative, infinite, or non-numeric limit throws.\n    \n-   commit `maxAge` overrides the cookie `maxAge` for that response. Expiry is stored alongside server data and serialized into the cookie.\n    \n-   Production stores must apply expiration consistently and support every runtime instance that can receive the user's next request.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype SessionStore<T> = {\n  get(id: string): MaybePromise<{ data: T; expiresAt: number | null } | null>;\n  set(id: string, entry: { data: T; expiresAt: number | null }): MaybePromise<void>;\n  delete(id: string): MaybePromise<void>;\n};\n\nconst memory = createMemorySessionStore({ maxEntries: 10_000 });\nmemory.size();\n```"
        },
        {
          "id": "authentication-flow",
          "title": "Authenticate every request",
          "markdown": "-   Read authentication in server middleware, loaders, actions, or plugin handlers for every protected request.\n    \n-   After verifying login, rotate the session ID, set the user ID, and return `sessions.redirect` so the cookie is committed.\n    \n-   Send only safe profile fields into loader data. Never expose the session ID, cookie, signing secret, or access token.\n    \n-   A client auth store may mirror safe user data after hydration, but the server must still authorize each request from the session backend.\n    \n\n**Reference Reference snippet**\n\n```ts\nexport const middleware = defineServerMiddleware(async ({ request }) => {\n  const session = await sessions.getSession(request);\n  if (!session.get(\"userId\")) return { redirect: \"/login\", status: 302 };\n});\n\nexport const load = defineServerLoader(async ({ request }) => {\n  const session = await sessions.getSession(request);\n  const user = await findUser(session.get(\"userId\"));\n  return { user: user ? { id: user.id, name: user.name } : null };\n});\n```\n\n**Request-scoped means request-scoped**\n\nNever write the current user, tenant, cart, token, or permissions to a global store, plugin store, service, or module variable during SSR. Those objects can be shared by concurrent requests."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:node-runtime",
      "section": "core",
      "slug": "node-runtime",
      "title": "Node runtime and production security",
      "description": "Configure the generated Node server, handler, origin and host checks, document boundary, static cache, and remote image optimizer.",
      "keywords": [
        "Node",
        "SSR handler",
        "canonicalOrigin",
        "trustedHosts",
        "remotePatterns",
        "deployment"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application using SSR, server loaders, actions, sessions, plugin endpoints, or image optimization."
      ],
      "outcomes": [
        "Configure the stable Node handler through tavo.config.ts.",
        "Apply the correct mutation origin and inbound host policy.",
        "Allowlist remote images without enabling private-network access.",
        "Operate the generated production server with explicit environment values."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Deployment",
          "href": "/docs/core/deployment",
          "description": "Choose the static or Node production artifact."
        },
        {
          "title": "Security",
          "href": "/docs/core/security",
          "description": "Review the complete application security model."
        },
        {
          "title": "Environment variables",
          "href": "/docs/core/environment-variables",
          "description": "Load server secrets and mode-specific values."
        }
      ],
      "canonicalPath": "/docs/core/node-runtime",
      "sections": [
        {
          "id": "node-config",
          "title": "Configure the stable server boundary",
          "markdown": "Place [](/docs/core/api/server#api-tavojs-core-server--nodehandleroptions \"View NodeHandlerOptions in the Core API reference\")under ssr in the one root tavo.config.ts. Tavo.js supplies route modules and top-level plugins to generated builds; applications configure the remaining handler behavior. Document fields follow [](/docs/core/api/server#api-tavojs-core-server--renderdocumentoptions \"View RenderDocumentOptions in the Core API reference\"), and image fields follow [](/docs/core/api/server#api-tavojs-core-server--imageoptimizeroptions \"View ImageOptimizerOptions in the Core API reference\").\n\n-   `RenderDocumentOptions` has title and `unsafeHeadHtml`. It has no raw `document.head` string alias.\n    \n-   Prefer route head exports and escaped TSX metadata. `unsafeHeadHtml` is unescaped and must never contain user-controlled content.\n    \n-   `canonicalOrigin` must contain only an HTTP(S) origin: no credentials, path, query, or hash.\n    \n-   `maxRequestBodyBytes` defaults to 10 `MiB` for the Node handler.\n    \n-   Cookie or Authorization requests bypass static response caching.\n    \n\n**Reference tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\n\nconst reviewedBootstrapHtml =\n  '<meta name=\"application-name\" content=\"Acme\">';\n\nexport default defineConfig({\n  ssr: {\n    canonicalOrigin: \"https://app.example.com\",\n    trustedHosts: [\"app.example.com\"],\n    maxRequestBodyBytes: 10 * 1024 * 1024,\n    stream: true,\n    document: {\n      lang: \"en\",\n      title: \"Acme\",\n      unsafeHeadHtml: reviewedBootstrapHtml\n    },\n    images: {\n      allowRemote: true,\n      remotePatterns: [{\n        protocol: \"https:\",\n        hostname: \"images.example.com\",\n        pathname: \"/media/**\"\n      }]\n    }\n  }\n});\n```"
        },
        {
          "id": "handler-http",
          "title": "Know the production HTTP behavior",
          "markdown": "[](/docs/core/api/server#api-tavojs-core-server--createnoderequesthandler \"View createNodeRequestHandler in the Core API reference\")applies this contract to the generated Node server. Low-level document and page render functions remain available when a platform needs a custom server integration.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`GET / HEAD`\n\n`page request`\n\nrender route\n\nResolves the route, plugins, images, static response cache, and optional streaming document.\n\n`unsafe method + action`\n\n`mutation`\n\naction response\n\nValidates host/origin and optional content type before running the route action.\n\n`unsafe method + plugin endpoint`\n\n`mutation`\n\nplugin response\n\nRuns matching server middleware and the most-specific endpoint with request-scoped disposal.\n\n`non-page method without handler`\n\n`HTTP failure`\n\n405\n\nReturns Allow: GET, HEAD and baseline security headers.\n\n`body over limit`\n\n`HTTP failure`\n\n413\n\nRejects before an action or endpoint receives the body.\n\n`uncaught handler failure`\n\n`HTTP failure`\n\ngeneric 500\n\nContains the exception and avoids returning private error details.\n\n`client disconnect`\n\n`cancellation`\n\nAbortSignal\n\nAborts request-owned work and cancels an active streaming reader.\n\n-   HTML, actions, plugin responses, images, and generated static assets receive baseline nosniff, referrer, permissions, and framing headers where applicable.\n    \n-   `Tavo.js` does not invent a universal Content Security Policy. Add a deployment-specific policy and pass one request nonce through intentional inline content.\n    \n-   The handler exposes `invalidateCache`(tags) and `clearCache`() for rendered and resolved cache invalidation.\n    \n\n**Reference server.mts**\n\n```ts\nimport { createServer } from \"node:http\";\nimport { createNodeRequestHandler } from \"@tavojs/core/server\";\nimport * as modules from \"virtual:tavo-pages\";\n\nconst handleRequest = createNodeRequestHandler({\n  modules,\n  trustedHosts: [\"example.com\"],\n  stream: true,\n});\n\ncreateServer(handleRequest).listen(3000);\n```"
        },
        {
          "id": "origin-matrix",
          "title": "Apply the exact origin and Host policy",
          "markdown": "Origin validation applies to unsafe methods when `validateOrigin` is not false. A present Origin must equal the normalized request URL origin. Missing Origin is accepted by the Fetch handler; the Node handler still requires a local or configured trusted inbound host.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`Fetch + matching Origin`\n\n`unsafe action / endpoint`\n\naccepted\n\nOrigin exactly matches new URL(`request.url`).origin.\n\n`Fetch + mismatched Origin`\n\n`unsafe action / endpoint`\n\n403\n\nRejected before application mutation code runs.\n\n`Fetch + missing Origin`\n\n`unsafe action / endpoint`\n\naccepted\n\nSupport for non-browser clients; authentication and authorization remain required.\n\n`Node + untrusted Host`\n\n`unsafe action / endpoint`\n\n403\n\nRejected even when Origin is missing or agrees with the forged Host.\n\n`Node + local Host`\n\n`localhost / loopback`\n\ntrusted\n\nLocalhost, 127.0.0.1, and loopback IPv6 are implicit.\n\n`Node + trustedHosts`\n\n`exact host or hostname`\n\naccepted\n\nA configured hostname also matches that hostname with an inbound port.\n\n`Node + canonicalOrigin`\n\n`reverse proxy`\n\npublic URL origin\n\nConstructs request URLs from the public origin and adds its host and hostname to the trusted set.\n\n`validateOrigin: false`\n\n`explicit opt-out`\n\nno origin check\n\nReserve for independently authenticated integrations such as signature-verified webhooks.\n\n**Origin validation is not authorization**\n\nA same-origin or Origin-less request can still belong to the wrong user. Authenticate the session, authorize the resource, validate the payload, and use idempotency or a transaction before committing a mutation."
        },
        {
          "id": "remote-images",
          "title": "Allowlist remote images narrowly",
          "markdown": "Configure remote loading through [](/docs/core/api/server#api-tavojs-core-server--imageoptimizeroptions \"View ImageOptimizerOptions in the Core API reference\"). The optional resolveHostname hook is a platform adapter with the exact signature shown below.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`allowRemote`\n\n`boolean`\n\nfalse\n\nRemote sources remain disabled until explicitly enabled.\n\n`remotePatterns`\n\n`string | { protocol, hostname, port, pathname }[]`\n\n\\[\\]\n\nAllows only matching remote origins and paths. Prefer HTTPS and the narrowest pathname.\n\n`resolveHostname`\n\n`(hostname: string) => Promise<Array<{ address: string }>>`\n\nNode DNS\n\nAdvanced test/platform hook; every returned address must pass public-network validation.\n\n`allowInsecureRemote`\n\n`boolean`\n\nfalse\n\nRelaxes HTTP/private-network protections. Use only inside a controlled network boundary.\n\n`timeoutMs / maxBytes`\n\n`number`\n\n5000 / 10 MiB\n\nBounds remote fetch time and source bytes.\n\n`maxConcurrentTransforms`\n\n`number`\n\n4\n\nLimits active image transformations.\n\n`maxPendingTransforms`\n\n`number`\n\n64\n\nExcess queued transformations receive 503.\n\n-   The optimizer rejects private hostnames and private DNS results, and checks redirected locations again.\n    \n-   Local absolute paths must remain inside `publicDir`.\n    \n-   Set the [`Image`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--image \"View Image in the Core API reference\") component's unoptimized prop when the source should bypass the optimizer.\n    \n-   Install the optional sharp peer only on servers that perform transformations."
        },
        {
          "id": "generated-node-server",
          "title": "Operate the generated Node server",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`NODE_ENV`\n\n`environment`\n\nproduction\n\nSelects mode-specific server env loading before the built entry is imported.\n\n`HOST`\n\n`bind address`\n\n127.0.0.1\n\nUse 0.0.0.0 only when the container or platform must accept external connections.\n\n`PORT`\n\n`number`\n\n4174\n\nHTTP listen port.\n\n`TAVO_MONITOR_TOKEN`\n\n`secret`\n\nmonitor disabled\n\nEnables /\\_tavo/monitor with an exact Authorization: Bearer header. Unauthorized requests return 404.\n\n`assets/*`\n\n`fingerprinted static assets`\n\n1 year immutable\n\nGenerated hashed assets receive long-lived caching.\n\n`other client files`\n\n`static files`\n\nno-cache\n\nHTML and non-fingerprinted files are revalidated.\n\n-   Deploy .`tavo`/build/client for fully client/static applications or run `.tavo/build/server/start.mjs` for request-time behavior.\n    \n-   Plain `tavo` preview delegates to Vite preview. `tavo` preview `--ssr` checks for missing or stale output and runs `tavo` build first when required.\n    \n-   Protect the external TLS, proxy header, CSP, secret injection, health-check, and process supervision boundaries on the hosting platform.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo build\nHOST=0.0.0.0 PORT=4174 node .tavo/build/server/start.mjs\n```"
        },
        {
          "id": "node-verification",
          "title": "Verify the deployed boundary",
          "markdown": "-   Exercise one SSR GET, one client navigation, one action, one plugin endpoint, one error response, and one remote image policy decision.\n    \n-   Verify the public Origin observed behind the real reverse proxy.\n    \n-   Confirm an untrusted Host and mismatched Origin receive 403 before mutation code runs.\n    \n-   Confirm the monitor endpoint is hidden without the Bearer token.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo check\nnpx tavo build --report-json\nnpx tavo preview --ssr\nnpx tavo monitor --url http://127.0.0.1:4174 --token \"$TAVO_MONITOR_TOKEN\" --once\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:plugins-and-localization",
      "section": "core",
      "slug": "plugins-and-localization",
      "title": "Plugins and localization",
      "description": "Choose the focused guide for framework plugins or locale-aware application content.",
      "keywords": [
        "plugin",
        "i18n",
        "services",
        "locale"
      ],
      "kind": "concept",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Choose the focused guide for framework plugins or locale-aware application content."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/plugins-and-localization",
      "sections": [
        {
          "id": "choose-topic",
          "title": "Choose the integration you need",
          "markdown": "Plugins and localization both participate in application setup, but they solve different problems. They now have separate guides so you can learn one contract at a time.\n\n[\n\n## Plugins\n\nDeclare framework-owned capabilities, routes, endpoints, middleware, document head entries, and build integrations.Read guide →\n\n](/docs/core/plugins)[\n\n## Localization\n\nCreate one i18n service for messages, locale detection, localized paths, and document direction.Read guide →\n\n](/docs/core/localization)"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:plugins",
      "section": "core",
      "slug": "plugins",
      "title": "Plugins",
      "description": "Declare framework integrations with an explicit manifest and lazy client, server, and build implementations.",
      "keywords": [
        "plugin",
        "manifest",
        "capability",
        "endpoint"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Declare framework integrations with an explicit manifest and lazy client, server, and build implementations."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/plugins",
      "sections": [
        {
          "id": "plugin-boundary",
          "title": "Use a plugin for framework integration",
          "markdown": "Create a plugin when a package must contribute framework-owned behavior such as capabilities, stores, pages, endpoints, middleware, head entries, or build configuration. Keep ordinary feature code in pages, components, and server modules.\n\nA plugin has an identity, a package version, a manifest of everything it may contribute, and lazy phase loaders. The manifest is the contract; a phase may implement only the declarations owned by that plugin.\n\n**Request data needs request scope**\n\nRuntime capabilities and stores can outlive one request during SSR. Resolve the current user, tenant, session, and token inside request-scoped capabilities, middleware, or endpoint handlers."
        },
        {
          "id": "plugin-example",
          "title": "Declare Plugin API v1 before implementing",
          "markdown": "Published plugins bake the literal `apiVersion`: 1 into their descriptor. Keep server implementation behind the server phase so client builds do not evaluate private dependencies.\n\n**Create src/plugins/project-api.ts — create this plugin descriptor**\n\n```ts\nimport {\n  definePlugin,\n  definePluginPhase\n} from \"@tavojs/core/plugin\";\n\nexport const projectApi = definePlugin({\n  id: \"@project/api\",\n  version: \"1.0.0\",\n  apiVersion: 1,\n  manifest: {\n    endpoints: [{\n      id: \"projects\",\n      methods: [\"GET\"],\n      match: { kind: \"exact\", path: \"/api/projects\" }\n    }],\n    exposure: [{\n      target: \"server\",\n      from: \"/api/projects\",\n      to: \"/api/projects\",\n      reason: \"Expose the project's public read endpoint.\"\n    }]\n  },\n  server: async () => definePluginPhase({\n    endpoints: {\n      projects: async () => {\n        const { listProjects } = await import(\"../server/projects\");\n        return Response.json(await listProjects());\n      }\n    }\n  })\n});\n```\n\n**Create src/server/projects.ts — create this server-only implementation**\n\n```ts\nimport \"@tavojs/core/server-only\";\n\ntype Project = { id: string; name: string };\n\nconst projects: Project[] = [\n  { id: \"alpha\", name: \"Alpha\" },\n  { id: \"beta\", name: \"Beta\" }\n];\n\nexport async function listProjects(): Promise<Project[]> {\n  return projects;\n}\n```"
        },
        {
          "id": "install-plugin",
          "title": "Install it in application configuration",
          "markdown": "Add the plugin instance to the existing plugins array in `tavo.config.ts`. Preserve other plugins and configuration fields; array order is not a substitute for declared dependencies or middleware ordering.\n\n**Merge tavo.config.ts — merge this plugin into the existing configuration**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { projectApi } from \"./src/plugins/project-api\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  plugins: [projectApi]\n});\n```"
        },
        {
          "id": "plugin-contract-reference",
          "title": "Plugin hooks and lifecycle",
          "markdown": "-   id identifies the package contract; version is the plugin package version used for dependency checks.\n    \n-   The manifest declares every capability, store, page, endpoint, middleware entry, head entry, build contribution, permission, and public exposure the plugin may own.\n    \n-   Client, server, and build loaders are lazy boundaries. Put environment-specific imports inside the matching phase module.\n    \n-   Use `definePluginFactory` when consumers configure typed plugin options and `definePluginPhase` to preserve literal implementation keys.\n    \n-   Runtime stores and capabilities may be shared between SSR requests. Use request-scoped capabilities, middleware, or handlers for the current user, session, or token.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype TavoPlugin = {\n  id: string;\n  version: string;\n  apiVersion: 1;\n  manifest: TavoPluginManifest;\n  client?: () => MaybePromise<TavoPluginPhase | { default: TavoPluginPhase }>;\n  server?: () => MaybePromise<TavoPluginPhase | { default: TavoPluginPhase }>;\n  build?: () => MaybePromise<TavoPluginPhase | { default: TavoPluginPhase }>;\n};\n```"
        },
        {
          "id": "plugin-manifest-reference",
          "title": "Manifest declarations and phase implementations",
          "markdown": "-   Every implementation key must match an ID declared in the manifest. Missing, extra, or cross-plugin contributions become diagnostics.\n    \n-   Endpoint manifests declare allowed methods, exact or subtree path matching, and optional origin-validation policy. Endpoint handlers return a Response.\n    \n-   Plugin pages and endpoints are namespaced by default. A manifest exposure must deliberately map them to a public application URL.\n    \n-   Middleware manifests declare server or page target, lifecycle stage, and before/after ownership constraints.\n    \n-   [`Head`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--head \"View Head in the Core API reference\") manifests declare a stable key, singleton or multi cardinality, and whether unsafe HTML permission is required. A raw contribution must declare the `unsafeHeadHtml` permission with a reviewable reason.\n    \n-   Capabilities explicitly declare runtime or request scope. Request-scoped factories receive the current Fetch Request.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype TavoPluginPhase = {\n  capabilities?: Record<string, PluginResourceFactory | PluginRequestResourceFactory>;\n  stores?: Record<string, PluginStoreFactory>;\n  pages?: Record<string, PageModule>;\n  endpoints?: Record<string, PluginServerHandler>;\n  middleware?: Record<string, PageMiddleware | PluginServerMiddleware>;\n  head?: Record<string, Child | string | ((context) => MaybePromise<Child | string>)>;\n  build?: { plugins?: Record<string, unknown> };\n  setup?: (context: PluginResolveContext) => MaybePromise<void>;\n  dispose?: () => MaybePromise<void>;\n};\n```"
        },
        {
          "id": "plugin-ordering-reference",
          "title": "Compatibility, ordering, and diagnostics",
          "markdown": "-   Published descriptors must bake in the literal `apiVersion`: 1. Application-local plugins may use `TAVO_PLUGIN_API_VERSION` because they are rebuilt with their host.\n    \n-   `checkPluginCompatibility` accepts a minimal { id, `apiVersion` } descriptor and rejects missing or incompatible versions with `TAVO_PLUGIN_001` before loading any phase.\n    \n-   Declare plugin dependencies by plugin ID, compatible package version, and any required capability tokens.\n    \n-   Declare middleware ordering with before and after ownership IDs. Dependency and ordering cycles become diagnostics.\n    \n-   Duplicate ownership, undeclared contributions, incompatible contracts, unapproved raw head HTML, and implicit route replacement are rejected or diagnosed.\n    \n-   Install a default plugin with plugins: \\[plugin\\]. Repeated installations require a unique application-supplied `instanceId`.\n    \n-   Use plugins: { use, overrides } only for owner-aware replacement.\n    \n-   Plugin diagnostics use the severity field."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:plugin-api-v1",
      "section": "core",
      "slug": "plugin-api-v1",
      "title": "Plugin API v1 reference",
      "description": "Author, install, inspect, and operate Plugin API v1 descriptors with explicit ownership, scope, authority, and failure contracts.",
      "keywords": [
        "plugin",
        "apiVersion",
        "capability",
        "plugin store",
        "instanceId",
        "ownership"
      ],
      "kind": "reference",
      "prerequisites": [
        "A framework integration that must contribute routes, endpoints, middleware, capabilities, stores, document head entries, or build behavior.",
        "An understanding of request-scoped versus process-wide server state."
      ],
      "outcomes": [
        "Declare a Plugin API v1 manifest and matching lazy phases.",
        "Choose safe runtime and request capability scopes.",
        "Install repeated instances and inspect their ownership graph.",
        "Interpret plugin diagnostics without executing invalid phase code."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Plugins guide",
          "href": "/docs/core/plugins",
          "description": "Start with the framework integration mental model."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Install plugins in the one root configuration file."
        },
        {
          "title": "Diagnostics reference",
          "href": "/docs/core/diagnostics",
          "description": "Look up stable framework and plugin diagnostic codes."
        }
      ],
      "canonicalPath": "/docs/core/plugin-api-v1",
      "sections": [
        {
          "id": "descriptor",
          "title": "Declare identity before implementation",
          "markdown": "Import plugin authoring APIs from `@tavojs/core/plugin`. A descriptor identifies the package, publishes literal Plugin API version 1, and declares every resource it may own before any client, server, or build phase is loaded.\n\nEvery plugin descriptor must write `apiVersion`: 1 literally so compatibility is visible to tooling and reviewers. `TAVO_PLUGIN_API_VERSION` is useful for host-side compatibility checks, not as a replacement inside the descriptor.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`id`\n\n`string`\n\nrequired\n\nStable plugin identity used by dependencies, owners, exposure, and overrides.\n\n`version`\n\n`semver string`\n\nrequired\n\nPlugin package version checked against dependency ranges.\n\n`apiVersion`\n\n`1`\n\nrequired\n\nIncompatible or missing versions fail with `TAVO_PLUGIN_001` before a phase is loaded.\n\n`manifest`\n\n[`TavoPluginManifest`](/docs/core/api/plugin#api-tavojs-core-plugin--tavopluginmanifest)\n\nrequired\n\nDeclares capabilities, stores, pages, endpoints, middleware, head entries, build contributions, permissions, and public exposure.\n\n`client / server / build`\n\n[`lazy`](/docs/core/api/errors-and-code-splitting#api-tavojs-core--lazy) `phase loaders`\n\nomitted\n\nLoad environment-specific implementation only after graph preflight succeeds.\n\n**Reference src/plugins/audit-log.ts**\n\n```ts\nimport {\n  defineCapability,\n  definePlugin,\n  definePluginPhase\n} from \"@tavojs/core/plugin\";\n\nexport type AuditLog = {\n  write(event: { name: string; actorId?: string }): Promise<void>;\n};\n\nexport const auditLog = defineCapability<AuditLog, \"runtime\">({\n  provider: \"@acme/audit\",\n  name: \"audit-log\",\n  scope: \"runtime\"\n});\n\nexport const auditPlugin = definePlugin({\n  id: \"@acme/audit\",\n  version: \"1.0.0\",\n  apiVersion: 1,\n  manifest: {\n    provides: [auditLog]\n  },\n  server: async function loadAuditServerPhase() {\n    return definePluginPhase({\n      capabilities: {\n        \"audit-log\": function createAuditLog(): AuditLog {\n          return {\n            async write(event) {\n              await persistAuditEvent(event);\n            }\n          };\n        }\n      }\n    });\n  }\n});\n```\n\n**The manifest is enforced**\n\nA phase implementation key must match an ID owned by the manifest. Missing, extra, cross-plugin, or environment-inappropriate contributions become diagnostics instead of silently extending authority."
        },
        {
          "id": "capabilities",
          "title": "Choose capability scope and dependency authority",
          "markdown": "Capabilities are owned tokens, not global service names. A runtime capability may be shared for the life of the plugin runtime. A request capability is created for one Fetch Request and disposed after its response body completes or is cancelled.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`runtime`\n\n[`PluginCapabilityToken`](/docs/core/api/plugin#api-tavojs-core-plugin--plugincapabilitytoken)`<``T``,` `\"runtime\"``>`\n\none value per plugin runtime\n\nUse for stateless clients, shared pools, clocks, and other concurrency-safe resources.\n\n`request`\n\n[`PluginCapabilityToken`](/docs/core/api/plugin#api-tavojs-core-plugin--plugincapabilitytoken)`<``T``,` `\"request\"``>`\n\none value per request scope\n\nUse for the current request, tenant, authenticated identity, trace, or request-owned transaction.\n\n`dependencies[].capabilities`\n\n[`AnyPluginToken`](/docs/core/api/plugin#api-tavojs-core-plugin--anyplugintoken)`[``]`\n\nno access\n\nA consumer may resolve only tokens explicitly declared on its dependency.\n\n`resolve / tryResolve`\n\n`typed capability lookup`\n\nthrows / undefined\n\nResolution is owner-aware; `tryResolve` converts unavailable access to undefined.\n\n-   Never place the current user, session, token, tenant, or permissions in a runtime capability.\n    \n-   Request-scoped resources stay alive while a streaming response is being read and dispose after completion or cancellation.\n    \n-   Dependency and capability cycles fail graph validation; they are not resolved by array order.\n    \n-   MVC controllers can resolve runtime tokens through `this.capabilities` while an active pages runtime is rendering.\n    \n\n**Reference src/plugins/audit-consumer.ts**\n\n```ts\nimport {\n  definePlugin,\n  definePluginPhase\n} from \"@tavojs/core/plugin\";\nimport { auditLog } from \"./audit-log\";\n\nexport const auditConsumer = definePlugin({\n  id: \"@acme/audit-consumer\",\n  version: \"1.0.0\",\n  apiVersion: 1,\n  manifest: {\n    dependencies: [{\n      id: \"@acme/audit\",\n      version: \"^1.0.0\",\n      capabilities: [auditLog]\n    }],\n    endpoints: [{\n      id: \"record\",\n      methods: [\"POST\"],\n      match: { kind: \"exact\", path: \"/record\" }\n    }]\n  },\n  server: async function loadConsumerServerPhase() {\n    return definePluginPhase({\n      endpoints: {\n        record: async function recordAuditEvent(context) {\n          const audit = await context.resolve(auditLog);\n          await audit.write({ name: \"recorded\" });\n          return Response.json({ ok: true });\n        }\n      }\n    });\n  }\n});\n```"
        },
        {
          "id": "stores",
          "title": "Declare store hydration explicitly",
          "markdown": "Plugin stores are runtime-scoped `Tavo.js` stores. Hydration is opt-in because serialized server state crosses into the browser. A hydrated store must provide validation, serialization, and deserialization together.\n\n-   hydrate defaults to false.\n    \n-   hydrate: true without validate, serialize, and deserialize throws `TAVO_PLUGIN_002` during definition.\n    \n-   Hydration payloads are keyed by plugin owner and store name, so named instances stay isolated.\n    \n-   Invalid deserialized state is rejected instead of being installed into the store.\n    \n\n**Reference src/plugins/counter.ts**\n\n```ts\nimport {\n  definePlugin,\n  definePluginPhase,\n  definePluginStore\n} from \"@tavojs/core/plugin\";\n\ntype CounterState = { count: number };\n\nexport const counterStore = definePluginStore<CounterState>({\n  provider: \"@acme/counter\",\n  name: \"counter\",\n  hydrate: true,\n  serialize(value) {\n    return { count: String(value.count) };\n  },\n  deserialize(value) {\n    return {\n      count: Number((value as { count?: unknown }).count)\n    };\n  },\n  validate(value): value is CounterState {\n    return Boolean(\n      value &&\n      typeof value === \"object\" &&\n      Number.isFinite((value as { count?: unknown }).count)\n    );\n  }\n});\n\nexport const counterPlugin = definePlugin({\n  id: \"@acme/counter\",\n  version: \"1.0.0\",\n  apiVersion: 1,\n  manifest: {\n    stores: [counterStore]\n  },\n  server: async function loadCounterServerPhase() {\n    return definePluginPhase({\n      stores: {\n        counter: function createCounterState(): CounterState {\n          return { count: 0 };\n        }\n      }\n    });\n  }\n});\n```"
        },
        {
          "id": "manifest-contributions",
          "title": "Match every manifest contribution to its runtime phase",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`pages`\n\n`page phase`\n\nnamespaced\n\nPlugin pages remain under their plugin namespace unless declared exposure maps them publicly.\n\n`endpoints`\n\n`server phase`\n\nnamespaced\n\nDeclare methods, exact or subtree matching, and origin validation. Exact and method-specific matches win deterministically.\n\n`middleware`\n\n`server or page phase`\n\ndeclared stage\n\nUse server:before-handler, page:before-app, or page:after-app plus explicit before/after owner constraints.\n\n`head`\n\n`client/server phase`\n\nescaped TSX\n\nDeclare a stable key and singleton or multi cardinality. Raw strings require `unsafeHeadHtml` on the entry and a manifest permission with a reason.\n\n`build`\n\n`build phase`\n\nnone\n\nDeclare aliases, defines, and ordered build plugin IDs before implementing their values.\n\n`setup / dispose`\n\n`phase lifecycle`\n\nomitted\n\nSetup runs after successful initialization; dispose releases plugin-owned runtime resources in reverse lifecycle order.\n\n-   Framework paths under /\\_tavo remain reserved even when an application remaps exposure.\n    \n-   Endpoint, page, singleton head, alias, and define collisions fail unless an exact owner-aware override resolves them.\n    \n-   Plugin endpoint handlers return a Fetch Response. Uncaught request or disposal failures use `TAVO_PLUGIN_009`.\n    \n-   Raw head HTML must be declared twice: `unsafeHeadHtml` on the head entry and the `unsafeHeadHtml` permission with a reviewable reason.\n    \n\n**Reference src/plugin.ts**\n\n```ts\nimport { definePlugin } from \"@tavojs/core/plugin\";\n\nexport default definePlugin({\n  id: \"@example/audit\",\n  apiVersion: 1,\n  version: \"1.0.0\",\n  manifest: {\n    endpoints: [{\n      id: \"events\",\n      methods: [\"POST\"],\n      match: { kind: \"exact\", path: \"/events\" }\n    }],\n    middleware: [{\n      id: \"request-context\",\n      target: \"server\",\n      stage: \"server:before-handler\"\n    }]\n  },\n  server: () => import(\"./server\")\n});\n```"
        },
        {
          "id": "installation",
          "title": "Install defaults, named instances, and overrides",
          "markdown": "The top-level plugins field in `tavo.config.ts` accepts the `TavoPluginInput` union. Use a simple array for default installations. Use the { use, overrides } form for named instances, disabling an installation, exposure remapping, or explicit replacement.\n\n-   The owner of a default installation is plugin-id#default. A named installation uses plugin-id#`instanceId`.\n    \n-   Installing the same plugin more than once without distinct `instanceId` values is fatal.\n    \n-   enabled: false omits the installation and its manifest-declared permissions and exposure.\n    \n-   expose remaps manifest-declared page or server exposure; it does not grant undeclared contributions.\n    \n-   Override kinds are page, endpoint, head, alias, and define. Both the replaced owner and winning owner must match exactly.\n    \n\n**Reference tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { analyticsPlugin } from \"./src/plugins/analytics\";\nimport { dashboardPlugin } from \"./src/plugins/dashboard\";\n\nexport default defineConfig({\n  plugins: {\n    use: [\n      {\n        plugin: analyticsPlugin,\n        instanceId: \"primary\",\n        expose: {\n          server: {\n            from: \"/\",\n            to: \"/analytics\"\n          }\n        }\n      },\n      {\n        plugin: dashboardPlugin,\n        instanceId: \"primary\"\n      },\n      {\n        plugin: dashboardPlugin,\n        instanceId: \"disabled-preview\",\n        enabled: false\n      }\n    ],\n    overrides: [{\n      kind: \"page\",\n      key: \"/dashboard\",\n      replace: {\n        plugin: \"@acme/dashboard\",\n        instanceId: \"primary\"\n      },\n      with: {\n        owner: \"app\"\n      }\n    }]\n  }\n});\n```"
        },
        {
          "id": "plugin-verification",
          "title": "Inspect before loading phases",
          "markdown": "Use the CLI inspection command for normal plugin verification. It reports the serializable preflight without presenting framework host compilation or runtime construction as plugin-author APIs. Experimental tooling that genuinely needs the graph can import [](/docs/core/api/dev#api-tavojs-core-dev--inspectplugingraph \"View inspectPluginGraph in the Core API reference\")from `@tavojs/core/dev`.\n\n-   Inspect owners, versions, dependencies, capabilities, mounts, middleware, endpoints, head keys, build values, permissions, exposure, and overrides.\n    \n-   A diagnostic includes code, severity, phase, message, and optional resource, owners, and remediation hint.\n    \n-   `TAVO_PLUGIN_001` rejects incompatible API versions before any phase load.\n    \n-   `TAVO_PLUGIN_002` through 009 cover invalid identity/manifest, ownership, dependency, cycle, permission, phase, initialization/build, and request/disposal failures.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo inspect plugins --json\nnpx tavo check\nnpx tavo verify --json\nnpx tavo build\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:testing-and-diagnostics",
      "section": "core",
      "slug": "testing-and-diagnostics",
      "title": "Testing, diagnostics, and observability",
      "description": "Catch project-shape, type, route, hydration, performance, and production failures at the appropriate layer.",
      "keywords": [
        "testing",
        "doctor",
        "diagnostics",
        "observability"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Catch project-shape, type, route, hydration, performance, and production failures at the appropriate layer."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/testing-and-diagnostics",
      "sections": [
        {
          "id": "feedback-loop",
          "title": "Use the fastest useful check",
          "markdown": "During implementation, start with targeted tests and typechecking. Before shipping, validate the production route graph, SSR output, browser behavior, and route bundle sizes.\n\n**Run Terminal — run from the project root**\n\n```bash\nnpx tavo doctor\nnpx tavo check\nnpx tavo routes\nnpx tavo build --report-json\nnpx tavo preview --ssr\n```"
        },
        {
          "id": "runtime-diagnostics",
          "title": "Make runtime failures actionable",
          "markdown": "Development diagnostics can report runtime errors, mount and patch traces, and hydration mismatches with phase and DOM path context. Use this information to find the first server-client divergence rather than suppressing the warning.\n\n**Create src/diagnostics.ts — create this development-only setup**\n\n```ts\nimport { configureDevDiagnostics } from \"@tavojs/core/dev\";\n\nconfigureDevDiagnostics({\n  enabled: true,\n  devMode: true,\n  onHydrationMismatch: (event) => console.warn(event.path, event.kind),\n  onError: (error) => console.error(error)\n});\n```"
        },
        {
          "id": "observability",
          "title": "Instrument lifecycle events without leaking data",
          "markdown": "Instrumentation emits route resolution, middleware, loader, action, and cache lifecycle events. Events contain route patterns and timing metadata rather than request bodies, cookies, tokens, or loader results.\n\n**Production validation**\n\nA passing dev server is not enough. Run the production build and SSR preview, then exercise navigation, actions, error routes, and hydration in a browser."
        },
        {
          "id": "testing-api-reference",
          "title": "Framework testing API",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n[`createTestRoot`](/docs/core/api/dev#api-tavojs-core-dev--createtestroot)`(``)`\n\n[`TestRoot`](/docs/core/api/dev#api-tavojs-core-dev--testroot)\n\nnew detached div\n\nRequires a DOM environment and exposes render, hydrate, unmount, text, and html.\n\n[`flushMicrotasks`](/docs/core/api/dev#api-tavojs-core-dev--flushmicrotasks)`(``)`\n\n`Promise<void>`\n\n—\n\nWaits through one queued microtask turn.\n\n[`expectTextContent`](/docs/core/api/dev#api-tavojs-core-dev--expecttextcontent)`(``root``,` `expected``)`\n\n`void`\n\n—\n\nThrows with expected and actual text when the values differ.\n\n[`captureDiagnostics`](/docs/core/api/dev#api-tavojs-core-dev--capturediagnostics)`(``)`\n\n`{ traces, mismatches, restore }`\n\ndiagnostics enabled\n\nCaptures trace and hydration mismatch events until restore disables and clears callbacks.\n\n[`createPagesTestHarness`](/docs/core/api/dev#api-tavojs-core-dev--createpagestestharness)`(``modules``,` `options``)`\n\n`route harness`\n\n—\n\nExposes runtime, `renderPath`, and asynchronous `resolvePath`. Rendering requires a DOM.\n\n[`clearServices`](/docs/core/api/dev#api-tavojs-core-dev--clearservices) `/` [`unregisterService`](/docs/core/api/dev#api-tavojs-core-dev--unregisterservice)\n\n`test cleanup`\n\n—\n\nResets process-wide service registration between tests.\n\n**Reference Reference snippet**\n\n```tsx\nimport {\n  captureDiagnostics,\n  createTestRoot,\n  expectTextContent,\n  flushMicrotasks\n} from \"@tavojs/core/dev\";\n\nconst diagnostics = captureDiagnostics();\nconst root = createTestRoot();\nroot.render(<Counter />);\nawait flushMicrotasks();\nexpectTextContent(root, \"Count: 0\");\nroot.unmount();\ndiagnostics.restore();\n```"
        },
        {
          "id": "diagnostic-error-contract",
          "title": "Coded framework errors",
          "markdown": "[](/docs/core/api/runtime-contracts#api-tavojs-core--tavoerror \"View TavoError in the Core API reference\")keeps a stable code for tools and logs while retaining a human message, optional details, remediation hint, and cause. Use [](/docs/core/api/runtime-contracts#api-tavojs-core--istavoerror \"View isTavoError in the Core API reference\")before reading the code and [](/docs/core/api/runtime-contracts#api-tavojs-core--formattavoerror \"View formatTavoError in the Core API reference\")when presenting the hint to a developer.\n\n**Reference Reference snippet**\n\n```ts\nimport { formatTavoError, isTavoError } from \"@tavojs/core\";\n\ntry {\n  await startApplication();\n} catch (error) {\n  if (isTavoError(error)) console.error(error.code, formatTavoError(error));\n}\n```\n\n-   `TAVO_PAGES_001`: invalid resolved-page cache limit.\n    \n-   `TAVO_PAGES_002`: missing client root element.\n    \n-   `TAVO_PAGES_003` / 004 / 005: page discovery or server bootstrap failure.\n    \n-   `TAVO_SSR_001`: invalid canonical SSR origin.\n    \n-   `TAVO_CONFIG_001` / 002: server-only or likely secret code reached a client boundary.\n    \n-   `TAVO_PLUGIN_001`: plugin descriptor targets an unsupported contract.\n    \n-   `TAVO_HYDRATION_001`: strict hydration found a server/client mismatch."
        },
        {
          "id": "instrumentation-reference",
          "title": "Instrumentation event contract",
          "markdown": "Build a private observer with [](/docs/core/api/dev#api-tavojs-core-dev--createinstrumentation \"View createInstrumentation in the Core API reference\"), or adapt an OpenTelemetry tracer with [](/docs/core/api/dev#api-tavojs-core-dev--createopentelemetryinstrumentation \"View createOpenTelemetryInstrumentation in the Core API reference\"). Both produce a [](/docs/core/api/dev#api-tavojs-core-dev--tavoinstrumentation \"View TavoInstrumentation in the Core API reference\")value for the SSR configuration.\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`name`\n\n`\"route.resolve\" | \"route.middleware\" | \"route.loader\" | \"route.action\" | \"route.cache\"`\n\n—\n\nIdentifies the framework operation.\n\n`phase`\n\n`\"start\" | \"end\" | \"error\" | \"abort\" | \"hit\" | \"miss\" | \"invalidate\"`\n\n—\n\nIdentifies lifecycle state and cache outcomes.\n\n`timing/context`\n\n`timestamp, durationMs, requestId, route, layer`\n\noperation-specific\n\nCorrelates work without including request content.\n\n`result/cache`\n\n`status, count, cacheTags, error`\n\noperation-specific\n\nCarries bounded result metadata. Treat custom error objects as potentially sensitive.\n\n-   Observer exceptions are isolated and never interrupt framework work.\n    \n-   The `OpenTelemetry` adapter pairs start and terminal events into spans.\n    \n-   `recordErrors` defaults to false; enable it only after application-level redaction is configured.\n    \n-   Request bodies, headers, cookies, tokens, loader data, and store state are not emitted by the framework."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:scheduling-and-instrumentation",
      "section": "core",
      "slug": "scheduling-and-instrumentation",
      "title": "Scheduling and instrumentation",
      "description": "Prioritize browser updates and observe server route lifecycles through the public experimental runtime tooling boundary.",
      "keywords": [
        "scheduler",
        "startTransition",
        "flushSync",
        "priority",
        "idle",
        "instrumentation",
        "OpenTelemetry",
        "tracing",
        "observability",
        "route events"
      ],
      "kind": "reference",
      "prerequisites": [
        "A browser update-priority need or a server observability integration."
      ],
      "outcomes": [
        "Choose the correct update priority.",
        "Defer non-urgent rendering with startTransition.",
        "Use flushSync only for an immediate DOM ordering requirement.",
        "Attach isolated instrumentation to the pages runtime.",
        "Adapt route events to an OpenTelemetry-compatible tracer.",
        "Keep error and request data out of telemetry by default."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Advanced development tooling",
          "href": "/docs/core/development-tooling",
          "description": "Inspect runtime state and custom development hosts."
        },
        {
          "title": "Runtime configuration",
          "href": "/docs/core/runtime-configuration",
          "description": "Attach instrumentation to nested SSR configuration."
        },
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Choose the appropriate verification layer."
        }
      ],
      "canonicalPath": "/docs/core/scheduling-and-instrumentation",
      "sections": [
        {
          "id": "priorities",
          "title": "Understand the priority queue",
          "markdown": "Scheduling APIs are public experimental exports from `@tavojs/core/dev`. They change when a connected component update renders; they do not make synchronous business logic asynchronous and they do not prioritize network requests.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`immediate`\n\n[`UpdatePriority`](/docs/core/api/dev#api-tavojs-core-dev--updatepriority)\n\nexplicit\n\nQueues work that `flushSync` drains before returning from its callback.\n\n`user-blocking`\n\n[`UpdatePriority`](/docs/core/api/dev#api-tavojs-core-dev--updatepriority)\n\nexplicit\n\nHigher-priority interactive work flushed with the normal microtask queue.\n\n`normal`\n\n[`UpdatePriority`](/docs/core/api/dev#api-tavojs-core-dev--updatepriority)\n\ncurrent default\n\nConnected component updates flush in a microtask.\n\n`background`\n\n[`UpdatePriority`](/docs/core/api/dev#api-tavojs-core-dev--updatepriority)\n\nstartTransition\n\nNon-urgent updates flush from a timer turn.\n\n`idle`\n\n[`UpdatePriority`](/docs/core/api/dev#api-tavojs-core-dev--updatepriority)\n\nexplicit\n\nUses `requestIdleCallback` when available and a short timer fallback otherwise.\n\n-   A component queued more than once keeps its highest requested priority and renders once for the accumulated state.\n    \n-   `runWithUpdatePriority` restores the previous priority in a finally block, including after a callback throws.\n    \n-   `getCurrentUpdatePriority` reports the active callback priority; outside an override it reports normal.\n    \n\n**Reference src/scheduling.ts**\n\n```ts\nimport {\n  getCurrentUpdatePriority,\n  runWithUpdatePriority,\n} from \"@tavojs/core/dev\";\n\nrunWithUpdatePriority(\"user-blocking\", () => {\n  console.debug(getCurrentUpdatePriority()); // \"user-blocking\"\n  updateKeyboardSelection();\n});\n```"
        },
        {
          "id": "transition",
          "title": "Defer a non-urgent result update",
          "markdown": "-   Keep the controlled input update urgent and defer only the replaceable result rendering.\n    \n-   Cancellation and stale-result handling still belong to the controller or resource that owns asynchronous work.\n    \n-   Do not use a transition for accessibility state that must be announced immediately.\n    \n\n**Reference src/components/ProjectSearch/index.tsx**\n\n```tsx\nimport { TavoController, createTavo } from \"@tavojs/core\";\nimport { startTransition } from \"@tavojs/core/dev\";\nimport { Input, Stack, Text } from \"@tavojs/ui\";\n\ntype SearchState = {\n  query: string;\n  visibleProjects: string[];\n};\n\nclass ProjectSearchController extends TavoController {\n  updateQuery(query: string) {\n    this.model.patch({ query });\n\n    startTransition(() => {\n      this.model.patch({\n        visibleProjects: filterProjects(query)\n      });\n    });\n  }\n}\n\nexport const ProjectSearch = createTavo<{}, SearchState>({\n  model: function createSearchState() {\n    return {\n      query: \"\",\n      visibleProjects: []\n    };\n  },\n  controller: ProjectSearchController,\n  view: function ProjectSearchView({ state, controller }) {\n    return (\n      <Stack gap=\"sm\">\n        <Input\n          value={state.query}\n          onInput={(event) => {\n            controller?.updateQuery(event.currentTarget.value);\n          }}\n        />\n        <Text>{state.visibleProjects.length} projects</Text>\n      </Stack>\n    );\n  }\n});\n```"
        },
        {
          "id": "flush-sync",
          "title": "Flush only when browser ordering requires it",
          "markdown": "`flushSync` runs its callback at immediate priority and drains immediate connected component work before returning. It is appropriate when the next statement must observe the updated DOM, such as measurement or focus handoff.\n\n**Reference src/components/Disclosure/controller.ts**\n\n```ts\nimport { flushSync } from \"@tavojs/core/dev\";\n\nexport function openAndFocus(\n  open: () => void,\n  focusPanel: () => void\n): void {\n  flushSync(() => {\n    open();\n  });\n\n  focusPanel();\n}\n```\n\n**Synchronous rendering is a narrow escape hatch**\n\nDo not wrap ordinary event handlers in `flushSync`. It reduces batching opportunities and can make interaction slower. Prefer the normal queue unless the next browser operation truly depends on the committed DOM."
        },
        {
          "id": "scheduling-verification",
          "title": "Verify the user-visible effect",
          "markdown": "-   Use runtime devtools to confirm that pending updates return to zero after the interaction.\n    \n-   Test that urgent input remains responsive while transition work is pending.\n    \n-   Test focus or measurement code in a real DOM environment; a server string render cannot verify browser ordering.\n    \n-   Avoid tests that depend on exact timer milliseconds. Assert final state and ordering instead."
        },
        {
          "id": "event-contract",
          "title": "Read the lifecycle event contract",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`name`\n\n`route.resolve | middleware | loader | action | cache`\n\noperation-specific\n\nIdentifies the framework operation being observed.\n\n`phase`\n\n`start | end | error | abort | hit | miss | invalidate`\n\noperation-specific\n\nIdentifies lifecycle progress, cancellation, or a cache outcome.\n\n`timestamp / durationMs`\n\n`number`\n\nDate.now / terminal only\n\nProvides wall-clock correlation and elapsed time.\n\n`requestId / route / layer`\n\n`string`\n\nwhen available\n\nCorrelates related work without including a URL query, headers, or data payload.\n\n`status / count / cacheTags`\n\n`bounded result metadata`\n\nwhen available\n\nReports HTTP and cache outcomes.\n\n`error`\n\n`unknown`\n\nerror phase only\n\nPotentially sensitive application object; adapters do not record it unless explicitly enabled.\n\n-   Framework events do not include request bodies, headers, cookies, tokens, loader results, or store state.\n    \n-   Listener failures are caught and never alter route behavior.\n    \n-   A custom `TavoInstrumentation` implementation receives the same isolation guarantee as `createInstrumentation`."
        },
        {
          "id": "custom-listener",
          "title": "Create an isolated custom observer",
          "markdown": "-   Keep the observer synchronous and inexpensive. Buffer or enqueue slow exporter work outside the request path.\n    \n-   Use route patterns rather than raw pathnames as metric labels to avoid unbounded cardinality.\n    \n-   Do not throw from a listener to signal exporter failure; monitor the exporter separately.\n    \n\n**Reference instrumentation.ts**\n\n```ts\nimport \"@tavojs/core/server-only\";\nimport {\n  createInstrumentation,\n  type TavoInstrumentationEvent\n} from \"@tavojs/core/dev\";\n\nfunction recordRouteMetric(event: TavoInstrumentationEvent): void {\n  if (event.phase !== \"end\" || event.durationMs === undefined) {\n    return;\n  }\n\n  metrics.histogram(\"tavo.route.duration\", event.durationMs, {\n    operation: event.name,\n    route: event.route ?? \"unknown\"\n  });\n}\n\nexport const instrumentation = createInstrumentation(\n  function observeTavoEvent(event) {\n    recordRouteMetric(event);\n  }\n);\n```\n\n**Reference tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { instrumentation } from \"./instrumentation\";\n\nexport default defineConfig({\n  ssr: {\n    instrumentation\n  }\n});\n```"
        },
        {
          "id": "opentelemetry",
          "title": "Adapt events to an OpenTelemetry tracer",
          "markdown": "[](/docs/core/api/dev#api-tavojs-core-dev--createopentelemetryinstrumentation \"View createOpenTelemetryInstrumentation in the Core API reference\")accepts the stable subset shared by OpenTelemetry tracer implementations. Supply an [](/docs/core/api/dev#api-tavojs-core-dev--opentelemetrytracerlike \"View OpenTelemetryTracerLike in the Core API reference\")adapter; its spans implement [](/docs/core/api/dev#api-tavojs-core-dev--opentelemetryspanlike \"View OpenTelemetrySpanLike in the Core API reference\"). Start events create spans. End, error, abort, hit, miss, and invalidate events finish the matching span or create a bounded terminal span when no start is pending.\n\n-   Span names use `tavo.route.resolve`, `tavo.route.middleware`, `tavo.route.loader`, `tavo.route.action`, or `tavo.route.cache`.\n    \n-   Correlation uses request ID, event name, route, and layer. Concurrent matching starts are completed in order.\n    \n-   `recordErrors` defaults to false. Enable it only after application-level exception redaction is configured.\n    \n-   Error and abort phases set an error status; normal and cache terminal phases set success.\n    \n\n**Reference src/server/telemetry-contract.ts**\n\n```ts\nexport type OpenTelemetrySpanLike = {\n  setAttribute?(\n    name: string,\n    value: string | number | boolean\n  ): unknown;\n  recordException?(error: unknown): unknown;\n  setStatus?(status: {\n    code: number;\n    message?: string;\n  }): unknown;\n  end?(endTime?: number): unknown;\n};\n\nexport type OpenTelemetryTracerLike = {\n  startSpan(\n    name: string,\n    options?: {\n      attributes?: Record<string, string | number | boolean>;\n      startTime?: number;\n    }\n  ): OpenTelemetrySpanLike;\n};\n```\n\n**Reference src/server/instrumentation.ts**\n\n```ts\nimport \"@tavojs/core/server-only\";\nimport {\n  createOpenTelemetryInstrumentation\n} from \"@tavojs/core/dev\";\nimport { tracer } from \"./telemetry\";\n\nexport const instrumentation = createOpenTelemetryInstrumentation(\n  tracer,\n  {\n    recordErrors: false\n  }\n);\n```\n\n**Observability must not become a data export**\n\nRoute names and cache tags are operational metadata, but they can still reveal application structure. Review exporter access, retention, and label cardinality as part of production security."
        },
        {
          "id": "instrumentation-verification",
          "title": "Verify lifecycle and failure isolation",
          "markdown": "-   Assert start and terminal events share request, route, and layer identity.\n    \n-   Abort a navigation or disconnect a request and verify an abort event rather than a false success.\n    \n-   Make a test listener throw and verify the route still completes.\n    \n-   Keep telemetry setup behind a server-only boundary and never import a private exporter into browser code.\n    \n\n**Run Terminal**\n\n```bash\nnpm run typecheck\nnpx tavo build\nnpx tavo preview --ssr\n\n# Exercise one loader, one action, and one cache hit.\n# Confirm the exporter receives terminal events and the responses are unchanged.\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:development-tooling",
      "section": "core",
      "slug": "development-tooling",
      "title": "Advanced development tooling",
      "description": "Build custom route inspectors, runtime panels, overlays, and SSR development hosts on the public experimental development boundary.",
      "keywords": [
        "@tavojs/core/dev",
        "inspection",
        "devtools",
        "overlay",
        "SSR development"
      ],
      "kind": "reference",
      "prerequisites": [
        "A custom development, test, editor, or inspection integration.",
        "Ordinary application development should use the project-local Tavo.js CLI first."
      ],
      "outcomes": [
        "Inspect route modules without rendering them.",
        "Subscribe to privacy-safe runtime state and clean up correctly.",
        "Start and close a custom SSR Vite development host."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Develop and inspect",
          "href": "/docs/cli/develop-and-inspect",
          "description": "Use the supported CLI workflow for ordinary projects."
        },
        {
          "title": "Runtime devtools",
          "href": "/docs/core/runtime-devtools",
          "description": "Review snapshot and panel details."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand the experimental stability classification."
        }
      ],
      "canonicalPath": "/docs/core/development-tooling",
      "sections": [
        {
          "id": "dev-boundary",
          "title": "Use the public experimental boundary",
          "markdown": "`@tavojs/core/dev` is a public experimental entry point. Its exports are suitable for custom development hosts and tools, but can evolve faster than stable application entry points. Import only this package boundary; files under Core src/runtime, src/ssr, src/framework, and src/auto-pages are not public imports.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`route inspection`\n\n`build / server`\n\nread-only\n\nDiscover modules and build manifests or diagnostics without creating a route runtime.\n\n`runtime snapshots`\n\n`browser`\n\nprivacy-safe\n\nInspect route lifecycle and DOM counts without loader data, headers, cookies, tokens, or store values.\n\n`diagnostics / overlay`\n\n`browser development`\n\nopt-in\n\nCollect traces and hydration mismatches or display a dependency-free error overlay.\n\n`SSR Vite host`\n\n`Node development`\n\n127.0.0.1:4174\n\nStarts middleware-mode Vite with `Tavo.js` routes, actions, plugins, images, and development cache behavior."
        },
        {
          "id": "manifest-inspection",
          "title": "Inspect route modules without rendering",
          "markdown": "-   The CLI is the normal application inspection surface and owns route discovery.\n    \n-   Experimental hosts that already own an explicit module map can use `createPagesManifest`, `createPagesManifestDetailed`, and `inspectPages` from `@tavojs/core/dev`.\n    \n-   `createPagesManifest` returns sorted routes. `createPagesManifestDetailed` also returns 404, global error, and diagnostics metadata.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo routes\nnpx tavo inspect route /dashboard --json\n```"
        },
        {
          "id": "runtime-snapshot",
          "title": "Subscribe to runtime state and dispose",
          "markdown": "-   `subscribeTavoRuntime` emits immediately unless immediate: false is supplied.\n    \n-   The subscription follows pathname and route-status changes and returns one unsubscribe function.\n    \n-   The panel returns element, refresh, and dispose. dispose removes its subscription, event listener, and DOM element.\n    \n-   Snapshots omit application data but expose route structure and operational counts; keep production installation opt-in.\n    \n\n**Reference src/dev/runtime-inspection.ts**\n\n```ts\nimport {\n  inspectTavoRuntime,\n  installTavoDevtoolsPanel,\n  subscribeTavoRuntime\n} from \"@tavojs/core/dev\";\n\nexport function installRuntimeInspection(): () => void {\n  console.debug(inspectTavoRuntime());\n\n  const stop = subscribeTavoRuntime(\n    function printRuntimeSnapshot(snapshot) {\n      console.debug(snapshot.route, snapshot.status, snapshot.dom);\n    },\n    { immediate: false }\n  );\n\n  const panel = installTavoDevtoolsPanel({\n    initiallyOpen: false\n  });\n\n  return function disposeRuntimeInspection() {\n    stop();\n    panel.dispose();\n  };\n}\n```"
        },
        {
          "id": "overlay-and-dom",
          "title": "Configure diagnostics and the development overlay",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n[`configureDevDiagnostics`](/docs/core/api/dev#api-tavojs-core-dev--configuredevdiagnostics)\n\n`browser diagnostics`\n\ndisabled\n\nConfigures traces, mismatch callbacks, error handling, development reporting, and strict hydration.\n\n[`installDevOverlay`](/docs/core/api/dev#api-tavojs-core-dev--installdevoverlay)\n\n`browser development`\n\ntraces: false\n\nInstalls the error overlay; optional traces add development lifecycle context.\n\n**Reference src/dev.ts**\n\n```ts\nimport {\n  configureDevDiagnostics,\n  installDevOverlay,\n} from \"@tavojs/core/dev\";\n\nconfigureDevDiagnostics({\n  enabled: true,\n  devMode: true,\n  strictHydration: false,\n});\n\ninstallDevOverlay({ traces: true });\n```\n\n**Strict hydration belongs in verification**\n\n`strictHydration` throws `TAVO_HYDRATION_001` at the first mismatch. Use it in browser tests or a controlled development mode, fix the first divergence, and do not enable it as an unreviewed production failure policy."
        },
        {
          "id": "ssr-dev-host",
          "title": "Start and close a custom SSR development host",
          "markdown": "-   The host reads root `tavo.config.ts` in the selected mode and uses its pages, CSS, plugins, and nested SSR options.\n    \n-   Set host deliberately. Binding 0.0.0.0 exposes the development server to the local network.\n    \n-   `TAVO_MONITOR_TOKEN` protects the development monitor endpoint with an exact Bearer header.\n    \n-   Always await `server.close` in tests and editor integrations so Vite watchers and the HTTP listener are released.\n    \n\n**Reference scripts/dev-ssr.ts**\n\n```ts\nimport {\n  startViteAutoPagesDevServer\n} from \"@tavojs/core/dev\";\n\nasync function main(): Promise<void> {\n  const server = await startViteAutoPagesDevServer({\n    root: process.cwd(),\n    mode: \"development\",\n    host: \"127.0.0.1\",\n    port: 4174\n  });\n\n  console.log(server.url);\n\n  process.once(\"SIGTERM\", function closeServer() {\n    void server.close();\n  });\n}\n\nawait main();\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:runtime-devtools",
      "section": "core",
      "slug": "runtime-devtools",
      "title": "Runtime devtools reference",
      "description": "Inspect privacy-safe route, cache, module, component, effect, and scheduler state in the browser.",
      "keywords": [
        "devtools",
        "inspect runtime",
        "debug panel",
        "snapshot"
      ],
      "kind": "reference",
      "prerequisites": [
        "A browser-rendered Tavo.js application in development."
      ],
      "outcomes": [
        "Inspect privacy-safe runtime snapshots and manage the optional devtools panel."
      ],
      "runtime": [
        "browser"
      ],
      "related": [
        {
          "title": "Runtime diagnostics",
          "href": "/docs/core/runtime-diagnostics",
          "description": "Configure traces and hydration diagnostics."
        }
      ],
      "canonicalPath": "/docs/core/runtime-devtools",
      "sections": [
        {
          "id": "snapshot-api",
          "title": "Snapshot and subscription APIs",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport {\n  inspectTavoRuntime,\n  installTavoDevtoolsPanel,\n  subscribeTavoRuntime,\n} from \"@tavojs/core/dev\";\n\nconsole.debug(inspectTavoRuntime());\n\nconst stop = subscribeTavoRuntime((snapshot) => {\n  console.debug(snapshot.route, snapshot.status);\n});\nconst panel = installTavoDevtoolsPanel();\n\nexport function disposeDevtools() {\n  stop();\n  panel.dispose();\n}\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n[`inspectTavoRuntime`](/docs/core/api/dev#api-tavojs-core-dev--inspecttavoruntime)`(``)`\n\n[`TavoDevtoolsSnapshot`](/docs/core/api/dev#api-tavojs-core-dev--tavodevtoolssnapshot)\n\ncurrent state\n\nReturns pathname, route, status, params, route runtime inspection, and DOM counts.\n\n[`subscribeTavoRuntime`](/docs/core/api/dev#api-tavojs-core-dev--subscribetavoruntime)`(``listener``,` `options``)`\n\n`unsubscribe function`\n\nimmediate: true\n\nPublishes on navigation and route-status changes; pass immediate: false to skip the first callback.\n\n[`installTavoDevtoolsPanel`](/docs/core/api/dev#api-tavojs-core-dev--installtavodevtoolspanel)`(``options``)`\n\n[`TavoDevtoolsPanel`](/docs/core/api/dev#api-tavojs-core-dev--tavodevtoolspanel)\n\ndocument.body, closed\n\nInstalls a dependency-free browser panel. It throws when no DOM document exists.\n\n`panel.refresh()`\n\n`void`\n\n—\n\nRefreshes the JSON snapshot manually.\n\n`panel.dispose()`\n\n`void`\n\n—\n\nUnsubscribes listeners, removes events, and removes the panel element.\n\n**Privacy-safe does not mean public**\n\nFramework snapshots omit loader data, store values, headers, cookies, and tokens. Route names and operational counts can still reveal application structure, so keep production devtools opt-in."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:cli-automation-protocol",
      "section": "core",
      "slug": "cli-automation-protocol",
      "title": "Framework CLI automation protocol",
      "description": "Consume versioned CLI JSON envelopes, bounded context, transactional change plans, receipts, and restricted verification safely.",
      "keywords": [
        "CLI",
        "automation",
        "JSON protocol",
        "change plan",
        "receipt",
        "agent context"
      ],
      "kind": "reference",
      "prerequisites": [
        "A project-local tavo CLI matching the application lockfile.",
        "An editor, CI job, or automation client that checks process exit status."
      ],
      "outcomes": [
        "Parse the stable v1 machine envelope.",
        "Apply hash-guarded changes transactionally.",
        "Verify changes without executing project scripts when required."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Automation workflow",
          "href": "/docs/cli/automation",
          "description": "Follow the task-oriented read-plan-apply workflow."
        },
        {
          "title": "CLI command reference",
          "href": "/docs/cli/commands",
          "description": "Check installed command and flag availability."
        },
        {
          "title": "Diagnostics reference",
          "href": "/docs/core/diagnostics",
          "description": "Interpret Core diagnostic codes returned by tooling."
        }
      ],
      "canonicalPath": "/docs/core/cli-automation-protocol",
      "sections": [
        {
          "id": "protocol-envelope",
          "title": "Parse the version 1 envelope",
          "markdown": "JSON-capable CLI commands return a versioned machine envelope. Parseable JSON does not imply success: check the process exit status, ok, and error-level diagnostics.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`schemaVersion`\n\n`1`\n\nrequired\n\nMachine protocol version.\n\n`command`\n\n`string`\n\nrequired\n\nCanonical producing command identifier.\n\n`ok`\n\n`boolean`\n\nderived\n\nFalse when the command or returned diagnostics contain an error.\n\n`project.fingerprint`\n\n`16 lowercase hex characters`\n\nrequired\n\nBounded fingerprint of command-relevant project data, not a file content hash.\n\n`data`\n\n`command-specific`\n\nrequired\n\nPayload described by the command or companion schema.\n\n`diagnostics`\n\n`Diagnostic v1[]`\n\n\\[\\]\n\nContains code, error/warning level, message, and optional location, confidence, fix, docs, or commands.\n\n`nextActions`\n\n`{ command, reason }[]`\n\n\\[\\]\n\nSuggested next commands; never implicit authorization.\n\n`metrics`\n\n`durationMs / bytes / estimatedTokens`\n\nrequired\n\nBounded transport and execution metadata.\n\n-   The installed package ships schemas under `node_modules`/`@tavojs/cli/schemas`.\n    \n-   Generator input uses `node_modules`/`@tavojs/cli/generator-spec.schema.json`.\n    \n-   agent-context data declares `protocolVersion`: 1 and `protocolStability`: stable."
        },
        {
          "id": "bounded-context",
          "title": "Request the smallest useful context",
          "markdown": "-   Summary context contains conventions, focused source metadata, relevant API cards, recipes, commands, and bounded project information.\n    \n-   Request full detail only when a complete route or inventory graph is necessary.\n    \n-   Focused inspection includes a SHA-256 content hash where available; use that hash as a write precondition.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo agent-context --json   --task modify-route   --target /account   --detail summary\n\nnpx tavo inspect route /account --json\n```"
        },
        {
          "id": "change-plan",
          "title": "Use explicit transactional operations",
          "markdown": "A change plan contains between one and 100 versioned operations. Existing-file mutations require a 64-character SHA-256 precondition; low-risk diagnostic fixes require either `expectedSha256` or `expectedMissing`.\n\nAPI / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`generate`\n\n`generator spec`\n\nplanned write\n\nRuns one validated `Tavo.js` generation specification.\n\n`create-file`\n\n`path + content`\n\nnew file\n\nRejects an unsafe, escaping, or existing target.\n\n`replace-range`\n\n`hash + 1-based range`\n\nbounded edit\n\nRejects stale content before replacing the exact source range.\n\n`delete-file`\n\n`path + hash`\n\ntransactional delete\n\nRejects a stale or escaping target.\n\n`apply-fix`\n\n`diagnostic code + precondition`\n\nlow-risk fix only\n\nApplies a CLI-owned safe fix identified by its diagnostic.\n\n-   Each text payload is limited to 1 `MiB`.\n    \n-   Traversal and symlink escapes are rejected.\n    \n-   If a later operation fails, earlier writes are rolled back.\n    \n\n**Reference change-plan.json**\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"operations\": [\n    {\n      \"id\": \"update-account-title\",\n      \"kind\": \"replace-range\",\n      \"file\": \"src/pages/account.tsx\",\n      \"expectedSha256\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\",\n      \"range\": {\n        \"start\": { \"line\": 12, \"column\": 3 },\n        \"end\": { \"line\": 12, \"column\": 24 }\n      },\n      \"text\": \"<Text>Account settings</Text>\"\n    }\n  ]\n}\n```"
        },
        {
          "id": "receipt",
          "title": "Retain and verify the receipt",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`dryRun`\n\n`boolean`\n\nrequired\n\nDistinguishes a planned receipt from an applied change.\n\n`transaction`\n\n`planned | committed | rolled-back | rejected`\n\nrequired\n\nReports the final transaction state.\n\n`fileHashes`\n\n`path → SHA-256 | null`\n\nrequired\n\nRecords post-operation file state for focused verification.\n\n`operations`\n\n`operation result[]`\n\nrequired\n\nReports each planned or attempted operation.\n\n`verificationCommand`\n\n`string`\n\nrequired\n\nSuggested focused verify command for the receipt.\n\n-   change prints a protocol envelope to stdout; it does not create a receipt file automatically.\n    \n-   Save stdout only after checking that the command completed successfully.\n    \n-   verify expands affected Framework surfaces from the receipt and checks current hashes.\n    \n-   `--no-project-scripts` prevents verify from running `package.json` scripts. Confirm `data.projectScripts` is false.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo change --from-json change-plan.json --dry-run\nnpx tavo change --from-json change-plan.json > change-receipt.json\nnpx tavo verify   --receipt change-receipt.json   --smoke   --no-project-scripts   --json\n```"
        },
        {
          "id": "stdin-and-generation",
          "title": "Use stdin and specs deliberately",
          "markdown": "-   Generator specs support page, component, store, layout, 404, error, action, and feature records.\n    \n-   Page specs use `typedRoute`: true only when `defineRoutePage` generation is desired.\n    \n-   Validation and dry-run prove structural validity and write scope; they do not approve the product change.\n    \n-   Use `--force` only after inspecting an intended replacement.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo generate --validate-spec tavo.generated.json\nnpx tavo generate --from-json tavo.generated.json --dry-run\nnpx tavo generate --from-stdin --dry-run < tavo.generated.json\nnpx tavo change --from-stdin --dry-run < change-plan.json\n```"
        },
        {
          "id": "cli-contract-verification",
          "title": "Verify semantic CLI behavior",
          "markdown": "-   `npx` `tavo` inspect plugins `--json` performs plugin preflight and reports owners, permissions, reasons, exposure, and diagnostics.\n    \n-   Build flags override configured `JavaScript` budgets and `prerenderStyles` for that invocation.\n    \n-   Plain `tavo` preview delegates to Vite preview. `tavo` preview `--ssr` rebuilds when production output is missing or stale.\n    \n-   Use the project-local CLI resolved from the lockfile. Use `npx` `@tavojs/cli` only for initial application creation.\n    \n-   Use `--help` on the installed version as the exact command/flag inventory; use the authored references for side effects, security, precedence, and failure behavior."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:deployment",
      "section": "core",
      "slug": "deployment",
      "title": "Deployment",
      "description": "Build once and deploy either the provider-neutral static output or generated Node server.",
      "keywords": [
        "deploy",
        "hosting",
        "node",
        "static"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Build once and deploy either the provider-neutral static output or generated Node server."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Inspect public package entry points and exports."
        }
      ],
      "canonicalPath": "/docs/core/deployment",
      "sections": [
        {
          "id": "output",
          "title": "Know what the build produces",
          "markdown": "`tavo` build emits two provider-neutral deployment outputs. Treat .`tavo`/build as generated output and rebuild it after every application change.\n\n**Reference Generated output — after a production build**\n\n```text\n.tavo/build/client/              static assets and prerendered HTML\n.tavo/build/server/start.mjs       generated Node production server\n```"
        },
        {
          "id": "target",
          "title": "Choose static hosting or Node",
          "markdown": "Static hosting can serve CSR and prerendered output but cannot run server loaders, route actions, or sessions. Run the generated Node server when the application needs request-time behavior.\n\n**Run Terminal — run from the project root**\n\n```bash\nnpx tavo build\nPORT=4174 node .tavo/build/server/start.mjs\n```"
        },
        {
          "id": "ship-checklist",
          "title": "Verify the deployed boundary",
          "markdown": "Business logic stays in route modules and server-only application services. Core 1.0 publishes static and Node deployment outputs.\n\n-   Rebuild after every source change.\n    \n-   Publish .`tavo`/build/client to a static host or run `.tavo/build/server/start.mjs` with Node.\n    \n-   Configure trusted hosts, canonical origin, CSP, secrets, and monitor authentication.\n    \n-   Exercise a real SSR request, a client navigation, an action, and an error response.\n    \n-   Inspect generated route sizes and enforce budgets in CI."
        },
        {
          "id": "build-artifact-contract",
          "title": "Build artifact contract",
          "markdown": "**Reference Reference snippet**\n\n```text\n.tavo/build/client/\n  static assets and prerendered HTML\n.tavo/build/server/start.mjs\n  generated Node production server\n```\n\ntavo build creates both provider-neutral outputs, discovers routes, generates route types, and attempts eligible prerenders. Invalid bundles or JavaScript budget violations fail the command.\n\n**SSR preview rebuilds stale output**\n\ntavo preview --ssr checks whether the production build is missing or older than application sources and runs tavo build first when necessary. Plain tavo preview delegates to Vite preview."
        },
        {
          "id": "production-output-reference",
          "title": "Static and Node production output",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`.tavo/build/client`\n\n`directory`\n\nalways generated\n\nStatic assets and prerendered HTML suitable for any static host.\n\n`.tavo/build/server/start.mjs`\n\n`Node entry`\n\nalways generated\n\nGenerated production server for SSR, loaders, actions, sessions, plugins, and monitoring."
        },
        {
          "id": "handler-http-behavior",
          "title": "Production handler failure behavior",
          "markdown": "-   GET and HEAD render pages. Other methods dispatch a matching route action.\n    \n-   A non-page method without a matching action returns 405 with Allow: GET, HEAD.\n    \n-   The Node handler rejects bodies larger than `maxRequestBodyBytes` with 413; the default is 10 `MiB`.\n    \n-   Uncaught route, plugin, and handler failures return a hardened generic 500 response rather than exposing an exception.\n    \n-   `canonicalOrigin` must be a credential-free HTTP(S) origin with no path, query, or hash; invalid input throws `TAVO_SSR_001`.\n    \n-   Page and action responses receive baseline security headers. Add deployment-specific CSP and proxy policy at the platform boundary.\n    \n-   Node client disconnects abort request-owned work; streaming responses also cancel their active reader."
        },
        {
          "id": "monitor-reference",
          "title": "Monitor CLI defaults",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`--url`\n\n`URL`\n\nhttp://127.0.0.1:4174\n\nThe CLI appends /\\_tavo/monitor unless it is already present.\n\n`--token`\n\n`string`\n\nTAVO\\_MONITOR\\_TOKEN\n\nSent as a Bearer token. Never place monitor credentials in a query string.\n\n`--once`\n\n`boolean`\n\nfalse\n\nWithout this flag, monitor refreshes continuously.\n\n`--interval`\n\n`milliseconds`\n\n1000\n\nWatch interval, clamped to a minimum of 250 ms.\n\n`--json`\n\n`boolean`\n\nfalse\n\nPrints the complete payload instead of the human table."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:runtime-configuration",
      "section": "core",
      "slug": "runtime-configuration",
      "title": "Runtime configuration reference",
      "description": "Review page runtime, document, SSR handler, cache, and image options with their production defaults.",
      "keywords": [
        "configuration",
        "SSR options",
        "defaults",
        "cache",
        "images"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application that needs a runtime option or default."
      ],
      "outcomes": [
        "Find page runtime, document, SSR handler, cache, and image option defaults."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Place runtime options in the correct project file."
        },
        {
          "title": "Deployment",
          "href": "/docs/core/deployment",
          "description": "Apply production handler options at the hosting boundary."
        }
      ],
      "canonicalPath": "/docs/core/runtime-configuration",
      "sections": [
        {
          "id": "page-runtime-options",
          "title": "Configure shared route behavior through defineConfig",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`ssr.getPageProps`\n\n`() => record`\n\nunset\n\nAdds application props to every page component.\n\n`ssr``.`[`notFound`](/docs/core/api/router#api-tavojs-core-router--notfound)\n\n[`Component`](/docs/core/api/components-and-dom#api-tavojs-core--component)\n\nsrc/pages/404\n\nOverrides the discovered not-found component.\n\n`ssr.csrFallback`\n\n[`Child`](/docs/core/api/components-and-dom#api-tavojs-core--child) `|` `function`\n\nempty route node\n\nServer shell for CSR routes.\n\n`ssr.csrActions`\n\n`CsrActionsOptions`\n\ndisabled\n\nRoutes browser form submissions to a configured action endpoint.\n\n`ssr.middleware`\n\n[`PageMiddleware`](/docs/core/api/router#api-tavojs-core-router--pagemiddleware)`[``]`\n\n\\[\\]\n\nRuns before route and layout middleware.\n\n`ssr.allowExternalRedirects`\n\n`boolean`\n\nfalse\n\nPermits normalized redirects to another origin.\n\n`ssr.trustedHosts`\n\n`string[]`\n\nlocal host policy\n\nAllows inbound hosts for action-origin validation.\n\n`ssr.i18n`\n\n[`I18nService`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--i18nservice)\n\nregistered default\n\nResolves locale-aware paths, messages, and document direction.\n\n`plugins`\n\n[`TavoPluginInput`](/docs/core/api/plugin#api-tavojs-core-plugin--tavoplugininput)\n\n\\[\\]\n\nAccepts the public plugin array or { use, overrides } form and adds manifest-declared pages, middleware, capabilities, stores, head entries, endpoints, and build contributions.\n\n`ssr.maxResolvedCacheEntries`\n\n`number`\n\n1024\n\nBounds process-local resolved static route data. Zero disables reuse; invalid values throw `TAVO_PAGES_001`.\n\n`ssr.instrumentation`\n\n[`TavoInstrumentation`](/docs/core/api/dev#api-tavojs-core-dev--tavoinstrumentation)\n\nunset\n\nReceives isolated route lifecycle events."
        },
        {
          "id": "document-options",
          "title": "Document rendering options",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`lang`\n\n`string`\n\n\"en\"\n\nHTML language unless the resolved i18n locale overrides it.\n\n`title`\n\n`string`\n\n\"\"\n\nEscaped base document title; resolved route and component metadata can replace it.\n\n`unsafeHeadHtml`\n\n`string`\n\n\"\"\n\nTrusted raw HTML inserted into the document head. Prefer escaped TSX metadata and use this explicit unsafe boundary only for reviewed markup.\n\n`htmlAttributes / bodyAttributes / appAttributes`\n\n`record`\n\n{}\n\nSafe string, number, or boolean attributes.\n\n`doctype`\n\n`string`\n\n\"<!doctype html>\"\n\nDocument prefix.\n\n`appContainerId`\n\n`string`\n\n\"app\"\n\nID of the rendered application container.\n\n`initialState`\n\n`unknown`\n\nomitted\n\nSerialized as escaped JSON when defined.\n\n`stateScriptId`\n\n`string`\n\n\"\\_\\_TAVO\\_STATE\\_\\_\"\n\nID of the JSON hydration script.\n\n`nonce`\n\n`string`\n\nunset\n\nApplied to state, style, and deferred patch scripts where supported.\n\n`beforeRender`\n\n`() => void`\n\nunset\n\nRe-establishes request context before render passes and stream chunks.\n\n`styleRegistry`\n\n[`StyleRegistry`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--styleregistry)\n\nnew registry\n\nCollects SSR component styles with deduplication."
        },
        {
          "id": "handler-options",
          "title": "SSR handler options",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`modules`\n\n`PageModules`\n\nrequired\n\nRoute module map used to create the pages runtime.\n\n`canonicalOrigin`\n\n`string`\n\nrequest host\n\nNode-only public HTTP(S) origin behind TLS termination. Invalid origins throw `TAVO_SSR_001`.\n\n`document`\n\n[`RenderDocumentOptions`](/docs/core/api/server#api-tavojs-core-server--renderdocumentoptions)\n\n{}\n\nBase HTML shell and CSP settings.\n\n`stream`\n\n`boolean`\n\nfalse\n\nReturns streamed HTML and enables progressive [`Deferred`](/docs/core/api/data-actions-and-async#api-tavojs-core--deferred \"View Deferred in the Core API reference\") patches.\n\n`images`\n\n[`ImageOptimizerOptions`](/docs/core/api/server#api-tavojs-core-server--imageoptimizeroptions)\n\noptimizer defaults\n\nConfigures /\\_tavo/image processing.\n\n`staticCache`\n\n[`SsrStaticCache`](/docs/core/api/server#api-tavojs-core-server--ssrstaticcache)\n\nmemory, 1024 entries\n\nRendered-response cache adapter.\n\n`maxRequestBodyBytes`\n\n`number`\n\n10485760\n\nNode-only action body limit; excess input receives 413."
        },
        {
          "id": "image-defaults",
          "title": "Image optimizer defaults",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`enabled`\n\n`boolean`\n\ntrue\n\nEnables the optimizer endpoint when image options are used.\n\n`allowRemote`\n\n`boolean`\n\nfalse\n\nRemote sources remain blocked until explicitly enabled and allowlisted.\n\n`publicDir`\n\n`string`\n\n\"public\"\n\n[`Root`](/docs/core/api/components-and-dom#api-tavojs-core--root \"View Root in the Core API reference\") for absolute local image paths.\n\n`quality`\n\n`number`\n\n75\n\nDefault output quality.\n\n`cacheMaxAge`\n\n`seconds`\n\n31536000\n\nSuccessful response cache lifetime.\n\n`defaultFormat`\n\n[`ImageFormat`](/docs/core/api/localization-seo-and-assets#api-tavojs-core--imageformat)\n\n\"webp\"\n\nOutput format when negotiation does not select another configured format.\n\n`sizes`\n\n`number[]`\n\n320, 640, 960, 1280, 1600\n\nAllowed responsive widths.\n\n`timeoutMs`\n\n`number`\n\n5000\n\nRemote fetch timeout.\n\n`maxBytes`\n\n`number`\n\n10485760\n\nMaximum source image size.\n\n`memoryCacheMaxEntries`\n\n`number`\n\n128\n\nProcess-local optimized image entries.\n\n`maxConcurrentTransforms`\n\n`number`\n\n4\n\nActive transformations, clamped to at least one.\n\n`maxPendingTransforms`\n\n`number`\n\n64\n\nQueued transformations before the endpoint returns 503.\n\n`allowInsecureRemote`\n\n`boolean`\n\nfalse\n\nHTTP and private-network protections remain enabled by default."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:runtime-diagnostics",
      "section": "core",
      "slug": "runtime-diagnostics",
      "title": "Runtime diagnostics reference",
      "description": "Configure render traces, hydration mismatch reports, strict CI failures, and DOM runtime tuning.",
      "keywords": [
        "diagnostics",
        "hydration",
        "strict",
        "trace",
        "DOM"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with a reproducible runtime problem."
      ],
      "outcomes": [
        "Configure runtime traces and hydration mismatch reporting.",
        "Interpret diagnostic hooks without leaking application data."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Choose the right validation layer for a failure."
        }
      ],
      "canonicalPath": "/docs/core/runtime-diagnostics",
      "sections": [
        {
          "id": "diagnostic-options",
          "title": "Diagnostic options",
          "markdown": "Apply these process-wide development settings with [](/docs/core/api/dev#api-tavojs-core-dev--configuredevdiagnostics \"View configureDevDiagnostics in the Core API reference\").\n\n**Reference Reference snippet**\n\n```ts\nimport { configureDevDiagnostics } from \"@tavojs/core/dev\";\n\nconfigureDevDiagnostics({\n  enabled: true,\n  devMode: true,\n  strictHydration: true,\n  onHydrationMismatch(event) {\n    console.error(event.kind, event.path, event.recovery);\n  },\n});\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`enabled`\n\n`boolean`\n\nfalse\n\nEnables trace delivery when an `onTrace` callback exists.\n\n`devMode`\n\n`boolean`\n\nfalse\n\nCollects mismatch details and enables console/overlay development reporting.\n\n`onTrace`\n\n`callback | null`\n\nnull\n\nReceives mount, patch, and hydrate events.\n\n`onHydrationMismatch`\n\n`callback | null`\n\nnull\n\nReceives expected/found values, DOM path, phase, kind, and recovery mode.\n\n`onError`\n\n`callback | null`\n\nnull\n\nReceives runtime errors instead of the console fallback.\n\n`strictHydration`\n\n`boolean`\n\nfalse\n\nThrows `TAVO_HYDRATION_001` on the first mismatch, suitable for CI/browser tests.\n\nRecovery is reported as text replacement, subtree replacement, or extra-node cleanup. Fix the first mismatch rather than suppressing later symptoms."
        },
        {
          "id": "dom-runtime-options",
          "title": "Use the DOM runtime defaults",
          "markdown": "Normal applications use the renderer defaults. DOM reconciliation tuning is not part of the public application API; use stable keys and fix hydration mismatches reported by the diagnostics hooks."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:diagnostics",
      "section": "core",
      "slug": "diagnostics",
      "title": "Framework diagnostics reference",
      "description": "Map every stable framework diagnostic code to its boundary, structured error contract, and first remediation step.",
      "keywords": [
        "TavoError",
        "diagnostic codes",
        "TAVO_PAGES",
        "TAVO_PLUGIN",
        "hydration"
      ],
      "kind": "reference",
      "prerequisites": [
        "A framework error, CLI diagnostic, plugin graph failure, or hydration mismatch to investigate."
      ],
      "outcomes": [
        "Recognize every stable Core diagnostic family.",
        "Preserve structured codes and remediation hints in tooling.",
        "Choose runtime diagnostics or CLI verification for the affected boundary."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Testing and diagnostics",
          "href": "/docs/core/testing-and-diagnostics",
          "description": "Use the fastest useful feedback layer."
        },
        {
          "title": "Plugin API v1",
          "href": "/docs/core/plugin-api-v1",
          "description": "Resolve plugin graph and runtime failures."
        },
        {
          "title": "Develop and inspect",
          "href": "/docs/cli/develop-and-inspect",
          "description": "Run project diagnostics and focused inspection."
        }
      ],
      "canonicalPath": "/docs/core/diagnostics",
      "sections": [
        {
          "id": "coded-errors",
          "title": "Preserve the structured TavoError",
          "markdown": "`TavoError` carries a stable code, message, optional structured details, remediation hint, and cause. Check `isTavoError` before reading those fields. `formatTavoError` preserves the code and appends the hint for human output.\n\n-   Branch on code, not on message text.\n    \n-   Treat details and cause as potentially sensitive before logging them.\n    \n-   Do not convert an error code into a successful process exit in build or verification tooling.\n    \n\n**Reference src/server/startup.ts**\n\n```ts\nimport {\n  formatTavoError,\n  isTavoError\n} from \"@tavojs/core\";\n\nexport async function startApplication(): Promise<void> {\n  try {\n    await initializeApplication();\n  } catch (error) {\n    if (isTavoError(error)) {\n      logger.error({\n        code: error.code,\n        details: error.details,\n        message: formatTavoError(error)\n      });\n      return;\n    }\n\n    throw error;\n  }\n}\n```"
        },
        {
          "id": "pages-config-codes",
          "title": "Pages, SSR, and configuration codes",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`TAVO_PAGES_001`\n\n`runtime configuration`\n\nerror\n\nThe resolved-page cache limit is invalid. Supply a finite non-negative `maxResolvedCacheEntries` value.\n\n`TAVO_PAGES_002`\n\n`browser boot`\n\nerror\n\nThe client root element is missing. Align `bootTavo` `rootId` with the HTML shell.\n\n`TAVO_PAGES_003`\n\n`page discovery`\n\nerror\n\nA dynamic discovery pattern is unsupported. Use the standard literal glob or explicit modules.\n\n`TAVO_PAGES_004`\n\n`page discovery`\n\nerror\n\nThe bundler page-discovery API is unavailable. Use `Tavo.js`'s Vite wrapper or explicit modules.\n\n`TAVO_PAGES_005`\n\n`server bootstrap`\n\nerror\n\nThe server bootstrap is missing page modules. Pass the discovered modules map.\n\n`TAVO_PAGES_006`\n\n`route manifest`\n\nerror\n\nA page declares conflicting static generation options. Choose named prerender or helper static, not both.\n\n`TAVO_SSR_001`\n\n`Node handler`\n\nerror\n\n`canonicalOrigin` is not a credential-free HTTP(S) origin without a path, query, or hash.\n\n`TAVO_CONFIG_001`\n\n`client build`\n\nerror\n\nA server-only module reached the browser graph. Move the import behind a server loader, action, middleware, or server plugin phase.\n\n`TAVO_CONFIG_002`\n\n`client build`\n\nerror\n\nA likely secret environment value is referenced from browser code. Keep it server-only and expose only deliberate VITE\\_ values.\n\n`TAVO_HYDRATION_001`\n\n`strict hydration`\n\nerror\n\nStrict hydration found a server/client mismatch. Fix the first reported DOM path and phase."
        },
        {
          "id": "plugin-codes",
          "title": "Plugin API v1 codes",
          "markdown": "API / contract\n\nType / boundary\n\nDefault / result\n\nBehavior\n\n`TAVO_PLUGIN_001`\n\n`compatibility`\n\nerror\n\nThe descriptor is missing Plugin API version 1 or targets an unsupported version.\n\n`TAVO_PLUGIN_002`\n\n`identity / manifest`\n\nerror\n\nPlugin identity, configuration input, manifest authority, or a hydrated store declaration is invalid.\n\n`TAVO_PLUGIN_003`\n\n`ownership`\n\nerror\n\nAn installation or contribution duplicates ownership without an exact valid override.\n\n`TAVO_PLUGIN_004`\n\n`dependency / capability`\n\nerror\n\nA required plugin, version, capability, request resource, or declared owner is unavailable.\n\n`TAVO_PLUGIN_005`\n\n`dependency / ordering`\n\nerror\n\nA plugin dependency, middleware order, or capability resolution graph contains a cycle.\n\n`TAVO_PLUGIN_006`\n\n`authority / permission`\n\nerror\n\nA plugin requested a reserved resource, undeclared exposure, invalid override, or missing permission.\n\n`TAVO_PLUGIN_007`\n\n`phase implementation`\n\nerror\n\nA loaded phase does not implement exactly the contributions declared by its manifest.\n\n`TAVO_PLUGIN_008`\n\n`initialize / build`\n\nerror\n\nA phase loader, setup hook, capability/store factory, or build contribution failed.\n\n`TAVO_PLUGIN_009`\n\n`request / dispose`\n\nerror\n\nPlugin middleware, an endpoint, a request capability, or request/runtime disposal failed.\n\n-   Plugin graph diagnostics include severity, phase, message, and optional resource, owners, and hint.\n    \n-   Use `tavo` inspect plugins or `tavo` inspect plugins `--json` for the supported project workflow.\n    \n-   Experimental tooling can import `inspectPluginGraph` from `@tavojs/core/dev`; compilation, request dispatch, and runtime disposal remain framework host responsibilities."
        },
        {
          "id": "runtime-diagnostic-hooks",
          "title": "Capture browser runtime context",
          "markdown": "**Reference src/dev/diagnostics.ts**\n\n```ts\nimport {\n  configureDevDiagnostics\n} from \"@tavojs/core/dev\";\n\nexport function enableStrictDiagnostics(): () => void {\n  configureDevDiagnostics({\n    enabled: true,\n    devMode: true,\n    strictHydration: true,\n    onTrace(event) {\n      console.debug(event.phase, event.path);\n    },\n    onHydrationMismatch(event) {\n      console.error(event.path, event.kind, event.recovery);\n    },\n    onError(error) {\n      console.error(error);\n    }\n  });\n\n  return function disableStrictDiagnostics() {\n    configureDevDiagnostics({\n      enabled: false,\n      devMode: false,\n      strictHydration: false,\n      onTrace: null,\n      onHydrationMismatch: null,\n      onError: null\n    });\n  };\n}\n```\n\n**Fix the first mismatch**\n\nHydration recovery may replace text, replace a subtree, or remove extra nodes. Later mismatch reports can be consequences of the first divergence, so start with the earliest DOM path and phase."
        },
        {
          "id": "diagnostic-verification",
          "title": "Choose the matching verifier",
          "markdown": "-   doctor reports project-shape issues without performing a production build.\n    \n-   check adds the project's typecheck script when available.\n    \n-   inspect plugins validates ownership and authority before phases are executed.\n    \n-   verify `--smoke` adds lightweight route checks; build remains the production compiler and prerender authority.\n    \n-   A parseable JSON envelope can still represent failure. Check both ok and the process exit status.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo doctor --json\nnpx tavo check --json\nnpx tavo inspect plugins --json\nnpx tavo verify --smoke --json\nnpx tavo build\n```"
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api-stability",
      "section": "core",
      "slug": "api-stability",
      "title": "API stability",
      "description": "Distinguish stable application entry points from experimental low-level runtime and tooling contracts.",
      "keywords": [
        "API stability",
        "stable",
        "experimental",
        "migration"
      ],
      "kind": "reference",
      "prerequisites": [
        "A public Tavo.js package entry point you plan to depend on."
      ],
      "outcomes": [
        "Distinguish stable application APIs from experimental low-level contracts."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Core API reference",
          "href": "/docs/core/api",
          "description": "Find public entry points and exact declarations."
        }
      ],
      "canonicalPath": "/docs/core/api-stability",
      "sections": [
        {
          "id": "stability-contract",
          "title": "Read the stability contract",
          "markdown": "Stable means changes follow semantic versioning from the 1.0 baseline onward. Experimental APIs are public package exports, but their contracts may evolve more quickly.\n\n**Reference Reference snippet**\n\n```ts\nimport {\n  getApiStability,\n  TAVO_API_STABILITY\n} from \"@tavojs/core\";\n\nconsole.log(getApiStability(\"@tavojs/core/router\"));\nconsole.log(TAVO_API_STABILITY[\"@tavojs/core/dev\"]);\n```\n\n-   Stable: root, router, server, config, plugin, server-only, and the JSX runtime paths.\n    \n-   Experimental: the consolidated dev entry point.\n    \n-   Use `getApiStability` for tooling and version-aware diagnostics instead of copying this classification into application code.\n    \n-   Only `package.json` exports are public; source-internal paths have no compatibility guarantee."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:glossary",
      "section": "core",
      "slug": "glossary",
      "title": "Tavo.js glossary",
      "description": "Look up the framework terms used throughout Tavo.js guides and API references.",
      "keywords": [
        "glossary",
        "terminology",
        "SSR",
        "CSR",
        "SSG",
        "ISR"
      ],
      "kind": "reference",
      "prerequisites": [
        "No project setup is required; this is a terminology reference."
      ],
      "outcomes": [
        "Interpret Tavo.js-specific routing, rendering, state, and extension terminology."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js Framework overview",
          "href": "/docs/core",
          "description": "See the terms connected in one application lifecycle."
        },
        {
          "title": "SSR and hydration",
          "href": "/docs/core/ssr-and-hydration",
          "description": "Apply the rendering terms to route behavior."
        }
      ],
      "canonicalPath": "/docs/core/glossary",
      "sections": [
        {
          "id": "application-terms",
          "title": "Application and routing terms",
          "markdown": "Term\n\nMeaning in Tavo.js\n\n**Route**\n\nA public URL pattern discovered from a non-underscore module in src/pages.\n\n**Page module**\n\nThe file that supplies a route component and optional loader, action, middleware, metadata, and render policy.\n\n**Layout**\n\nA \\_layout.tsx module that wraps matching descendant routes and may own its own loader, middleware, and metadata.\n\n**Route group**\n\nA folder in parentheses that organizes routes or layouts without adding a URL segment.\n\n**Loader**\n\nRequest-owned read operation that resolves data before a route or layout renders.\n\n**Middleware**\n\nOrdered route work that either continues resolution or redirects before loaders run.\n\n**Action**\n\nA server handler for a non-GET request to a route, normally used for mutations and forms.\n\n**Hydration**\n\nAttaching Tavo.js's browser runtime to server-rendered HTML using the same serialized route state."
        },
        {
          "id": "rendering-terms",
          "title": "Rendering terms",
          "markdown": "Term\n\nExpanded form\n\nMeaning in Tavo.js\n\n**CSR**\n\nClient-Side Rendering\n\nThe server sends a document shell and the browser resolves and renders the route.\n\n**SSR**\n\nServer-Side Rendering\n\nTavo.js resolves and renders the route for an incoming request, then the browser hydrates it.\n\n**SSG**\n\nStatic Site Generation\n\nTavo.js prerenders selected SSR routes during the production build.\n\n**ISR**\n\nIncremental Static Regeneration\n\nA runtime caches SSR output and refreshes it after the route's revalidation interval.\n\n**Deferred boundary**\n\n—\n\nAn SSR streaming boundary that sends fallback content before optional promise-backed content settles."
        },
        {
          "id": "state-and-extension-terms",
          "title": "State and extension terms",
          "markdown": "Term\n\nMeaning in Tavo.js\n\n**Model**\n\nReactive state owned by one mounted createTavo component.\n\n**Controller**\n\nComponent behavior, lifecycle, services, and managed side effects in createTavo.\n\n**Store**\n\nObservable state container; a global store is for browser state shared by multiple consumers, not request identity.\n\n**Resource**\n\nComponent-owned asynchronous read state with loading, success, error, reset, and cancellation behavior.\n\n**Plugin**\n\nA manifest-backed framework integration with lazy client, server, and build phase implementations.\n\n**Server-only module**\n\nA module Tavo.js prevents from entering the client bundle, normally under src/server or marked with the server-only import."
        },
        {
          "id": "exact-api-reference",
          "title": "Look up exact public types",
          "markdown": "**Public API names are navigable**\n\nLinked API names throughout this guide open the canonical Core declaration with its complete signature, runtime boundary, stability, import path, and owning guide.\n\n[Browse every public Core symbol](/docs/core/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api",
      "section": "core",
      "slug": "api",
      "title": "Core API reference",
      "description": "Choose the stable root, router, server, config, plugin, and development entry points intentionally.",
      "keywords": [
        "api",
        "exports",
        "imports",
        "packages"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose exports you need to inspect."
      ],
      "outcomes": [
        "Choose the stable root, router, server, config, plugin, and development entry points intentionally."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Tavo.js glossary",
          "href": "/docs/core/glossary",
          "description": "Look up framework-specific terminology."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public stability classifications."
        }
      ],
      "canonicalPath": "/docs/core/api",
      "sections": [
        {
          "id": "entry-points",
          "title": "Import from the narrowest public entry point",
          "markdown": "The root package provides common application APIs. Use the five memorable feature boundaries for routing, server work, configuration, plugins, and development tooling.\n\n**Reference Public import map — copy only the imports you use**\n\n```ts\nimport { createResource, createStore, createTavo, Seo } from \"@tavojs/core\";\nimport { defineRoutePage, navigate } from \"@tavojs/core/router\";\nimport { createSessionStorage } from \"@tavojs/core/server\";\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { definePlugin } from \"@tavojs/core/plugin\";\nimport { createPagesTestHarness } from \"@tavojs/core/dev\";\n```"
        },
        {
          "id": "package-map",
          "title": "Use entry points by responsibility",
          "markdown": "-   `@tavojs/core`: components, JSX, stores, actions, forms, resources, styling, localization, and common application APIs.\n    \n-   `@tavojs/core/router`: Auto Pages routes, navigation, loaders, actions, middleware, subscriptions, and route types.\n    \n-   `@tavojs/core/server`: Node SSR, document rendering, sessions, and server utilities.\n    \n-   `@tavojs/core/config` and `@tavojs/core/plugin`: project configuration and Plugin API v1.\n    \n-   `@tavojs/core/dev`: experimental inspection, testing, instrumentation, validation, scheduling, and devtools.\n    \n-   `@tavojs/core/server-only` and the JSX runtime paths are technical integration boundaries."
        },
        {
          "id": "compatibility",
          "title": "Treat declarations as the exact contract",
          "markdown": "Guides explain how APIs fit together; generated `TypeScript` declarations remain authoritative for overloads, generic parameters, and return values in the installed version.\n\n**Do not import source internals**\n\nOnly package.json exports are public. Internal file paths can change without a public API migration path."
        },
        {
          "id": "runtime-entry-points",
          "title": "Rendering and production entry points",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`@tavojs/core`\n\n`stable`\n\nsymbol-specific\n\nCommon application APIs. DOM, focus, ref, directive, and transition symbols are browser-only; JSX values, static rendering, and style registries also work on the server.\n\n`@tavojs/core/router`\n\n`stable`\n\nbrowser + server\n\nAuto Pages routing, navigation, route modules, loaders, actions, middleware, subscriptions, and route types.\n\n`@tavojs/core/server`\n\n`stable`\n\nserver\n\nNode SSR, document rendering, sessions, and server utilities.\n\n`@tavojs/core/config`\n\n`stable`\n\nbuild\n\nConfiguration authoring helpers, exact project types, and Vite integration.\n\n`@tavojs/core/plugin`\n\n`stable`\n\nbuild + server + browser\n\nPlugin-author declarations, manifests, phases, permissions, capabilities, stores, and compatibility helpers.\n\n`@tavojs/core/dev`\n\n`experimental`\n\ndevelopment + tests\n\nInspection, testing, instrumentation, validation, scheduling, devtools, configuration loading, overlays, and development servers.\n\n`@tavojs/core/server-only`\n\n`stable`\n\nserver marker\n\nEmpty side-effect boundary that rejects execution in a browser bundle.\n\n**Declarations are authoritative**\n\nThese guides explain behavior and defaults. Use the declarations shipped with the installed package for exact generic parameters, overloads, and return types, and import only package.json exports."
        },
        {
          "id": "public-export-inventory",
          "title": "Browse by responsibility",
          "markdown": "[\n\n## Components, JSX, and DOM\n\n35 public exports`@tavojs/core`\n\nComponent contracts, JSX output, roots, refs, directives, focus, observers, and transitions from the root package.\n\nRead guide →\n\n](/docs/core/api/components-and-dom)[\n\n## Errors and code splitting\n\n12 public exports`@tavojs/core`\n\nError boundaries and lazy component contracts for pending, failure, and loaded states.\n\nRead guide →\n\n](/docs/core/api/errors-and-code-splitting)[\n\n## Runtime contracts\n\n16 public exports`@tavojs/core`\n\nShared state helpers, storage and unsubscribe contracts, diagnostics, and API stability metadata.\n\nRead guide →\n\n](/docs/core/api/runtime-contracts)[\n\n## MVC, stores, and services\n\n36 public exports`@tavojs/core`\n\ncreateTavo, controllers, application boot, services, stores, persistence, and selectors.\n\nRead guide →\n\n](/docs/core/api/application)[\n\n## Data, actions, and async\n\n26 public exports`@tavojs/core`\n\nActions, forms, resources, deferred values, and their data contracts.\n\nRead guide →\n\n](/docs/core/api/data-actions-and-async)[\n\n## Localization, SEO, and assets\n\n44 public exports`@tavojs/core`\n\nLocalization state and routing, document head, SEO metadata, images, fonts, scripts, and style registries.\n\nRead guide →\n\n](/docs/core/api/localization-seo-and-assets)[\n\n## Router and Auto Pages\n\n52 public exports`@tavojs/core/router`\n\nRoutes, navigation, loaders, middleware, actions, route modules, status, prefetching, and subscriptions.\n\nRead guide →\n\n](/docs/core/api/router)[\n\n## Server rendering and sessions\n\n27 public exports`@tavojs/core/server`\n\nNode request handling, rendering, static caches, image optimization, environment loading, and sessions.\n\nRead guide →\n\n](/docs/core/api/server)[\n\n## Configuration\n\n8 public exports`@tavojs/core/config`\n\nStable authoring helpers and exact project and Vite configuration contracts.\n\nRead guide →\n\n](/docs/core/api/config)[\n\n## Plugin API\n\n46 public exports`@tavojs/core/plugin`\n\nPlugin-author declarations, manifests, permissions, capabilities, phases, stores, and compatibility helpers.\n\nRead guide →\n\n](/docs/core/api/plugin)[\n\n## Development and testing\n\n55 public exports`@tavojs/core/dev`\n\nExperimental testing, validation, diagnostics, instrumentation, scheduling, inspection, overlays, configuration loading, and development servers.\n\nRead guide →\n\n](/docs/core/api/dev)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/components-and-dom",
      "section": "core",
      "slug": "api/components-and-dom",
      "title": "Components, JSX, and DOM API",
      "description": "Component contracts, JSX output, roots, refs, directives, focus, observers, and transitions from the root package.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "autoFocus",
        "captureFocusRestore",
        "Child",
        "ClassName",
        "Component",
        "createDirective",
        "createListRefs",
        "createRef",
        "createRoot",
        "DomRef",
        "DomRefCallback",
        "DomRefObject",
        "ElementCleanup",
        "ElementDirective",
        "ElementDirectiveInput",
        "ElementTarget",
        "focusFirst",
        "focusFirstInvalid",
        "Fragment",
        "getFocusableElements",
        "h",
        "mergeRefs",
        "observeIntersection",
        "observeMutation",
        "observeResize",
        "PropsWithChildren",
        "render",
        "renderToString",
        "Root",
        "setRef",
        "transition",
        "TransitionClassNames",
        "TransitionOptions",
        "trapFocus",
        "VNode"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public components, jsx, and dom contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/components-and-dom",
      "sections": [
        {
          "id": "public-exports",
          "title": "Components, JSX, and DOM exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### autoFocus[#](#api-tavojs-core--autofocus)\n\n```\nautoFocus<T extends HTMLElement = HTMLElement>(options?: FocusOptions | undefined): ElementDirective<T>\n```\n\nCreates a directive that focuses the element after it is mounted.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### captureFocusRestore[#](#api-tavojs-core--capturefocusrestore)\n\n```\ncaptureFocusRestore(documentRef?: Document | undefined): () => void\n```\n\nCaptures current focus and returns a function that restores it later.\n\n[Related guide](/docs/core/dom-and-accessibility#focus-ownership)\n\n#### Child[#](#api-tavojs-core--child)\n\n```\ntype Child = Primitive | VNode | Child[];\n```\n\nDefines the child contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#functional-components)\n\n#### ClassName[#](#api-tavojs-core--classname)\n\n```\ntype ClassName = string | string[];\n```\n\nDefines the class name contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#intrinsic-runtime)\n\n#### Component[#](#api-tavojs-core--component)\n\n```\ntype Component<P extends Record<string, unknown> = Record<string, unknown>> = (props: PropsWithChildren<P>) => Child;\n```\n\nDefines the component contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#functional-components)\n\n#### createDirective[#](#api-tavojs-core--createdirective)\n\n```\ncreateDirective<T extends HTMLElement = HTMLElement>(directive: ElementDirective<T>): ElementDirective<T>\n```\n\nCreates a reusable element directive from a function.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### createListRefs[#](#api-tavojs-core--createlistrefs)\n\n```\ncreateListRefs<K extends string | number, T extends Element = Element>(): { get(key: K): DomRefObject<T>; delete(key: K): boolean; clear(): void; entries(): IterableIterator<[K, DomRefObject<T>]>; }\n```\n\nCreates a keyed collection of refs for dynamic lists.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### createRef[#](#api-tavojs-core--createref)\n\n```\ncreateRef<T extends Element = Element>(): DomRefObject<T>\n```\n\nCreates a mutable DOM ref object for controller-owned element access.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### createRoot[#](#api-tavojs-core--createroot)\n\n```\ncreateRoot(container: Element | DocumentFragment): Root\n```\n\nCreates root for the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#manual-rendering)\n\n#### DomRef[#](#api-tavojs-core--domref)\n\n```\ntype DomRef<T extends Element = Element> = DomRefObject<T> | DomRefCallback<T> | null | undefined;\n```\n\nPublic DOM ref value accepted by intrinsic JSX elements.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### DomRefCallback[#](#api-tavojs-core--domrefcallback)\n\n```\ntype DomRefCallback<T extends Element = Element> = (node: T | null) => void;\n```\n\nCallback ref shape for one-off DOM element access.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### DomRefObject[#](#api-tavojs-core--domrefobject)\n\n```\ntype DomRefObject<T extends Element = Element> = {\n    current: T | null;\n};\n```\n\nObject ref shape used by MVC controllers to keep direct DOM handles.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### ElementCleanup[#](#api-tavojs-core--elementcleanup)\n\n```\ntype ElementCleanup = () => void;\n```\n\nDefines the element cleanup contract used by the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### ElementDirective[#](#api-tavojs-core--elementdirective)\n\n```\ntype ElementDirective<T extends HTMLElement = HTMLElement> = (element: T) => void | ElementCleanup;\n```\n\nDefines the element directive contract used by the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### ElementDirectiveInput[#](#api-tavojs-core--elementdirectiveinput)\n\n```\ntype ElementDirectiveInput<T extends HTMLElement = HTMLElement> = ElementDirective<T> | Array<ElementDirective<T> | null | undefined | false> | null | undefined | false;\n```\n\nDefines the element directive input contract used by the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### ElementTarget[#](#api-tavojs-core--elementtarget)\n\n```\ntype ElementTarget<T extends Element = Element> = T | DomRefObject<T>;\n```\n\nDefines the element target contract used by the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#managed-observers)\n\n#### focusFirst[#](#api-tavojs-core--focusfirst)\n\n```\nfocusFirst(root: ParentNode, options?: FocusOptions | undefined): HTMLElement | null\n```\n\nFocuses the first focusable descendant inside a root node.\n\n[Related guide](/docs/core/dom-and-accessibility#focus-ownership)\n\n#### focusFirstInvalid[#](#api-tavojs-core--focusfirstinvalid)\n\n```\nfocusFirstInvalid(root: ParentNode, options?: FocusOptions | undefined): HTMLElement | null\n```\n\nFocuses the first invalid form control inside a root node.\n\n[Related guide](/docs/core/dom-and-accessibility#focus-ownership)\n\n#### Fragment[#](#api-tavojs-core--fragment)\n\n```\nFragment: typeof Fragment\n```\n\nProvides fragment behavior for the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#functional-components)\n\n#### getFocusableElements[#](#api-tavojs-core--getfocusableelements)\n\n```\ngetFocusableElements(root: ParentNode): HTMLElement[]\n```\n\nFinds focusable descendants in DOM order.\n\n[Related guide](/docs/core/dom-and-accessibility#focus-ownership)\n\n#### h[#](#api-tavojs-core--h)\n\n```\nh(type: NodeType, props: (Record<string, unknown> & { children?: Child }) | null, ...children: Child[]): VNode\n```\n\nProvides h behavior for the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#intrinsic-runtime)\n\n#### mergeRefs[#](#api-tavojs-core--mergerefs)\n\n```\nmergeRefs<T extends Element>(...refs: DomRef<T>[]): DomRefCallback<T>\n```\n\nCombines several refs into one callback ref.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### observeIntersection[#](#api-tavojs-core--observeintersection)\n\n```\nobserveIntersection<T extends Element>(target: ElementTarget<T>, listener: IntersectionObserverCallback, options?: IntersectionObserverInit | undefined): Unsubscribe\n```\n\nObserves element viewport intersection changes and returns an unsubscribe function.\n\n[Related guide](/docs/core/dom-and-accessibility#managed-observers)\n\n#### observeMutation[#](#api-tavojs-core--observemutation)\n\n```\nobserveMutation<T extends Node>(target: T | { current: T | null; }, listener: MutationCallback, options?: MutationObserverInit | undefined): Unsubscribe\n```\n\nObserves DOM mutations and returns an unsubscribe function.\n\n[Related guide](/docs/core/dom-and-accessibility#managed-observers)\n\n#### observeResize[#](#api-tavojs-core--observeresize)\n\n```\nobserveResize<T extends Element>(target: ElementTarget<T>, listener: ResizeObserverCallback, options?: ResizeObserverOptions | undefined): Unsubscribe\n```\n\nObserves element size changes and returns an unsubscribe function.\n\n[Related guide](/docs/core/dom-and-accessibility#managed-observers)\n\n#### PropsWithChildren[#](#api-tavojs-core--propswithchildren)\n\n```\ntype PropsWithChildren<P extends Record<string, unknown> = Record<string, unknown>> = P & {\n    children?: Child;\n};\n```\n\nDefines the props with children contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#functional-components)\n\n#### render[#](#api-tavojs-core--render)\n\n```\nrender(node: Child, container: Element | DocumentFragment): void\n```\n\nRenders for the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#manual-rendering)\n\n#### renderToString[#](#api-tavojs-core--rendertostring)\n\n```\nrenderToString(node: Child): string\n```\n\nRenders to string for the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#manual-rendering)\n\n#### Root[#](#api-tavojs-core--root)\n\n```\ntype Root = {\n    render(node: Child): void;\n    hydrate(node: Child): void;\n    unmount(): void;\n};\n```\n\nDefines the root contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#manual-rendering)\n\n#### setRef[#](#api-tavojs-core--setref)\n\n```\nsetRef<T extends Element>(ref: DomRef<T>, node: T | null): void\n```\n\nSets a ref to a DOM node or null. Useful when writing framework adapters.\n\n[Related guide](/docs/core/dom-and-accessibility#ref-lifecycle)\n\n#### transition[#](#api-tavojs-core--transition)\n\n```\ntransition<T extends HTMLElement = HTMLElement>(options?: TransitionOptions<T> | undefined): ElementDirective<T>\n```\n\nCreates a small class/callback transition directive for mounted elements.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### TransitionClassNames[#](#api-tavojs-core--transitionclassnames)\n\n```\ntype TransitionClassNames = {\n    enter?: string;\n    enterActive?: string;\n    leave?: string;\n    leaveActive?: string;\n};\n```\n\nDefines the transition class names contract used by the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### TransitionOptions[#](#api-tavojs-core--transitionoptions)\n\n```\ntype TransitionOptions<T extends HTMLElement = HTMLElement> = {\n    classes?: TransitionClassNames;\n    onEnter?: (element: T) => void;\n    onLeave?: (element: T) => void;\n};\n```\n\nConfigures transition in the application runtime.\n\n[Related guide](/docs/core/dom-and-accessibility#directives)\n\n#### trapFocus[#](#api-tavojs-core--trapfocus)\n\n```\ntrapFocus(root: HTMLElement): () => void\n```\n\nKeeps Tab navigation inside a container until the returned cleanup runs.\n\n[Related guide](/docs/core/dom-and-accessibility#focus-ownership)\n\n#### VNode[#](#api-tavojs-core--vnode)\n\n```\ntype VNode = {\n    type: NodeType;\n    props: {\n        children: Child[];\n        [key: string]: unknown;\n    };\n};\n```\n\nDefines the v node contract used by the application runtime.\n\n[Related guide](/docs/core/components-and-jsx#intrinsic-runtime)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/errors-and-code-splitting",
      "section": "core",
      "slug": "api/errors-and-code-splitting",
      "title": "Errors and code splitting API",
      "description": "Error boundaries and lazy component contracts for pending, failure, and loaded states.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "ErrorBoundary",
        "ErrorBoundaryProps",
        "lazy",
        "LazyComponent",
        "LazyErrorFallback",
        "LazyErrorState",
        "LazyFallback",
        "LazyLoader",
        "LazyModule",
        "LazyOptions",
        "LazyPendingState",
        "LazyStatus"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public errors and code splitting contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/errors-and-code-splitting",
      "sections": [
        {
          "id": "public-exports",
          "title": "Errors and code splitting exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### ErrorBoundary[#](#api-tavojs-core--errorboundary)\n\n```\nErrorBoundary(props: ErrorBoundaryProps): ErrorBoundaryVNode\n```\n\nCreates an error boundary vnode that captures descendant render errors.\n\n[Related guide](/docs/core/errors-and-code-splitting#error-boundary)\n\n#### ErrorBoundaryProps[#](#api-tavojs-core--errorboundaryprops)\n\n```\ntype ErrorBoundaryProps = {\n    children?: Child;\n    fallback: ErrorBoundaryFallback;\n    resetKey?: unknown;\n};\n```\n\nDefines the props accepted by error boundary in the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#error-boundary)\n\n#### lazy[#](#api-tavojs-core--lazy)\n\n```\nlazy<P extends Record<string, unknown> = Record<string, unknown>>(loader: LazyLoader<P>, options?: LazyOptions | undefined): LazyComponent<P>\n```\n\nCreates a component that loads its implementation with a dynamic import on first render.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyComponent[#](#api-tavojs-core--lazycomponent)\n\n```\ntype LazyComponent<P extends Record<string, unknown>> = Component<P> & {\n    preload(): Promise<Component<P>>;\n    getStatus(): LazyStatus<P>;\n};\n```\n\nDefines the lazy component contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyErrorFallback[#](#api-tavojs-core--lazyerrorfallback)\n\n```\ntype LazyErrorFallback = Child | ((state: LazyErrorState) => Child);\n```\n\nDefines the lazy error fallback contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyErrorState[#](#api-tavojs-core--lazyerrorstate)\n\n```\ntype LazyErrorState = {\n    status: \"error\";\n    error: unknown;\n};\n```\n\nRepresents the observable state of lazy error in the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyFallback[#](#api-tavojs-core--lazyfallback)\n\n```\ntype LazyFallback = Child | ((state: LazyPendingState) => Child);\n```\n\nDefines the lazy fallback contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyLoader[#](#api-tavojs-core--lazyloader)\n\n```\ntype LazyLoader<P extends Record<string, unknown>> = () => Promise<LazyModule<P>>;\n```\n\nDefines the lazy loader contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyModule[#](#api-tavojs-core--lazymodule)\n\n```\ntype LazyModule<P extends Record<string, unknown>> = Component<P> | {\n    default: Component<P>;\n};\n```\n\nDefines the lazy module contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyOptions[#](#api-tavojs-core--lazyoptions)\n\n```\ntype LazyOptions = {\n    fallback?: LazyFallback;\n    errorFallback?: LazyErrorFallback;\n};\n```\n\nConfigures lazy in the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyPendingState[#](#api-tavojs-core--lazypendingstate)\n\n```\ntype LazyPendingState = {\n    status: \"idle\" | \"loading\";\n};\n```\n\nRepresents the observable state of lazy pending in the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)\n\n#### LazyStatus[#](#api-tavojs-core--lazystatus)\n\n```\ntype LazyStatus<P extends Record<string, unknown>> = {\n    status: \"idle\";\n    component: null;\n    error: null;\n} | {\n    status: \"loading\";\n    component: null;\n    error: null;\n} | {\n    status: \"loaded\";\n    component: Component<P>;\n    error: null;\n} | {\n    status: \"error\";\n    component: null;\n    error: unknown;\n};\n```\n\nDefines the lazy status contract used by the application runtime.\n\n[Related guide](/docs/core/errors-and-code-splitting#lazy-components)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/runtime-contracts",
      "section": "core",
      "slug": "api/runtime-contracts",
      "title": "Runtime contracts API",
      "description": "Shared state helpers, storage and unsubscribe contracts, diagnostics, and API stability metadata.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "ApiStability",
        "ApiStabilityEntry",
        "formatTavoError",
        "getApiStability",
        "isTavoError",
        "shallowEqual",
        "StatePatch",
        "StateUpdater",
        "StorageLike",
        "TAVO_API_STABILITY",
        "TAVO_DIAGNOSTIC_MESSAGES",
        "TavoDiagnosticCode",
        "TavoError",
        "TavoErrorOptions",
        "TavoPublicEntryPoint",
        "Unsubscribe"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public runtime contracts contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/runtime-contracts",
      "sections": [
        {
          "id": "public-exports",
          "title": "Runtime contracts exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### ApiStability[#](#api-tavojs-core--apistability)\n\n```\ntype ApiStability = \"stable\" | \"experimental\";\n```\n\nDefines the api stability contract used by the application runtime.\n\n[Related guide](/docs/core/api-stability#stability-contract)\n\n#### ApiStabilityEntry[#](#api-tavojs-core--apistabilityentry)\n\n```\ntype ApiStabilityEntry = {\n    level: ApiStability;\n    since: string;\n    note: string;\n};\n```\n\nDescribes one entry in api stability in the application runtime.\n\n[Related guide](/docs/core/api-stability#stability-contract)\n\n#### formatTavoError[#](#api-tavojs-core--formattavoerror)\n\n```\nformatTavoError(error: TavoError): string\n```\n\nProduces a human-readable diagnostic while preserving the stable code for logs and tooling.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### getApiStability[#](#api-tavojs-core--getapistability)\n\n```\ngetApiStability(entryPoint: \"@tavojs/core\" | \"@tavojs/core/config\" | \"@tavojs/core/dev\" | \"@tavojs/core/jsx-dev-runtime\" | \"@tavojs/core/jsx-runtime\" | \"@tavojs/core/plugin\" | \"@tavojs/core/router\" | \"@tavojs/core/server\" | \"@tavojs/core/server-only\"): ApiStabilityEntry\n```\n\nReads api stability for the application runtime.\n\n[Related guide](/docs/core/api-stability#stability-contract)\n\n#### isTavoError[#](#api-tavojs-core--istavoerror)\n\n```\nisTavoError(error: unknown): error is TavoError\n```\n\nReports whether the current value satisfies tavo error for the application runtime.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### shallowEqual[#](#api-tavojs-core--shallowequal)\n\n```\nshallowEqual(left: unknown, right: unknown): boolean\n```\n\nProvides shallow equal behavior for the application runtime.\n\n[Related guide](/docs/core/stores#store-subscriptions)\n\n#### StatePatch[#](#api-tavojs-core--statepatch)\n\n```\ntype StatePatch<T extends Record<string, unknown>> = Partial<T> | ((previous: T) => Partial<T>);\n```\n\nDefines the state patch contract used by the application runtime.\n\n[Related guide](/docs/core/stores#store-contract)\n\n#### StateUpdater[#](#api-tavojs-core--stateupdater)\n\n```\ntype StateUpdater<T extends Record<string, unknown>> = T | ((previous: T) => T);\n```\n\nDefines the state updater contract used by the application runtime.\n\n[Related guide](/docs/core/stores#store-contract)\n\n#### StorageLike[#](#api-tavojs-core--storagelike)\n\n```\ntype StorageLike = {\n    getItem(key: string): string | null;\n    setItem(key: string, value: string): void;\n    removeItem?(key: string): void;\n};\n```\n\nDefines the storage like contract used by the application runtime.\n\n[Related guide](/docs/core/stores#derived-and-persistent-stores)\n\n#### TAVO\\_API\\_STABILITY[#](#api-tavojs-core--tavo-api-stability)\n\n```\nTAVO_API_STABILITY: Readonly<{ \"@tavojs/core\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/config\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/dev\": { level: \"experimental\"; since: string; note: string; }; \"@tavojs/core/jsx-dev-runtime\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/jsx-runtime\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/plugin\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/router\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/server\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/server-only\": { level: \"stable\"; since: string; note: string; }; }>\n```\n\nMachine-readable stability contract for public package entry points. Stable entry points follow semantic versioning from Tavo.js 1.0 onward.\n\n[Related guide](/docs/core/api-stability#stability-contract)\n\n#### TAVO\\_DIAGNOSTIC\\_MESSAGES[#](#api-tavojs-core--tavo-diagnostic-messages)\n\n```\nTAVO_DIAGNOSTIC_MESSAGES: Readonly<{ readonly TAVO_PAGES_001: \"The resolved page cache limit is invalid.\"; readonly TAVO_PAGES_002: \"The client root element is missing.\"; readonly TAVO_PAGES_003: \"The auto-discovery pattern is unsupported.\"; readonly TAVO_PAGES_004: \"The bundler page-discovery API is unavailable.\"; readonly TAVO_PAGES_005: \"Server bootstrap is missing page modules.\"; readonly TAVO_PAGES_006: \"A page module declares conflicting static generation options.\"; readonly TAVO_SSR_001: \"The canonical SSR origin is invalid.\"; readonly TAVO_CONFIG_001: \"A server-only module reached the client bundle.\"; readonly TAVO_CONFIG_002: \"A likely secret environment value is referenced by client code.\"; readonly TAVO_PLUGIN_001: \"A plugin targets an unsupported Tavo.js plugin API version.\"; readonly TAVO_PLUGIN_002: \"A plugin manifest or identity is invalid.\"; readonly TAVO_PLUGIN_003: \"Plugin ownership or contribution is duplicated.\"; readonly TAVO_PLUGIN_004: \"A plugin dependency or capability requirement is not satisfied.\"; readonly TAVO_PLUGIN_005: \"A plugin dependency or ordering graph contains a cycle.\"; readonly TAVO_PLUGIN_006: \"A plugin requested a reserved resource or missing permission.\"; readonly TAVO_PLUGIN_007: \"A plugin phase does not implement its declared manifest.\"; readonly TAVO_PLUGIN_008: \"A plugin failed during initialization or build.\"; readonly TAVO_PLUGIN_009: \"A plugin failed while handling or disposing a request.\"; readonly TAVO_HYDRATION_001: \"Strict hydration detected a server/client mismatch.\"; }>\n```\n\nExposes the tavo diagnostic messages constant used by the application runtime.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### TavoDiagnosticCode[#](#api-tavojs-core--tavodiagnosticcode)\n\n```\ntype TavoDiagnosticCode = keyof typeof TAVO_DIAGNOSTIC_MESSAGES;\n```\n\nDefines the tavo diagnostic code contract used by the application runtime.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### TavoError[#](#api-tavojs-core--tavoerror)\n\n```\nclass TavoError extends Error {\n    readonly code: TavoDiagnosticCode;\n    readonly details?: Readonly<Record<string, unknown>>;\n    readonly hint?: string;\n    constructor(code: TavoDiagnosticCode, message?: string, options?: TavoErrorOptions);\n}\n```\n\nFramework error with a stable code and optional structured remediation context.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### TavoErrorOptions[#](#api-tavojs-core--tavoerroroptions)\n\n```\ntype TavoErrorOptions = {\n    cause?: unknown;\n    details?: Readonly<Record<string, unknown>>;\n    hint?: string;\n};\n```\n\nConfigures tavo error in the application runtime.\n\n[Related guide](/docs/core/diagnostics#coded-errors)\n\n#### TavoPublicEntryPoint[#](#api-tavojs-core--tavopublicentrypoint)\n\n```\ntype TavoPublicEntryPoint = keyof typeof TAVO_API_STABILITY;\n```\n\nDefines the tavo public entry point contract used by the application runtime.\n\n[Related guide](/docs/core/api-stability#stability-contract)\n\n#### Unsubscribe[#](#api-tavojs-core--unsubscribe)\n\n```\ntype Unsubscribe = () => void;\n```\n\nDefines the unsubscribe contract used by the application runtime.\n\n[Related guide](/docs/core/mvc#lifecycle-and-cleanup)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/application",
      "section": "core",
      "slug": "api/application",
      "title": "MVC, stores, and services API",
      "description": "createTavo, controllers, application boot, services, stores, persistence, and selectors.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "bootTavo",
        "BootTavoOptions",
        "BootTavoResult",
        "computedStore",
        "createExternalStore",
        "createServiceKey",
        "createStore",
        "createTavo",
        "defineGlobalStore",
        "ExternalStore",
        "getGlobalStore",
        "getService",
        "getTavoBootMode",
        "hasGlobalStore",
        "hasService",
        "listGlobalStores",
        "listServices",
        "MvcComponentDefinition",
        "persistStore",
        "PersistStoreOptions",
        "registerService",
        "RegisterServiceOptions",
        "SelectorListener",
        "ServiceIdentifier",
        "ServiceKey",
        "Store",
        "StoreInitializer",
        "StoreInitializerSet",
        "StoreListener",
        "StorePath",
        "StorePathSegment",
        "StoreSelector",
        "StoreWatchListener",
        "TavoBootMode",
        "TavoController",
        "tryGetService"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public mvc, stores, and services contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/application",
      "sections": [
        {
          "id": "public-exports",
          "title": "MVC, stores, and services exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### bootTavo[#](#api-tavojs-core--boottavo)\n\n```\nbootTavo(options?: BootTavoOptions | undefined): Promise<BootTavoResult>\n```\n\nBoots the default Tavo.js app behavior for projects that use file-based pages.\n\n[Related guide](/docs/core/ssr-and-hydration#boot-and-hydration-reference)\n\n#### BootTavoOptions[#](#api-tavojs-core--boottavooptions)\n\n```\ntype BootTavoOptions = BootTavoClientOptions & BootTavoServerOptions;\n```\n\nConfigures boot tavo in the application runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#boot-and-hydration-reference)\n\n#### BootTavoResult[#](#api-tavojs-core--boottavoresult)\n\n```\ntype BootTavoResult = {\n    mode: \"client\";\n    root: Root;\n} | {\n    mode: \"server\";\n    handle: ReturnType<typeof createNodeRequestHandler>;\n    modules: PageModules;\n} | {\n    mode: \"none\";\n};\n```\n\nDescribes the result returned by boot tavo in the application runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#boot-and-hydration-reference)\n\n#### computedStore[#](#api-tavojs-core--computedstore)\n\n```\ncomputedStore<T extends Record<string, unknown>, S extends Record<string, unknown>>(source: Store<T>, selector: StoreSelector<T, S>, options?: { isEqual?: ((left: S, right: S) => boolean) | undefined; } | undefined): Store<S>\n```\n\nCreates a derived readonly store that updates whenever the source store's selected value changes.\n\n[Related guide](/docs/core/stores#external-stores)\n\n#### createExternalStore[#](#api-tavojs-core--createexternalstore)\n\n```\ncreateExternalStore<T>(store: ExternalStore<T>): ExternalStore<T>\n```\n\nCreates external store for the application runtime.\n\n[Related guide](/docs/core/stores#external-stores)\n\n#### createServiceKey[#](#api-tavojs-core--createservicekey)\n\n```\ncreateServiceKey<T>(name: string): ServiceKey<T>\n```\n\nCreates a typed key for registering and resolving a named service.\n\n[Related guide](/docs/core/services-and-dependencies#typed-services)\n\n#### createStore[#](#api-tavojs-core--createstore)\n\n```\ncreateStore<T extends Record<string, unknown>>(initialState: T | StoreInitializer<T>): Store<T>\n```\n\nCreates store for the application runtime.\n\n[Related guide](/docs/core/stores#store-contract)\n\n#### createTavo[#](#api-tavojs-core--createtavo)\n\n```\ncreateTavo<P extends AnyRecord, S extends AnyRecord, C = unknown>(definition: MvcComponentDefinition<P, S, C>): Component<P>\n```\n\nCreates tavo for the application runtime.\n\n[Related guide](/docs/core/mvc#definition-contract)\n\n#### defineGlobalStore[#](#api-tavojs-core--defineglobalstore)\n\n```\ndefineGlobalStore<T extends AnyRecord>(name: string, initialState: T | StoreInitializer<T>): Store<T>\n```\n\nDefines a named global store once and returns the shared instance.\n\n[Related guide](/docs/core/stores#global-stores)\n\n#### ExternalStore[#](#api-tavojs-core--externalstore)\n\n```\ntype ExternalStore<T> = {\n    getSnapshot(): T;\n    getServerSnapshot?: () => T;\n    subscribe(listener: () => void): Unsubscribe;\n};\n```\n\nDefines storage behavior for external in the application runtime.\n\n[Related guide](/docs/core/stores#external-stores)\n\n#### getGlobalStore[#](#api-tavojs-core--getglobalstore)\n\n```\ngetGlobalStore<T extends AnyRecord>(name: string): Store<T>\n```\n\nLooks up a previously defined global store by name.\n\n[Related guide](/docs/core/stores#global-stores)\n\n#### getService[#](#api-tavojs-core--getservice)\n\n```\ngetService<T>(identifier: ServiceIdentifier<T>): T\n```\n\nLooks up a previously registered service by name.\n\n[Related guide](/docs/core/services-and-dependencies#selection)\n\n#### getTavoBootMode[#](#api-tavojs-core--gettavobootmode)\n\n```\ngetTavoBootMode(options?: Pick<BootTavoOptions, \"root\" | \"rootSelector\" | \"hydrate\"> | undefined): TavoBootMode\n```\n\nReturns the boot mode Tavo.js will use for the current document.\n\n[Related guide](/docs/core/ssr-and-hydration#boot-and-hydration-reference)\n\n#### hasGlobalStore[#](#api-tavojs-core--hasglobalstore)\n\n```\nhasGlobalStore(name: string): boolean\n```\n\nReturns true when a named global store exists in the shared registry.\n\n[Related guide](/docs/core/stores#global-stores)\n\n#### hasService[#](#api-tavojs-core--hasservice)\n\n```\nhasService(identifier: ServiceIdentifier<unknown>): boolean\n```\n\nReturns true when a named service exists in the shared registry.\n\n[Related guide](/docs/core/services-and-dependencies#selection)\n\n#### listGlobalStores[#](#api-tavojs-core--listglobalstores)\n\n```\nlistGlobalStores(): string[]\n```\n\nLists all registered global store names.\n\n[Related guide](/docs/core/stores#global-stores)\n\n#### listServices[#](#api-tavojs-core--listservices)\n\n```\nlistServices(): string[]\n```\n\nLists all registered service names.\n\n[Related guide](/docs/core/services-and-dependencies#selection)\n\n#### MvcComponentDefinition[#](#api-tavojs-core--mvccomponentdefinition)\n\n```\ntype MvcComponentDefinition<P extends AnyRecord, S extends AnyRecord, C> = {\n    model?: (props: P) => S | Store<S>;\n    controller?: new (ctx: MvcControllerContext<P, S>) => C;\n    createController?: (ctx: MvcControllerContext<P, S>) => C;\n    view: (ctx: MvcContext<P, S, C>) => Child;\n};\n```\n\nDefines the mvc component definition contract used by the application runtime.\n\n[Related guide](/docs/core/mvc#definition-contract)\n\n#### persistStore[#](#api-tavojs-core--persiststore)\n\n```\npersistStore<T extends Record<string, unknown>>(store: Store<T>, options: PersistStoreOptions<T>): Unsubscribe\n```\n\nPersists store updates to browser storage and hydrates an initial saved snapshot when available.\n\n[Related guide](/docs/core/stores#derived-and-persistent-stores)\n\n#### PersistStoreOptions[#](#api-tavojs-core--persiststoreoptions)\n\n```\ntype PersistStoreOptions<T extends Record<string, unknown>> = {\n    key: string;\n    storage?: StorageLike;\n    serialize?: (state: T) => string;\n    deserialize?: (raw: string) => Partial<T> | T;\n    pick?: (state: T) => Partial<T> | T;\n};\n```\n\nConfigures persist store in the application runtime.\n\n[Related guide](/docs/core/stores#derived-and-persistent-stores)\n\n#### registerService[#](#api-tavojs-core--registerservice)\n\n```\nregisterService<T>(identifier: ServiceIdentifier<T>, service: T, options?: RegisterServiceOptions | undefined): T\n```\n\nRegisters a named app/service dependency and returns the same instance.\n\n[Related guide](/docs/core/services-and-dependencies#registration)\n\n#### RegisterServiceOptions[#](#api-tavojs-core--registerserviceoptions)\n\n```\ntype RegisterServiceOptions = {\n    override?: boolean;\n};\n```\n\nConfigures register service in the application runtime.\n\n[Related guide](/docs/core/services-and-dependencies#registration)\n\n#### SelectorListener[#](#api-tavojs-core--selectorlistener)\n\n```\ntype SelectorListener<S, T> = (selected: S, previousSelected: S, state: T) => void;\n```\n\nDefines a callback notified by selector in the application runtime.\n\n[Related guide](/docs/core/stores#store-subscriptions)\n\n#### ServiceIdentifier[#](#api-tavojs-core--serviceidentifier)\n\n```\ntype ServiceIdentifier<T = unknown> = string | ServiceKey<T>;\n```\n\nDefines the service identifier contract used by the application runtime.\n\n[Related guide](/docs/core/services-and-dependencies#typed-services)\n\n#### ServiceKey[#](#api-tavojs-core--servicekey)\n\n```\ntype ServiceKey<T> = {\n    readonly name: string;\n    readonly __tavoServiceType?: T;\n};\n```\n\nDefines the service key contract used by the application runtime.\n\n[Related guide](/docs/core/services-and-dependencies#typed-services)\n\n#### Store[#](#api-tavojs-core--store)\n\n```\ntype Store<T extends Record<string, unknown>> = {\n    getState(): T;\n    setState(next: StateUpdater<T>): T;\n    set<K extends keyof T>(key: K, value: StoreSetValue<T, T[K]>): T;\n    set<S = unknown>(path: StorePath, value: StoreSetValue<T, S>): T;\n    patch(partial: StatePatch<T>): T;\n    subscribe(listener: StoreListener<T>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    subscribeSelector<S>(selector: StoreSelector<T, S>, listener: SelectorListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<K extends keyof T>(key: K, listener: StoreWatchListener<T[K], T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: T[K], b: T[K]) => boolean;\n    }): Unsubscribe;\n    watch<S>(selector: StoreSelector<T, S>, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<S = unknown>(path: StorePath, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n};\n```\n\nDefines storage behavior for application runtime in the application runtime.\n\n[Related guide](/docs/core/stores#store-contract)\n\n#### StoreInitializer[#](#api-tavojs-core--storeinitializer)\n\n```\ntype StoreInitializer<T extends Record<string, unknown>> = (set: StoreInitializerSet<T>, get: () => T) => T;\n```\n\nDefines the store initializer contract used by the application runtime.\n\n[Related guide](/docs/core/stores#store-initializers)\n\n#### StoreInitializerSet[#](#api-tavojs-core--storeinitializerset)\n\n```\ntype StoreInitializerSet<T extends Record<string, unknown>> = (partial: StatePatch<T>) => T;\n```\n\nDefines the store initializer set contract used by the application runtime.\n\n[Related guide](/docs/core/stores#store-initializers)\n\n#### StoreListener[#](#api-tavojs-core--storelistener)\n\n```\ntype StoreListener<T> = (state: T, previous: T) => void;\n```\n\nDefines a callback notified by store in the application runtime.\n\n[Related guide](/docs/core/stores#store-subscriptions)\n\n#### StorePath[#](#api-tavojs-core--storepath)\n\n```\ntype StorePath = StorePathSegment | readonly StorePathSegment[];\n```\n\nDefines the store path contract used by the application runtime.\n\n[Related guide](/docs/core/stores#nested-store-paths)\n\n#### StorePathSegment[#](#api-tavojs-core--storepathsegment)\n\n```\ntype StorePathSegment = string | number;\n```\n\nDefines the store path segment contract used by the application runtime.\n\n[Related guide](/docs/core/stores#nested-store-paths)\n\n#### StoreSelector[#](#api-tavojs-core--storeselector)\n\n```\ntype StoreSelector<T, S> = (state: T) => S;\n```\n\nDefines the store selector contract used by the application runtime.\n\n[Related guide](/docs/core/stores#store-subscriptions)\n\n#### StoreWatchListener[#](#api-tavojs-core--storewatchlistener)\n\n```\ntype StoreWatchListener<S, T> = (selected: S, previousSelected: S, state: T, previousState: T) => void;\n```\n\nDefines a callback notified by store watch in the application runtime.\n\n[Related guide](/docs/core/stores#nested-store-paths)\n\n#### TavoBootMode[#](#api-tavojs-core--tavobootmode)\n\n```\ntype TavoBootMode = \"server\" | \"ssr\" | \"csr\" | \"none\";\n```\n\nDefines the tavo boot mode contract used by the application runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#boot-and-hydration-reference)\n\n#### TavoController[#](#api-tavojs-core--tavocontroller)\n\n```\nclass TavoController implements MvcControllerTools {\n    #private;\n    model: Store<any>;\n    props: AnyRecord;\n    router: MvcControllerFrameworkContext[\"router\"];\n    stores: MvcControllerFrameworkContext[\"stores\"];\n    services: MvcControllerFrameworkContext[\"services\"];\n    capabilities: MvcControllerFrameworkContext[\"capabilities\"];\n    page: MvcControllerFrameworkContext[\"page\"];\n    __setTavoControllerContext(context: Pick<MvcControllerContext<AnyRecord, AnyRecord>, \"model\" | \"props\">): void;\n    __setTavoControllerTools(tools: MvcControllerTools): void;\n    cleanup(fn: Unsubscribe): Unsubscribe;\n    createId(prefix?: string): string;\n    setTimeout(fn: () => void, delay?: number): Unsubscribe;\n    setInterval(fn: () => void, delay?: number): Unsubscribe;\n    action<TResult, TArgs extends unknown[]>(fn: (...args: TArgs) => Promise<TResult> | TResult): TavoAction<TResult, TArgs>;\n    scheduleLayoutEffect(fn: () => void | Unsubscribe): Unsubscribe;\n    scheduleAfterRender(fn: () => void): Unsubscribe;\n    scheduleOnMount(fn: () => void | Unsubscribe): Unsubscribe;\n    listen<T extends AnyRecord>(store: Store<T>, listener: StoreListener<T>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    select<T extends AnyRecord, S>(store: Store<T>, selector: StoreSelector<T, S>, listener: SelectorListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<T extends AnyRecord, S>(store: Store<T>, target: StorePath | StoreSelector<T, S>, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    listenExternal<T>(store: ExternalStore<T>, listener: (snapshot: T, previousSnapshot: T) => void, options?: {\n        immediate?: boolean;\n        isEqual?: (a: T, b: T) => boolean;\n    }): Unsubscribe;\n    observeResize<T extends Element>(target: ElementTarget<T>, listener: ResizeObserverCallback, options?: ResizeObserverOptions): Unsubscribe;\n    observeIntersection<T extends Element>(target: ElementTarget<T>, listener: IntersectionObserverCallback, options?: IntersectionObserverInit): Unsubscribe;\n    observeMutation<T extends Node>(target: T | {\n        current: T | null;\n    }, listener: MutationCallback, options?: MutationObserverInit): Unsubscribe;\n}\n```\n\nDefines the tavo controller contract used by the application runtime.\n\n[Related guide](/docs/core/mvc#lifecycle-reference)\n\n#### tryGetService[#](#api-tavojs-core--trygetservice)\n\n```\ntryGetService<T>(identifier: ServiceIdentifier<T>): T | undefined\n```\n\nLooks up an optional service by name without throwing when it is missing.\n\n[Related guide](/docs/core/services-and-dependencies#selection)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/data-actions-and-async",
      "section": "core",
      "slug": "api/data-actions-and-async",
      "title": "Data, actions, and async API",
      "description": "Actions, forms, resources, deferred values, and their data contracts.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "Action",
        "ActionContext",
        "ActionState",
        "ActionStatus",
        "createAction",
        "createDeferredValue",
        "createFormAction",
        "createResource",
        "createServerFormAction",
        "Deferred",
        "DeferredProps",
        "DeferredState",
        "DeferredTimeoutError",
        "DeferredValue",
        "FormAction",
        "formDataToObject",
        "FormState",
        "FormValues",
        "Resource",
        "ResourceState",
        "ServerFormActionBody",
        "ServerFormActionBodyContext",
        "ServerFormActionBodyValue",
        "ServerFormActionContentType",
        "ServerFormActionOptions",
        "TavoAction"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public data, actions, and async contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/data-actions-and-async",
      "sections": [
        {
          "id": "public-exports",
          "title": "Data, actions, and async exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### Action[#](#api-tavojs-core--action)\n\n```\ntype Action<TInput, TResult> = {\n    store: Store<ActionState<TResult>>;\n    getState(): ActionState<TResult>;\n    run(input: TInput): Promise<ActionState<TResult>>;\n    abort(): void;\n    reset(): void;\n};\n```\n\nDefines the action contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#action-primitive-reference)\n\n#### ActionContext[#](#api-tavojs-core--actioncontext)\n\n```\ntype ActionContext<TInput> = {\n    input: TInput;\n    signal: AbortSignal;\n};\n```\n\nProvides the context passed to action in the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#action-primitive-reference)\n\n#### ActionState[#](#api-tavojs-core--actionstate)\n\n```\ntype ActionState<TResult = unknown> = {\n    status: ActionStatus;\n    data: TResult | null;\n    error: unknown;\n    submittedAt: number | null;\n    completedAt: number | null;\n};\n```\n\nRepresents the observable state of action in the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#action-primitive-reference)\n\n#### ActionStatus[#](#api-tavojs-core--actionstatus)\n\n```\ntype ActionStatus = \"idle\" | \"running\" | \"success\" | \"error\";\n```\n\nDefines the action status contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#action-primitive-reference)\n\n#### createAction[#](#api-tavojs-core--createaction)\n\n```\ncreateAction<TInput = void, TResult = unknown>(handler: (context: ActionContext<TInput>) => TResult | Promise<TResult>): Action<TInput, TResult>\n```\n\nCreates an MVC-friendly mutation primitive with status, result, error, and abort handling.\n\n[Related guide](/docs/core/actions-and-forms#action-primitive-reference)\n\n#### createDeferredValue[#](#api-tavojs-core--createdeferredvalue)\n\n```\ncreateDeferredValue<T>(promise: Promise<T>, options?: { id?: string | undefined; serialize?: ((value: T) => unknown) | undefined; deserialize?: ((value: unknown) => T) | undefined; timeoutMs?: number | undefined; timeoutFallback?: DeferredTimeoutFallback; signal?: AbortSignal | undefined; } | undefined): DeferredValue<T>\n```\n\nCreates a reusable deferred wrapper so nested SSR trees can share one async unit by id.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### createFormAction[#](#api-tavojs-core--createformaction)\n\n```\ncreateFormAction<TResult = unknown>(handler: (values: FormValues, context: { signal: AbortSignal; }) => TResult | Promise<TResult>): FormAction<TResult>\n```\n\nCreates a form-oriented action for MVC controllers without introducing hook-style APIs.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### createResource[#](#api-tavojs-core--createresource)\n\n```\ncreateResource<T>(loader: (context: { signal: AbortSignal; }) => Promise<T>): Resource<T>\n```\n\nCreates an MVC-friendly async resource with explicit load/reset methods and observable state.\n\n[Related guide](/docs/core/data-and-middleware#resource-reference)\n\n#### createServerFormAction[#](#api-tavojs-core--createserverformaction)\n\n```\ncreateServerFormAction<TResult = unknown>(url: string, options?: ServerFormActionOptions<TResult> | undefined): FormAction<TResult>\n```\n\nCreates a form action that submits to an SSR route action endpoint.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### Deferred[#](#api-tavojs-core--deferred)\n\n```\nDeferred<T>(props: DeferredProps<T>): Child\n```\n\nProgressive SSR boundary that renders stable fallback UI during pure CSR rendering.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### DeferredProps[#](#api-tavojs-core--deferredprops)\n\n```\ntype DeferredProps<T> = {\n    value: Promise<T> | T | DeferredValue<T>;\n    fallback?: Child;\n    children: DeferredRender<T> | Child;\n    id?: string;\n    as?: string;\n    errorFallback?: DeferredErrorFallback;\n    serialize?: (value: T) => unknown;\n    deserialize?: (value: unknown) => T;\n    timeoutMs?: number;\n    timeoutFallback?: DeferredTimeoutFallback;\n    signal?: AbortSignal;\n};\n```\n\nDefines the props accepted by deferred in the application runtime.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### DeferredState[#](#api-tavojs-core--deferredstate)\n\n```\ntype DeferredState<T> = {\n    status: \"pending\";\n    data: null;\n    error: null;\n} | {\n    status: \"resolved\";\n    data: T;\n    error: null;\n} | {\n    status: \"rejected\";\n    data: null;\n    error: unknown;\n};\n```\n\nRepresents the observable state of deferred in the application runtime.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### DeferredTimeoutError[#](#api-tavojs-core--deferredtimeouterror)\n\n```\ntype DeferredTimeoutError = {\n    code: \"TAVO_DEFERRED_TIMEOUT\";\n    id?: string;\n    timeoutMs: number;\n    message: string;\n};\n```\n\nRepresents a failure raised by deferred timeout in the application runtime.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### DeferredValue[#](#api-tavojs-core--deferredvalue)\n\n```\ntype DeferredValue<T> = {\n    id?: string;\n    promise: Promise<T>;\n    serialize?: (value: T) => unknown;\n    deserialize?: (value: unknown) => T;\n    timeoutMs?: number;\n    timeoutFallback?: DeferredTimeoutFallback;\n    signal?: AbortSignal;\n};\n```\n\nDefines the deferred value contract used by the application runtime.\n\n[Related guide](/docs/core/streaming-and-async#deferred-api-reference)\n\n#### FormAction[#](#api-tavojs-core--formaction)\n\n```\ntype FormAction<TResult = unknown> = {\n    action: Action<FormValues, TResult>;\n    store: Store<FormState<TResult>>;\n    submit(form: HTMLFormElement | FormData | FormValues): Promise<FormState<TResult>>;\n    reset(): void;\n};\n```\n\nDefines the form action contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### formDataToObject[#](#api-tavojs-core--formdatatoobject)\n\n```\nformDataToObject(formData: FormData): FormValues\n```\n\nConverts browser FormData into a plain object while preserving repeated field names.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### FormState[#](#api-tavojs-core--formstate)\n\n```\ntype FormState<TResult = unknown> = ActionState<TResult> & {\n    values: FormValues;\n};\n```\n\nRepresents the observable state of form in the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### FormValues[#](#api-tavojs-core--formvalues)\n\n```\ntype FormValues = Record<string, FormDataEntryValue | FormDataEntryValue[]>;\n```\n\nDefines the form values contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### Resource[#](#api-tavojs-core--resource)\n\n```\ntype Resource<T> = {\n    store: Store<ResourceState<T>>;\n    read(): ResourceState<T>;\n    load(options?: {\n        signal?: AbortSignal;\n    }): Promise<ResourceState<T>>;\n    preload(options?: {\n        signal?: AbortSignal;\n    }): Promise<ResourceState<T>>;\n    abort(reason?: unknown): void;\n    reset(): void;\n};\n```\n\nDefines the resource contract used by the application runtime.\n\n[Related guide](/docs/core/data-and-middleware#resource-reference)\n\n#### ResourceState[#](#api-tavojs-core--resourcestate)\n\n```\ntype ResourceState<T> = {\n    status: \"idle\" | \"loading\" | \"success\" | \"error\";\n    data: T | null;\n    error: unknown;\n    updatedAt: number | null;\n};\n```\n\nRepresents the observable state of resource in the application runtime.\n\n[Related guide](/docs/core/data-and-middleware#resource-reference)\n\n#### ServerFormActionBody[#](#api-tavojs-core--serverformactionbody)\n\n```\ntype ServerFormActionBody = ServerFormActionBodyValue | Partial<Record<TavoBootMode | \"default\", ServerFormActionBodyValue>>;\n```\n\nDefines the server form action body contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### ServerFormActionBodyContext[#](#api-tavojs-core--serverformactionbodycontext)\n\n```\ntype ServerFormActionBodyContext = {\n    bootMode: TavoBootMode;\n    url: string;\n};\n```\n\nProvides the context passed to server form action body in the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### ServerFormActionBodyValue[#](#api-tavojs-core--serverformactionbodyvalue)\n\n```\ntype ServerFormActionBodyValue = \"form-data\" | \"json\" | ((values: FormValues, context: ServerFormActionBodyContext) => BodyInit | Promise<BodyInit>);\n```\n\nDefines the server form action body value contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### ServerFormActionContentType[#](#api-tavojs-core--serverformactioncontenttype)\n\n```\ntype ServerFormActionContentType = ActionContentType | Partial<Record<TavoBootMode | \"default\", ActionContentType>>;\n```\n\nDefines the server form action content type contract used by the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### ServerFormActionOptions[#](#api-tavojs-core--serverformactionoptions)\n\n```\ntype ServerFormActionOptions<TResult = unknown> = {\n    body?: ServerFormActionBody;\n    contentType?: ServerFormActionContentType;\n    credentials?: RequestCredentials;\n    fetch?: typeof fetch;\n    headers?: HeadersInit;\n    method?: string;\n    parseResponse?: (response: Response) => Promise<TResult> | TResult;\n};\n```\n\nConfigures server form action in the application runtime.\n\n[Related guide](/docs/core/actions-and-forms#form-action-reference)\n\n#### TavoAction[#](#api-tavojs-core--tavoaction)\n\n```\ntype TavoAction<TResult, TArgs extends unknown[]> = {\n    readonly pending: boolean;\n    readonly error: unknown;\n    readonly result: TResult | null;\n    run(...args: TArgs): Promise<TResult>;\n    reset(): void;\n};\n```\n\nDefines the tavo action contract used by the application runtime.\n\n[Related guide](/docs/core/mvc#controller-actions)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/localization-seo-and-assets",
      "section": "core",
      "slug": "api/localization-seo-and-assets",
      "title": "Localization, SEO, and assets API",
      "description": "Localization state and routing, document head, SEO metadata, images, fonts, scripts, and style registries.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core",
        "AnyI18nService",
        "createI18n",
        "CreateI18nOptions",
        "createStyleRegistry",
        "DEFAULT_I18N_SERVICE_NAME",
        "DefinedI18nMessages",
        "defineMessages",
        "ensureClientStyle",
        "Font",
        "FontDisplay",
        "FontProps",
        "getActiveStyleRegistry",
        "Head",
        "HeadProps",
        "I18nDetectLocaleInput",
        "I18nLocaleDirection",
        "I18nLocaleInfo",
        "I18nMessages",
        "I18nMissingKeyPayload",
        "I18nParams",
        "I18nPrimitive",
        "I18nResolvedPath",
        "I18nRoutingOptions",
        "I18nService",
        "I18nSetLocaleOptions",
        "I18nState",
        "I18nTextTree",
        "I18nTextValue",
        "I18nTranslationKey",
        "Image",
        "ImageFormat",
        "ImageProps",
        "renderStyleTags",
        "Script",
        "ScriptProps",
        "Seo",
        "SeoOpenGraph",
        "SeoProps",
        "SeoTwitter",
        "style",
        "StyleOptions",
        "StyleRegistry",
        "StyleRegistryEntry",
        "withStyleRegistry"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public localization, seo, and assets contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/localization-seo-and-assets",
      "sections": [
        {
          "id": "public-exports",
          "title": "Localization, SEO, and assets exports",
          "markdown": "### @tavojs/core\n\nCanonical import boundary for every symbol in this section.\n\n#### AnyI18nService[#](#api-tavojs-core--anyi18nservice)\n\n```\ntype AnyI18nService = I18nService<any, string>;\n```\n\nDefines the any i18n service contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### createI18n[#](#api-tavojs-core--createi18n)\n\n```\ncreateI18n<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string>(options: CreateI18nOptions<TMessages, TDefaultLocale>): I18nService<TMessages, TDefaultLocale>\n```\n\nCreates a reactive i18n service with direct object access through \\`i18n.text\\`.\n\n[Related guide](/docs/core/localization#localization-example)\n\n#### CreateI18nOptions[#](#api-tavojs-core--createi18noptions)\n\n```\ntype CreateI18nOptions<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string> = {\n    defaultLocale: TDefaultLocale;\n    locale?: keyof TMessages & string;\n    fallbackLocale?: keyof TMessages & string;\n    messages: TMessages;\n    locales?: Partial<Record<keyof TMessages & string, I18nLocaleInfo>>;\n    routing?: false | I18nRoutingOptions;\n    serviceName?: string | false;\n    onMissingKey?: (payload: I18nMissingKeyPayload) => string | void;\n};\n```\n\nConfigures create i18n in the application runtime.\n\n[Related guide](/docs/core/localization#i18n-options-reference)\n\n#### createStyleRegistry[#](#api-tavojs-core--createstyleregistry)\n\n```\ncreateStyleRegistry(): StyleRegistry\n```\n\nCreates style registry for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### DEFAULT\\_I18N\\_SERVICE\\_NAME[#](#api-tavojs-core--default-i18n-service-name)\n\n```\nDEFAULT_I18N_SERVICE_NAME: \"tavo:i18n\"\n```\n\nExposes the default i18 n service name constant used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### DefinedI18nMessages[#](#api-tavojs-core--definedi18nmessages)\n\n```\ntype DefinedI18nMessages<TMessages extends I18nMessages> = TMessages & {\n    readonly __tavo_defined_messages__?: true;\n};\n```\n\nDefines the defined i18n messages contract used by the application runtime.\n\n[Related guide](/docs/core/localization#localization-example)\n\n#### defineMessages[#](#api-tavojs-core--definemessages)\n\n```\ndefineMessages<const TMessages extends I18nMessages>(messages: TMessages): DefinedI18nMessages<TMessages>\n```\n\nMarks a central translation catalog for build-time i18n splitting.\n\n[Related guide](/docs/core/localization#localization-example)\n\n#### ensureClientStyle[#](#api-tavojs-core--ensureclientstyle)\n\n```\nensureClientStyle(id: string, css: string, options?: StyleOptions | undefined): void\n```\n\nEnsures client style for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### Font[#](#api-tavojs-core--font)\n\n```\nFont(props: FontProps): Child\n```\n\nLoads external or self-hosted fonts into the document head for SSR and CSR usage.\n\n[Related guide](/docs/core/seo-assets-and-styling#font-script-reference)\n\n#### FontDisplay[#](#api-tavojs-core--fontdisplay)\n\n```\ntype FontDisplay = \"auto\" | \"block\" | \"swap\" | \"fallback\" | \"optional\";\n```\n\nDefines the font display contract used by the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#font-script-reference)\n\n#### FontProps[#](#api-tavojs-core--fontprops)\n\n```\ntype FontProps = {\n    href?: string;\n    src?: string;\n    family?: string;\n    local?: string[];\n    weight?: string | number;\n    style?: \"normal\" | \"italic\" | \"oblique\";\n    display?: FontDisplay;\n    preload?: boolean;\n    preconnect?: string[];\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    type?: string;\n    variable?: `--${string}`;\n    fallback?: string;\n};\n```\n\nDefines the props accepted by font in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#font-script-reference)\n\n#### getActiveStyleRegistry[#](#api-tavojs-core--getactivestyleregistry)\n\n```\ngetActiveStyleRegistry(): StyleRegistry | null\n```\n\nReads active style registry for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### Head[#](#api-tavojs-core--head)\n\n```\nHead(props: PropsWithChildren<HeadProps>): Child\n```\n\nProvides head behavior for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### HeadProps[#](#api-tavojs-core--headprops)\n\n```\ntype HeadProps = {\n    title?: string;\n    unsafeHeadHtml?: string;\n    children?: Child;\n};\n```\n\nDefines the props accepted by head in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### I18nDetectLocaleInput[#](#api-tavojs-core--i18ndetectlocaleinput)\n\n```\ntype I18nDetectLocaleInput = {\n    pathname?: string;\n    request?: unknown;\n    headers?: Headers | Record<string, string | string[] | undefined>;\n    cookie?: string;\n};\n```\n\nDefines the i18n detect locale input contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-options-reference)\n\n#### I18nLocaleDirection[#](#api-tavojs-core--i18nlocaledirection)\n\n```\ntype I18nLocaleDirection = \"ltr\" | \"rtl\" | \"auto\";\n```\n\nDefines the i18n locale direction contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nLocaleInfo[#](#api-tavojs-core--i18nlocaleinfo)\n\n```\ntype I18nLocaleInfo = {\n    label?: string;\n    dir?: I18nLocaleDirection;\n};\n```\n\nDefines the i18n locale info contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nMessages[#](#api-tavojs-core--i18nmessages)\n\n```\ntype I18nMessages = Record<string, I18nTextTree>;\n```\n\nDefines the i18n messages contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nMissingKeyPayload[#](#api-tavojs-core--i18nmissingkeypayload)\n\n```\ntype I18nMissingKeyPayload = {\n    key: string;\n    locale: string;\n    fallbackLocale: string;\n};\n```\n\nDefines the i18n missing key payload contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nParams[#](#api-tavojs-core--i18nparams)\n\n```\ntype I18nParams = Record<string, string | number | boolean | null | undefined>;\n```\n\nDefines the i18n params contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nPrimitive[#](#api-tavojs-core--i18nprimitive)\n\n```\ntype I18nPrimitive = string | number | boolean | null;\n```\n\nDefines the i18n primitive contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nResolvedPath[#](#api-tavojs-core--i18nresolvedpath)\n\n```\ntype I18nResolvedPath<TLocale extends string = string> = {\n    pathname: string;\n    locale: TLocale;\n    localized: boolean;\n};\n```\n\nDefines the i18n resolved path contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nRoutingOptions[#](#api-tavojs-core--i18nroutingoptions)\n\n```\ntype I18nRoutingOptions = {\n    enabled?: boolean;\n    defaultLocalePrefix?: \"always\" | \"never\";\n    cookieName?: string;\n    detectFrom?: Array<\"path\" | \"cookie\" | \"header\">;\n};\n```\n\nConfigures i18n routing in the application runtime.\n\n[Related guide](/docs/core/localization#i18n-options-reference)\n\n#### I18nService[#](#api-tavojs-core--i18nservice)\n\n```\ntype I18nService<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string> = {\n    readonly locale: keyof TMessages & string;\n    readonly defaultLocale: TDefaultLocale;\n    readonly fallbackLocale: keyof TMessages & string;\n    readonly locales: Array<keyof TMessages & string>;\n    readonly dir: I18nLocaleDirection;\n    readonly messages: TMessages;\n    readonly text: TMessages[TDefaultLocale];\n    readonly store: Store<I18nState<TMessages>>;\n    setLocale(locale: keyof TMessages & string, options?: I18nSetLocaleOptions): I18nState<TMessages>;\n    setMessages(locale: keyof TMessages & string, messages: TMessages[keyof TMessages], options?: {\n        merge?: boolean;\n    }): I18nState<TMessages>;\n    getLocaleInfo(locale?: keyof TMessages & string): I18nLocaleInfo;\n    detectLocale(input?: I18nDetectLocaleInput): keyof TMessages & string;\n    resolvePath(pathname: string): I18nResolvedPath<keyof TMessages & string>;\n    localizePath(pathname: string, locale?: keyof TMessages & string, options?: {\n        includeDefaultLocale?: boolean;\n    }): string;\n    setLocaleFromRequest(input?: I18nDetectLocaleInput): I18nState<TMessages>;\n    setLocaleFromPath(pathname: string): I18nState<TMessages>;\n    t(key: I18nTranslationKey<TMessages[TDefaultLocale]>, params?: I18nParams): string;\n    t(key: string, params?: I18nParams): string;\n    subscribe(listener: StoreListener<I18nState<TMessages>>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    watchLocale(listener: StoreWatchListener<keyof TMessages & string, I18nState<TMessages>>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n};\n```\n\nDefines the i18n service contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nSetLocaleOptions[#](#api-tavojs-core--i18nsetlocaleoptions)\n\n```\ntype I18nSetLocaleOptions = {\n    persist?: boolean;\n};\n```\n\nConfigures i18n set locale in the application runtime.\n\n[Related guide](/docs/core/localization#i18n-options-reference)\n\n#### I18nState[#](#api-tavojs-core--i18nstate)\n\n```\ntype I18nState<TMessages extends I18nMessages> = {\n    locale: keyof TMessages & string;\n    fallbackLocale: keyof TMessages & string;\n    messages: TMessages;\n};\n```\n\nRepresents the observable state of i18n in the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nTextTree[#](#api-tavojs-core--i18ntexttree)\n\n```\ntype I18nTextTree = {\n    readonly [key: string]: I18nTextValue;\n};\n```\n\nDefines the i18n text tree contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nTextValue[#](#api-tavojs-core--i18ntextvalue)\n\n```\ntype I18nTextValue = I18nPrimitive | I18nTextTree | readonly I18nTextValue[];\n```\n\nDefines the i18n text value contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### I18nTranslationKey[#](#api-tavojs-core--i18ntranslationkey)\n\n```\ntype I18nTranslationKey<TTree> = TTree extends I18nTextTree ? {\n    [K in StringKeyOf<TTree>]: TTree[K] extends I18nTextTree ? `${K}` | `${K}.${I18nTranslationKey<TTree[K]>}` : `${K}`;\n}[StringKeyOf<TTree>] : never;\n```\n\nDefines the i18n translation key contract used by the application runtime.\n\n[Related guide](/docs/core/localization#i18n-service-reference)\n\n#### Image[#](#api-tavojs-core--image)\n\n```\nImage(props: ImageProps): Child\n```\n\nSEO-friendly image component that emits responsive SSR optimizer URLs.\n\n[Related guide](/docs/core/seo-assets-and-styling#image-reference)\n\n#### ImageFormat[#](#api-tavojs-core--imageformat)\n\n```\ntype ImageFormat = \"webp\" | \"avif\" | \"jpeg\" | \"png\" | \"original\";\n```\n\nDefines the image format contract used by the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#image-reference)\n\n#### ImageProps[#](#api-tavojs-core--imageprops)\n\n```\ntype ImageProps = {\n    src: string;\n    alt: string;\n    width?: number;\n    height?: number;\n    widths?: number[];\n    sizes?: string;\n    quality?: number;\n    format?: ImageFormat;\n    priority?: boolean;\n    unoptimized?: boolean;\n    loading?: \"lazy\" | \"eager\";\n    decoding?: \"async\" | \"sync\" | \"auto\";\n    fetchPriority?: \"high\" | \"low\" | \"auto\";\n    srcset?: string;\n    className?: ClassName;\n    style?: string | Record<string, unknown>;\n    [key: string]: unknown;\n};\n```\n\nDefines the props accepted by image in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#image-reference)\n\n#### renderStyleTags[#](#api-tavojs-core--renderstyletags)\n\n```\nrenderStyleTags(registry: StyleRegistry, options?: RenderStyleTagsOptions | undefined): string\n```\n\nRenders style tags for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### Script[#](#api-tavojs-core--script)\n\n```\nScript(props: ScriptProps): Child\n```\n\nInjects external or inline scripts into the document head for CSR and SSR flows.\n\n[Related guide](/docs/core/seo-assets-and-styling#font-script-reference)\n\n#### ScriptProps[#](#api-tavojs-core--scriptprops)\n\n```\ntype ScriptProps = {\n    src?: string;\n    type?: string;\n    async?: boolean;\n    defer?: boolean;\n    module?: boolean;\n    noModule?: boolean;\n    preload?: boolean;\n    content?: string;\n    json?: unknown;\n    id?: string;\n    nonce?: string;\n    integrity?: string;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    referrerPolicy?: \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\";\n    fetchPriority?: \"high\" | \"low\" | \"auto\";\n};\n```\n\nDefines the props accepted by script in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#font-script-reference)\n\n#### Seo[#](#api-tavojs-core--seo)\n\n```\nSeo(props: SeoProps): Child\n```\n\nInjects common SEO metadata into the document head for CSR and SSR apps.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### SeoOpenGraph[#](#api-tavojs-core--seoopengraph)\n\n```\ntype SeoOpenGraph = {\n    title?: string;\n    description?: string;\n    type?: string;\n    url?: string;\n    image?: string;\n    imageAlt?: string;\n    siteName?: string;\n    locale?: string;\n};\n```\n\nDefines the seo open graph contract used by the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### SeoProps[#](#api-tavojs-core--seoprops)\n\n```\ntype SeoProps = {\n    title?: string;\n    description?: string;\n    canonical?: string;\n    robots?: string;\n    noIndex?: boolean;\n    noFollow?: boolean;\n    keywords?: string | string[];\n    author?: string;\n    themeColor?: string;\n    openGraph?: SeoOpenGraph;\n    twitter?: SeoTwitter;\n};\n```\n\nDefines the props accepted by seo in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### SeoTwitter[#](#api-tavojs-core--seotwitter)\n\n```\ntype SeoTwitter = {\n    card?: \"summary\" | \"summary_large_image\" | \"app\" | \"player\";\n    title?: string;\n    description?: string;\n    image?: string;\n    creator?: string;\n    site?: string;\n};\n```\n\nDefines the seo twitter contract used by the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#head-seo-reference)\n\n#### style[#](#api-tavojs-core--style)\n\n```\nstyle(id: string, css: string, options?: StyleOptions | undefined): void\n```\n\nProvides style behavior for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### StyleOptions[#](#api-tavojs-core--styleoptions)\n\n```\ntype StyleOptions = {\n    attributes?: Record<string, string | number | boolean>;\n};\n```\n\nConfigures style in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### StyleRegistry[#](#api-tavojs-core--styleregistry)\n\n```\ntype StyleRegistry = {\n    add(id: string, css: string, options?: StyleOptions): void;\n    has(id: string): boolean;\n    entries(): StyleRegistryEntry[];\n};\n```\n\nDefines the style registry contract used by the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### StyleRegistryEntry[#](#api-tavojs-core--styleregistryentry)\n\n```\ntype StyleRegistryEntry = {\n    id: string;\n    css: string;\n    attributes?: Record<string, string | number | boolean>;\n};\n```\n\nDescribes one entry in style registry in the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)\n\n#### withStyleRegistry[#](#api-tavojs-core--withstyleregistry)\n\n```\nwithStyleRegistry<T>(registry: StyleRegistry, fn: () => T): T\n```\n\nRuns work with style registry for the application runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#styling)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/router",
      "section": "core",
      "slug": "api/router",
      "title": "Router and Auto Pages API",
      "description": "Routes, navigation, loaders, middleware, actions, route modules, status, prefetching, and subscriptions.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core/router",
        "createRouter",
        "defineAction",
        "defineLoader",
        "defineMiddleware",
        "defineRoutePage",
        "defineServerLoader",
        "defineServerMiddleware",
        "getAvailableRoutes",
        "getCurrentPathname",
        "getResolvedRoute",
        "getRouteStatus",
        "isClientRuntime",
        "isServerRuntime",
        "Link",
        "LinkProps",
        "LoaderData",
        "MiddlewareResult",
        "MiddlewareRuntime",
        "navigate",
        "notFound",
        "PageAction",
        "PageActionContext",
        "PageActionOptions",
        "PageCachePolicy",
        "PageCacheTags",
        "PageErrorProps",
        "PageHead",
        "PageHeadExport",
        "PageLoadContext",
        "PageLoader",
        "PageLoaderOptions",
        "PageMiddleware",
        "PageMiddlewareOptions",
        "PagePendingProps",
        "PageProps",
        "PageRenderMode",
        "PageRevalidate",
        "PageRouteDefinition",
        "PageStaticParams",
        "prefetchRoute",
        "RouteConfig",
        "RouteParamsFromPath",
        "Router",
        "RouterNavigateOptions",
        "RouterParams",
        "RouterProvider",
        "RouteStatus",
        "RouteStatusState",
        "subscribeAvailableRoutes",
        "subscribePathname",
        "subscribeRouteStatus",
        "TypedPageModule"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public router and auto pages contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/router",
      "sections": [
        {
          "id": "public-exports",
          "title": "Router and Auto Pages exports",
          "markdown": "### @tavojs/core/router\n\nCanonical import boundary for every symbol in this section.\n\n#### createRouter[#](#api-tavojs-core-router--createrouter)\n\n```\ncreateRouter(routes: RouteConfig[]): Router\n```\n\nCreates a client router with history navigation and pattern matching.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### defineAction[#](#api-tavojs-core-router--defineaction)\n\n```\ndefineAction<T extends PageAction>(action: T, options?: PageActionOptions | undefined): T\n```\n\nDefines a server route action for non-GET requests while preserving handler types.\n\n[Related guide](/docs/core/actions-and-forms#route-action-reference)\n\n#### defineLoader[#](#api-tavojs-core-router--defineloader)\n\n```\ndefineLoader<T>(loader: (context: PageLoadContext) => T | Promise<T>, options?: PageLoaderOptions | undefined): (context: PageLoadContext) => T | Promise<T>\n```\n\nDefines a route loader while preserving its return type for app-level helpers.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### defineMiddleware[#](#api-tavojs-core-router--definemiddleware)\n\n```\ndefineMiddleware<T extends PageMiddleware | PageMiddleware[]>(middleware: T, options?: PageMiddlewareOptions | undefined): T\n```\n\nDefines route middleware with a stable signature.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### defineRoutePage[#](#api-tavojs-core-router--defineroutepage)\n\n```\ndefineRoutePage<TPath extends string, TData = unknown>(path: TPath, page: TypedPageModule<TPath, TData>): TypedPageModule<TPath, TData>\n```\n\nDefines a page module with a filename path hint for typed params and loader data.\n\n[Related guide](/docs/core/pages-and-layouts#page-module-reference)\n\n#### defineServerLoader[#](#api-tavojs-core-router--defineserverloader)\n\n```\ndefineServerLoader<T>(loader: (context: PageLoadContext) => T | Promise<T>): (context: PageLoadContext) => T | Promise<T>\n```\n\nDefines a route loader that only runs during server-side route resolution.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### defineServerMiddleware[#](#api-tavojs-core-router--defineservermiddleware)\n\n```\ndefineServerMiddleware<T extends PageMiddleware | PageMiddleware[]>(middleware: T): T\n```\n\nDefines route middleware that only runs during server-side route resolution.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### getAvailableRoutes[#](#api-tavojs-core-router--getavailableroutes)\n\n```\ngetAvailableRoutes(): PageRouteDefinition[]\n```\n\nReads current available routes from the reactive route store.\n\n[Related guide](/docs/core/navigation-and-route-state#subscriptions)\n\n#### getCurrentPathname[#](#api-tavojs-core-router--getcurrentpathname)\n\n```\ngetCurrentPathname(): string\n```\n\nReads current pathname from the reactive navigation store.\n\n[Related guide](/docs/core/navigation-and-route-state#subscriptions)\n\n#### getResolvedRoute[#](#api-tavojs-core-router--getresolvedroute)\n\n```\ngetResolvedRoute(pathname?: string): {\n    pathname: string;\n    params: RouterParams;\n    route: PageRouteDefinition | null;\n    status: number;\n    data: unknown;\n    error: unknown;\n    layers: RouteDataLayer[];\n    layerData: Record<string, unknown>;\n    head: PageHead;\n    cache: PageCachePolicy;\n    renderMode: PageRenderMode;\n    node: Child;\n    redirect?: string;\n    i18n?: {\n        locale: string;\n        dir: I18nLocaleDirection;\n    };\n} | null\n```\n\nReads the resolved route payload for one pathname or the current active location.\n\n[Related guide](/docs/core/navigation-and-route-state#subscriptions)\n\n#### getRouteStatus[#](#api-tavojs-core-router--getroutestatus)\n\n```\ngetRouteStatus(pathname?: string | undefined): RouteStatus\n```\n\nReads current route status state for a pathname.\n\n[Related guide](/docs/core/navigation-and-route-state#status)\n\n#### isClientRuntime[#](#api-tavojs-core-router--isclientruntime)\n\n```\nisClientRuntime(): boolean\n```\n\nReports whether the current value satisfies client runtime for the file routing and route modules.\n\n[Related guide](/docs/core/route-files-and-matching#module-shape)\n\n#### isServerRuntime[#](#api-tavojs-core-router--isserverruntime)\n\n```\nisServerRuntime(): boolean\n```\n\nReports whether the current value satisfies server runtime for the file routing and route modules.\n\n[Related guide](/docs/core/route-files-and-matching#module-shape)\n\n#### Link[#](#api-tavojs-core-router--link)\n\n```\nLink(props: PropsWithChildren<LinkProps>): Child\n```\n\nAnchor component with SPA navigation behavior and browser fallback semantics.\n\n[Related guide](/docs/core/navigation-and-route-state#navigation)\n\n#### LinkProps[#](#api-tavojs-core-router--linkprops)\n\n```\ntype LinkProps = {\n    to: string;\n    replace?: boolean;\n    scroll?: boolean;\n    className?: ClassName;\n    children?: Child;\n};\n```\n\nDefines the props accepted by link in the file routing and route modules.\n\n[Related guide](/docs/core/navigation-and-route-state#navigation)\n\n#### LoaderData[#](#api-tavojs-core-router--loaderdata)\n\n```\ntype LoaderData<TLoader> = TLoader extends (...args: any[]) => infer TResult ? Awaited<TResult> : never;\n```\n\nDefines the loader data contract used by the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### MiddlewareResult[#](#api-tavojs-core-router--middlewareresult)\n\n```\ntype MiddlewareResult = void | {\n    redirect?: string;\n    status?: number;\n};\n```\n\nDescribes the result returned by middleware in the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### MiddlewareRuntime[#](#api-tavojs-core-router--middlewareruntime)\n\n```\ntype MiddlewareRuntime = RuntimeEnvironment | \"both\";\n```\n\nDefines the middleware runtime contract used by the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### navigate[#](#api-tavojs-core-router--navigate)\n\n```\nnavigate(to: string, options?: RouterNavigateOptions | undefined): void\n```\n\nNavigates using active router when available, with history fallback.\n\n[Related guide](/docs/core/navigation-and-route-state#navigation)\n\n#### notFound[#](#api-tavojs-core-router--notfound)\n\n```\nnotFound(): never\n```\n\nStops route resolution and renders the application's reserved 404 page.\n\n[Related guide](/docs/core/route-files-and-matching#special-modules)\n\n#### PageAction[#](#api-tavojs-core-router--pageaction)\n\n```\ntype PageAction = ((context: PageActionContext) => Response | ActionResult | void | Promise<Response | ActionResult | void>) & {\n    __tavo_action_options__?: PageActionOptions;\n};\n```\n\nDefines the page action contract used by the file routing and route modules.\n\n[Related guide](/docs/core/actions-and-forms#route-action-reference)\n\n#### PageActionContext[#](#api-tavojs-core-router--pageactioncontext)\n\n```\ntype PageActionContext = PageLoadContext;\n```\n\nProvides the context passed to page action in the file routing and route modules.\n\n[Related guide](/docs/core/actions-and-forms#route-action-reference)\n\n#### PageActionOptions[#](#api-tavojs-core-router--pageactionoptions)\n\n```\ntype PageActionOptions = {\n    contentType?: ActionContentType;\n    validateOrigin?: boolean;\n};\n```\n\nConfigures page action in the file routing and route modules.\n\n[Related guide](/docs/core/actions-and-forms#route-action-reference)\n\n#### PageCachePolicy[#](#api-tavojs-core-router--pagecachepolicy)\n\n```\ntype PageCachePolicy = {\n    static: boolean;\n    revalidate: number | null;\n    vary: string[];\n    tags: string[];\n};\n```\n\nDefines the page cache policy contract used by the file routing and route modules.\n\n[Related guide](/docs/core/static-output-and-cache#choose-policy)\n\n#### PageCacheTags[#](#api-tavojs-core-router--pagecachetags)\n\n```\ntype PageCacheTags = string | string[] | ((context: PageLoadContext) => string | string[] | Promise<string | string[]>);\n```\n\nDefines the page cache tags contract used by the file routing and route modules.\n\n[Related guide](/docs/core/static-output-and-cache#choose-policy)\n\n#### PageErrorProps[#](#api-tavojs-core-router--pageerrorprops)\n\n```\ntype PageErrorProps<TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = PagePendingProps<TParams, TLayers> & {\n    data: unknown;\n    error: unknown;\n};\n```\n\nDefines the props accepted by page error in the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#route-pending-error-reference)\n\n#### PageHead[#](#api-tavojs-core-router--pagehead)\n\n```\ntype PageHead = {\n    title?: string;\n    unsafeHeadHtml?: string;\n    status?: number;\n    htmlAttributes?: Record<string, string | number | boolean>;\n    bodyAttributes?: Record<string, string | number | boolean>;\n};\n```\n\nDefines the page head contract used by the file routing and route modules.\n\n[Related guide](/docs/core/rendering-head-and-hydration#head-contract)\n\n#### PageHeadExport[#](#api-tavojs-core-router--pageheadexport)\n\n```\ntype PageHeadExport = PageHead | Child;\n```\n\nDefines the page head export contract used by the file routing and route modules.\n\n[Related guide](/docs/core/rendering-head-and-hydration#head-contract)\n\n#### PageLoadContext[#](#api-tavojs-core-router--pageloadcontext)\n\n```\ntype PageLoadContext = {\n    pathname: string;\n    params: RouterParams;\n    request: Request;\n    rawRequest?: unknown;\n    url: URL;\n    headers: Headers;\n    method: string;\n    signal: AbortSignal;\n    layers?: Record<string, unknown>;\n};\n```\n\nProvides the context passed to page load in the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### PageLoader[#](#api-tavojs-core-router--pageloader)\n\n```\ntype PageLoader = ((context: PageLoadContext) => unknown | Promise<unknown>) & {\n    __tavo_loader_options__?: PageLoaderOptions;\n};\n```\n\nDefines the page loader contract used by the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### PageLoaderOptions[#](#api-tavojs-core-router--pageloaderoptions)\n\n```\ntype PageLoaderOptions = {\n    runtime?: LoaderRuntime;\n};\n```\n\nConfigures page loader in the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#loader-contract-reference)\n\n#### PageMiddleware[#](#api-tavojs-core-router--pagemiddleware)\n\n```\ntype PageMiddleware = ((context: {\n    to: string;\n    from?: string;\n    params: RouterParams;\n    request: Request;\n    rawRequest?: unknown;\n    url: URL;\n    headers: Headers;\n    method: string;\n    signal: AbortSignal;\n}) => MiddlewareResult | Promise<MiddlewareResult>) & {\n    __tavo_middleware_options__?: PageMiddlewareOptions;\n};\n```\n\nDefines the page middleware contract used by the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### PageMiddlewareOptions[#](#api-tavojs-core-router--pagemiddlewareoptions)\n\n```\ntype PageMiddlewareOptions = {\n    runtime?: MiddlewareRuntime;\n};\n```\n\nConfigures page middleware in the file routing and route modules.\n\n[Related guide](/docs/core/data-and-middleware#middleware-contract-reference)\n\n#### PagePendingProps[#](#api-tavojs-core-router--pagependingprops)\n\n```\ntype PagePendingProps<TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = {\n    pathname: string;\n    params: TParams;\n    layers: RouteDataLayer[];\n    layerData: TLayers;\n};\n```\n\nDefines the props accepted by page pending in the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#route-pending-error-reference)\n\n#### PageProps[#](#api-tavojs-core-router--pageprops)\n\n```\ntype PageProps<TData = unknown, TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = {\n    pathname?: string;\n    params: TParams;\n    data?: TData;\n    error?: unknown;\n    layers?: RouteDataLayer[];\n    layerData?: TLayers;\n};\n```\n\nDefines the props accepted by page in the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#page-module-reference)\n\n#### PageRenderMode[#](#api-tavojs-core-router--pagerendermode)\n\n```\ntype PageRenderMode = \"ssr\" | \"csr\";\n```\n\nDefines the page render mode contract used by the file routing and route modules.\n\n[Related guide](/docs/core/ssr-and-hydration#render-mode-reference)\n\n#### PageRevalidate[#](#api-tavojs-core-router--pagerevalidate)\n\n```\ntype PageRevalidate = number | false;\n```\n\nDefines the page revalidate contract used by the file routing and route modules.\n\n[Related guide](/docs/core/static-output-and-cache#choose-policy)\n\n#### PageRouteDefinition[#](#api-tavojs-core-router--pageroutedefinition)\n\n```\ntype PageRouteDefinition = {\n    file: string;\n    path: string;\n    component: Component<AnyRecord>;\n    pending?: Component<AnyRecord>;\n    error?: Component<AnyRecord>;\n    layouts: Component<AnyRecord>[];\n    layoutLayers: Array<{\n        kind: \"root\" | \"layout\";\n        id: string;\n        file: string;\n        component: Component<AnyRecord>;\n        load?: PageModuleRecord[\"load\"];\n        head?: PageModuleRecord[\"head\"];\n        middleware: PageMiddleware[];\n        render?: PageModuleRecord[\"render\"];\n        layout?: PageModuleRecord[\"layout\"];\n        prerender?: boolean;\n        static?: boolean;\n        revalidate?: PageRevalidate;\n        vary?: string | string[];\n        cacheTags?: PageCacheTags;\n    }>;\n    load?: PageModuleRecord[\"load\"];\n    action?: PageModuleRecord[\"action\"];\n    head?: PageModuleRecord[\"head\"];\n    middleware: PageMiddleware[];\n    cacheTags?: PageCacheTags;\n    cacheTagResolvers: PageCacheTags[];\n    generateStaticParams?: PageModuleRecord[\"generateStaticParams\"];\n    renderMode: PageRenderMode;\n    cache: PageCachePolicy;\n};\n```\n\nDefines the page route definition contract used by the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#page-module-reference)\n\n#### PageStaticParams[#](#api-tavojs-core-router--pagestaticparams)\n\n```\ntype PageStaticParams = RouterParams[];\n```\n\nDefines the page static params contract used by the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#route-conventions-reference)\n\n#### prefetchRoute[#](#api-tavojs-core-router--prefetchroute)\n\n```\nprefetchRoute(pathname: string, options?: { signal?: AbortSignal | undefined; } | undefined): Promise<void>\n```\n\nPrefetches a route by resolving its loaders without changing browser location.\n\n[Related guide](/docs/core/navigation-and-route-state#prefetch)\n\n#### RouteConfig[#](#api-tavojs-core-router--routeconfig)\n\n```\ntype RouteConfig = {\n    path: string;\n    component: Component<{\n        params: RouterParams;\n    }>;\n};\n```\n\nDefines the route config contract used by the file routing and route modules.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### RouteParamsFromPath[#](#api-tavojs-core-router--routeparamsfrompath)\n\n```\ntype RouteParamsFromPath<TPath extends string> = RouteParamsFromSegments<TPath>;\n```\n\nDefines the route params from path contract used by the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#page-module-reference)\n\n#### Router[#](#api-tavojs-core-router--router)\n\n```\ntype Router = {\n    navigate(to: string, options?: RouterNavigateOptions): void;\n    getPathname(): string;\n    match(pathname: string): {\n        route: RouteConfig | null;\n        params: RouterParams;\n    };\n};\n```\n\nDefines the router contract used by the file routing and route modules.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### RouterNavigateOptions[#](#api-tavojs-core-router--routernavigateoptions)\n\n```\ntype RouterNavigateOptions = {\n    replace?: boolean;\n    scroll?: boolean;\n};\n```\n\nConfigures router navigate in the file routing and route modules.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### RouterParams[#](#api-tavojs-core-router--routerparams)\n\n```\ntype RouterParams = Record<string, string>;\n```\n\nDefines the router params contract used by the file routing and route modules.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### RouterProvider[#](#api-tavojs-core-router--routerprovider)\n\n```\nRouterProvider(props: PropsWithChildren<RouterProviderProps>): Child\n```\n\nProvides router context and renders either explicit children or matched route view.\n\n[Related guide](/docs/core/routing#standalone-router-reference)\n\n#### RouteStatus[#](#api-tavojs-core-router--routestatus)\n\n```\ntype RouteStatus = {\n    pathname: string;\n    status: \"idle\" | \"loading\" | \"prefetching\" | \"ready\" | \"redirecting\" | \"error\";\n    error: unknown;\n    redirect?: string;\n};\n```\n\nDefines the route status contract used by the file routing and route modules.\n\n[Related guide](/docs/core/navigation-and-route-state#status)\n\n#### RouteStatusState[#](#api-tavojs-core-router--routestatusstate)\n\n```\ntype RouteStatusState = {\n    byPath: Record<string, RouteStatus>;\n};\n```\n\nRepresents the observable state of route status in the file routing and route modules.\n\n[Related guide](/docs/core/navigation-and-route-state#status)\n\n#### subscribeAvailableRoutes[#](#api-tavojs-core-router--subscribeavailableroutes)\n\n```\nsubscribeAvailableRoutes(listener: (routes: PageRouteDefinition[]) => void): () => void\n```\n\nSubscribes to route catalog updates.\n\n[Related guide](/docs/core/navigation-and-route-state#subscriptions)\n\n#### subscribePathname[#](#api-tavojs-core-router--subscribepathname)\n\n```\nsubscribePathname(listener: (pathname: string) => void): () => void\n```\n\nSubscribes to pathname changes.\n\n[Related guide](/docs/core/navigation-and-route-state#subscriptions)\n\n#### subscribeRouteStatus[#](#api-tavojs-core-router--subscriberoutestatus)\n\n```\nsubscribeRouteStatus(listener: (status: RouteStatus, all: RouteStatusState) => void, pathname?: string | undefined): () => void\n```\n\nSubscribes to route status changes for one pathname or all routes.\n\n[Related guide](/docs/core/navigation-and-route-state#status)\n\n#### TypedPageModule[#](#api-tavojs-core-router--typedpagemodule)\n\n```\ntype TypedPageModule<TPath extends string, TData = unknown> = Omit<PageModuleRecord, \"default\" | \"pending\" | \"error\" | \"prerender\"> & {\n    default: Component<PageProps<TData, RouteParamsFromPath<TPath>>>;\n    pending?: Component<PagePendingProps<RouteParamsFromPath<TPath>>>;\n    error?: Component<PageErrorProps<RouteParamsFromPath<TPath>>>;\n};\n```\n\nDefines the typed page module contract used by the file routing and route modules.\n\n[Related guide](/docs/core/pages-and-layouts#page-module-reference)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/server",
      "section": "core",
      "slug": "api/server",
      "title": "Server rendering and sessions API",
      "description": "Node request handling, rendering, static caches, image optimization, environment loading, and sessions.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core/server",
        "createMemorySessionStore",
        "createMemoryStaticCache",
        "createNodeRequestHandler",
        "createPagesRuntimeAsync",
        "createSessionStorage",
        "defineServerOnly",
        "ImageOptimizerOptions",
        "invalidateStaticCache",
        "loadServerEnv",
        "LoadServerEnvOptions",
        "MemorySessionStoreOptions",
        "MemoryStaticCacheOptions",
        "NodeHandlerOptions",
        "renderDocument",
        "RenderDocumentOptions",
        "renderDocumentStream",
        "renderPagesResponseFromRuntimeAsync",
        "Session",
        "SessionCommitOptions",
        "SessionCookieOptions",
        "SessionCookieSameSite",
        "SessionStorage",
        "SessionStorageOptions",
        "SessionStore",
        "SessionStoreEntry",
        "SsrStaticCache",
        "SsrStaticCacheEntry"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public server rendering and sessions contract from its canonical package boundary."
      ],
      "runtime": [
        "server"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/server",
      "sections": [
        {
          "id": "public-exports",
          "title": "Server rendering and sessions exports",
          "markdown": "### @tavojs/core/server\n\nCanonical import boundary for every symbol in this section.\n\n#### createMemorySessionStore[#](#api-tavojs-core-server--creatememorysessionstore)\n\n```\ncreateMemorySessionStore<T extends Record<string, unknown>>(options?: MemorySessionStoreOptions | undefined): SessionStore<T> & { size(): number; }\n```\n\nCreates memory session store for the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-store-reference)\n\n#### createMemoryStaticCache[#](#api-tavojs-core-server--creatememorystaticcache)\n\n```\ncreateMemoryStaticCache(options?: MemoryStaticCacheOptions | undefined): SsrStaticCache & { size(): number; clear(): void; }\n```\n\nCreates the default process-local static SSR cache used by the Node request handler.\n\n[Related guide](/docs/core/ssr-and-hydration#static-cache-contract)\n\n#### createNodeRequestHandler[#](#api-tavojs-core-server--createnoderequesthandler)\n\n```\ncreateNodeRequestHandler(options: NodeHandlerOptions, runtime?: PagesRuntime | Promise<PagesRuntime> | undefined): ((req: { url?: string | undefined; method?: string | undefined; headers?: Record<string, string | undefined> | undefined; once?: ((event: string, listener: () => void) => unknown) | undefined; off?: ((event: string, listener: () => void) => unknown) | undefined; }, res: { writeHead: (status: number, headers: Record<string, string | string[]>) => void; write: (chunk: Uint8Array<ArrayBufferLike>) => boolean | void; end: (body?: string | Uint8Array<ArrayBufferLike> | undefined) => void; headersSent?: boolean | undefined; destroyed?: boolean | undefined; once?: ((event: string, listener: () => void) => unknown) | undefined; off?: ((event: string, listener: () => void) => unknown) | undefined; }) => Promise<void>) & { invalidateCache: (tags: string | string[]) => Promise<number>; clearCache: () => Promise<void>; }\n```\n\nCreates a Node-style request handler that renders framework pages to HTML.\n\n[Related guide](/docs/core/node-runtime#handler-http)\n\n#### createPagesRuntimeAsync[#](#api-tavojs-core-server--createpagesruntimeasync)\n\n```\ncreatePagesRuntimeAsync(modules: PageModules, options?: PageRuntimeOptions | undefined): Promise<PagesRuntime>\n```\n\nAsync variant for SSR/build flows that use async plugin lifecycle hooks.\n\n[Related guide](/docs/core/pages-and-layouts#pages-runtime-reference)\n\n#### createSessionStorage[#](#api-tavojs-core-server--createsessionstorage)\n\n```\ncreateSessionStorage<T extends Record<string, unknown>>(options: SessionStorageOptions<T>): SessionStorage<T>\n```\n\nCreates session storage for the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-storage-reference)\n\n#### defineServerOnly[#](#api-tavojs-core-server--defineserveronly)\n\n```\ndefineServerOnly<T extends (...args: any[]) => unknown>(fn: T): T\n```\n\nDefines and type-checks server only for the server runtime.\n\n[Related guide](/docs/core/security#server-only-reference)\n\n#### ImageOptimizerOptions[#](#api-tavojs-core-server--imageoptimizeroptions)\n\n```\ntype ImageOptimizerOptions = {\n    enabled?: boolean;\n    allowRemote?: boolean;\n    remotePatterns?: Array<string | RemoteImagePattern>;\n    publicDir?: string;\n    quality?: number;\n    cacheMaxAge?: number;\n    defaultFormat?: ImageFormat;\n    sizes?: number[];\n    timeoutMs?: number;\n    maxBytes?: number;\n    memoryCacheMaxEntries?: number;\n    maxConcurrentTransforms?: number;\n    maxPendingTransforms?: number;\n    allowInsecureRemote?: boolean;\n    resolveHostname?: (hostname: string) => Promise<Array<{\n        address: string;\n    }>>;\n};\n```\n\nConfigures image optimizer in the server runtime.\n\n[Related guide](/docs/core/seo-assets-and-styling#image-reference)\n\n#### invalidateStaticCache[#](#api-tavojs-core-server--invalidatestaticcache)\n\n```\ninvalidateStaticCache(cache: SsrStaticCache, tags: string | string[]): Promise<number>\n```\n\nInvalidates tagged entries when supported by a cache adapter.\n\n[Related guide](/docs/core/ssr-and-hydration#static-cache-contract)\n\n#### loadServerEnv[#](#api-tavojs-core-server--loadserverenv)\n\n```\nloadServerEnv(options?: LoadServerEnvOptions | undefined): Record<string, string>\n```\n\nLoads server-only .env files into process.env without exposing them to client code.\n\n[Related guide](/docs/core/environment-variables#server-example)\n\n#### LoadServerEnvOptions[#](#api-tavojs-core-server--loadserverenvoptions)\n\n```\ntype LoadServerEnvOptions = {\n    mode?: string;\n    root?: string;\n};\n```\n\nConfigures load server env in the server runtime.\n\n[Related guide](/docs/core/environment-variables#server-example)\n\n#### MemorySessionStoreOptions[#](#api-tavojs-core-server--memorysessionstoreoptions)\n\n```\ntype MemorySessionStoreOptions = {\n    /** Maximum process-local sessions. Set to 0 to disable persistence. */\n    maxEntries?: number;\n};\n```\n\nConfigures memory session store in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-store-reference)\n\n#### MemoryStaticCacheOptions[#](#api-tavojs-core-server--memorystaticcacheoptions)\n\n```\ntype MemoryStaticCacheOptions = {\n    /** Maximum process-local entries. Set to 0 to disable storage. */\n    maxEntries?: number;\n};\n```\n\nConfigures memory static cache in the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#static-cache-contract)\n\n#### NodeHandlerOptions[#](#api-tavojs-core-server--nodehandleroptions)\n\n```\ntype NodeHandlerOptions = PageRuntimeOptions & {\n    modules: PageModules;\n    /** Public origin used when Node runs behind TLS termination, e.g. https://app.example.com. */\n    canonicalOrigin?: string;\n    document?: RenderDocumentOptions;\n    stream?: boolean;\n    images?: ImageOptimizerOptions;\n    staticCache?: SsrStaticCache;\n    maxRequestBodyBytes?: number;\n};\n```\n\nConfigures node handler in the server runtime.\n\n[Related guide](/docs/core/node-runtime#handler-http)\n\n#### renderDocument[#](#api-tavojs-core-server--renderdocument)\n\n```\nrenderDocument(node: Child, options?: RenderDocumentOptions | undefined): string\n```\n\nRenders document for the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#server-rendering-methods)\n\n#### RenderDocumentOptions[#](#api-tavojs-core-server--renderdocumentoptions)\n\n```\ntype RenderDocumentOptions = {\n    lang?: string;\n    title?: string;\n    unsafeHeadHtml?: string;\n    bodyAttributes?: Record<string, string | number | boolean>;\n    htmlAttributes?: Record<string, string | number | boolean>;\n    appAttributes?: Record<string, string | number | boolean>;\n    doctype?: string;\n    appContainerId?: string;\n    initialState?: unknown;\n    stateScriptId?: string;\n    nonce?: string;\n    beforeRender?: () => void;\n    styleRegistry?: StyleRegistry;\n};\n```\n\nConfigures render document in the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#server-rendering-methods)\n\n#### renderDocumentStream[#](#api-tavojs-core-server--renderdocumentstream)\n\n```\nrenderDocumentStream(node: Child, options?: RenderDocumentOptions | undefined): ReadableStream<Uint8Array<ArrayBufferLike>>\n```\n\nRenders document stream for the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#server-rendering-methods)\n\n#### renderPagesResponseFromRuntimeAsync[#](#api-tavojs-core-server--renderpagesresponsefromruntimeasync)\n\n```\nrenderPagesResponseFromRuntimeAsync(runtime: PagesRuntime, pathname: string, options?: RenderPagesDocumentAsyncOptions | undefined): Promise<RenderPagesResponse>\n```\n\nResolves route data/head with a prebuilt runtime and returns HTML with HTTP response metadata.\n\n[Related guide](/docs/core/pages-and-layouts#pages-runtime-reference)\n\n#### Session[#](#api-tavojs-core-server--session)\n\n```\ntype Session<T extends Record<string, unknown>> = {\n    readonly data: T;\n    readonly id: string;\n    readonly isNew: boolean;\n    readonly rotated: boolean;\n    readonly secure: boolean;\n    delete(key: keyof T & string): void;\n    destroy(): void;\n    get<K extends keyof T & string>(key: K): T[K] | undefined;\n    has(key: keyof T & string): boolean;\n    rotate(): void;\n    set<K extends keyof T & string>(key: K, value: T[K]): void;\n};\n```\n\nDefines the session contract used by the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-api-reference)\n\n#### SessionCommitOptions[#](#api-tavojs-core-server--sessioncommitoptions)\n\n```\ntype SessionCommitOptions = {\n    maxAge?: number;\n};\n```\n\nConfigures session commit in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-api-reference)\n\n#### SessionCookieOptions[#](#api-tavojs-core-server--sessioncookieoptions)\n\n```\ntype SessionCookieOptions = {\n    domain?: string;\n    httpOnly?: boolean;\n    maxAge?: number;\n    name: string;\n    path?: string;\n    sameSite?: SessionCookieSameSite;\n    secrets: string[];\n    secure?: boolean;\n};\n```\n\nConfigures session cookie in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-api-reference)\n\n#### SessionCookieSameSite[#](#api-tavojs-core-server--sessioncookiesamesite)\n\n```\ntype SessionCookieSameSite = \"lax\" | \"strict\" | \"none\";\n```\n\nDefines the session cookie same site contract used by the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-api-reference)\n\n#### SessionStorage[#](#api-tavojs-core-server--sessionstorage)\n\n```\ntype SessionStorage<T extends Record<string, unknown>> = {\n    commitSession(session: Session<T>, options?: SessionCommitOptions): Promise<string>;\n    destroySession(session: Session<T>, options?: SessionCommitOptions): Promise<string>;\n    getSession(contextOrRequest?: unknown): Promise<Session<T>>;\n    redirect(to: string, session: Session<T>, init?: ResponseInit): Promise<Response>;\n};\n```\n\nDefines the session storage contract used by the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-storage-reference)\n\n#### SessionStorageOptions[#](#api-tavojs-core-server--sessionstorageoptions)\n\n```\ntype SessionStorageOptions<T extends Record<string, unknown>> = {\n    cookie: SessionCookieOptions;\n    store?: SessionStore<T>;\n};\n```\n\nConfigures session storage in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-storage-reference)\n\n#### SessionStore[#](#api-tavojs-core-server--sessionstore)\n\n```\ntype SessionStore<T extends Record<string, unknown>> = {\n    get(id: string): Promise<SessionStoreEntry<T> | null> | SessionStoreEntry<T> | null;\n    set(id: string, entry: SessionStoreEntry<T>): Promise<void> | void;\n    delete(id: string): Promise<void> | void;\n};\n```\n\nDefines storage behavior for session in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-store-reference)\n\n#### SessionStoreEntry[#](#api-tavojs-core-server--sessionstoreentry)\n\n```\ntype SessionStoreEntry<T extends Record<string, unknown>> = {\n    data: T;\n    expiresAt: number | null;\n};\n```\n\nDescribes one entry in session store in the server runtime.\n\n[Related guide](/docs/core/sessions-and-authentication#session-store-reference)\n\n#### SsrStaticCache[#](#api-tavojs-core-server--ssrstaticcache)\n\n```\ntype SsrStaticCache = {\n    get(key: string): SsrStaticCacheEntry | null | Promise<SsrStaticCacheEntry | null>;\n    set(key: string, entry: SsrStaticCacheEntry): void | Promise<void>;\n    delete(key: string): void | Promise<void>;\n    invalidateTags?(tags: string[]): number | Promise<number>;\n    clear?(): void | Promise<void>;\n};\n```\n\nDefines the ssr static cache contract used by the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#static-cache-contract)\n\n#### SsrStaticCacheEntry[#](#api-tavojs-core-server--ssrstaticcacheentry)\n\n```\ntype SsrStaticCacheEntry = {\n    response: RenderPagesResponse;\n    expiresAt: number | null;\n    tags: string[];\n};\n```\n\nDescribes one entry in ssr static cache in the server runtime.\n\n[Related guide](/docs/core/ssr-and-hydration#static-cache-contract)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/config",
      "section": "core",
      "slug": "api/config",
      "title": "Configuration API",
      "description": "Stable authoring helpers and exact project and Vite configuration contracts.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core/config",
        "defineConfig",
        "defineTavoViteConfig",
        "ExactTavoConfig",
        "TavoConfig",
        "TavoViteConfig",
        "TavoViteConfigEnv",
        "TavoViteConfigExport",
        "ViteEsbuildOptions"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public configuration contract from its canonical package boundary."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/config",
      "sections": [
        {
          "id": "public-exports",
          "title": "Configuration exports",
          "markdown": "### @tavojs/core/config\n\nCanonical import boundary for every symbol in this section.\n\n#### defineConfig[#](#api-tavojs-core-config--defineconfig)\n\n```\ndefineConfig<const T extends TavoConfig>(config: ExactTavoConfig<T>): T\n```\n\nDefines the single project configuration object and brands it for runtime validation.\n\n[Related guide](/docs/core/configuration#tavo-config)\n\n#### defineTavoViteConfig[#](#api-tavojs-core-config--definetavoviteconfig)\n\n```\ndefineTavoViteConfig(config?: TavoViteConfigExport | undefined): TavoViteConfigExport\n```\n\nDefines a Vite config with the JSX runtime settings required by Tavo.js.\n\n[Related guide](/docs/core/configuration#vite-config)\n\n#### ExactTavoConfig[#](#api-tavojs-core-config--exacttavoconfig)\n\n```\ntype ExactTavoConfig<T extends TavoConfig> = T & {\n    [K in Exclude<keyof T, keyof TavoConfig>]: never;\n};\n```\n\nDefines the exact tavo config contract used by the project configuration.\n\n[Related guide](/docs/core/configuration#top-level-reference)\n\n#### TavoConfig[#](#api-tavojs-core-config--tavoconfig)\n\n```\ntype TavoConfig = {\n    pagesDir?: string;\n    cssEntries?: string[];\n    plugins?: TavoPluginInput;\n    diagnostics?: {\n        devOverlay?: boolean;\n        traces?: boolean;\n    };\n    build?: {\n        prerenderStyles?: \"inline\" | \"external\";\n        budgets?: {\n            firstLoadJs?: number | string;\n            routeJs?: number | string;\n        };\n    };\n    ssr?: Omit<NodeHandlerOptions, \"modules\" | \"plugins\"> & {\n        modules?: NodeHandlerOptions[\"modules\"];\n    };\n};\n```\n\nDefines the tavo config contract used by the project configuration.\n\n[Related guide](/docs/core/configuration#top-level-reference)\n\n#### TavoViteConfig[#](#api-tavojs-core-config--tavoviteconfig)\n\n```\ntype TavoViteConfig = Record<string, unknown> & {\n    esbuild?: ViteEsbuildOptions | false;\n};\n```\n\nDefines the tavo vite config contract used by the project configuration.\n\n[Related guide](/docs/core/configuration#vite-config)\n\n#### TavoViteConfigEnv[#](#api-tavojs-core-config--tavoviteconfigenv)\n\n```\ntype TavoViteConfigEnv = Record<string, unknown> & {\n    command?: string;\n    mode?: string;\n    isPreview?: boolean;\n    isSsrBuild?: boolean;\n};\n```\n\nDefines the tavo vite config env contract used by the project configuration.\n\n[Related guide](/docs/core/configuration#vite-config)\n\n#### TavoViteConfigExport[#](#api-tavojs-core-config--tavoviteconfigexport)\n\n```\ntype TavoViteConfigExport = TavoViteConfig | Promise<TavoViteConfig> | ((env: TavoViteConfigEnv) => TavoViteConfig | Promise<TavoViteConfig>);\n```\n\nDefines the tavo vite config export contract used by the project configuration.\n\n[Related guide](/docs/core/configuration#vite-config)\n\n#### ViteEsbuildOptions[#](#api-tavojs-core-config--viteesbuildoptions)\n\n```\ntype ViteEsbuildOptions = Record<string, unknown> & {\n    jsx?: string;\n    jsxImportSource?: string;\n};\n```\n\nConfigures vite esbuild in the project configuration.\n\n[Related guide](/docs/core/configuration#vite-config)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/plugin",
      "section": "core",
      "slug": "api/plugin",
      "title": "Plugin API",
      "description": "Plugin-author declarations, manifests, permissions, capabilities, phases, stores, and compatibility helpers.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core/plugin",
        "AnyPluginToken",
        "checkPluginCompatibility",
        "defineCapability",
        "definePlugin",
        "definePluginFactory",
        "definePluginPhase",
        "definePluginStore",
        "MaybePromise",
        "PluginBuildDeclaration",
        "PluginBuildItemDeclaration",
        "PluginCapabilityResolver",
        "PluginCapabilityToken",
        "PluginDependency",
        "PluginDiagnostic",
        "PluginDiagnosticCode",
        "PluginEndpointDeclaration",
        "PluginEndpointMatcher",
        "PluginExposureDeclaration",
        "PluginExposureTarget",
        "PluginHeadDeclaration",
        "PluginHeadImplementation",
        "PluginMiddlewareDeclaration",
        "PluginMiddlewareStage",
        "PluginMiddlewareTarget",
        "PluginOverride",
        "PluginPageDeclaration",
        "PluginPermissionDeclaration",
        "PluginPhaseLoader",
        "PluginPhaseTarget",
        "PluginRequestResolveContext",
        "PluginRequestResourceFactory",
        "PluginResolveContext",
        "PluginResourceFactory",
        "PluginScope",
        "PluginServerHandler",
        "PluginServerHandlerContext",
        "PluginServerMiddleware",
        "PluginStoreFactory",
        "PluginStoreToken",
        "PluginUse",
        "PluginUseConfiguration",
        "TAVO_PLUGIN_API_VERSION",
        "TavoPlugin",
        "TavoPluginInput",
        "TavoPluginManifest",
        "TavoPluginPhase"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public plugin api contract from its canonical package boundary."
      ],
      "runtime": [
        "build",
        "server",
        "browser"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/plugin",
      "sections": [
        {
          "id": "public-exports",
          "title": "Plugin API exports",
          "markdown": "### @tavojs/core/plugin\n\nCanonical import boundary for every symbol in this section.\n\n#### AnyPluginToken[#](#api-tavojs-core-plugin--anyplugintoken)\n\n```\ntype AnyPluginToken = PluginCapabilityToken<any, any> | PluginStoreToken<any>;\n```\n\nDefines the any plugin token contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### checkPluginCompatibility[#](#api-tavojs-core-plugin--checkplugincompatibility)\n\n```\ncheckPluginCompatibility(plugin: { id: string; apiVersion: number; }): { compatible: boolean; currentVersion: 1; requestedVersion: number; diagnostic?: PluginDiagnostic | undefined; }\n```\n\nChecks a plugin descriptor without running phase code.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### defineCapability[#](#api-tavojs-core-plugin--definecapability)\n\n```\ndefineCapability<T, TScope extends \"runtime\" | \"request\">(definition: { provider: string; name: string; scope: TScope; }): PluginCapabilityToken<T, TScope>\n```\n\nDefines and type-checks capability for the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### definePlugin[#](#api-tavojs-core-plugin--defineplugin)\n\n```\ndefinePlugin<T extends TavoPlugin>(plugin: T): T\n```\n\nDefines a Plugin API v1 descriptor. Validation occurs during graph compilation.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### definePluginFactory[#](#api-tavojs-core-plugin--definepluginfactory)\n\n```\ndefinePluginFactory<TOptions, TPlugin extends TavoPlugin>(factory: (options: TOptions) => TPlugin): (options: TOptions) => TPlugin\n```\n\nDefines a typed plugin factory.\n\n[Related guide](/docs/core/plugin-api-v1#installation)\n\n#### definePluginPhase[#](#api-tavojs-core-plugin--definepluginphase)\n\n```\ndefinePluginPhase<T extends TavoPluginPhase>(phase: T): T\n```\n\nDefines a phase implementation while preserving its literal keys.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### definePluginStore[#](#api-tavojs-core-plugin--definepluginstore)\n\n```\ndefinePluginStore<T extends AnyRecord>(definition: Omit<PluginStoreToken<T>, \"hydrate\" | \"kind\" | \"scope\"> & { hydrate?: boolean | undefined; }): PluginStoreToken<T>\n```\n\nDefines an owned runtime store and its optional hydration contract.\n\n[Related guide](/docs/core/plugin-api-v1#stores)\n\n#### MaybePromise[#](#api-tavojs-core-plugin--maybepromise)\n\n```\ntype MaybePromise<T> = T | Promise<T>;\n```\n\nDefines the maybe promise contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### PluginBuildDeclaration[#](#api-tavojs-core-plugin--pluginbuilddeclaration)\n\n```\ntype PluginBuildDeclaration = {\n    aliases?: Readonly<Record<string, string>>;\n    defines?: Readonly<Record<string, string>>;\n    plugins?: readonly PluginBuildItemDeclaration[];\n};\n```\n\nDefines the plugin build declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginBuildItemDeclaration[#](#api-tavojs-core-plugin--pluginbuilditemdeclaration)\n\n```\ntype PluginBuildItemDeclaration = {\n    id: string;\n    before?: readonly string[];\n    after?: readonly string[];\n};\n```\n\nDefines the plugin build item declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginCapabilityResolver[#](#api-tavojs-core-plugin--plugincapabilityresolver)\n\n```\ntype PluginCapabilityResolver = {\n    resolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T;\n    tryResolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T | undefined;\n};\n```\n\nDefines the plugin capability resolver contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginCapabilityToken[#](#api-tavojs-core-plugin--plugincapabilitytoken)\n\n```\ntype PluginCapabilityToken<T = unknown, TScope extends PluginScope = PluginScope> = {\n    readonly kind: \"capability\";\n    readonly provider: string;\n    readonly name: string;\n    readonly scope: TScope;\n    readonly __tavoCapabilityType?: T;\n};\n```\n\nDefines the plugin capability token contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginDependency[#](#api-tavojs-core-plugin--plugindependency)\n\n```\ntype PluginDependency = {\n    id: string;\n    instanceId?: string;\n    version: string;\n    optional?: boolean;\n    capabilities?: readonly AnyPluginToken[];\n};\n```\n\nDefines the plugin dependency contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### PluginDiagnostic[#](#api-tavojs-core-plugin--plugindiagnostic)\n\n```\ntype PluginDiagnostic = {\n    code: PluginDiagnosticCode;\n    severity: \"error\" | \"warning\";\n    phase: \"compile\" | \"initialize\" | \"build\" | \"request\" | \"dispose\";\n    message: string;\n    resource?: string;\n    owners?: readonly string[];\n    hint?: string;\n};\n```\n\nDefines the plugin diagnostic contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#plugin-verification)\n\n#### PluginDiagnosticCode[#](#api-tavojs-core-plugin--plugindiagnosticcode)\n\n```\ntype PluginDiagnosticCode = \"TAVO_PLUGIN_001\" | \"TAVO_PLUGIN_002\" | \"TAVO_PLUGIN_003\" | \"TAVO_PLUGIN_004\" | \"TAVO_PLUGIN_005\" | \"TAVO_PLUGIN_006\" | \"TAVO_PLUGIN_007\" | \"TAVO_PLUGIN_008\" | \"TAVO_PLUGIN_009\";\n```\n\nDefines the plugin diagnostic code contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#plugin-verification)\n\n#### PluginEndpointDeclaration[#](#api-tavojs-core-plugin--pluginendpointdeclaration)\n\n```\ntype PluginEndpointDeclaration = {\n    id: string;\n    methods: readonly string[];\n    match: PluginEndpointMatcher;\n    validateOrigin?: boolean;\n};\n```\n\nDefines the plugin endpoint declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginEndpointMatcher[#](#api-tavojs-core-plugin--pluginendpointmatcher)\n\n```\ntype PluginEndpointMatcher = {\n    kind: \"exact\";\n    path: string;\n} | {\n    kind: \"subtree\";\n    path: string;\n};\n```\n\nDefines the plugin endpoint matcher contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginExposureDeclaration[#](#api-tavojs-core-plugin--pluginexposuredeclaration)\n\n```\ntype PluginExposureDeclaration = {\n    target: \"page\" | \"server\";\n    from?: string;\n    to: string;\n    reason: string;\n};\n```\n\nDefines the plugin exposure declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginExposureTarget[#](#api-tavojs-core-plugin--pluginexposuretarget)\n\n```\ntype PluginExposureTarget = string | {\n    from?: string;\n    to: string;\n};\n```\n\nDefines the plugin exposure target contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginHeadDeclaration[#](#api-tavojs-core-plugin--pluginheaddeclaration)\n\n```\ntype PluginHeadDeclaration = {\n    id: string;\n    key: string;\n    cardinality: \"singleton\" | \"multi\";\n    unsafeHeadHtml?: boolean;\n};\n```\n\nDefines the plugin head declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginHeadImplementation[#](#api-tavojs-core-plugin--pluginheadimplementation)\n\n```\ntype PluginHeadImplementation = Child | string | ((context: PluginResolveContext) => MaybePromise<Child | string>);\n```\n\nDefines the plugin head implementation contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginMiddlewareDeclaration[#](#api-tavojs-core-plugin--pluginmiddlewaredeclaration)\n\n```\ntype PluginMiddlewareDeclaration = {\n    id: string;\n    target: PluginMiddlewareTarget;\n    stage: PluginMiddlewareStage;\n    before?: readonly string[];\n    after?: readonly string[];\n};\n```\n\nDefines the plugin middleware declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginMiddlewareStage[#](#api-tavojs-core-plugin--pluginmiddlewarestage)\n\n```\ntype PluginMiddlewareStage = \"server:before-handler\" | \"page:before-app\" | \"page:after-app\";\n```\n\nDefines the plugin middleware stage contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginMiddlewareTarget[#](#api-tavojs-core-plugin--pluginmiddlewaretarget)\n\n```\ntype PluginMiddlewareTarget = \"server\" | \"page\";\n```\n\nDefines the plugin middleware target contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginOverride[#](#api-tavojs-core-plugin--pluginoverride)\n\n```\ntype PluginOverride = {\n    kind: \"page\" | \"endpoint\" | \"head\" | \"alias\" | \"define\";\n    key: string;\n    replace: {\n        plugin: string;\n        instanceId?: string;\n    };\n    with: {\n        owner: \"app\" | string;\n        instanceId?: string;\n        key?: string;\n    };\n};\n```\n\nDefines the plugin override contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#installation)\n\n#### PluginPageDeclaration[#](#api-tavojs-core-plugin--pluginpagedeclaration)\n\n```\ntype PluginPageDeclaration = {\n    id: string;\n    path: string;\n};\n```\n\nDefines the plugin page declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginPermissionDeclaration[#](#api-tavojs-core-plugin--pluginpermissiondeclaration)\n\n```\ntype PluginPermissionDeclaration = {\n    name: \"unsafeHeadHtml\";\n    /** Required permissions are part of the plugin's installation contract. */\n    required?: boolean;\n    reason: string;\n};\n```\n\nDefines the plugin permission declaration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### PluginPhaseLoader[#](#api-tavojs-core-plugin--pluginphaseloader)\n\n```\ntype PluginPhaseLoader = () => MaybePromise<TavoPluginPhase | {\n    default: TavoPluginPhase;\n}>;\n```\n\nDefines the plugin phase loader contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### PluginPhaseTarget[#](#api-tavojs-core-plugin--pluginphasetarget)\n\n```\ntype PluginPhaseTarget = \"client\" | \"server\" | \"build\";\n```\n\nDefines the plugin phase target contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### PluginRequestResolveContext[#](#api-tavojs-core-plugin--pluginrequestresolvecontext)\n\n```\ntype PluginRequestResolveContext = Omit<PluginResolveContext, \"resolve\" | \"tryResolve\"> & {\n    readonly request: Request;\n    resolve<T>(token: PluginCapabilityToken<T, any> | PluginStoreToken<any>): Promise<T>;\n    tryResolve<T>(token: PluginCapabilityToken<T, any> | PluginStoreToken<any>): Promise<T | undefined>;\n};\n```\n\nProvides the context passed to plugin request resolve in the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginRequestResourceFactory[#](#api-tavojs-core-plugin--pluginrequestresourcefactory)\n\n```\ntype PluginRequestResourceFactory<T = unknown> = (context: PluginRequestResolveContext) => MaybePromise<T>;\n```\n\nDefines the plugin request resource factory contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginResolveContext[#](#api-tavojs-core-plugin--pluginresolvecontext)\n\n```\ntype PluginResolveContext = {\n    readonly instanceId: string;\n    resolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T;\n    tryResolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T | undefined;\n};\n```\n\nProvides the context passed to plugin resolve in the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginResourceFactory[#](#api-tavojs-core-plugin--pluginresourcefactory)\n\n```\ntype PluginResourceFactory<T = unknown> = (context: PluginResolveContext) => MaybePromise<T>;\n```\n\nDefines the plugin resource factory contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginScope[#](#api-tavojs-core-plugin--pluginscope)\n\n```\ntype PluginScope = \"runtime\" | \"request\";\n```\n\nDefines the plugin scope contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### PluginServerHandler[#](#api-tavojs-core-plugin--pluginserverhandler)\n\n```\ntype PluginServerHandler = (context: PluginServerHandlerContext) => MaybePromise<Response>;\n```\n\nDefines the plugin server handler contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginServerHandlerContext[#](#api-tavojs-core-plugin--pluginserverhandlercontext)\n\n```\ntype PluginServerHandlerContext = PluginRequestResolveContext & {\n    params: Record<string, string>;\n};\n```\n\nProvides the context passed to plugin server handler in the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginServerMiddleware[#](#api-tavojs-core-plugin--pluginservermiddleware)\n\n```\ntype PluginServerMiddleware = (context: PluginServerHandlerContext) => MaybePromise<Response | void>;\n```\n\nDefines the plugin server middleware contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#capabilities)\n\n#### PluginStoreFactory[#](#api-tavojs-core-plugin--pluginstorefactory)\n\n```\ntype PluginStoreFactory<T extends AnyRecord = AnyRecord> = (context: PluginResolveContext) => MaybePromise<T | Store<T>>;\n```\n\nDefines the plugin store factory contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#stores)\n\n#### PluginStoreToken[#](#api-tavojs-core-plugin--pluginstoretoken)\n\n```\ntype PluginStoreToken<T extends AnyRecord = AnyRecord> = {\n    readonly kind: \"store\";\n    readonly provider: string;\n    readonly name: string;\n    readonly scope: \"runtime\";\n    readonly hydrate: boolean;\n    readonly validate?: (value: unknown) => value is T;\n    readonly serialize?: (value: T) => unknown;\n    readonly deserialize?: (value: unknown) => T;\n    readonly __tavoStoreType?: T;\n};\n```\n\nDefines the plugin store token contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#stores)\n\n#### PluginUse[#](#api-tavojs-core-plugin--pluginuse)\n\n```\ntype PluginUse = TavoPlugin | (PluginInstallation & {\n    /** Remaps this installation's manifest-declared public exposure. */\n    expose?: {\n        page?: PluginExposureTarget;\n        server?: PluginExposureTarget;\n    };\n});\n```\n\nApplication-owned ergonomic installation record.\n\n[Related guide](/docs/core/plugin-api-v1#installation)\n\n#### PluginUseConfiguration[#](#api-tavojs-core-plugin--pluginuseconfiguration)\n\n```\ntype PluginUseConfiguration = {\n    use: readonly PluginUse[];\n    overrides?: readonly PluginOverride[];\n};\n```\n\nDefines the plugin use configuration contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#installation)\n\n#### TAVO\\_PLUGIN\\_API\\_VERSION[#](#api-tavojs-core-plugin--tavo-plugin-api-version)\n\n```\nTAVO_PLUGIN_API_VERSION: 1\n```\n\nCurrent public contract implemented by the Tavo.js plugin runtime.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### TavoPlugin[#](#api-tavojs-core-plugin--tavoplugin)\n\n```\ntype TavoPlugin = {\n    id: string;\n    version: string;\n    apiVersion: typeof TAVO_PLUGIN_API_VERSION;\n    manifest: TavoPluginManifest;\n    client?: PluginPhaseLoader;\n    server?: PluginPhaseLoader;\n    build?: PluginPhaseLoader;\n};\n```\n\nDefines the tavo plugin contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)\n\n#### TavoPluginInput[#](#api-tavojs-core-plugin--tavoplugininput)\n\n```\ntype TavoPluginInput = PluginUseConfiguration | readonly PluginUse[];\n```\n\nAuthor input; normalized to the compiler's internal graph configuration.\n\n[Related guide](/docs/core/plugin-api-v1#installation)\n\n#### TavoPluginManifest[#](#api-tavojs-core-plugin--tavopluginmanifest)\n\n```\ntype TavoPluginManifest = {\n    provides?: readonly AnyPluginToken[];\n    dependencies?: readonly PluginDependency[];\n    stores?: readonly PluginStoreToken<any>[];\n    pages?: readonly PluginPageDeclaration[];\n    endpoints?: readonly PluginEndpointDeclaration[];\n    middleware?: readonly PluginMiddlewareDeclaration[];\n    head?: readonly PluginHeadDeclaration[];\n    build?: PluginBuildDeclaration;\n    /** Framework permissions enabled by installing this trusted plugin. */\n    permissions?: readonly PluginPermissionDeclaration[];\n    /** Default public mounts enabled by installing this trusted plugin. */\n    exposure?: readonly PluginExposureDeclaration[];\n};\n```\n\nDefines the tavo plugin manifest contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#manifest-contributions)\n\n#### TavoPluginPhase[#](#api-tavojs-core-plugin--tavopluginphase)\n\n```\ntype TavoPluginPhase = {\n    capabilities?: Readonly<Record<string, PluginResourceFactory | PluginRequestResourceFactory>>;\n    stores?: Readonly<Record<string, PluginStoreFactory>>;\n    pages?: Readonly<Record<string, PageModule>>;\n    endpoints?: Readonly<Record<string, PluginServerHandler>>;\n    middleware?: Readonly<Record<string, PageMiddleware | PluginServerMiddleware>>;\n    head?: Readonly<Record<string, PluginHeadImplementation>>;\n    build?: {\n        plugins?: Readonly<Record<string, unknown>>;\n    };\n    setup?: (context: PluginResolveContext) => MaybePromise<void>;\n    dispose?: () => MaybePromise<void>;\n};\n```\n\nDefines the tavo plugin phase contract used by the Plugin API v1.\n\n[Related guide](/docs/core/plugin-api-v1#descriptor)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "core:api/dev",
      "section": "core",
      "slug": "api/dev",
      "title": "Development and testing API",
      "description": "Experimental testing, validation, diagnostics, instrumentation, scheduling, inspection, overlays, configuration loading, and development servers.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/core/dev",
        "captureDiagnostics",
        "clearServices",
        "configureDevDiagnostics",
        "createInstrumentation",
        "createOpenTelemetryInstrumentation",
        "createPagesManifest",
        "createPagesManifestDetailed",
        "createPagesTestHarness",
        "createTestRoot",
        "defineValidatedAction",
        "DevDiagnosticsOptions",
        "DevTraceEvent",
        "DevTracePhase",
        "expectTextContent",
        "flushMicrotasks",
        "flushSync",
        "getAutoPagesInspection",
        "getCurrentUpdatePriority",
        "HydrationMismatchEvent",
        "inspectPages",
        "inspectPluginGraph",
        "inspectTavoRuntime",
        "installDevOverlay",
        "installTavoDevtoolsPanel",
        "loadTavoConfig",
        "LoadTavoConfigOptions",
        "OpenTelemetrySpanLike",
        "OpenTelemetryTracerLike",
        "ParseSchema",
        "RunningDevServer",
        "runWithUpdatePriority",
        "SafeParseSchema",
        "StandardSchema",
        "startTransition",
        "startViteAutoPagesDevServer",
        "subscribeTavoRuntime",
        "TavoDevtoolsPanel",
        "TavoDevtoolsSnapshot",
        "TavoInstrumentation",
        "TavoInstrumentationEvent",
        "TavoInstrumentationEventName",
        "TavoInstrumentationListener",
        "TavoInstrumentationPhase",
        "TavoSchema",
        "TestRoot",
        "unregisterService",
        "UpdatePriority",
        "ValidatedActionContext",
        "validateInput",
        "ValidationFailure",
        "ValidationIssue",
        "ValidationResult",
        "ValidationSuccess",
        "ViteAutoPagesDevServerOptions",
        "ViteDevServerLike"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/core package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public development and testing contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Core API index",
          "href": "/docs/core/api",
          "description": "Browse every API category and public package boundary."
        },
        {
          "title": "API stability",
          "href": "/docs/core/api-stability",
          "description": "Understand public and experimental stability labels."
        }
      ],
      "canonicalPath": "/docs/core/api/dev",
      "sections": [
        {
          "id": "public-exports",
          "title": "Development and testing exports",
          "markdown": "### @tavojs/core/dev\n\nCanonical import boundary for every symbol in this section.\n\n#### captureDiagnostics[#](#api-tavojs-core-dev--capturediagnostics)\n\n```\ncaptureDiagnostics(): { traces: DevTraceEvent[]; mismatches: HydrationMismatchEvent[]; restore(): void; }\n```\n\nCaptures diagnostics for the experimental development tooling.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### clearServices[#](#api-tavojs-core-dev--clearservices)\n\n```\nclearServices(): void\n```\n\nClears the shared service registry. Intended primarily for tests.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### configureDevDiagnostics[#](#api-tavojs-core-dev--configuredevdiagnostics)\n\n```\nconfigureDevDiagnostics(options: DevDiagnosticsOptions): void\n```\n\nUpdates runtime diagnostics callbacks used by the DOM renderer.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### createInstrumentation[#](#api-tavojs-core-dev--createinstrumentation)\n\n```\ncreateInstrumentation(listener: TavoInstrumentationListener): TavoInstrumentation\n```\n\nCreates an isolated observer. Listener failures never interrupt framework work.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### createOpenTelemetryInstrumentation[#](#api-tavojs-core-dev--createopentelemetryinstrumentation)\n\n```\ncreateOpenTelemetryInstrumentation(tracer: OpenTelemetryTracerLike, options?: { recordErrors?: boolean | undefined; } | undefined): TavoInstrumentation\n```\n\nAdapts Tavo.js events to the stable tracing subset shared by OpenTelemetry implementations.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#opentelemetry)\n\n#### createPagesManifest[#](#api-tavojs-core-dev--createpagesmanifest)\n\n```\ncreatePagesManifest(modules: PageModules): PageRouteDefinition[]\n```\n\nConvenience helper returning only sorted route definitions.\n\n[Related guide](/docs/core/development-tooling#manifest-inspection)\n\n#### createPagesManifestDetailed[#](#api-tavojs-core-dev--createpagesmanifestdetailed)\n\n```\ncreatePagesManifestDetailed(modules: PageModules): PagesManifest\n```\n\nBuilds the full pages manifest with routes, layouts, and diagnostics.\n\n[Related guide](/docs/core/development-tooling#manifest-inspection)\n\n#### createPagesTestHarness[#](#api-tavojs-core-dev--createpagestestharness)\n\n```\ncreatePagesTestHarness(modules: PageModules, options?: PageRuntimeOptions | undefined): { runtime: PagesRuntime; renderPath(pathname: string): string; resolvePath(pathname: string): Promise<unknown>; }\n```\n\nCreates pages test harness for the experimental development tooling.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### createTestRoot[#](#api-tavojs-core-dev--createtestroot)\n\n```\ncreateTestRoot(): TestRoot\n```\n\nCreates test root for the experimental development tooling.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### defineValidatedAction[#](#api-tavojs-core-dev--definevalidatedaction)\n\n```\ndefineValidatedAction<TInput>(schema: TavoSchema<TInput>, handler: (context: ValidatedActionContext<TInput>) => void | Response | ActionResult | Promise<void | Response | ActionResult>, options?: PageActionOptions | undefined): PageAction\n```\n\nDefines a route action with portable schema validation and structured 400 failures.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### DevDiagnosticsOptions[#](#api-tavojs-core-dev--devdiagnosticsoptions)\n\n```\ntype DevDiagnosticsOptions = {\n    enabled?: boolean;\n    devMode?: boolean;\n    onTrace?: ((event: DevTraceEvent) => void) | null;\n    onHydrationMismatch?: ((event: HydrationMismatchEvent) => void) | null;\n    onError?: ((error: unknown) => void) | null;\n    strictHydration?: boolean;\n};\n```\n\nConfigures dev diagnostics in the experimental development tooling.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### DevTraceEvent[#](#api-tavojs-core-dev--devtraceevent)\n\n```\ntype DevTraceEvent = {\n    phase: DevTracePhase;\n    kind: string;\n    key?: string | number | null;\n    detail?: string;\n};\n```\n\nDescribes an event emitted by dev trace in the experimental development tooling.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### DevTracePhase[#](#api-tavojs-core-dev--devtracephase)\n\n```\ntype DevTracePhase = \"mount\" | \"patch\" | \"hydrate\";\n```\n\nDefines the dev trace phase contract used by the experimental development tooling.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### expectTextContent[#](#api-tavojs-core-dev--expecttextcontent)\n\n```\nexpectTextContent(root: TestRoot, expected: string): void\n```\n\nAsserts text content for the experimental development tooling.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### flushMicrotasks[#](#api-tavojs-core-dev--flushmicrotasks)\n\n```\nflushMicrotasks(): Promise<void>\n```\n\nFlushes microtasks for the experimental development tooling.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### flushSync[#](#api-tavojs-core-dev--flushsync)\n\n```\nflushSync<T>(callback: () => T): T\n```\n\nFlushes sync for the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#flush-sync)\n\n#### getAutoPagesInspection[#](#api-tavojs-core-dev--getautopagesinspection)\n\n```\ngetAutoPagesInspection(): AutoPagesInspection\n```\n\nReturns a privacy-safe snapshot for first-party development tools.\n\n[Related guide](/docs/core/development-tooling#manifest-inspection)\n\n#### getCurrentUpdatePriority[#](#api-tavojs-core-dev--getcurrentupdatepriority)\n\n```\ngetCurrentUpdatePriority(): UpdatePriority\n```\n\nReads current update priority for the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#priorities)\n\n#### HydrationMismatchEvent[#](#api-tavojs-core-dev--hydrationmismatchevent)\n\n```\ntype HydrationMismatchEvent = {\n    message: string;\n    expected?: string;\n    found?: string;\n    path?: string;\n    pathSegments?: string[];\n    phase?: DevTracePhase;\n    kind?: string;\n    recovery?: \"text\" | \"subtree\" | \"cleanup\";\n};\n```\n\nDescribes an event emitted by hydration mismatch in the experimental development tooling.\n\n[Related guide](/docs/core/runtime-diagnostics#diagnostic-options)\n\n#### inspectPages[#](#api-tavojs-core-dev--inspectpages)\n\n```\ninspectPages(modules: PageModules): { routes: PageRouteDefinition[]; diagnostics: string[]; }\n```\n\nReturns route data and diagnostics without creating runtime objects.\n\n[Related guide](/docs/core/development-tooling#manifest-inspection)\n\n#### inspectPluginGraph[#](#api-tavojs-core-dev--inspectplugingraph)\n\n```\ninspectPluginGraph(config?: TavoPluginInput | undefined, options?: PluginCompileOptions | undefined): PluginGraphInspection\n```\n\nReturns a serializable inspection without executing plugin code.\n\n[Related guide](/docs/core/plugin-api-v1#plugin-verification)\n\n#### inspectTavoRuntime[#](#api-tavojs-core-dev--inspecttavoruntime)\n\n```\ninspectTavoRuntime(): TavoDevtoolsSnapshot\n```\n\nReturns an inspection of tavo runtime for the experimental development tooling.\n\n[Related guide](/docs/core/development-tooling#runtime-snapshot)\n\n#### installDevOverlay[#](#api-tavojs-core-dev--installdevoverlay)\n\n```\ninstallDevOverlay(options?: { traces?: boolean | undefined; } | undefined): void\n```\n\nEnables a browser overlay for runtime errors and hydration mismatches during development.\n\n[Related guide](/docs/core/development-tooling#overlay-and-dom)\n\n#### installTavoDevtoolsPanel[#](#api-tavojs-core-dev--installtavodevtoolspanel)\n\n```\ninstallTavoDevtoolsPanel(options?: { target?: HTMLElement | undefined; initiallyOpen?: boolean | undefined; } | undefined): TavoDevtoolsPanel\n```\n\nInstalls an opt-in, dependency-free browser panel backed by privacy-safe snapshots.\n\n[Related guide](/docs/core/runtime-devtools#snapshot-api)\n\n#### loadTavoConfig[#](#api-tavojs-core-dev--loadtavoconfig)\n\n```\nloadTavoConfig(rootDir?: string | undefined, options?: LoadTavoConfigOptions | undefined): Promise<TavoConfig>\n```\n\nLoads the root \\`tavo.config.ts\\` default export once for the current process.\n\n[Related guide](/docs/core/configuration#loading-behavior)\n\n#### LoadTavoConfigOptions[#](#api-tavojs-core-dev--loadtavoconfigoptions)\n\n```\ntype LoadTavoConfigOptions = {\n    mode?: string;\n};\n```\n\nConfigures load tavo config in the experimental development tooling.\n\n[Related guide](/docs/core/configuration#loading-behavior)\n\n#### OpenTelemetrySpanLike[#](#api-tavojs-core-dev--opentelemetryspanlike)\n\n```\ntype OpenTelemetrySpanLike = {\n    setAttribute?(name: string, value: string | number | boolean): unknown;\n    recordException?(error: unknown): unknown;\n    setStatus?(status: {\n        code: number;\n        message?: string;\n    }): unknown;\n    end?(endTime?: number): unknown;\n};\n```\n\nDefines the open telemetry span like contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#opentelemetry)\n\n#### OpenTelemetryTracerLike[#](#api-tavojs-core-dev--opentelemetrytracerlike)\n\n```\ntype OpenTelemetryTracerLike = {\n    startSpan(name: string, options?: {\n        attributes?: Record<string, string | number | boolean>;\n        startTime?: number;\n    }): OpenTelemetrySpanLike;\n};\n```\n\nDefines the open telemetry tracer like contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#opentelemetry)\n\n#### ParseSchema[#](#api-tavojs-core-dev--parseschema)\n\n```\ntype ParseSchema<T> = {\n    parse?(value: unknown): T;\n    parseAsync?(value: unknown): Promise<T>;\n};\n```\n\nDefines the parse schema contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### RunningDevServer[#](#api-tavojs-core-dev--runningdevserver)\n\n```\ntype RunningDevServer = {\n    close(): Promise<void>;\n    url: string;\n};\n```\n\nDefines the running dev server contract used by the experimental development tooling.\n\n[Related guide](/docs/core/development-tooling#ssr-dev-host)\n\n#### runWithUpdatePriority[#](#api-tavojs-core-dev--runwithupdatepriority)\n\n```\nrunWithUpdatePriority<T>(priority: UpdatePriority, callback: () => T): T\n```\n\nRuns with update priority for the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#priorities)\n\n#### SafeParseSchema[#](#api-tavojs-core-dev--safeparseschema)\n\n```\ntype SafeParseSchema<T> = {\n    safeParse?(value: unknown): unknown;\n    safeParseAsync?(value: unknown): Promise<unknown>;\n};\n```\n\nDefines the safe parse schema contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### StandardSchema[#](#api-tavojs-core-dev--standardschema)\n\n```\ntype StandardSchema<T> = {\n    \"~standard\": {\n        validate(value: unknown): {\n            value: T;\n            issues?: undefined;\n        } | {\n            value?: undefined;\n            issues: ReadonlyArray<{\n                message: string;\n                path?: ReadonlyArray<PropertyKey | {\n                    key: PropertyKey;\n                }>;\n            }>;\n        } | Promise<{\n            value: T;\n            issues?: undefined;\n        } | {\n            value?: undefined;\n            issues: ReadonlyArray<{\n                message: string;\n                path?: ReadonlyArray<PropertyKey | {\n                    key: PropertyKey;\n                }>;\n            }>;\n        }>;\n    };\n};\n```\n\nDefines the standard schema contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### startTransition[#](#api-tavojs-core-dev--starttransition)\n\n```\nstartTransition(callback: () => void): void\n```\n\nStarts transition for the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#transition)\n\n#### startViteAutoPagesDevServer[#](#api-tavojs-core-dev--startviteautopagesdevserver)\n\n```\nstartViteAutoPagesDevServer(options?: ViteAutoPagesDevServerOptions | undefined): Promise<RunningDevServer>\n```\n\nStarts a Vite middleware-mode server that SSR-renders file-based pages.\n\n[Related guide](/docs/core/development-tooling#ssr-dev-host)\n\n#### subscribeTavoRuntime[#](#api-tavojs-core-dev--subscribetavoruntime)\n\n```\nsubscribeTavoRuntime(listener: (snapshot: TavoDevtoolsSnapshot) => void, options?: { immediate?: boolean | undefined; } | undefined): () => void\n```\n\nSubscribes to navigation and route lifecycle changes with privacy-safe snapshots.\n\n[Related guide](/docs/core/development-tooling#runtime-snapshot)\n\n#### TavoDevtoolsPanel[#](#api-tavojs-core-dev--tavodevtoolspanel)\n\n```\ntype TavoDevtoolsPanel = {\n    element: HTMLElement;\n    refresh(): void;\n    dispose(): void;\n};\n```\n\nDefines the tavo devtools panel contract used by the experimental development tooling.\n\n[Related guide](/docs/core/runtime-devtools#snapshot-api)\n\n#### TavoDevtoolsSnapshot[#](#api-tavojs-core-dev--tavodevtoolssnapshot)\n\n```\ntype TavoDevtoolsSnapshot = AutoPagesInspection & {\n    dom: {\n        mountedComponents: number;\n        pendingPassiveEffects: number;\n        pendingUpdates: number;\n    };\n};\n```\n\nDefines the tavo devtools snapshot contract used by the experimental development tooling.\n\n[Related guide](/docs/core/runtime-devtools#snapshot-api)\n\n#### TavoInstrumentation[#](#api-tavojs-core-dev--tavoinstrumentation)\n\n```\ntype TavoInstrumentation = {\n    emit(event: TavoInstrumentationEvent): void;\n};\n```\n\nDefines the tavo instrumentation contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### TavoInstrumentationEvent[#](#api-tavojs-core-dev--tavoinstrumentationevent)\n\n```\ntype TavoInstrumentationEvent = {\n    name: TavoInstrumentationEventName;\n    phase: TavoInstrumentationPhase;\n    timestamp: number;\n    requestId?: string;\n    route?: string;\n    layer?: string;\n    durationMs?: number;\n    status?: number;\n    count?: number;\n    cacheTags?: string[];\n    error?: unknown;\n};\n```\n\nDescribes an event emitted by tavo instrumentation in the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### TavoInstrumentationEventName[#](#api-tavojs-core-dev--tavoinstrumentationeventname)\n\n```\ntype TavoInstrumentationEventName = \"route.resolve\" | \"route.middleware\" | \"route.loader\" | \"route.action\" | \"route.cache\";\n```\n\nDefines the tavo instrumentation event name contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### TavoInstrumentationListener[#](#api-tavojs-core-dev--tavoinstrumentationlistener)\n\n```\ntype TavoInstrumentationListener = (event: TavoInstrumentationEvent) => void;\n```\n\nDefines a callback notified by tavo instrumentation in the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### TavoInstrumentationPhase[#](#api-tavojs-core-dev--tavoinstrumentationphase)\n\n```\ntype TavoInstrumentationPhase = \"start\" | \"end\" | \"error\" | \"abort\" | \"hit\" | \"miss\" | \"invalidate\";\n```\n\nDefines the tavo instrumentation phase contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#custom-listener)\n\n#### TavoSchema[#](#api-tavojs-core-dev--tavoschema)\n\n```\ntype TavoSchema<T> = StandardSchema<T> | SafeParseSchema<T> | ParseSchema<T>;\n```\n\nDefines the tavo schema contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### TestRoot[#](#api-tavojs-core-dev--testroot)\n\n```\ntype TestRoot = {\n    container: HTMLElement;\n    render(node: Child): void;\n    hydrate(node: Child): void;\n    unmount(): void;\n    text(): string;\n    html(): string;\n};\n```\n\nDefines the test root contract used by the experimental development tooling.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### unregisterService[#](#api-tavojs-core-dev--unregisterservice)\n\n```\nunregisterService(identifier: ServiceIdentifier<unknown>): boolean\n```\n\nRemoves a service registration. Intended primarily for tests.\n\n[Related guide](/docs/core/testing-and-diagnostics#testing-api-reference)\n\n#### UpdatePriority[#](#api-tavojs-core-dev--updatepriority)\n\n```\ntype UpdatePriority = \"immediate\" | \"user-blocking\" | \"normal\" | \"background\" | \"idle\";\n```\n\nDefines the update priority contract used by the experimental development tooling.\n\n[Related guide](/docs/core/scheduling-and-instrumentation#priorities)\n\n#### ValidatedActionContext[#](#api-tavojs-core-dev--validatedactioncontext)\n\n```\ntype ValidatedActionContext<TInput> = PageActionContext & {\n    input: TInput;\n};\n```\n\nProvides the context passed to validated action in the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### validateInput[#](#api-tavojs-core-dev--validateinput)\n\n```\nvalidateInput<T>(schema: TavoSchema<T>, input: unknown): Promise<ValidationResult<T>>\n```\n\nValidates through Standard Schema or common safeParse/parse-compatible validators.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### ValidationFailure[#](#api-tavojs-core-dev--validationfailure)\n\n```\ntype ValidationFailure = {\n    ok: false;\n    issues: ValidationIssue[];\n};\n```\n\nDefines the validation failure contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### ValidationIssue[#](#api-tavojs-core-dev--validationissue)\n\n```\ntype ValidationIssue = {\n    message: string;\n    path?: ReadonlyArray<PropertyKey>;\n};\n```\n\nDefines the validation issue contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### ValidationResult[#](#api-tavojs-core-dev--validationresult)\n\n```\ntype ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;\n```\n\nDescribes the result returned by validation in the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### ValidationSuccess[#](#api-tavojs-core-dev--validationsuccess)\n\n```\ntype ValidationSuccess<T> = {\n    ok: true;\n    value: T;\n};\n```\n\nDefines the validation success contract used by the experimental development tooling.\n\n[Related guide](/docs/core/actions-and-forms#validation-reference)\n\n#### ViteAutoPagesDevServerOptions[#](#api-tavojs-core-dev--viteautopagesdevserveroptions)\n\n```\ntype ViteAutoPagesDevServerOptions = {\n    root?: string;\n    pagesDir?: string;\n    cssEntries?: string[];\n    mode?: string;\n    images?: ImageOptimizerOptions;\n    port?: number;\n    host?: string;\n};\n```\n\nConfigures vite auto pages dev server in the experimental development tooling.\n\n[Related guide](/docs/core/development-tooling#ssr-dev-host)\n\n#### ViteDevServerLike[#](#api-tavojs-core-dev--vitedevserverlike)\n\n```\ntype ViteDevServerLike = {\n    middlewares: (req: unknown, res: unknown, next: (error?: unknown) => void) => void;\n    transformRequest(url: string, options?: {\n        ssr?: boolean;\n    }): Promise<null | {\n        code: string;\n    }>;\n    pluginContainer?: {\n        resolveId(id: string, importer?: string, options?: {\n            ssr?: boolean;\n        }): Promise<string | null | {\n            id: string;\n        }>;\n    };\n    ssrLoadModule(id: string): Promise<unknown>;\n    ssrFixStacktrace(error: unknown): void;\n    close(): Promise<void>;\n};\n```\n\nDefines the vite dev server like contract used by the experimental development tooling.\n\n[Related guide](/docs/core/development-tooling#ssr-dev-host)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:index",
      "section": "cli",
      "slug": "",
      "title": "Framework CLI overview",
      "description": "Use the tavo CLI as the supported interface for creating, understanding, validating, building, and shipping a Tavo.js application.",
      "keywords": [
        "tavo",
        "cli",
        "workflow"
      ],
      "kind": "concept",
      "prerequisites": [
        "No project setup is required to understand the CLI workflow."
      ],
      "outcomes": [
        "Use the tavo CLI as the supported interface for creating, understanding, validating, building, and shipping a Tavo.js application."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli",
      "sections": [
        {
          "id": "role",
          "title": "What the CLI owns",
          "markdown": "The framework CLI understands Tavo.js routes, layouts, stores, generators, and provider-neutral build artifacts. Prefer it over hand-written framework plumbing because its output stays aligned with the installed package version.\n\n**Two different CLIs**\n\nUse tavo for the framework and application lifecycle. Use tavo-ui web for theme configuration and token tooling. The tavo-ui command is bundled with @tavojs/ui; do not install @tavojs/ui-cli separately."
        },
        {
          "id": "workflows",
          "title": "Choose a workflow",
          "markdown": "[\n\n## Start or extend an app\n\nScaffold a project, then generate functional routes, components, stores, actions, and layouts.Read guide →\n\n](/docs/cli/create-and-generate)[\n\n## Understand a project\n\nRun development servers and inspect routes, inventory, diagnostics, and individual entities.Read guide →\n\n](/docs/cli/develop-and-inspect)[\n\n## Validate production\n\nGenerate route types and production output, enforce budgets, and preview the real SSR build.Read guide →\n\n](/docs/cli/build-and-preview)[\n\n## Ship and observe\n\nBuild static or Node output and read protected production runtime metrics.Read guide →\n\n](/docs/cli/deploy-and-monitor)[\n\n## Automate safely\n\nUse bounded JSON context, hashes, dry runs, change receipts, and focused verification.Read guide →\n\n](/docs/cli/automation)"
        },
        {
          "id": "local-version",
          "title": "Run the project-local version",
          "markdown": "Generated applications install `@tavojs/cli` as a development dependency, which makes the project-local `tavo` binary available. Use the generated package scripts for normal development. For a command without a script, use npx from the project root so it resolves the installed binary and contributors and CI use the version in the lockfile.\n\n**Run Terminal**\n\n```bash\nnpm run dev\nnpx tavo --version\nnpx tavo --help\n\n# Equivalent local execution:\npnpm exec tavo --version\nyarn tavo --version\nbun run tavo --version\n```\n\n**Bootstrap with the current release**\n\nnpx @tavojs/cli resolves the current registry release for the initial create app command. Inside an existing application, run npx from the project root after installing dependencies so it uses the local Tavo.js CLI."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:create-and-generate",
      "section": "cli",
      "slug": "create-and-generate",
      "title": "Create and generate",
      "description": "Scaffold a new application and add files that follow Tavo.js route, component, store, action, and layout conventions.",
      "keywords": [
        "create",
        "generate",
        "scaffold",
        "page"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Scaffold a new application and add files that follow Tavo.js route, component, store, action, and layout conventions."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/create-and-generate",
      "sections": [
        {
          "id": "create-app",
          "title": "Create the application once",
          "markdown": "create app writes a complete project shell into a new directory. Select a package manager when the team has standardized on one; otherwise use the default generated npm workflow.\n\n**Run Terminal**\n\n```bash\nnode --version\nnpx @tavojs/cli create app project-dashboard --package-manager npm\ncd project-dashboard\nnpm install\nnpm run dev\n```\n\nUse `Node.js 20.19+ or 22.12+`. The development server prints the local URL after dependencies are installed.\n\n**Existing directories**\n\nReview the target directory before using force. Generated files are easiest to reason about when creation begins in an empty folder."
        },
        {
          "id": "focused-generators",
          "title": "Generate one application concept at a time",
          "markdown": "Generators choose the correct source directory, file naming convention, imports, and starter types. Options add useful structure without forcing it into every file. Page generation uses a functional default export unless --typed-route explicitly requests defineRoutePage.\n\n**Run Terminal**\n\n```bash\nnpx tavo generate page 'projects/[id]' --loader --seo\nnpx tavo generate page 'reports/[year]' --typed-route\nnpx tavo generate component ProjectCard --props\nnpx tavo generate store session --shape user,ready\nnpx tavo generate layout dashboard\nnpx tavo generate action archive-project\nnpx tavo generate 404\nnpx tavo generate error\n```\n\n**Quote dynamic route names**\n\nShells such as zsh interpret square brackets as filename patterns. Quote a route name containing \\[id\\], \\[...slug\\], or another dynamic segment so the CLI receives it unchanged."
        },
        {
          "id": "generated-specs",
          "title": "Use a spec for repeatable batches",
          "markdown": "For code generators and automation, validate a JSON spec before writing. Dry runs expose the complete write plan, while force should remain an explicit decision when a file already exists.\n\n**Run Terminal**\n\n```bash\nnpx tavo generate --validate-spec tavo.generated.json\nnpx tavo generate --from-json tavo.generated.json --dry-run\nnpx tavo generate --from-json tavo.generated.json\n```\n\n-   Commit the spec when it describes repeatable project structure.\n    \n-   Inspect generated route and store names before applying the plan.\n    \n-   Run typecheck after generation; a successful write is not the same as a valid application."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:develop-and-inspect",
      "section": "cli",
      "slug": "develop-and-inspect",
      "title": "Develop and inspect",
      "description": "Run the correct development mode and ask the CLI for route, project, diagnostic, and entity information instead of guessing.",
      "keywords": [
        "dev",
        "inspect",
        "routes",
        "doctor",
        "network"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Run the correct development mode and ask the CLI for route, project, diagnostic, and entity information instead of guessing."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/develop-and-inspect",
      "sections": [
        {
          "id": "development-mode",
          "title": "Choose CSR or SSR development",
          "markdown": "Use the standard dev command for fast client iteration. Add SSR when working on loaders, actions, sessions, server middleware, hydration, or request-time metadata.\n\n**Run Terminal**\n\n```bash\nnpx tavo dev\nnpx tavo dev --ssr\n```\n\n**Testing from another device**\n\nAdd --network to bind to 0.0.0.0, then open the printed LAN address from a phone or tablet on the same network."
        },
        {
          "id": "project-views",
          "title": "Inspect the project at the right level",
          "markdown": "-   routes shows URL patterns, source files, layouts, and route parameters.\n    \n-   inventory lists pages, components, stores, actions, CSS, exports, and imports.\n    \n-   info summarizes framework and project configuration.\n    \n-   doctor reports project-shape problems without running a production build.\n    \n-   check adds lightweight validation and the local typecheck script when available.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo routes\nnpx tavo inventory --json\nnpx tavo doctor\nnpx tavo check\n```"
        },
        {
          "id": "focused-inspection",
          "title": "Inspect one entity before changing it",
          "markdown": "inspect returns focused information for a route, component, store, file, or public API. JSON output includes imports, parse status, and a content hash that automated change plans can use as a stale-write guard.\n\n**Run Terminal**\n\n```bash\nnpx tavo inspect route /dashboard --json\nnpx tavo inspect component ProjectCard --json\nnpx tavo inspect api defineRoutePage --json\n```"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:build-and-preview",
      "section": "cli",
      "slug": "build-and-preview",
      "title": "Build and preview",
      "description": "Validate generated routes, server output, static pages, code splitting, and bundle budgets before deployment.",
      "keywords": [
        "build",
        "preview",
        "report",
        "budgets"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Validate generated routes, server output, static pages, code splitting, and bundle budgets before deployment."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/build-and-preview",
      "sections": [
        {
          "id": "production-build",
          "title": "Treat build as application validation",
          "markdown": "tavo build compiles client and server bundles, discovers pages, prerenders static routes, generates route types, and prints each route's render mode and JavaScript cost.\n\n**Run Terminal**\n\n```bash\nnpx tavo build --report-json\n```\n\n-   Client assets are written to .tavo/build/client.\n    \n-   The SSR entry is written to .tavo/build/server.\n    \n-   Route types and manifests are written to .tavo/generated.\n    \n-   The normalized report is written when --report-json is enabled."
        },
        {
          "id": "budgets",
          "title": "Fail when JavaScript exceeds the contract",
          "markdown": "First-load and route budgets turn the build table into a CI guard. Start with limits based on the current product, then lower them deliberately as architecture improves.\n\n**Run Terminal**\n\n```bash\nnpx tavo build --max-first-load-js 150kb --max-route-js 40kb\n```\n\n**Read the route table**\n\nA large first-load value usually points to shared layout or root imports. A large route value usually points to page-specific libraries or eagerly loaded content."
        },
        {
          "id": "preview",
          "title": "Preview the output you will deploy",
          "markdown": "Use preview after the build to test production chunking and asset paths. Use SSR preview when validating hydration, loaders, actions, headers, static caching, or server failures.\n\n**Run Terminal**\n\n```bash\nnpx tavo preview\nnpx tavo preview --ssr\nnpx tavo preview --ssr --network\n```"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:deploy-and-monitor",
      "section": "cli",
      "slug": "deploy-and-monitor",
      "title": "Deploy and monitor",
      "description": "Deploy provider-neutral static or Node output and inspect protected production metrics.",
      "keywords": [
        "deploy",
        "monitor",
        "node",
        "static"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Deploy provider-neutral static or Node output and inspect protected production metrics."
      ],
      "runtime": [
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/deploy-and-monitor",
      "sections": [
        {
          "id": "deployment-output",
          "title": "Build the deployment output",
          "markdown": "tavo build creates static assets and prerendered HTML under .tavo/build/client plus a generated Node production server at .tavo/build/server/start.mjs.\n\n**Run Terminal**\n\n```bash\nnpx tavo build\nPORT=4174 node .tavo/build/server/start.mjs\n```"
        },
        {
          "id": "deployment-contract",
          "title": "Choose static hosting or Node",
          "markdown": "Publish .tavo/build/client when every required route can run as CSR or prerendered HTML. Use the generated Node server when SSR, loaders, actions, sessions, server routes, or monitoring require request-time execution.\n\n-   Configure trusted hosts and canonical origin where the platform synthesizes request URLs.\n    \n-   Set CSP, secrets, body limits, and image allowlists for the deployment.\n    \n-   Rebuild before deploying; generated output is not application source."
        },
        {
          "id": "monitor",
          "title": "Protect runtime monitoring",
          "markdown": "The generated server exposes monitor data only when TAVO\\_MONITOR\\_TOKEN is configured. The CLI sends the same token in an Authorization: Bearer header and can print one JSON snapshot or refresh continuously.\n\n**Run Terminal**\n\n```bash\nTAVO_MONITOR_TOKEN=$MONITOR_TOKEN node .tavo/build/server/start.mjs\nnpx tavo monitor --url https://app.example.com --token $MONITOR_TOKEN --once\nnpx tavo monitor --url https://app.example.com --token $MONITOR_TOKEN --json --once\n```\n\n**Never place the token in the URL**\n\nQuery-string credentials are rejected because URLs are routinely stored in logs, browser history, and proxy records."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:automation",
      "section": "cli",
      "slug": "automation",
      "title": "Automation and JSON protocol",
      "description": "Give agents and tooling bounded context, hash-guarded change plans, dry runs, receipts, and focused verification.",
      "keywords": [
        "automation",
        "json",
        "agent",
        "transaction",
        "verify"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Give agents and tooling bounded context, hash-guarded change plans, dry runs, receipts, and focused verification."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/automation",
      "sections": [
        {
          "id": "bounded-context",
          "title": "Request only the context needed",
          "markdown": "agent-context returns task-relevant conventions, the selected entity, API cards, diagnostics, and next actions. Summary output is intentionally bounded; request full detail only when a complete graph is necessary.\n\n**Run Terminal**\n\n```bash\nnpx tavo agent-context --json --task modify-route --target /account\nnpx tavo inspect route /account --json\n```"
        },
        {
          "id": "transaction",
          "title": "Use a read-plan-apply cycle",
          "markdown": "-   Inspect the target and capture its SHA-256 hash.\n    \n-   Create a versioned change plan with expected hashes or expectedMissing preconditions.\n    \n-   Run change with --dry-run and review every operation.\n    \n-   Apply the same plan and retain the returned receipt.\n    \n-   Verify only the changed files and their dependent Tavo.js modules.\n    \n\n**Run Terminal**\n\n```bash\nnpx tavo change --from-json change.json --dry-run\nnpx tavo change --from-json change.json > change-receipt.json\nnpx tavo verify --receipt change-receipt.json --smoke --no-project-scripts --json\n```\n\nchange prints its receipt as a JSON protocol envelope; it does not create .tavo/change-receipt.json automatically. Save stdout to a project-relative file, check that the change command exited successfully, then pass that exact file to verify."
        },
        {
          "id": "diagnostics-and-generation",
          "title": "Prefer machine-readable diagnostics",
          "markdown": "JSON forms of routes, inventory, doctor, check, and verify are stable inputs for editors and agents. Validate generation specs independently and use doctor fix dry runs when tooling needs suggested repairs without immediate writes.\n\n**Run Terminal**\n\n```bash\nnpx tavo doctor --fix-dry-run --json\nnpx tavo generate --validate-spec tavo.generated.json\nnpx tavo verify --spec tavo.generated.json --no-project-scripts --json\n```\n\n**Human approval still matters**\n\nA dry run proves the plan is structurally valid; it does not decide whether the proposed product or architecture change is appropriate.\n\n**Choose whether verify may run project scripts**\n\nBy default, verify runs the project's typecheck package script when it exists. That is useful in a trusted developer or CI workflow. Automation that must not execute package scripts must pass --no-project-scripts and confirm that the installed CLI advertises the flag. The JSON response reports projectScripts as false when the restriction is active."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "cli:commands",
      "section": "cli",
      "slug": "commands",
      "title": "Command reference",
      "description": "Review the command and flag inventory reported by the currently linked framework CLI.",
      "keywords": [
        "commands",
        "flags",
        "help",
        "reference"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js project with dependencies installed."
      ],
      "outcomes": [
        "Review the command and flag inventory reported by the currently linked framework CLI."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Command reference",
          "href": "/docs/cli/commands",
          "description": "Check syntax, side effects, flags, and exit behavior."
        },
        {
          "title": "Application configuration",
          "href": "/docs/core/configuration",
          "description": "Understand the files read by CLI workflows."
        }
      ],
      "canonicalPath": "/docs/cli/commands",
      "sections": [
        {
          "id": "project-lifecycle-commands",
          "title": "Project lifecycle commands",
          "markdown": "Syntax\n\nSide effect / behavior\n\nOutput and exit\n\n`tavo create app [dir] [--package-manager npm|pnpm|yarn|bun]`\n\nCreates a new application directory and starter files. It does not install dependencies.\n\nPrints created files and next commands; exits non-zero when creation is rejected.\n\n`tavo dev [--ssr] [--host <ip>|--network]`\n\nStarts the development server. --ssr enables request-time route rendering.\n\nKeeps running until stopped; startup failure exits non-zero.\n\n`tavo build [--report-json] [--max-first-load-js <size>] [--max-route-js <size>]`\n\nWrites client, server, manifest, generated type, and optional report output under .tavo.\n\nPrints route output and budgets; compilation, prerender, or budget failure exits non-zero.\n\n`tavo preview [--ssr] [--host <ip>|--network]`\n\nServes the last production build without rebuilding application source.\n\nKeeps running until stopped; missing or invalid build output fails startup."
        },
        {
          "id": "inspection-commands",
          "title": "Inspection and validation commands",
          "markdown": "Syntax\n\nBehavior\n\n`tavo routes [--json]`\n\nReads the file-route tree and reports patterns, files, layouts, and parameters.\n\n`tavo info [--json]`\n\nReads project, package, pages, and CSS configuration.\n\n`tavo inventory [--json]`\n\nIndexes pages, layouts, components, stores, actions, imports, and exports.\n\n`tavo inspect <route|component|store|file|api> <target> --json`\n\nReturns focused source and metadata, including a content hash where available.\n\n`tavo doctor [--json|--fix-dry-run|--fix]`\n\nReports project-shape diagnostics. Only --fix writes low-risk repairs; --fix-dry-run previews them.\n\n`tavo check [--json]`\n\nRuns project diagnostics and the package.json typecheck script when one exists.\n\nHuman output is the default. JSON commands return a protocol envelope and still use a non-zero exit status when diagnostics contain an error. A caller must check both the exit status and the envelope instead of assuming parseable JSON means success."
        },
        {
          "id": "write-and-verify-commands",
          "title": "Generation, change, and verification commands",
          "markdown": "Syntax\n\nSide effect / behavior\n\nSafe-use note\n\n`tavo generate <kind> <name> [options]`\n\nWrites convention-aware page, component, store, action, or layout files. Pages are functional by default; --typed-route opts into defineRoutePage.\n\nUse --from-json <file> --dry-run for a batch plan, or --validate-spec before writing.\n\n`tavo change --from-json <file> [--dry-run]`\n\nApplies a hash-guarded change plan transactionally and prints the receipt JSON to stdout.\n\nRun the same plan with --dry-run, then redirect a successful real run to a receipt file.\n\n`tavo verify [--files <list>|--receipt <file>] [--smoke] [--no-project-scripts] [--json]`\n\nExpands affected files, runs source diagnostics, optional static smoke checks, and plugin inspection. By default it also runs the project's typecheck script.\n\nUse --no-project-scripts for restricted automation; verify the JSON response contains projectScripts: false."
        },
        {
          "id": "monitoring-command",
          "title": "Monitoring command",
          "markdown": "Syntax\n\nBehavior\n\nDefault / next step\n\n`tavo monitor [--url <origin>] [--token <token>] [--once] [--interval <ms>] [--json]`\n\nRequests the protected runtime monitor endpoint; it does not deploy or alter the application.\n\nThe default URL is http://127.0.0.1:4174 and the token may come from TAVO\\_MONITOR\\_TOKEN."
        },
        {
          "id": "installed-help",
          "title": "Installed command inventory",
          "markdown": "This snapshot is generated from tavo --help during documentation synchronization, so command names and flags come from the linked CLI rather than a hand-maintained list.\n\n**Reference Reference snippet**\n\n```text\ntavo CLI v1.0.1\n\nCommands:\n  tavo create app [dir]\n  tavo dev [--ssr] [--host 0.0.0.0|--network]\n  tavo build\n  tavo preview [--ssr] [--host 0.0.0.0|--network]\n  tavo monitor [--url http://127.0.0.1:4174]\n  tavo routes [--json]\n  tavo info [--json]\n  tavo inventory [--json]\n  tavo doctor [--json]\n  tavo doctor --fix-dry-run [--json]\n  tavo check [--json]\n  tavo agent-context --json [--task <task>] [--target <name>] [--detail summary|full]\n  tavo inspect <route|component|store|file|api> <target> --json\n  tavo inspect plugins [--json]\n  tavo change --from-json <file> [--dry-run]\n  tavo change --from-stdin [--dry-run]\n  tavo verify [--no-project-scripts] [--json]\n  tavo verify --smoke --json\n  tavo verify --spec <file> --json\n  tavo generate page <name> [--loader] [--seo] [--typed-route]\n  tavo generate component <name> [--props]\n  tavo generate store <name> [--shape key,count]\n  tavo generate layout <name>\n  tavo generate 404\n  tavo generate error\n  tavo generate action <name>\n  tavo generate --from-json <file>\n  tavo generate --from-stdin\n  tavo generate --validate-spec <file>\n\nFlags:\n  --force                 overwrite generated files when supported\n  --loader                include a typed page loader in page generator output\n  --seo                   include Seo metadata in page generator output\n  --typed-route           wrap a generated page with defineRoutePage(...)\n  --props                 include a typed props example in component generator output\n  --shape <keys>          comma-separated store keys for store generator output\n  --from-json <file>      generate from a JSON spec file\n  --from-stdin            generate from JSON read on stdin\n  --validate-spec <file>  validate a generator spec without writing files\n  --dry-run               print a transactional generation plan without writing files\n  --fix-dry-run           print suggested doctor fixes without editing files\n  --fix                   apply low-risk doctor fixes\n  --spec <file>           include a generator spec in verify output\n  --task <task>           select task-specific agent context\n  --detail <level>        select summary or full agent context\n  --files <list>          verify comma-separated changed files\n  --receipt <file>        verify files listed by a change receipt\n  --smoke                 include lightweight route smoke checks in verify output\n  --no-project-scripts    skip package scripts during restricted verification\n  --package-manager <pm>  scaffold app using npm, pnpm, yarn, or bun\n  --report-json           write .tavo/generated/build-report.json\n  --max-first-load-js <size>  fail build when initial JS exceeds size (for example 150kb)\n  --max-route-js <size>    fail build when route JS exceeds size (for example 40kb)\n  --prerender-styles <mode>  choose inline or external styles for static pages\n  --once                  print one monitor snapshot and exit\n  --json                  print supported command output as JSON\n  --interval <ms>         delay between monitor refreshes\n  --token <token>         send a monitor authorization bearer token\n  --host <ip>             bind dev/preview server to a host, e.g. 0.0.0.0 for LAN access\n  --network               shortcut for --host 0.0.0.0\n  --debug                 show error stack traces\n  --help                  show this message\n  --version               print CLI version\n```"
        },
        {
          "id": "output-conventions",
          "title": "Choose human or JSON output",
          "markdown": "Default output is optimized for terminal reading. Use --json for automation, CI artifacts, or editor integrations. Commands that write files expose a dry-run or validation path when a safe preview is meaningful.\n\n-   Use --help on the project-local version for exact installed behavior.\n    \n-   Use --json only on commands that advertise it.\n    \n-   Treat non-zero exit status as failure even when JSON contains useful diagnostics.\n    \n-   Persist build reports and change receipts when they are part of a CI or automation decision."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:index",
      "section": "ui",
      "slug": "",
      "title": "Tavo.js UI documentation",
      "description": "The complete source of truth for installing, theming, composing, validating, and shipping accessible Tavo.js interfaces.",
      "keywords": [
        "ui",
        "components",
        "design system",
        "themes",
        "accessibility"
      ],
      "kind": "concept",
      "prerequisites": [
        "A Tavo.js application and familiarity with TypeScript, TSX, and component-based interface development."
      ],
      "outcomes": [
        "Explain how Tavo.js UI components, compiled styles, generated themes, responsive props, and tooling fit together.",
        "Choose the correct guide, component page, configuration reference, or exact package API for a concrete task."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the package and generate the project theme config."
        },
        {
          "title": "Browse all components",
          "href": "/docs/ui/components",
          "description": "Open the visual catalog and exact component contracts."
        }
      ],
      "canonicalPath": "/docs/ui",
      "sections": [
        {
          "id": "choose-documentation-flow",
          "title": "Choose the documentation flow",
          "markdown": "[\n\n## Add UI to an application\n\nInstall the package, create the project theme config, and enable automatic theme generation.Read guide →\n\n](/docs/ui/installation)[\n\n## Understand the UI system\n\nUse the guides for theme ownership, responsive composition, accessibility, interaction behavior, testing, and delivery.Read guide →\n\n](/docs/ui/theming)[\n\n## Choose a component\n\nBrowse the visual catalog for focused imports, props, composition rules, accessibility notes, and examples.Read guide →\n\n](/docs/ui/components)[\n\n## Look up an exact API\n\nUse the generated reference for canonical package exports, TypeScript signatures, stability, and related guides.Read guide →\n\n](/docs/ui/api)"
        },
        {
          "id": "mental-model",
          "title": "How Tavo.js UI fits together",
          "markdown": "Tavo.js UI is an optional interface system for Tavo.js applications. The framework owns routing, rendering, application state, and production output. Tavo.js UI adds accessible components, compiled component styles, responsive props, generated theme variables, and focused interface tooling.\n\nComponent imports supply structure and behavior. The project theme supplies shared design decisions such as color, typography, spacing, density, radii, and motion. The tavoUi plugin validates that config and makes the resulting theme available during normal development and production builds."
        },
        {
          "id": "package-boundaries",
          "title": "Know which package or command owns the job",
          "markdown": "Tavo.js UI is optional. It builds on the Tavo.js Framework, but it does not replace the framework runtime or its command-line tools.\n\nName\n\nResponsibility\n\nPackage and command\n\n**Tavo.js Framework**\n\nRoutes, TSX rendering, loaders, actions, middleware, SSR, and browser navigation.\n\n@tavojs/core · tavo\n\n**Tavo.js UI**\n\nOptional web components, compiled component CSS, themes, metadata, and the Tavo.js UI plugin.\n\n@tavojs/ui · tavo-ui\n\n**UI Core**\n\nPlatform-neutral theme resolution for custom exporters and design tooling.\n\n@tavojs/ui-core · advanced tooling only"
        },
        {
          "id": "style-lifecycle",
          "title": "Follow one component from config to interface",
          "markdown": "**Reference Reference snippet**\n\n```text\ntavo-ui.config.json\n  → tavoUi() validates and resolves the project theme\n  → generated variables enter the application build\n  → component imports load their compiled structural styles\n  → responsive props resolve against shared breakpoints\n  → the initial interface renders with the selected theme\n  → themeController handles later device, light, or dark changes\n```\n\n**Components and themes have separate ownership**\n\nA component import provides its layout, states, and interaction styles. The generated theme provides the shared variables those styles consume. Keep both boundaries explicit when diagnosing a visual problem."
        },
        {
          "id": "choose",
          "title": "Browse Tavo.js UI by system",
          "markdown": "[\n\n## Start\n\nPackage installation, default theme config creation, and plugin setup for an existing Tavo.js application.Read guide →\n\n](/docs/ui/installation)[\n\n## Theme system\n\nPresets, project anchors, tokens, typography, density, color modes, runtime selection, and the complete config contract.Read guide →\n\n](/docs/ui/theming)[\n\n## Layout and composition\n\nResponsive values, layout primitives, focused imports, compound components, polymorphic roots, and project-owned styling.Read guide →\n\n](/docs/ui/responsive-styling)[\n\n## Component behavior\n\nAccessibility ownership, controlled state, forms, actions, navigation, dialogs, overlays, loading, and limitations.Read guide →\n\n](/docs/ui/accessibility)[\n\n## Quality and tooling\n\nTheme commands, plugin output, SSR behavior, testing, diagnostics, performance, audits, and continuous integration.Read guide →\n\n](/docs/ui/cli)[\n\n## Component catalog\n\nAll 80 public components with live examples, exact props, focused imports, composition rules, and accessibility notes.Read guide →\n\n](/docs/ui/components)[\n\n## Reference\n\nTheme configuration, component metadata, versioning, stability, and canonical package exports.Read guide →\n\n](/docs/ui/theme-config-reference)"
        },
        {
          "id": "first-composition",
          "title": "Compose a page from semantic primitives",
          "markdown": "Start with Page and Section for structure, Stack or Grid for layout, Text for hierarchy, and focused product components for interaction. Reach for custom CSS only when component props and tokens do not express the product-specific requirement.\n\n**Create src/components/Dashboard.tsx**\n\n```tsx\nimport { Button, Card, Grid, Page, Section, Stack, Text } from \"@tavojs/ui\";\n\nexport function Dashboard() {\n  return <Page>\n    <Section title=\"Projects\" description=\"Work currently in delivery\">\n      <Grid columns={{ base: 1, md: 2 }} spacing=\"md\">\n        <Card title=\"Documentation\"><Text>Developer experience overhaul</Text></Card>\n        <Card title=\"Framework\"><Text>Production validation</Text></Card>\n      </Grid>\n      <Stack align=\"start\"><Button>Create project</Button></Stack>\n    </Section>\n  </Page>;\n}\n```\n\nBrowse the [component reference](/docs/ui/components) when you need exact props, composition rules, accessibility notes, and focused imports."
        },
        {
          "id": "source-of-truth-contract",
          "title": "How to read this reference",
          "markdown": "Focused guides explain ownership, workflows, defaults, failure behavior, and verification. Component pages own exact props and composition rules. The generated API inventory mirrors the declarations in the connected Tavo.js UI checkout.\n\n**Published package exports are the public boundary**\n\nImport from `@tavojs/ui`, its documented focused or grouped component entry points, or the public theme, plugin, accessibility, and metadata entry points. Do not depend on package source paths or generated implementation files."
        },
        {
          "id": "first-production-loop",
          "title": "Use the verification loop early",
          "markdown": "Validate the theme independently, then verify the complete application build. This catches invalid tokens, contrast problems, generated-style failures, SSR mismatches, and unexpected bundle cost before release.\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web check\nnpx tavo-ui web audit\nnpx tavo build --report-json\nnpx tavo preview --ssr\n```"
        },
        {
          "id": "exact-reference",
          "title": "Choose the exact reference boundary",
          "markdown": "[\n\n## Component reference\n\nExact component props, focused imports, defaults, composition, accessibility, limitations, and live examples.Read guide →\n\n](/docs/ui/components)[\n\n## Theme configuration\n\nEvery project theme field, merge rule, preset interaction, and generated output behavior.Read guide →\n\n](/docs/ui/theme-config-reference)[\n\n## Package API\n\nEvery published value and type from the root, theme, accessibility, metadata, plugin, and grouped entry points.Read guide →\n\n](/docs/ui/api)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:installation",
      "section": "ui",
      "slug": "installation",
      "title": "Install Tavo.js UI",
      "description": "Install the web component package, create a project theme, and let the Tavo.js plugin inject generated CSS.",
      "keywords": [
        "install",
        "plugin",
        "theme css",
        "sass"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Install the web component package, create a project theme, and let the Tavo.js plugin inject generated CSS."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/installation",
      "sections": [
        {
          "id": "install",
          "title": "Install the web package",
          "markdown": "Use `Node.js 20.19+ or 22.12+`. A generated `Tavo.js` application already has `@tavojs/core`, so install only `@tavojs/ui`, then use its bundled command to create the project-owned theme configuration.\n\n**Run Terminal**\n\n```bash\nnpm install @tavojs/ui\nnpx tavo-ui web init\n```\n\n**The CLI is included**\n\n`@tavojs/ui` provides the `tavo-ui` command. Do not install, pin, or upgrade `@tavojs/ui-cli` separately. Keep the command on the same version as the installed UI package by running the local binary.\n\n**No Sass dependency**\n\nPublished component entry points contain compiled CSS. Consuming applications do not install sass or sass-embedded."
        },
        {
          "id": "plugin",
          "title": "Enable automatic theme generation",
          "markdown": "Merge tavoUi into the generated application configuration. Keep pagesDir, the starter stylesheet, diagnostics, build settings, and any plugins that are already present.\n\n**Patch tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { tavoUi } from \"@tavojs/ui/plugin\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false\n  },\n  plugins: [tavoUi()]\n});\n```\n\nIf plugins already contains entries, append tavoUi() instead of replacing them. No app-level theme import is required when injection is enabled. Set an explicit config path only when the project does not use the default filename."
        },
        {
          "id": "css-loading",
          "title": "Understand component and theme CSS",
          "markdown": "-   Normal root, grouped, and focused imports automatically load compiled component CSS.\n    \n-   `tavoUi`() supplies the project-generated theme variables.\n    \n-   Without the plugin, import `@tavojs/ui/theme.css` once to use the package default theme.\n    \n-   The /css entry points are equivalent aliases for tooling that prefers explicit CSS-safe paths.\n    \n\n**Create src/components/SaveButton.tsx**\n\n```tsx\nimport { Button } from \"@tavojs/ui/button\";\n\nexport const SaveButton = () => {\n  return <Button tone=\"primary\">Save changes</Button>;\n};\n```"
        },
        {
          "id": "package-contract",
          "title": "Package and runtime requirements",
          "markdown": "`Tavo.js` UI is a web component system for `Tavo.js` applications. Install its Core peer dependency explicitly when an application does not already include it. For a generated `Tavo.js` application, install only `@tavojs/ui`. Use `Node.js 20.19+ or 22.12+` for the framework, Vite, and UI tooling.\n\n**Run Terminal**\n\n```bash\nnpm install @tavojs/ui\nnpx tavo-ui web init\n```\n\n-   The `tavo-ui` command is bundled with `@tavojs/ui`. Do not install or version its implementation package separately.\n    \n-   Components do not require a provider. Import them and render them through the normal `Tavo.js` application tree.\n    \n-   Published component entry points contain compiled styles; applications do not install Sass.\n    \n-   Component CSS and project theme CSS are separate: component imports supply structure, while the plugin or `theme.css` supplies variables.\n    \n-   `@tavojs/ui` 0.1.x declares `@tavojs/core` ^0.1.0 as its peer range."
        },
        {
          "id": "plugin-options",
          "title": "Tavo.js UI plugin options",
          "markdown": "**Patch tavo.config.ts**\n\n```ts\nimport { defineConfig } from \"@tavojs/core/config\";\nimport { tavoUi } from \"@tavojs/ui/plugin\";\n\nexport default defineConfig({\n  pagesDir: \"src/pages\",\n  cssEntries: [\"src/styles.css\"],\n  diagnostics: {\n    devOverlay: true,\n    traces: false\n  },\n  plugins: [tavoUi({\n    config: \"tavo-ui.config.json\",\n    out: false,\n    watch: true,\n    silent: false,\n    required: true,\n    inject: true\n  })]\n});\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`config`\n\n`string`\n\n\"`tavo-ui.config.json`\"\n\nTheme config path, relative to the project root unless absolute.\n\n`out`\n\n`string | false`\n\nfalse\n\nAlso writes generated CSS to this path. Unchanged content is not rewritten.\n\n`watch`\n\n`boolean`\n\ntrue\n\nWatches the config in development, regenerates it, invalidates the virtual CSS module, and reloads the page.\n\n`silent`\n\n`boolean`\n\nfalse\n\nSuppresses generation information and warnings.\n\n`required`\n\n`boolean`\n\ntrue\n\nThrows when the config is missing. false lets generation continue without project theme CSS.\n\n`inject`\n\n`boolean`\n\ntrue\n\nAdds the generated theme import to project `JavaScript` and `TypeScript` source modules."
        },
        {
          "id": "plugin-behavior",
          "title": "What the plugin changes",
          "markdown": "During server rendering, the framework document receives the generated theme in a style record named tavo-ui.theme. During development and browser builds, the Vite integration serves the same CSS through the virtual @tavojs/ui/theme.css module.\n\n-   Automatic injection applies only to `JavaScript` and `TypeScript` project source modules.\n    \n-   It excludes `node_modules`, dist, build output, files outside the project root, and `tavo` or Vite config modules.\n    \n-   A source file that already imports `@tavojs/ui/theme.css` is not modified again.\n    \n-   Malformed JSON, invalid theme values, and accessibility violations configured to fail all stop the build.\n    \n\n**Choose one theme source**\n\nUse plugin injection for the normal `Tavo.js` workflow. If the plugin is absent, import `@tavojs/ui/theme.css` once for the package default, or generate and import one project-owned CSS file. Do not import both a generated file and the plugin-managed theme."
        },
        {
          "id": "css-delivery-paths",
          "title": "Choose one theme CSS delivery path",
          "markdown": "Component imports and theme variables are separate concerns. Root, grouped, and focused component imports load compiled component CSS automatically. The project plugin supplies project-owned theme variables; the package theme file supplies only the published default theme.\n\n-   Recommended: enable `tavoUi`() and keep `tavo-ui.config.json` in the application. No application-level theme import is required.\n    \n-   Without the plugin: import `@tavojs/ui/theme.css` once to use the package default theme.\n    \n-   For an external pipeline: generate a physical CSS file with the CLI, then import that file once.\n    \n-   Do not combine project plugin injection with a generated physical theme import unless two theme definitions are intentional.\n    \n-   The /css component entry points are API-equivalent aliases; they do not replace theme CSS.\n    \n\n**Compiled CSS means no Sass dependency**\n\nPublished component entry points contain compiled style maps and CSS. Sass and sass-embedded are library build dependencies, not application dependencies."
        },
        {
          "id": "plugin-quick-contract",
          "title": "Know the plugin defaults before customizing it",
          "markdown": "-   Relative config and output paths resolve from the application root; absolute paths are accepted.\n    \n-   required: false allows an application to start without a config and produces no project theme CSS.\n    \n-   inject: false disables automatic source imports; the application must import the theme path intentionally.\n    \n-   watch: false disables config watching but does not disable generation during build startup.\n    \n\n**Reference Reference snippet**\n\n```ts\ntavoUi({\n  config: \"tavo-ui.config.json\", // default\n  out: false,                    // do not write a physical file\n  watch: true,                   // watch config in development\n  silent: false,                 // print generation and contrast messages\n  required: true,                // fail when config is missing\n  inject: true                   // attach the virtual theme import\n})\n```"
        },
        {
          "id": "installation-failures",
          "title": "Diagnose theme setup failures",
          "markdown": "-   A missing config throws `tavo-ui`: missing theme config when required remains true.\n    \n-   Invalid JSON fails while the plugin reads the config; schema and theme validation errors fail during generation.\n    \n-   A default-looking interface usually means the package theme was imported instead of the project-generated theme.\n    \n-   Missing variables usually mean neither the plugin, the default package theme, nor a generated CSS file was loaded.\n    \n-   Duplicate theme declarations usually mean more than one delivery path is active.\n    \n\n**The config is project-owned**\n\n`Tavo.js` UI does not require a `ThemeProvider`. The config is resolved into global CSS variables during development and production builds, while runtime helpers only select light, dark, or system mode."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:theming",
      "section": "ui",
      "slug": "theming",
      "title": "Theming",
      "description": "Resolve a small brand configuration into light and dark color modes, product scales, typography, and interaction tokens.",
      "keywords": [
        "theme",
        "preset",
        "colors",
        "dark mode"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Resolve a small brand configuration into light and dark color modes, product scales, typography, and interaction tokens."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/theming",
      "sections": [
        {
          "id": "minimal-config",
          "title": "Start from one brand color",
          "markdown": "Only color.light.primary is required. Add the published schema for editor completion, choose system as the default unless the product requires a fixed initial mode, and introduce overrides only after reviewing generated output.\n\n**Reference Reference snippet**\n\n```json\n{\n  \"$schema\": \"./node_modules/@tavojs/ui/schema.json\",\n  \"defaultTheme\": \"system\",\n  \"color\": {\n    \"light\": { \"primary\": \"#006ecf\" }\n  }\n}\n```"
        },
        {
          "id": "presets-and-methods",
          "title": "Separate product shape from color behavior",
          "markdown": "Presets provide coordinated defaults for scale, typography, density, and surfaces. Explicit config is merged afterward and always wins. Color methods decide how the brand anchors become ramps and structural colors.\n\n-   minimal: neutral, general-purpose starting point.\n    \n-   enterprise and dense: practical dashboard density and restrained surfaces.\n    \n-   editorial and mobile: typography or touch-oriented foundations.\n    \n-   glass: translucent structural surfaces and backdrop-filter tokens.\n    \n-   monochrome: strict black, white, and neutral structure with exact action colors.\n    \n-   analogous, monochromatic, and glass are color generation methods; they are not component variants."
        },
        {
          "id": "runtime-mode",
          "title": "Control light, dark, and system modes",
          "markdown": "The tavoUi plugin reads tavo-ui.config.json and injects the generated CSS at build time. It does not import that JSON into the browser or create runtime state. Create one controller at the client application boundary, using the same initial mode as defaultTheme in the config.\n\n**Create src/theme-controller.ts**\n\n```ts\nimport {\n  createThemeController,\n  mountThemeController\n} from \"@tavojs/ui/theme\";\n\nexport const theme = createThemeController(\"system\");\nexport const stopThemeRuntime = mountThemeController(theme);\n\nexport function setThemeMode(mode: \"light\" | \"dark\" | \"system\") {\n  theme.setMode(mode);\n}\n\nexport function toggleThemeMode() {\n  theme.toggleMode();\n}\n```\n\n**Config import is optional**\n\nUse `createThemeControllerFromConfig` only when the application deliberately imports `tavo-ui.config.json` at runtime. Automatic CSS injection does not require that import. With the normal workflow, pass light, dark, or system directly to `createThemeController` and keep it aligned with `config.defaultTheme`.\n\nExplicit light or dark mode writes data-tavo-theme on the document root. System mode removes that attribute so the generated prefers-color-scheme rules decide. The controller persists the user's selection. Call setThemeMode from a menu, button, or settings controller, and subscribe to theme.store only when UI needs to display the current selection.\n\n**Keep selectors aligned**\n\nIf `output.darkSelector` is customized, the application shell must write the same selector contract. The default runtime writes `data-tavo-theme`."
        },
        {
          "id": "theme-config-surface",
          "title": "Configure every theme layer intentionally",
          "markdown": "`TavoUiThemeConfig` requires a light primary color and exposes optional settings for presets, modes, scale, typography, interaction, viewport behavior, breakpoints, output selectors, accessibility, and token overrides.\n\n-   `color.light.primary` is required. secondary is derived when omitted; dark anchors inherit light values and can override either color.\n    \n-   semantic defines success, warning, danger, and info globally or per light and dark mode.\n    \n-   scale controls dimensions and effects; typography controls font stacks and type sizes; interaction controls hover, focus, pressed, disabled, and transition behavior.\n    \n-   viewport emits a fluid root font-size; breakpoints emit responsive threshold data; output controls selectors and the system-mode media query.\n    \n-   tokens provides final per-mode token overrides; accessibility enables contrast diagnostics.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype TavoUiThemeConfig = {\n  preset?: \"minimal\" | \"glass\" | \"enterprise\" | \"editorial\" | \"dense\" | \"mobile\" | \"monochrome\";\n  defaultTheme?: \"light\" | \"dark\" | \"system\";\n  color: ThemeColorConfig;\n  semantic?: ThemeModeSemanticConfig;\n  scale?: ThemeScaleConfig;\n  typography?: ThemeTypographyConfig;\n  interaction?: ThemeInteractionConfig;\n  viewport?: ThemeViewportConfig;\n  breakpoints?: ThemeBreakpointsConfig;\n  output?: ThemeOutputConfig;\n  accessibility?: ThemeAccessibilityConfig;\n  tokens?: ThemeTokenOverrides;\n};\n```"
        },
        {
          "id": "theme-resolution-order",
          "title": "Follow the theme resolution order",
          "markdown": "-   Apply the selected preset first.\n    \n-   Deep-merge explicit color, dark color, scale, typography, viewport, breakpoints, semantic modes, output, accessibility, and token maps over the preset.\n    \n-   Derive a secondary anchor when one is absent, then build primary, secondary, and neutral ramps.\n    \n-   Generate semantic and product-alias tokens for both modes.\n    \n-   Apply per-mode token overrides last. Explicit overrides win even when they replace a generated alias.\n    \n\n**Explicit project values always win**\n\nA preset coordinates defaults, but it never locks density, typography, colors, radii, or other project decisions."
        },
        {
          "id": "theme-scale-defaults",
          "title": "Understand scale and interaction defaults",
          "markdown": "Without a preset or explicit base unit, comfortable density starts from a 40px medium control, 8px spacing base, 8px radius, 3px focus ring, 16px body type, and 22px blur. Derived tokens convert these values to rem where appropriate.\n\n-   unit derives control height at 5×, spacing at 1×, radius at 1×, body type at 2×, and blur at 2.75× unless a more specific value is present.\n    \n-   density changes generated defaults only. Explicit unit, `controlHeight`, and spacing remain exact.\n    \n-   `controlRadius` and `surfaceRadius` override the shared radius for controls and surfaces independently.\n    \n-   motion and `interaction.transition` are multipliers; zero produces zero-duration generated transitions.\n    \n-   opacity, `glassAlpha`, `hoverShadow`, `focusAlpha`, and `disabledOpacity` are ratios from zero to one."
        },
        {
          "id": "theme-validation-summary",
          "title": "Fail close to invalid theme values",
          "markdown": "-   Positive-only values include unit, control height, spacing, type sizes, viewport dimensions, and breakpoints.\n    \n-   Radii, shadows, borders, focus, motion, blur, hover lift, active scale, and transition must be non-negative.\n    \n-   Viewport `rootMin` must not exceed `rootMax`, and `minWidth` must be less than `maxWidth`.\n    \n-   Breakpoints must be positive and strictly ascending: sm < md < lg.\n    \n-   Unknown presets, methods, modes, densities, and contrast levels throw descriptive errors."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:tokens",
      "section": "ui",
      "slug": "tokens",
      "title": "Design tokens",
      "description": "Use generated semantic variables so components and application surfaces adapt together across brands and color modes.",
      "keywords": [
        "tokens",
        "css variables",
        "semantic",
        "scale"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Use generated semantic variables so components and application surfaces adapt together across brands and color modes."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/tokens",
      "sections": [
        {
          "id": "token-layers",
          "title": "Think in three token layers",
          "markdown": "-   Color ramps preserve the generated shades for primary, secondary, and neutral anchors.\n    \n-   Semantic mode tokens describe intent: backgrounds, text, borders, actions, feedback, overlays, panels, headers, and sidebars.\n    \n-   Static tokens describe spacing, sizing, radius, typography, motion, focus, blur, opacity, and breakpoints.\n    \n\nApplication code should normally consume semantic or static tokens. Direct ramp shades are useful for visualization and tooling, but they couple product CSS to palette details."
        },
        {
          "id": "using-tokens",
          "title": "Use tokens for product-specific CSS",
          "markdown": "Tavo.js UI components already consume the token contract. When a product-specific class is still necessary, reference the same variables so custom sections respond to theme and scale changes.\n\n**Reference Reference snippet**\n\n```css\n.projectSummary {\n  color: var(--tui-color-text);\n  background: var(--tui-color-panel-bg);\n  border: var(--tui-border-width) solid var(--tui-color-panel-border);\n  border-radius: var(--tui-radius-surface);\n  padding: var(--tui-space-6);\n}\n```"
        },
        {
          "id": "overrides",
          "title": "Override by intent, not by accident",
          "markdown": "tokens.light and tokens.dark apply after generated semantic tokens. Use them for a small number of product aliases that genuinely need a fixed value, then run the accessibility audit again.\n\n**Reference Reference snippet**\n\n```json\n{\n  \"tokens\": {\n    \"light\": { \"color-sidebar-bg\": \"#ffffff\" },\n    \"dark\": { \"color-sidebar-bg\": \"#050505\" }\n  }\n}\n```\n\n**Prefer configuration first**\n\nBefore overriding tokens, check whether preset, color method, density, radius, shadow, typography, or scale settings express the desired system-wide change."
        },
        {
          "id": "token-name-contract",
          "title": "Use the published token names",
          "markdown": "Spacing uses a numeric scale, not named md or lg variables. Component gap names map onto that scale: sm uses space-2, md uses space-4, and lg uses space-6.\n\n**Reference Reference snippet**\n\n```css\n.productPanel {\n  color: var(--tui-color-text);\n  background: var(--tui-color-panel-bg);\n  border: var(--tui-border-width) solid var(--tui-color-panel-border);\n  border-radius: var(--tui-radius-surface);\n  padding: var(--tui-space-6);\n}\n```\n\n**There is no --tui-space-md or --tui-space-lg**\n\nUse `--tui-space-1` through `--tui-space-6`. The complete catalog is available programmatically, so validation and documentation can share the same source of truth."
        },
        {
          "id": "token-metadata-api",
          "title": "Inspect the token catalog programmatically",
          "markdown": "-   `tavoUiTokenNames` is the built-in variable-name inventory.\n    \n-   `tavoUiTokenMetadata` includes each name and its token group.\n    \n-   `getTavoUiTokenMetadata`(config) adds project-defined override names.\n    \n-   Use `tavo-ui` validate-css to find unknown `Tavo.js` UI variables in application stylesheets.\n    \n\n**Reference Reference snippet**\n\n```ts\nimport {\n  getTavoUiTokenMetadata,\n  getTavoUiTokenGroup,\n  tavoUiTokenMetadata,\n  tavoUiTokenNames\n} from \"@tavojs/ui/theme\";\n\ntavoUiTokenNames.includes(\"--tui-space-4\");\ngetTavoUiTokenGroup(\"--tui-color-panel-bg\");\n\n// Includes custom entries from tokens.light and tokens.dark.\nconst projectTokens = getTavoUiTokenMetadata(config);\n```"
        },
        {
          "id": "token-prefix-and-overrides",
          "title": "Apply project token overrides",
          "markdown": "Theme generation emits the canonical `--tui` variable contract. Use `tokens.light` and `tokens.dark` to replace generated values or add project-specific variables for each mode.\n\n-   `tokens.light` and `tokens.dark` apply after generated semantic values.\n    \n-   An override name does not need to be built in; generated custom names use the canonical `--tui` prefix.\n    \n-   Re-run contrast and CSS-token audits after overriding foreground or background colors.\n    \n\n**Reference Reference snippet**\n\n```css\n--tui-color-panel-bg: #ffffff;\n--tui-product-accent: #7c3aed;\n```"
        },
        {
          "id": "generated-global-css",
          "title": "Account for generated global CSS",
          "markdown": "-   All elements and pseudo-elements receive border-box sizing.\n    \n-   Document scrollbars receive token-backed colors and dimensions.\n    \n-   body margin and padding are reset to zero.\n    \n-   body receives the generated application-background token.\n    \n-   The root selector receives color-scheme, root font sizing, ramps, semantic variables, and static tokens.\n    \n\n**Theme CSS is not variables only**\n\nLoad it once at the application boundary. Repeated or scoped imports can unexpectedly repeat reset rules or place root selectors in an unintended cascade position."
        },
        {
          "id": "token-inventory",
          "title": "Complete token inventory",
          "markdown": "125 public CSS variables are synchronized from the current theme package. Generated values may differ when your project changes its theme configuration.\n\n`--tui-backdrop-filter`effects · backdrop-filter\n\n`--tui-blur-surface`effects · blur-surface\n\n`--tui-border-width`border · border-width\n\n`--tui-border-width-strong`border · border-width-strong\n\n`--tui-breakpoint-lg`breakpoint · breakpoint-lg\n\n`--tui-breakpoint-md`breakpoint · breakpoint-md\n\n`--tui-breakpoint-sm`breakpoint · breakpoint-sm\n\n`--tui-color-app-bg`color · color-app-bg\n\n`--tui-color-bg`color · color-bg\n\n`--tui-color-border`color · color-border\n\n`--tui-color-border-strong`color · color-border-strong\n\n`--tui-color-danger`color · color-danger\n\n`--tui-color-danger-surface`color · color-danger-surface\n\n`--tui-color-danger-surface-text`color · color-danger-surface-text\n\n`--tui-color-focus`color · color-focus\n\n`--tui-color-focus-ring`color · color-focus-ring\n\n`--tui-color-header-bg`color · color-header-bg\n\n`--tui-color-header-border`color · color-header-border\n\n`--tui-color-heading`color · color-heading\n\n`--tui-color-info`color · color-info\n\n`--tui-color-link`color · color-link\n\n`--tui-color-neutral-bg`color · color-neutral-bg\n\n`--tui-color-neutral-bg-hover`color · color-neutral-bg-hover\n\n`--tui-color-neutral-text`color · color-neutral-text\n\n`--tui-color-overlay-bg`color · color-overlay-bg\n\n`--tui-color-panel-bg`color · color-panel-bg\n\n`--tui-color-panel-border`color · color-panel-border\n\n`--tui-color-primary-bg`color · color-primary-bg\n\n`--tui-color-primary-bg-hover`color · color-primary-bg-hover\n\n`--tui-color-primary-soft-bg`color · color-primary-soft-bg\n\n`--tui-color-primary-soft-text`color · color-primary-soft-text\n\n`--tui-color-primary-text`color · color-primary-text\n\n`--tui-color-secondary-bg`color · color-secondary-bg\n\n`--tui-color-secondary-bg-hover`color · color-secondary-bg-hover\n\n`--tui-color-secondary-soft-bg`color · color-secondary-soft-bg\n\n`--tui-color-secondary-soft-text`color · color-secondary-soft-text\n\n`--tui-color-secondary-text`color · color-secondary-text\n\n`--tui-color-selection-bg`color · color-selection-bg\n\n`--tui-color-selection-text`color · color-selection-text\n\n`--tui-color-sidebar-bg`color · color-sidebar-bg\n\n`--tui-color-sidebar-border`color · color-sidebar-border\n\n`--tui-color-success`color · color-success\n\n`--tui-color-surface`color · color-surface\n\n`--tui-color-surface-raised`color · color-surface-raised\n\n`--tui-color-surface-subtle`color · color-surface-subtle\n\n`--tui-color-text`color · color-text\n\n`--tui-color-text-muted`color · color-text-muted\n\n`--tui-color-warning`color · color-warning\n\n`--tui-focus-offset`focus · focus-offset\n\n`--tui-focus-width`focus · focus-width\n\n`--tui-font-family`typography · font-family\n\n`--tui-font-family-heading`typography · font-family-heading\n\n`--tui-font-family-text`typography · font-family-text\n\n`--tui-font-size-body`typography · font-size-body\n\n`--tui-font-size-caption`typography · font-size-caption\n\n`--tui-font-size-h1`typography · font-size-h1\n\n`--tui-font-size-h2`typography · font-size-h2\n\n`--tui-font-size-h3`typography · font-size-h3\n\n`--tui-font-size-label`typography · font-size-label\n\n`--tui-glass-chrome-alpha`effects · glass-chrome-alpha\n\n`--tui-interaction-active-scale`interaction · interaction-active-scale\n\n`--tui-interaction-disabled-opacity`interaction · interaction-disabled-opacity\n\n`--tui-interaction-focus-alpha`interaction · interaction-focus-alpha\n\n`--tui-interaction-hover-lift`interaction · interaction-hover-lift\n\n`--tui-interaction-hover-shadow-opacity`interaction · interaction-hover-shadow-opacity\n\n`--tui-interaction-transition-base`interaction · interaction-transition-base\n\n`--tui-interaction-transition-fast`interaction · interaction-transition-fast\n\n`--tui-motion-base`motion · motion-base\n\n`--tui-motion-ease`motion · motion-ease\n\n`--tui-motion-fast`motion · motion-fast\n\n`--tui-motion-slow`motion · motion-slow\n\n`--tui-neutral-100`color · neutral-100\n\n`--tui-neutral-200`color · neutral-200\n\n`--tui-neutral-300`color · neutral-300\n\n`--tui-neutral-400`color · neutral-400\n\n`--tui-neutral-50`color · neutral-50\n\n`--tui-neutral-500`color · neutral-500\n\n`--tui-neutral-600`color · neutral-600\n\n`--tui-neutral-700`color · neutral-700\n\n`--tui-neutral-800`color · neutral-800\n\n`--tui-neutral-900`color · neutral-900\n\n`--tui-neutral-950`color · neutral-950\n\n`--tui-opacity-disabled`opacity · opacity-disabled\n\n`--tui-opacity-muted`opacity · opacity-muted\n\n`--tui-primary-100`color · primary-100\n\n`--tui-primary-200`color · primary-200\n\n`--tui-primary-300`color · primary-300\n\n`--tui-primary-400`color · primary-400\n\n`--tui-primary-50`color · primary-50\n\n`--tui-primary-500`color · primary-500\n\n`--tui-primary-600`color · primary-600\n\n`--tui-primary-700`color · primary-700\n\n`--tui-primary-800`color · primary-800\n\n`--tui-primary-900`color · primary-900\n\n`--tui-primary-950`color · primary-950\n\n`--tui-radius-control`radius · radius-control\n\n`--tui-radius-lg`radius · radius-lg\n\n`--tui-radius-md`radius · radius-md\n\n`--tui-radius-sm`radius · radius-sm\n\n`--tui-radius-surface`radius · radius-surface\n\n`--tui-secondary-100`color · secondary-100\n\n`--tui-secondary-200`color · secondary-200\n\n`--tui-secondary-300`color · secondary-300\n\n`--tui-secondary-400`color · secondary-400\n\n`--tui-secondary-50`color · secondary-50\n\n`--tui-secondary-500`color · secondary-500\n\n`--tui-secondary-600`color · secondary-600\n\n`--tui-secondary-700`color · secondary-700\n\n`--tui-secondary-800`color · secondary-800\n\n`--tui-secondary-900`color · secondary-900\n\n`--tui-secondary-950`color · secondary-950\n\n`--tui-shadow-lg`effects · shadow-lg\n\n`--tui-shadow-md`effects · shadow-md\n\n`--tui-shadow-sm`effects · shadow-sm\n\n`--tui-size-lg`sizing · size-lg\n\n`--tui-size-md`sizing · size-md\n\n`--tui-size-sm`sizing · size-sm\n\n`--tui-size-xl`sizing · size-xl\n\n`--tui-size-xs`sizing · size-xs\n\n`--tui-space-1`spacing · space-1\n\n`--tui-space-2`spacing · space-2\n\n`--tui-space-3`spacing · space-3\n\n`--tui-space-4`spacing · space-4\n\n`--tui-space-5`spacing · space-5\n\n`--tui-space-6`spacing · space-6"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:theme-runtime",
      "section": "ui",
      "slug": "theme-runtime",
      "title": "Theme runtime",
      "description": "Control light, dark, and system modes through a small store-backed controller without adding a UI provider.",
      "keywords": [
        "theme controller",
        "dark mode",
        "system mode",
        "localStorage"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Control light, dark, and system modes through a small store-backed controller without adding a UI provider."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/theme-runtime",
      "sections": [
        {
          "id": "controller-api",
          "title": "Theme controller API",
          "markdown": "**Create src/theme-controller.ts**\n\n```ts\nimport {\n  createThemeController,\n  mountThemeController,\n  subscribeTheme\n} from \"@tavojs/ui/theme\";\n\nexport const theme = createThemeController(\"system\");\nexport const stopThemeRuntime = mountThemeController(theme);\nexport const unsubscribeTheme = subscribeTheme(theme, (snapshot) => {\n  console.log(snapshot.mode, snapshot.resolvedMode);\n}, { immediate: true });\n\nexport function setThemeMode(mode: \"light\" | \"dark\" | \"system\") {\n  theme.setMode(mode);\n}\n\nexport function toggleThemeMode() {\n  theme.toggleMode();\n}\n```\n\n**CSS injection and runtime state are separate**\n\nThe `tavoUi` plugin consumes `tavo-ui.config.json` during development and builds to generate CSS. It does not expose the config object in browser code or create this controller. Pass the configured `defaultTheme` directly to `createThemeController` for the normal auto-injected workflow.\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`createThemeController(mode)`\n\n`ThemeController`\n\n\"system\"\n\nReads a valid saved choice, creates the state store, and exposes mode actions.\n\n`createThemeControllerFromConfig(config)`\n\n`ThemeController`\n\nconfig default or system\n\nOptional convenience when browser code deliberately imports the theme config. The plugin does not pass its build-time config into runtime code.\n\n`mountThemeController(controller)`\n\n`cleanup function`\n\n—\n\nSynchronizes the document and starts watching system preference.\n\n`getThemeSnapshot(controller)`\n\n`ThemeSnapshot`\n\ncurrent state\n\nReturns mode, `resolvedMode`, `setMode`, and `toggleMode`.\n\n`subscribeTheme(controller, listener, options)`\n\n`unsubscribe function`\n\nimmediate: false\n\nPublishes a complete snapshot after state changes."
        },
        {
          "id": "mode-behavior",
          "title": "Mode, persistence, and system behavior",
          "markdown": "-   The document attribute is `data-tavo-theme`. Explicit light or dark sets it; system removes it so generated media-query CSS can decide.\n    \n-   The saved key is `tavo-ui`.theme. A valid saved light, dark, or system value wins over the default passed to `createThemeController`.\n    \n-   System resolves with `prefers-color-scheme` and updates only while the selected mode remains system.\n    \n-   `toggleMode` chooses the explicit opposite of `resolvedMode`, so it leaves system mode.\n    \n-   Blocked or unavailable local storage does not stop theme switching.\n    \n-   Call both cleanup functions when the application shell unmounts or replaces the controller.\n    \n\n**There is no ThemeProvider**\n\nComponents read CSS variables, not context. Keep one controller at application-shell scope and pass snapshots or actions only to the controls that need them."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:responsive-styling",
      "section": "ui",
      "slug": "responsive-styling",
      "title": "Responsive styling",
      "description": "Express mobile-first layout changes through responsive component props and sx using the web package's published breakpoints.",
      "keywords": [
        "responsive",
        "sx",
        "breakpoints",
        "visibility"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Express mobile-first layout changes through responsive component props and sx using the web package's published breakpoints."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/responsive-styling",
      "sections": [
        {
          "id": "mobile-first",
          "title": "Read responsive values mobile-first",
          "markdown": "base applies at every width. sm, md, and lg begin at their published minimum widths of 480px, 768px, and 1024px and continue upward until a later value overrides them. This applies to responsive layout props and breakpoint blocks inside sx. Theme config can emit different breakpoint variables for custom tooling, but it does not rebuild packaged component media queries.\n\n**Reference Reference snippet**\n\n```tsx\nimport { Box, Grid } from \"@tavojs/ui\";\n\nexport const ProjectGrid = () => {\n  return (\n    <Box padding={{ base: \"sm\", md: \"lg\" }}>\n      <Grid\n        columns={{ base: 1, sm: 2, lg: 3 }}\n        spacing={{ base: \"sm\", lg: \"lg\" }}\n      />\n    </Box>\n  );\n};\n```"
        },
        {
          "id": "sx",
          "title": "Use sx for local token-aware exceptions",
          "markdown": "Prefer named component props for common layout because they communicate intent. Use sx for a local style that still needs responsive values, pseudo selectors, or nested selectors and does not deserve a reusable class.\n\n**Reference Reference snippet**\n\n```tsx\n<Box sx={{\n  base: { display: \"none\" },\n  lg: { display: \"flex\", gap: \"var(--tui-space-4)\" },\n  \"&:focus-within\": { outline: \"2px solid var(--tui-color-focus-ring)\" }\n}} />\n```"
        },
        {
          "id": "visibility",
          "title": "Avoid inverted visibility rules",
          "markdown": "A value at sm does not describe widths below sm. To show something only on desktop, hide it at base and restore its display at lg. To hide something from tablet upward, leave the base display alone and set display none at md.\n\n**Breakpoints and viewport scaling are different**\n\nBreakpoints switch layout at discrete widths. viewport smoothly changes the root font size so rem-based components scale between mobile and desktop."
        },
        {
          "id": "sx-root-contract",
          "title": "Know where sx is applied",
          "markdown": "sx converts `camelCase` declarations to CSS, supports nested selectors containing &, and emits mobile-first breakpoint rules. Generated rules live in @layer `tavo-ui`.overrides, after component styles. The runtime keeps a bounded cache of 256 style records and retains styles while their elements remain mounted.\n\n-   base applies at every width; sm, md, and lg add min-width rules.\n    \n-   Use &:hover, &:focus-visible, &\\[`data-state`\\='open'\\], and descendant selectors for local states.\n    \n-   Nested at-rules are supported. A nested object without an at-rule or & selector is ignored rather than converted to CSS.\n    \n-   sx is consumed by `Tavo.js` UI. It is not forwarded as a DOM attribute.\n    \n-   A raw DOM node or arbitrary custom component does not process sx unless a `Tavo.js` UI component owns that prop."
        },
        {
          "id": "responsive-types",
          "title": "Read the responsive type contract",
          "markdown": "-   A scalar responsive prop applies at every width.\n    \n-   base applies at every width; sm, md, and lg are mobile-first min-width overrides.\n    \n-   Omitted lower-width values preserve the component default or the preceding cascade value.\n    \n-   Use style for a static inline style and sx for generated responsive or selector-aware CSS.\n    \n\n**Reference Reference snippet**\n\n```ts\ntype Breakpoint = \"base\" | \"sm\" | \"md\" | \"lg\";\ntype ResponsiveValue<T> = T | Partial<Record<Breakpoint, T>>;\n\ntype SxPrimitive = string | number | boolean | null | undefined;\ntype SxStyleBlock = {\n  [propertyOrSelector: string]: SxPrimitive | SxStyleBlock;\n};\ntype Sx = SxStyleBlock | Partial<Record<Breakpoint, SxStyleBlock>>;\n```"
        },
        {
          "id": "compiled-breakpoint-contract",
          "title": "Use the breakpoints compiled into Tavo.js UI",
          "markdown": "Published web components and the sx runtime currently compile sm at 480px, md at 768px, and lg at 1024px. Responsive component props, generated sx rules, and the published SCSS helper use those thresholds.\n\n**Project breakpoint config does not retarget packaged media queries**\n\nbreakpoints in theme config is exposed in token and build output for tooling, but the current package does not rebuild component SCSS or the `JavaScript` sx runtime for each application. Keep responsive UI on 480/768/1024 until custom runtime breakpoints are supported."
        },
        {
          "id": "sx-syntax-reference",
          "title": "Write selectors that the sx compiler understands",
          "markdown": "-   Use `camelCase` CSS properties; they are serialized to kebab-case.\n    \n-   Nested selector keys must contain &. Comma-separated selectors replace each & with the generated class.\n    \n-   Nested at-rules are accepted when the key starts with @.\n    \n-   null, undefined, and false declarations are omitted.\n    \n-   Numbers are serialized as numbers; add px, rem, percent, or another unit when CSS requires one.\n    \n-   A nested object under an arbitrary key such as selectors is ignored rather than treated as a selector group.\n    \n\n**Reference Reference snippet**\n\n```tsx\n<Box\n  sx={{\n    display: \"none\",\n    \"&:focus-within\": {\n      outline: \"2px solid var(--tui-color-focus-ring)\"\n    },\n    \"&[data-state='open'], &:hover\": { opacity: 1 },\n    lg: {\n      display: \"flex\",\n      gap: \"var(--tui-space-4)\",\n      \"&:hover\": { transform: \"translateY(-1px)\" }\n    }\n  }}\n/>\n```"
        },
        {
          "id": "sx-runtime-and-cascade",
          "title": "Understand sx generation, SSR, and cleanup",
          "markdown": "-   sx content is serialized and hashed into a deterministic tsx\\_\\* class and `tavo-ui`.sx.\\* style ID.\n    \n-   Identical style objects reuse the same cached rule.\n    \n-   Rules are emitted in @layer `tavo-ui`.overrides after @layer `tavo-ui`.components, so sx overrides component defaults without !important.\n    \n-   During SSR, rules enter `Tavo.js`'s active style registry. Hydration discovers existing `data-tavo-style` nodes instead of duplicating them.\n    \n-   The client cache retains 256 distinct sx records. Evicted styles stay mounted while a rendered component still references them, then clean up after release.\n    \n-   Only components that process sx can compile it. Raw DOM nodes and arbitrary imported SVG components need a `Tavo.js` UI wrapper such as Box or Icon."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:composition-and-imports",
      "section": "ui",
      "slug": "composition-and-imports",
      "title": "Composition and imports",
      "description": "Choose import paths by ownership and use compound components when a component owns structured child roles.",
      "keywords": [
        "imports",
        "composition",
        "compound",
        "subpath"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Choose import paths by ownership and use compound components when a component owns structured child roles."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/composition-and-imports",
      "sections": [
        {
          "id": "import-strategy",
          "title": "Choose an import style",
          "markdown": "All documented entry points are public. Root imports optimize convenience, focused imports make ownership explicit, and grouped imports collect components by product area.\n\n**Reference Reference snippet**\n\n```ts\nimport { Button, Card } from \"@tavojs/ui\";\nimport { SearchInput } from \"@tavojs/ui/search-input\";\nimport { Page, Shell } from \"@tavojs/ui/layout\";\nimport { Field, TextInput } from \"@tavojs/ui/forms\";\nimport { Table, Toolbar } from \"@tavojs/ui/data\";\n```\n\n**CSS-safe aliases**\n\nUse `@tavojs/ui/css` or `@tavojs/ui/css/button` only when build tooling benefits from an explicit CSS-safe path. Component APIs are identical."
        },
        {
          "id": "compound-components",
          "title": "Use compound APIs for owned structure",
          "markdown": "Compound members make structural roles visible and keep behavior inside the owning component. Use them for cards, tables, tabs, collapsibles, dialogs, and similar APIs instead of reconstructing their internal semantics with generic primitives.\n\n**Reference Reference snippet**\n\n```tsx\nimport { Card, Table } from \"@tavojs/ui\";\n\nexport const Report = () => {\n  return (\n    <Card.Root title=\"Delivery report\">\n      <Card.Content>Current project status</Card.Content>\n      <Card.Actions>Export report</Card.Actions>\n      <Table.Root>\n        <Table.Head>Column definitions</Table.Head>\n        <Table.Body>Project rows</Table.Body>\n      </Table.Root>\n    </Card.Root>\n  );\n};\n```"
        },
        {
          "id": "composition-rules",
          "title": "Keep composition predictable",
          "markdown": "-   Use layout primitives for spacing and alignment instead of margin conventions between child components.\n    \n-   Keep stateful behavior controlled by application state when the component API exposes value and change handlers.\n    \n-   Do not depend on internal class names or DOM nesting.\n    \n-   Use component metadata and the reference page to find related components and required compound members.\n    \n-   Prefer one public import style within a feature so refactors remain mechanical."
        },
        {
          "id": "base-props-reference",
          "title": "Shared component props",
          "markdown": "Most single-root Tavo.js UI components extend BaseProps. A component can narrow that contract when it owns a native control or a structured composition, so its component page remains the final authority.\n\nProp\n\nType\n\nBehavior\n\n`children`\n\n`Child`\n\nContent rendered by the component.\n\n`className`\n\n`string`\n\nA class added to the public root element.\n\n`sx`\n\n`Sx`\n\nToken-aware local styles compiled into the overrides layer.\n\n`style`\n\n`Record<string, unknown>`\n\nInline styles forwarded to the public root.\n\n`id, role, tabIndex`\n\n`native values`\n\nIdentity, semantics, and keyboard order for the root.\n\n`hidden, disabled`\n\n`boolean`\n\nNative state where the rendered element supports it.\n\n`events`\n\n`event handlers`\n\nClick, change, input, keyboard, focus, and blur handlers.\n\n`aria-* and data-*`\n\n`unknown`\n\nAccessible state and application-owned data attributes.\n\n**Passthrough belongs to a specific element**\n\nMulti-element components document where passthrough props land. For example, `SearchInput` applies sx to its wrapper but native input attributes to the search control; Dialog applies root props to its overlay rather than its inner dialog surface."
        },
        {
          "id": "shared-values",
          "title": "Sizes, tones, spacing, and responsive values",
          "markdown": "-   Size is sm, md, or lg. Interactive controls normally default to md.\n    \n-   Shared semantic tones are primary, secondary, neutral, success, warning, danger, and info. Individual components intentionally expose only the tones they can represent.\n    \n-   Spacing is sm, md, or lg. Gap additionally accepts none; layout gaps may also accept numbers or CSS strings.\n    \n-   `ResponsiveValue`<T> accepts one static value or an object keyed by base, sm, md, and lg.\n    \n-   Numeric responsive gaps become pixel values. Named gaps resolve through theme spacing tokens; CSS strings pass through unchanged.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Flex, Grid, Stack } from \"@tavojs/ui\";\n\nexport const ResultsLayout = () => {\n  return (\n    <Stack gap={{ base: \"sm\", lg: \"lg\" }}>\n      <Flex direction={{ base: \"column\", md: \"row\" }} gap=\"md\" />\n      <Grid columns={{ base: 1, sm: 2, lg: 4 }} spacing=\"md\" />\n    </Stack>\n  );\n};\n```"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:polymorphic-as",
      "section": "ui",
      "slug": "polymorphic-as",
      "title": "Polymorphic as",
      "description": "Change the semantic root of a compatible primitive while preserving its Tavo.js UI styling and public props.",
      "keywords": [
        "as",
        "polymorphic",
        "semantics",
        "root element"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Change the semantic root of a compatible primitive while preserving its Tavo.js UI styling and public props."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/polymorphic-as",
      "sections": [
        {
          "id": "use-as",
          "title": "Use as when styling and semantics differ",
          "markdown": "A primitive can be visually correct while its default root is not the right document landmark or content element. The as prop preserves computed styling, className, style, sx, accessibility attributes, events, and children while changing that root.\n\n**Reference Reference snippet**\n\n```tsx\nimport { Box, Card, Text } from \"@tavojs/ui\";\n\nexport const ReleaseNotes = () => {\n  return (\n    <Box as=\"main\" maxWidth=\"lg\" center fullWidth>\n      <Text as=\"h1\" variant=\"h1\">Release notes</Text>\n      <Card as=\"article\" title=\"Version 0.1\">Framework and UI changes</Card>\n    </Box>\n  );\n};\n```"
        },
        {
          "id": "avoid-as",
          "title": "Do not replace owned semantics",
          "markdown": "Inputs, table parts, menus, dialogs, and other structured components depend on native elements or compound composition. Use the dedicated component instead of turning a generic Box into a field or control.\n\n-   Prefer `TextInput` over Box as an input.\n    \n-   Prefer Button over a clickable Box.\n    \n-   Prefer Table compound members over manually styled row containers.\n    \n-   Prefer Link for navigation and Button for actions.\n    \n-   Do not change the root of a component whose reference page does not document as support."
        },
        {
          "id": "semantic-contract",
          "title": "Own the semantics you introduce",
          "markdown": "Changing the root changes native behavior. Keep heading levels meaningful, label repeated landmarks, provide button types inside forms, and make custom navigation adapters forward computed props to their actual root."
        },
        {
          "id": "polymorphic-reference",
          "title": "Polymorphic roots and forwarding",
          "markdown": "Single-root primitives that expose as use it in place of the component default. A custom component receives the generated `className`, style, children, accessibility attributes, events, and remaining public props and must forward them to its real root.\n\n-   Changing the root changes native behavior; styling does not recreate button, link, landmark, or heading semantics.\n    \n-   Do not replace owned input, table, dialog, or menu structure with as.\n    \n-   Button does not infer anchor rendering from href. Use as=\"a\" or a routing adapter.\n    \n-   When a disabled Button renders as an anchor or custom component, href is removed, `aria-disabled` is set, and `tabIndex` becomes -1."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:accessibility",
      "section": "ui",
      "slug": "accessibility",
      "title": "Accessibility",
      "description": "Combine component-provided keyboard and ARIA behavior with application-owned labels, semantics, state, and testing.",
      "keywords": [
        "accessibility",
        "a11y",
        "keyboard",
        "contrast",
        "aria"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Combine component-provided keyboard and ARIA behavior with application-owned labels, semantics, state, and testing."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/accessibility",
      "sections": [
        {
          "id": "shared-responsibility",
          "title": "Know what the component can guarantee",
          "markdown": "Tavo.js UI owns reusable mechanics such as dialog focus trapping, escape handling, tab keyboard navigation, menu movement, field message wiring, and status semantics. The application still owns meaningful labels, heading order, controlled open state, validation messages, and task completion flow.\n\n-   Give icon-only controls an accessible name.\n    \n-   Associate every field with a visible label or an intentional accessible label.\n    \n-   Keep focus visible and restore it after overlays close.\n    \n-   Use semantic Text and Box roots through as instead of making generic containers interactive.\n    \n-   Test the complete flow with keyboard and a screen reader, not only isolated component markup."
        },
        {
          "id": "forms-and-feedback",
          "title": "Connect fields to feedback",
          "markdown": "Field, FormLabel, FormControl, FormMessage, Fieldset, and Legend provide the structural pieces for understandable forms. Pair asynchronous feedback with visible status text or a Toast so the result remains clear without moving focus.\n\n**Reference Reference snippet**\n\n```tsx\nimport { Field, TextInput } from \"@tavojs/ui\";\n\nexport const EmailField = ({ error }: { error?: string }) => {\n  return (\n    <Field label=\"Email\" error={error} required>\n      <TextInput name=\"email\" type=\"email\" required />\n    </Field>\n  );\n};\n```"
        },
        {
          "id": "audits",
          "title": "Audit theme contrast",
          "markdown": "Theme auditing checks important foreground and background contrast pairs. Use the programmatic helper or the web CLI in continuous integration, then supplement it with rendered accessibility tests.\n\n**Reference Reference snippet**\n\n```ts\nimport { auditThemeA11y } from \"@tavojs/ui/a11y\";\n\nconst result = auditThemeA11y({\n  color: { light: { primary: \"#7C5CFF\" } },\n  accessibility: { contrast: \"AA\" }\n});\n```\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web audit --config tavo-ui.config.json\n```"
        },
        {
          "id": "focus-announcement",
          "title": "Focus and announcement helpers",
          "markdown": "-   `FocusTrap` defaults active to true and cycles Tab or Shift+Tab within its descendants. It does not create dialog semantics or restore focus by itself.\n    \n-   Spinner defaults size=md, tone=primary, and label=Loading; it exposes status semantics.\n    \n-   Toast defaults tone=info and `closeLabel`\\=Dismiss notification. `ToastStack` only positions a group; application state owns its queue and removal.\n    \n-   Overlay defaults open=true, scrim=soft, and center=true. It is a visual primitive, not a modal or focus manager."
        },
        {
          "id": "production-checklist",
          "title": "Review component behavior before shipping",
          "markdown": "-   Test keyboard behavior, focus order, and visible focus for every interactive composition.\n    \n-   Verify labels, descriptions, errors, current-page state, and dynamic announcements with assistive technology.\n    \n-   Test controlled components when values are missing, stale, empty, or outside the available item set.\n    \n-   Check long labels, localized content, reduced motion, high zoom, narrow viewports, and both color modes.\n    \n-   Use public props and compound members only. Treat internal classes and element nesting as implementation details."
        },
        {
          "id": "field-wiring-contract",
          "title": "Let Field own label and message wiring",
          "markdown": "Field derives an input ID, labels the first child VNode, and connects one generated message through `aria-describedby`. Message priority is error, warning, success, then hint.\n\n-   Pass hint, error, warning, or success to Field instead of adding an unconnected `FormMessage` manually.\n    \n-   Put the form control first. Field applies ID and ARIA wiring to only the first child VNode.\n    \n-   Field required displays the required marker but does not set the native input attribute. Pass required to the control too.\n    \n-   An explicit child ID wins over the Field ID and becomes the label target.\n    \n-   Existing `aria-describedby` values are preserved and combined with the generated message ID.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Field, TextInput } from \"@tavojs/ui\";\n\nexport const EmailField = ({ error }: { error?: string }) => {\n  return (\n    <Field\n      label=\"Email\"\n      hint=\"Used for account notices\"\n      error={error}\n      required\n    >\n      <TextInput name=\"email\" type=\"email\" required />\n    </Field>\n  );\n};\n```"
        },
        {
          "id": "a11y-audit-api",
          "title": "Read theme audit results precisely",
          "markdown": "-   Theme auditing checks light and dark token results. AA uses 4.5:1 and AAA uses 7:1.\n    \n-   `failOnViolation` makes token generation throw; `auditThemeA11y` catches those violations and returns error-severity issues.\n    \n-   Without `failOnViolation`, contrast findings are warnings and passed remains true.\n    \n-   The result describes theme-token contrast only; it does not audit component metadata or rendered application UI.\n    \n\n**Reference Reference snippet**\n\n```ts\nimport { auditThemeA11y } from \"@tavojs/ui/a11y\";\n\ntype A11yAuditIssue = {\n  id: string;\n  severity: \"error\" | \"warning\" | \"info\";\n  message: string;\n  target?: string;\n};\n\ntype A11yAuditResult = {\n  passed: boolean;\n  issues: A11yAuditIssue[];\n};\n\nconst result = auditThemeA11y(config);\n```"
        },
        {
          "id": "a11y-audit-boundary",
          "title": "Know what automated UI audits do not prove",
          "markdown": "Theme auditing checks six generated foreground/background pairs: normal text, muted text, headings, primary actions, secondary actions, and neutral actions. It skips non-hex values because their contrast cannot be resolved statically.\n\n-   The audit does not inspect rendered DOM, accessible names, heading order, landmarks, or duplicate IDs.\n    \n-   It does not exercise keyboard navigation, focus restoration, overlay stacking, or task completion flow.\n    \n-   It does not test browser zoom, forced colors, reduced motion, localization expansion, or screen-reader output.\n    \n-   It does not validate whether component documentation contains accessibility guidance.\n    \n-   Combine the theme check with browser automation, an accessibility engine, keyboard testing, and representative screen-reader testing."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:shared-component-props",
      "section": "ui",
      "slug": "shared-component-props",
      "title": "Shared component props",
      "description": "Understand BaseProps, shared values, responsive styling, polymorphic roots, passthrough, and where props are applied.",
      "keywords": [
        "BaseProps",
        "sx",
        "responsive",
        "tone",
        "size",
        "as"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Understand BaseProps, shared values, responsive styling, polymorphic roots, passthrough, and where props are applied."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/shared-component-props",
      "sections": [
        {
          "id": "base-props-reference",
          "title": "Shared component props",
          "markdown": "Most single-root Tavo.js UI components extend BaseProps. A component can narrow that contract when it owns a native control or a structured composition, so its component page remains the final authority.\n\nProp\n\nType\n\nBehavior\n\n`children`\n\n`Child`\n\nContent rendered by the component.\n\n`className`\n\n`string`\n\nA class added to the public root element.\n\n`sx`\n\n`Sx`\n\nToken-aware local styles compiled into the overrides layer.\n\n`style`\n\n`Record<string, unknown>`\n\nInline styles forwarded to the public root.\n\n`id, role, tabIndex`\n\n`native values`\n\nIdentity, semantics, and keyboard order for the root.\n\n`hidden, disabled`\n\n`boolean`\n\nNative state where the rendered element supports it.\n\n`events`\n\n`event handlers`\n\nClick, change, input, keyboard, focus, and blur handlers.\n\n`aria-* and data-*`\n\n`unknown`\n\nAccessible state and application-owned data attributes.\n\n**Passthrough belongs to a specific element**\n\nMulti-element components document where passthrough props land. For example, `SearchInput` applies sx to its wrapper but native input attributes to the search control; Dialog applies root props to its overlay rather than its inner dialog surface."
        },
        {
          "id": "shared-values",
          "title": "Sizes, tones, spacing, and responsive values",
          "markdown": "-   Size is sm, md, or lg. Interactive controls normally default to md.\n    \n-   Shared semantic tones are primary, secondary, neutral, success, warning, danger, and info. Individual components intentionally expose only the tones they can represent.\n    \n-   Spacing is sm, md, or lg. Gap additionally accepts none; layout gaps may also accept numbers or CSS strings.\n    \n-   `ResponsiveValue`<T> accepts one static value or an object keyed by base, sm, md, and lg.\n    \n-   Numeric responsive gaps become pixel values. Named gaps resolve through theme spacing tokens; CSS strings pass through unchanged.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Flex, Grid, Stack } from \"@tavojs/ui\";\n\nexport const ResultsLayout = () => {\n  return (\n    <Stack gap={{ base: \"sm\", lg: \"lg\" }}>\n      <Flex direction={{ base: \"column\", md: \"row\" }} gap=\"md\" />\n      <Grid columns={{ base: 1, sm: 2, lg: 4 }} spacing=\"md\" />\n    </Stack>\n  );\n};\n```"
        },
        {
          "id": "sx-root-contract",
          "title": "Know where sx is applied",
          "markdown": "sx converts `camelCase` declarations to CSS, supports nested selectors containing &, and emits mobile-first breakpoint rules. Generated rules live in @layer `tavo-ui`.overrides, after component styles. The runtime keeps a bounded cache of 256 style records and retains styles while their elements remain mounted.\n\n-   base applies at every width; sm, md, and lg add min-width rules.\n    \n-   Use &:hover, &:focus-visible, &\\[`data-state`\\='open'\\], and descendant selectors for local states.\n    \n-   Nested at-rules are supported. A nested object without an at-rule or & selector is ignored rather than converted to CSS.\n    \n-   sx is consumed by `Tavo.js` UI. It is not forwarded as a DOM attribute.\n    \n-   A raw DOM node or arbitrary custom component does not process sx unless a `Tavo.js` UI component owns that prop."
        },
        {
          "id": "polymorphic-reference",
          "title": "Polymorphic roots and forwarding",
          "markdown": "Single-root primitives that expose as use it in place of the component default. A custom component receives the generated `className`, style, children, accessibility attributes, events, and remaining public props and must forward them to its real root.\n\n-   Changing the root changes native behavior; styling does not recreate button, link, landmark, or heading semantics.\n    \n-   Do not replace owned input, table, dialog, or menu structure with as.\n    \n-   Button does not infer anchor rendering from href. Use as=\"a\" or a routing adapter.\n    \n-   When a disabled Button renders as an anchor or custom component, href is removed, `aria-disabled` is set, and `tabIndex` becomes -1."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:forms-and-state",
      "section": "ui",
      "slug": "forms-and-state",
      "title": "Forms and component state",
      "description": "Build labelled forms and understand controlled, initial, native, validation, search, and selection behavior.",
      "keywords": [
        "forms",
        "Field",
        "controlled",
        "validation",
        "SearchInput",
        "DatePicker"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Build labelled forms and understand controlled, initial, native, validation, search, and selection behavior."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/forms-and-state",
      "sections": [
        {
          "id": "state-models",
          "title": "Choose controlled, initial, and native state intentionally",
          "markdown": "`Tavo.js` UI does not impose one state model on every control. Native controls accept their normal checked, `defaultChecked`, value, or `defaultValue` inputs. Higher-level components such as Tabs, Calendar, `DatePicker`, `SearchInput` clearing, and `ToggleGroup` render from values supplied by the application.\n\n-   Checkbox, Radio, and Switch preserve native change events and form submission.\n    \n-   Tabs requires tabs and `activeId`. `onChange` reports the requested ID; the application must store it and rerender.\n    \n-   If Tabs receives an unknown `activeId`, it shows the first item. An empty tabs array renders no markup.\n    \n-   `ToggleGroup` uses checked native radio or checkbox inputs. Single mode defaults to a radiogroup; multiple mode defaults to a group.\n    \n-   `SearchInput` can render `defaultValue`, but its custom clear button is based on the controlled value prop.\n    \n\n**Do not mix value and defaultValue**\n\nUse value with an input/change handler for controlled state, or `defaultValue` for browser-owned initial state. `SearchInput` clearing is intentionally a controlled workflow: provide value, clearable, and `onClear` together."
        },
        {
          "id": "controlled-example",
          "title": "Own interactive state in a Tavo.js component",
          "markdown": "A controlled component renders the value that your application supplies and reports proposed changes through a callback. Keep that value in a `createTavo` model when the current choice must be visible to sibling UI or reset by another control.\n\nThis example is complete: typing updates the model, the message rerenders from the same value, and Clear resets both the input and the message.\n\n-   This model is local to each mounted `ProjectFilter` instance; it is not shared across requests or pages.\n    \n-   The view runs in the browser after hydration and again whenever `model.set` changes query.\n    \n-   Use a shared store only when two separately mounted consumers must observe the same value.\n    \n\n**Create src/components/ProjectFilter.tsx**\n\n```tsx\nimport { createTavo } from \"@tavojs/core\";\nimport { Button, SearchInput, Stack, Text } from \"@tavojs/ui\";\n\ntype FilterState = { query: string };\n\nexport const ProjectFilter = createTavo<Record<string, never>, FilterState>({\n  model: () => ({ query: \"\" }),\n  view: ({ state, model }) => (\n    <Stack gap=\"sm\">\n      <SearchInput\n        aria-label=\"Filter projects\"\n        placeholder=\"Filter projects\"\n        value={state.query}\n        clearable\n        onInput={(event) => model.set(\"query\", event.currentTarget.value)}\n        onClear={() => model.set(\"query\", \"\")}\n      />\n      <Text>\n        {state.query ? `Filtering for “${state.query}”` : \"Showing all projects\"}\n      </Text>\n      <Button\n        type=\"button\"\n        variant=\"text\"\n        onClick={() => model.set(\"query\", \"\")}\n      >\n        Reset filter\n      </Button>\n    </Stack>\n  )\n});\n```\n\n**Verify the ownership loop**\n\nRender <`ProjectFilter` /> in a page, type roadmap, and confirm the message becomes “Filtering for ‘roadmap’.” Use either clear action and confirm the input and message reset together."
        },
        {
          "id": "field-contract",
          "title": "Let Field wire one control",
          "markdown": "Field renders a visible label, annotates the first child control, and renders at most one message. It preserves an explicit control ID; otherwise it uses the Field id or derives one from a string label.\n\n-   Message priority is error, warning, success, then hint.\n    \n-   The message ID is appended to an existing `aria-describedby` value.\n    \n-   An error sets `aria-invalid`\\=true on the first control.\n    \n-   required shows a visual required marker; optional shows Optional. They do not replace the control's native required prop.\n    \n-   Only the first child control receives generated ID and description wiring. Use separate Field components for separate controls.\n    \n-   Repeated labels can derive repeated IDs. Supply stable unique id values in repeated rows and forms.\n    \n\n**Create src/components/EmailField.tsx**\n\n```tsx\nimport { Field, TextInput } from \"@tavojs/ui\";\n\nexport const EmailField = ({ value, error, onInput }) => {\n  return (\n    <Field\n      id=\"account-email\"\n      label=\"Email\"\n      hint=\"Used for receipts\"\n      error={error}\n      required\n    >\n      <TextInput type=\"email\" value={value} required onInput={onInput} />\n    </Field>\n  );\n};\n```"
        },
        {
          "id": "form-defaults",
          "title": "Form and selection defaults",
          "markdown": "-   Checkbox: indeterminate=false, size=md, tone=primary. Indeterminate adds `aria-checked`\\=mixed but remains application-controlled.\n    \n-   Radio: size=md and tone=primary. `RadioGroup` defaults to vertical and supplies its name to descendant Radio components that do not already have one.\n    \n-   Switch: size=md and tone=primary. It is a native checkbox styled as a switch.\n    \n-   Select and `TextInput`: size=md. Textarea defaults to rows=4 and resize=vertical.\n    \n-   Slider: min=0, max=100, step=1.\n    \n-   Toggle: pressed=false, size=md, variant=default. `ToggleGroup` defaults to type=single, size=md, and variant=default.\n    \n-   `FormControl` renders a form and defaults `fullWidth` to false. `FormControlLabel` defaults to size=md."
        },
        {
          "id": "search-date-contracts",
          "title": "Search, calendar, and date behavior",
          "markdown": "-   `SearchInput` always renders a native search control. size defaults to md, clearable and loading default to false, and `clearLabel` defaults to Clear search.\n    \n-   The clear action appears only when value is a non-empty controlled string, clearable is true, `onClear` exists, and the input is neither disabled nor read-only.\n    \n-   Calendar defaults locale to en-US. selected, min, and max use YYYY-MM-DD values; month is zero-based because it follows the `JavaScript` Date month contract.\n    \n-   `DatePicker` defaults size to md, open to false, and `renderCalendarWhenClosed` to true. Set the last option to false when closed calendar markup is unnecessary.\n    \n-   `DatePicker` reports native date changes and calendar selections through `onValueChange`.\n    \n-   Combobox is a native input plus datalist. `listId` defaults from the name, or to combobox-options when neither is supplied."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:actions-and-navigation",
      "section": "ui",
      "slug": "actions-and-navigation",
      "title": "Actions and navigation",
      "description": "Use Button, Link, navigation menus, breadcrumbs, and pagination with their exact rendering and state contracts.",
      "keywords": [
        "Button",
        "Link",
        "navigation",
        "router",
        "pagination",
        "disabled"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Use Button, Link, navigation menus, breadcrumbs, and pagination with their exact rendering and state contracts."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/actions-and-navigation",
      "sections": [
        {
          "id": "button-contract",
          "title": "Button rendering, loading, and defaults",
          "markdown": "-   Defaults are variant=solid, tone=primary, size=md, loading=false, disabled=false, `iconOnly`\\=false, and native type=button.\n    \n-   loading disables the action, renders a spinner, and exposes `aria-busy`\\=true.\n    \n-   `iconOnly` changes sizing but does not create an accessible name. Supply label or `aria-label`.\n    \n-   href is forwarded only when the root is an anchor or a custom component. It does not change the root by itself.\n    \n-   A disabled non-button loses href, receives `aria-disabled`\\=true, and is removed from sequential keyboard navigation.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Button, Icon } from \"@tavojs/ui\";\n\n<Button type=\"submit\" loading={saving}>Save changes</Button>\n<Button as=\"a\" href=\"/settings\" variant=\"soft\">Settings</Button>\n<Button iconOnly label=\"Add project\"><Icon viewBox=\"0 0 24 24\" /></Button>\n```"
        },
        {
          "id": "link-contract",
          "title": "Use href and to for different navigation paths",
          "markdown": "-   href behaves as a normal anchor destination.\n    \n-   to enables `Tavo.js` router navigation for same-origin destinations and localizes the path when an i18n service is active.\n    \n-   replace and scroll are passed to router navigation.\n    \n-   Modified clicks, downloads, external origins, non-\\_self targets, same-page hash changes, and prevented events retain native anchor behavior.\n    \n-   javascript:, data:, and vbscript: destinations are removed. A disabled Link also removes its destination and exposes `aria-disabled`\\=true.\n    \n-   Link computes `aria-current`\\=page for the current same-origin pathname unless the application supplies `aria-current` explicitly."
        },
        {
          "id": "navigation-components",
          "title": "Navigation component contracts",
          "markdown": "-   Breadcrumbs renders hierarchy navigation from items and marks entries with current=true as the current page.\n    \n-   `NavigationMenu` accepts items or custom children, defaults orientation to horizontal, and sets `aria-current`\\=page on current items.\n    \n-   Menubar accepts items or compound `Menubar.Item` children. An item with href renders as a link; otherwise it renders as a button.\n    \n-   Pagination requires page and `pageCount`, defaults `siblingCount` to 1 and label to Pagination, and reports requested pages through `onChange`.\n    \n-   Application state owns the current navigation destination and pagination page; the components do not mutate those values internally."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:dialogs-and-floating-content",
      "section": "ui",
      "slug": "dialogs-and-floating-content",
      "title": "Dialogs and floating content",
      "description": "Understand open state, focus, dismissal, keyboard navigation, positioning, and announcements across floating interfaces.",
      "keywords": [
        "Dialog",
        "Popover",
        "Sheet",
        "DropdownMenu",
        "focus",
        "Escape"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Understand open state, focus, dismissal, keyboard navigation, positioning, and announcements across floating interfaces."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/dialogs-and-floating-content",
      "sections": [
        {
          "id": "dialog-contract",
          "title": "Dialog and confirmation behavior",
          "markdown": "-   Dialog defaults open=false, `fullScreen`\\=false, and `closeLabel`\\=Close. A closed Dialog renders no DOM.\n    \n-   The open dialog uses role=dialog, `aria-modal`\\=true, `tabIndex`\\=-1, Escape closing, and Tab focus trapping.\n    \n-   Clicking the overlay calls `onClose`. An application `onClick` handler can `preventDefault` to keep it open.\n    \n-   Use `labelledBy` and `describedBy` for stable title and description relationships. Passing title without `labelledBy` displays a title but does not invent an ID.\n    \n-   `ConfirmDialog` defaults title to Confirm action, labels to Confirm and Cancel, and tone to danger. Both actions are application callbacks.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Dialog, Text } from \"@tavojs/ui\";\n\n<Dialog open={open} title=\"Invite teammate\" labelledBy=\"invite-title\" describedBy=\"invite-help\" onClose={close}>\n  <Text id=\"invite-help\">Choose an account role before sending.</Text>\n</Dialog>\n```"
        },
        {
          "id": "sheet-menu-contract",
          "title": "Sheets and menus",
          "markdown": "-   Sheet defaults open=false and side=right. Its Content repeats open and side because the compound API does not share hidden component state.\n    \n-   `Sheet.Content` uses dialog semantics, Escape closing, and focus trapping. `Sheet.Close` defaults its accessible label to Close sheet.\n    \n-   `DropdownMenu` uses native details/summary structure, defaults open=false and align=end, and closes through `onClose` when Escape is pressed.\n    \n-   Menu items support `ArrowUp`, `ArrowDown`, Home, and End focus movement. An href item is a link; another item is a button.\n    \n-   A disabled link item removes href, sets `aria-disabled`, and uses `tabIndex`\\=-1."
        },
        {
          "id": "popover-disclosure-contract",
          "title": "Popovers and disclosures",
          "markdown": "-   Popover defaults open=false and placement=bottom-start. Placement supports bottom-start, bottom-end, top-start, and top-end.\n    \n-   `Popover.Content` uses a directive to stay within an eight-pixel viewport margin, update on resize and scroll, and close its native details owner after an outside pointer press.\n    \n-   A custom use directive on `Popover.Content` is merged with the positioning directive rather than replacing it.\n    \n-   Collapsible is a styled native details element with Root, Trigger, and Content members. open defaults to false.\n    \n-   Tooltip defaults side=top and exposes role=tooltip. `HoverCard` uses focusable trigger and tooltip content but does not own application state.\n    \n\n**Native disclosure state**\n\nPopover, `DropdownMenu`, and Collapsible use details and summary. The open prop supplies rendered state, while the browser can also toggle the native element. Rerender from application state when the open value must remain authoritative."
        },
        {
          "id": "focus-announcement",
          "title": "Focus and announcement helpers",
          "markdown": "-   `FocusTrap` defaults active to true and cycles Tab or Shift+Tab within its descendants. It does not create dialog semantics or restore focus by itself.\n    \n-   Spinner defaults size=md, tone=primary, and label=Loading; it exposes status semantics.\n    \n-   Toast defaults tone=info and `closeLabel`\\=Dismiss notification. `ToastStack` only positions a group; application state owns its queue and removal.\n    \n-   Overlay defaults open=true, scrim=soft, and center=true. It is a visual primitive, not a modal or focus manager."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:layout-components",
      "section": "ui",
      "slug": "layout-components",
      "title": "Layout component reference",
      "description": "Use layout defaults, responsive primitives, compound structures, tables, split panes, and Resizable accurately.",
      "keywords": [
        "layout",
        "Flex",
        "Grid",
        "Stack",
        "Table",
        "Resizable"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Use layout defaults, responsive primitives, compound structures, tables, split panes, and Resizable accurately."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/layout-components",
      "sections": [
        {
          "id": "layout-defaults",
          "title": "Layout primitive defaults",
          "markdown": "-   Stack and Inline default gap to md. Stack lays out vertically; Inline lays out horizontally.\n    \n-   Flex defaults direction=row, align=stretch, justify=start, gap=none, and wrap=false.\n    \n-   Grid defaults to 12 columns, spacing=md, and align=stretch. `minItemWidth` switches it to auto-fit responsive columns.\n    \n-   Page defaults size=xl and padding=lg. Section defaults to a section root, `titleSize`\\=h2, and spacing=lg.\n    \n-   Toolbar defaults component=div, align=center, justify=between, gap=md, and wrap=true.\n    \n-   `AppBar` defaults component=header and position=sticky. Sidebar defaults padding=md.\n    \n-   Spacer defaults size=md and axis=block; it is `aria-hidden` because it is layout-only."
        },
        {
          "id": "compound-layouts",
          "title": "Shell, split panes, and owned structure",
          "markdown": "-   Shell accepts header, sidebar, rail, and children as explicit application regions. The application owns landmark labels and responsive visibility.\n    \n-   `SplitPane` accepts aside and children directly and also exposes Root, Aside, and Main members. It defaults side=left, ratio=1fr 2fr, and gap=md.\n    \n-   Card defaults component=section, tone=neutral, and surface=default. `Card.Root` exposes Header, Media, Content, and Actions members.\n    \n-   `Table.Root` owns native table structure inside a scroll wrapper. Use `Table.Caption` rather than a caption prop, and keep Head, Body, Row, `HeaderCell`, and Cell in valid table order.\n    \n-   `Table.Data` receives columns and rows, defaults compact=false, and stringifies a cell when the column has no render function."
        },
        {
          "id": "resizable-limit",
          "title": "Understand the current Resizable contract",
          "markdown": "Resizable currently provides layout anatomy rather than managed resizing. Root defaults direction to horizontal. Panel applies `defaultSize` as flex-basis. Handle renders a focusable separator, but the package does not yet attach pointer dragging, arrow-key resizing, value constraints, or change callbacks.\n\n**Do not promise interaction that is not implemented**\n\nUse Resizable for styled panel structure only. If users must resize panes, the application must add the interaction and update ARIA values, or use a dedicated resizing implementation."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:media-and-loading",
      "section": "ui",
      "slug": "media-and-loading",
      "title": "Media and loading states",
      "description": "Use optimized images, fallbacks, aspect ratios, avatars, code, progress, spinners, and skeletons predictably.",
      "keywords": [
        "Image",
        "Skeleton",
        "Spinner",
        "Progress",
        "Avatar",
        "CodeBlock"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Use optimized images, fallbacks, aspect ratios, avatars, code, progress, spinners, and skeletons predictably."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/media-and-loading",
      "sections": [
        {
          "id": "image-contract",
          "title": "Image optimization, sizing, and fallbacks",
          "markdown": "-   Image defaults src=null, alt to an empty string, and `objectFit`\\=cover.\n    \n-   A present src is rendered through the `Tavo.js` Core Image optimizer. SVG URLs and SVG data URLs default to unoptimized unless unoptimized is supplied explicitly.\n    \n-   Numeric width and height are passed to the image element. String dimensions become inline CSS values.\n    \n-   When both width and height exist, Image reserves a frame. A numeric pair also creates an aspect ratio to reduce layout shift.\n    \n-   When src is missing, skeleton takes precedence, then fallback. Without either, an empty image element is rendered.\n    \n-   sx applies to the frame when dimensions reserve space and to the image otherwise.\n    \n\n**Reference Reference snippet**\n\n```tsx\nimport { Image } from \"@tavojs/ui\";\n\n<Image\n  src=\"/dashboard.png\"\n  alt=\"Project dashboard with delivery metrics\"\n  width={1280}\n  height={720}\n  widths={[640, 960, 1280]}\n/>\n\n<Image src={null} alt=\"\" width=\"100%\" height={240} skeleton=\"rounded\" />\n```"
        },
        {
          "id": "content-defaults",
          "title": "Content component defaults",
          "markdown": "-   Avatar defaults src=null, alt to an empty string, and size=md. It falls back to initials, then string children.\n    \n-   `AspectRatio` defaults ratio to 16/9. Invalid, non-finite, or non-positive ratios fall back to that value.\n    \n-   Skeleton defaults width=100%, height=1rem, and variant=text.\n    \n-   Progress defaults value=0, max=100, tone=primary, size=md, and `showValue`\\=false. Values are clamped for visual width and ARIA output.\n    \n-   `StatusDot` defaults tone=neutral, size=md, and pulse=false. Supply label when status is not already present as nearby text."
        },
        {
          "id": "code-and-loading",
          "title": "Code and loading behavior",
          "markdown": "-   `CodeBlock` defaults `editorTheme`\\=auto, highlighted=true, and wrap=false.\n    \n-   Syntax highlighting is lightweight token classification rather than a full language parser. Very large or uncommon source can be rendered without highlighting.\n    \n-   Spinner communicates active loading. Skeleton reserves visual space. Progress communicates a known amount. Choose the component that matches what the application actually knows.\n    \n-   Loading placeholders still need a nearby accessible name or status when the wait is meaningful to assistive technology."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:component-limitations",
      "section": "ui",
      "slug": "component-limitations",
      "title": "Component limitations and pitfalls",
      "description": "Know which components provide complete interaction, which are structural primitives, and what applications still own.",
      "keywords": [
        "limitations",
        "pitfalls",
        "Portal",
        "Resizable",
        "accessibility"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Know which components provide complete interaction, which are structural primitives, and what applications still own."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/component-limitations",
      "sections": [
        {
          "id": "structural-primitives",
          "title": "Know which components are structural",
          "markdown": "-   Portal currently returns children in place. It does not mount into `document.body` or another DOM container.\n    \n-   Resizable supplies styled panels and a separator but no resizing interaction.\n    \n-   Overlay supplies scrim and centering only; it does not add modal semantics, focus trapping, Escape handling, or scroll locking.\n    \n-   `FocusTrap` manages Tab cycling only; it does not create a complete dialog or restore focus after unmount."
        },
        {
          "id": "composition-failures",
          "title": "Avoid common composition failures",
          "markdown": "-   Do not depend on generated class names or undocumented DOM nesting.\n    \n-   Do not pass a caption prop to `Table.Root`; render `Table.Caption` as a child.\n    \n-   Do not put multiple independently labelled controls in one Field and expect all of them to receive wiring.\n    \n-   Do not render Button with href and assume it becomes a link; choose as=\"a\" explicitly.\n    \n-   Do not use Box as a replacement for inputs, buttons, links, table parts, or dialogs.\n    \n-   Do not assume an open prop creates an `onOpenChange` callback. Use the callbacks documented by the specific component and native disclosure events where needed."
        },
        {
          "id": "production-checklist",
          "title": "Review component behavior before shipping",
          "markdown": "-   Test keyboard behavior, focus order, and visible focus for every interactive composition.\n    \n-   Verify labels, descriptions, errors, current-page state, and dynamic announcements with assistive technology.\n    \n-   Test controlled components when values are missing, stale, empty, or outside the available item set.\n    \n-   Check long labels, localized content, reduced motion, high zoom, narrow viewports, and both color modes.\n    \n-   Use public props and compound members only. Treat internal classes and element nesting as implementation details."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:cli",
      "section": "ui",
      "slug": "cli",
      "title": "Web UI CLI",
      "description": "Initialize, generate, validate, audit, inspect, and preview a web theme through the explicit tavo-ui web command group.",
      "keywords": [
        "tavo-ui",
        "cli",
        "generate",
        "audit",
        "tokens"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Initialize, generate, validate, audit, inspect, and preview a web theme through the explicit tavo-ui web command group."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/cli",
      "sections": [
        {
          "id": "web-commands",
          "title": "Use the explicit web command group",
          "markdown": "`tavo-ui` is bundled with `@tavojs/ui` and has a different responsibility from the framework's `tavo` command. Web commands forward to the installed UI package and read `tavo-ui.config.json` unless another path is provided.\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web init\nnpx tavo-ui web check --config tavo-ui.config.json\nnpx tavo-ui web audit --config tavo-ui.config.json\nnpx tavo-ui web tokens --config tavo-ui.config.json --mode light\nnpx tavo-ui web preview --config tavo-ui.config.json --out theme-preview.html\n```"
        },
        {
          "id": "workflow",
          "title": "Choose commands by outcome",
          "markdown": "-   init writes a starter config and refuses to overwrite an existing one.\n    \n-   generate writes physical theme CSS when a project needs a file outside plugin injection.\n    \n-   check prints readable validation and contrast diagnostics.\n    \n-   audit emits structured results for CI and tooling.\n    \n-   tokens prints JSON, CSS, or Figma-style token data for one or both modes.\n    \n-   preview writes a standalone HTML theme review without starting the application.\n    \n\n**Plugin-managed projects**\n\nWhen `tavoUi`() is enabled, normal development and production builds generate and inject the theme. A separate generate script is only necessary when another tool needs a physical CSS file."
        },
        {
          "id": "reference",
          "title": "Current UI CLI inventory",
          "markdown": "This snapshot comes from tavo-ui --help during documentation synchronization. Native tooling is listed by the binary but remains outside this web documentation phase.\n\n**Reference Reference snippet**\n\n```text\nUsage:\n  tavo-ui web <command> [options]\n  tavo-ui generate [options]\n\nCommands:\n  web generate      Generate the web theme stylesheet.\n  web check         Validate the web theme config.\n  web validate-css  Report unknown Tavo.js UI variables in application CSS.\n  web tokens        Print generated web theme tokens.\n  web init          Create a default web theme config.\n  web preview       Generate a web theme preview.\n  web audit         Print web theme audit results.\n\nInstall:\n  npm install @tavojs/ui              (includes tavo-ui for web)\n```"
        },
        {
          "id": "command-reference",
          "title": "Web command reference",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`init`\n\n`writes JSON`\n\n`tavo-ui.config.json`\n\nCreates a minimal schema-linked config and refuses to overwrite an existing file.\n\n`generate`\n\n`writes CSS`\n\n`src/theme/generated/default-theme.css`\n\nBuilds theme CSS. Generated theme files must use the .css extension.\n\n`check`\n\n`read only`\n\n—\n\nValidates config and prints readable contrast warnings.\n\n`validate-css`\n\n`read only`\n\nsrc\n\nFinds unknown `--tui-`\\* variables in CSS, SCSS, Sass, and Less files.\n\n`audit`\n\n`JSON output`\n\n—\n\nPrints passed, `warningCount`, and warnings for CI or custom tooling.\n\n`tokens`\n\n`stdout`\n\nall modes, JSON\n\nPrints resolved JSON, CSS variables, or Figma-style JSON.\n\n`preview`\n\n`writes HTML`\n\n`tavo-ui-preview.html`\n\nCreates a standalone visual review of surfaces, actions, and representative tokens.\n\n**Run Terminal**\n\n```bash\nnpx tavo-ui web validate-css --config tavo-ui.config.json src\nnpx tavo-ui web tokens --config tavo-ui.config.json --mode dark --format css\nnpx tavo-ui web preview --config tavo-ui.config.json --out theme-preview.html\n```"
        },
        {
          "id": "cli-options-and-errors",
          "title": "Options, defaults, and errors",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`--config, -c`\n\n`path`\n\n`tavo-ui.config.json`\n\nSelects the theme config for every command.\n\n`--out, -o`\n\n`path`\n\ncommand-specific\n\nSelects generate or preview output.\n\n`--mode`\n\n`\"light\" | \"dark\" | \"all\"`\n\n\"all\"\n\nSelects token output modes.\n\n`--format`\n\n`\"json\" | \"css\" | \"figma\"`\n\n\"json\"\n\nSelects token output format.\n\n-   Unknown commands, options, modes, formats, and missing option values exit with an error.\n    \n-   A missing config or nonexistent validate-css input path exits with an error.\n    \n-   validate-css ignores comments and strings, reports source locations, suggests tokens from the same group, and exits nonzero when diagnostics exist.\n    \n-   The dispatcher explains which platform package to install when `@tavojs/ui` is unavailable."
        },
        {
          "id": "ci-semantics",
          "title": "Use the CLI correctly in CI",
          "markdown": "**Merge package.json**\n\n```json\n{\n  \"scripts\": {\n    \"ui:check\": \"tavo-ui web check --config tavo-ui.config.json\",\n    \"ui:check-css\": \"tavo-ui web validate-css --config tavo-ui.config.json src\",\n    \"ui:audit\": \"tavo-ui web audit --config tavo-ui.config.json\"\n  }\n}\n```\n\n**Warnings and exit status are different**\n\naudit reports passed false when warnings exist, but warnings alone do not force a nonzero exit. Enable `accessibility.failOnViolation` to make contrast violations throw, or parse audit JSON when project policy treats every warning as blocking."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:css-and-plugin",
      "section": "ui",
      "slug": "css-and-plugin",
      "title": "CSS and plugin reference",
      "description": "Understand compiled component styles, project theme generation, SSR injection, file output, watching, and CSS cascade behavior.",
      "keywords": [
        "plugin",
        "CSS",
        "theme injection",
        "SSR styles",
        "tavoUi"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Understand compiled component styles, project theme generation, SSR injection, file output, watching, and CSS cascade behavior."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/css-and-plugin",
      "sections": [
        {
          "id": "plugin-options",
          "title": "Configure every tavoUi option",
          "markdown": "Option\n\nDefault\n\nBehavior\n\n`config`\n\n`tavo-ui.config.json`\n\nTheme config path, relative to app root or absolute.\n\n`out`\n\n`false`\n\nOptional physical CSS output path.\n\n`watch`\n\n`true`\n\nWatch config and trigger a full development reload.\n\n`silent`\n\n`false`\n\nSuppress generation info and contrast warnings.\n\n`required`\n\n`true`\n\nThrow when the theme config does not exist.\n\n`inject`\n\n`true`\n\nInject the virtual theme import into project source."
        },
        {
          "id": "plugin-build-lifecycle",
          "title": "Follow theme CSS through a build",
          "markdown": "-   At build start, the plugin reads JSON, resolves the theme, validates it, and creates the virtual `@tavojs/ui/theme.css` module.\n    \n-   With inject enabled, it prepends that import to project `JavaScript` and `TypeScript` source modules.\n    \n-   It excludes dependencies, build output, and `Tavo.js` or Vite configuration files.\n    \n-   An existing theme import is detected and not duplicated.\n    \n-   During SSR, the `Tavo.js` plugin document hook emits generated CSS as the `tavo-ui`.theme style record.\n    \n-   During development, a config change regenerates CSS, invalidates the virtual module, and requests a full page reload."
        },
        {
          "id": "plugin-file-output",
          "title": "Write physical CSS only when another tool needs it",
          "markdown": "Set out to write the generated CSS to a project path in addition to virtual delivery. The plugin creates parent directories and skips the write when file content is unchanged.\n\n**Reference Reference snippet**\n\n```ts\ntavoUi({\n  out: \"src/theme/generated/tavo-theme.css\",\n  inject: false\n})\n```\n\n**Own the import when inject is false**\n\nWriting a file does not attach that file to application output. Import it once from the application entry or pass it to the external consumer that requested it."
        },
        {
          "id": "css-cascade-contract",
          "title": "Work with the public cascade layers",
          "markdown": "-   The layer order is `tavo-ui`.theme, `tavo-ui`.components, then `tavo-ui`.overrides.\n    \n-   Published component rules occupy the components layer.\n    \n-   Generated sx rules occupy the overrides layer and therefore beat normal component defaults without !important.\n    \n-   Project classes outside a layer participate in the browser's unlayered cascade and can override layered declarations.\n    \n-   Avoid internal CSS module names and DOM nesting; use public props, sx, semantic variables, or a project class on the documented public root."
        },
        {
          "id": "style-registry-runtime",
          "title": "Reuse style records across SSR and hydration",
          "markdown": "-   Dynamic sx rules register through the framework-wide `Tavo.js` style runtime when it is available.\n    \n-   Server rendering collects those rules and emits deterministic `data-tavo-style` IDs.\n    \n-   Client initialization scans hydrated style records once per document and deduplicates later registrations.\n    \n-   Styles requested for cleanup remain connected while mounted components retain them.\n    \n-   The fallback client runtime inserts styles directly into document head when no framework style runtime is active."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:ssr-and-hydration",
      "section": "ui",
      "slug": "ssr-and-hydration",
      "title": "SSR and hydration",
      "description": "Understand automatic component style collection, project theme output, hydration deduplication, and runtime mode timing.",
      "keywords": [
        "SSR",
        "hydration",
        "styles",
        "CSP",
        "theme flash"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Understand automatic component style collection, project theme output, hydration deduplication, and runtime mode timing."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/ssr-and-hydration",
      "sections": [
        {
          "id": "automatic-style-flow",
          "title": "The normal SSR style flow is automatic",
          "markdown": "-   `Tavo.js` Core creates a style registry around server rendering and writes collected component styles into the document.\n    \n-   The `Tavo.js` UI plugin adds project theme variables to the server document as the `tavo-ui`.theme style record.\n    \n-   Hydration scans existing `data-tavo-style` records once and reuses them by id instead of appending duplicates.\n    \n-   Mounted components retain dynamic sx styles; cleanup removes an evicted style only after its final consumer releases it.\n    \n\n**No provider or manual registry setup**\n\nApplications rendered by `Tavo.js` use the framework registry automatically. Manual style registries belong to low-level custom renderers and framework integrations, not normal page code."
        },
        {
          "id": "runtime-mode-timing",
          "title": "Plan the first theme frame",
          "markdown": "Generated CSS can render light, dark, or system mode on the server. A saved browser preference is available only when the theme controller reads local storage. Mounting the controller after the first paint can therefore switch from the generated default to the saved explicit mode.\n\n-   Choose system when matching the device on the first frame is more important than restoring an explicit saved choice before hydration.\n    \n-   Choose a fixed default when the product requires deterministic server output.\n    \n-   The package does not currently expose a pre-hydration persistence bootstrap helper.\n    \n-   Theme runtime methods are server-safe: unavailable window, document, `matchMedia`, or storage APIs fall back or do nothing."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:testing",
      "section": "ui",
      "slug": "testing",
      "title": "Testing Tavo.js UI",
      "description": "Test product behavior through semantics, controlled state, keyboard flows, server output, and theme validation.",
      "keywords": [
        "testing",
        "keyboard",
        "SSR tests",
        "CI"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Test product behavior through semantics, controlled state, keyboard flows, server output, and theme validation."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/testing",
      "sections": [
        {
          "id": "application-tests",
          "title": "Test the application contract",
          "markdown": "-   Query by role, accessible name, label, visible text, and state instead of internal class names or DOM nesting.\n    \n-   Drive controlled props through the same application actions used in production and assert the resulting native state.\n    \n-   Cover keyboard movement, Escape behavior, focus restoration, validation messages, live announcements, and disabled actions.\n    \n-   Render important routes through the normal `Tavo.js` SSR path and verify usable initial markup before hydration.\n    \n-   Run theme, CSS token, and accessibility checks alongside unit and browser tests.\n    \n\n**No special test provider**\n\n`Tavo.js` UI does not publish a test renderer or provider. Use `Tavo.js`'s normal rendering and testing APIs, and test the semantic behavior developers and users depend on."
        },
        {
          "id": "ci-example",
          "title": "Add UI checks to continuous integration",
          "markdown": "**Run Terminal**\n\n```bash\nnpx tavo-ui web check --config tavo-ui.config.json\nnpx tavo-ui web validate-css --config tavo-ui.config.json src\nnpx tavo-ui web audit --config tavo-ui.config.json\nnpm run typecheck\nnpm test\n```"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:diagnostics",
      "section": "ui",
      "slug": "diagnostics",
      "title": "UI diagnostics",
      "description": "Trace missing styles, invalid configuration, unknown tokens, contrast warnings, and theme runtime problems.",
      "keywords": [
        "diagnostics",
        "troubleshooting",
        "missing CSS",
        "contrast"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Trace missing styles, invalid configuration, unknown tokens, contrast warnings, and theme runtime problems."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/diagnostics",
      "sections": [
        {
          "id": "diagnostic-map",
          "title": "Start from the visible symptom",
          "markdown": "API / option\n\nType\n\nDefault\n\nBehavior\n\n`Components are unstyled`\n\n`CSS loading`\n\n—\n\nConfirm the component comes from a public normal or /css entry point, not a source-internal path.\n\n`Variables are missing`\n\n`theme loading`\n\n—\n\nEnable `tavoUi`(), import `theme.css` once, or import one generated theme file.\n\n`Missing theme config`\n\n`plugin`\n\nrequired: true\n\nCreate the default config, correct config path, or intentionally use required: false.\n\n`Unknown --tui-* variable`\n\n`validate-css`\n\n—\n\nUse the reported file, line, column, and same-group suggestions to replace the token.\n\n`Contrast warning`\n\n`theme audit`\n\nAA\n\nAdjust brand anchors or semantic overrides; enable `failOnViolation` when it must block builds.\n\n`Mode does not persist`\n\n`runtime`\n\n—\n\nStorage may be blocked. Switching still works for the current document by design."
        },
        {
          "id": "programmatic-audits",
          "title": "Use theme audits and token metadata",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport { auditThemeA11y } from \"@tavojs/ui/a11y\";\nimport { getTavoUiTokenMetadata } from \"@tavojs/ui/theme\";\n\nconst themeAudit = auditThemeA11y(config);\nconst projectTokens = getTavoUiTokenMetadata(config);\n```\n\n-   Audit issues contain id, severity, message, and an optional target.\n    \n-   Theme issues are errors only when `failOnViolation` is enabled; otherwise they are warnings.\n    \n-   The theme audit checks generated contrast pairs, not rendered DOM or component-documentation metadata.\n    \n-   Token metadata includes built-in and config-defined tokens with CSS names and groups."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:performance",
      "section": "ui",
      "slug": "performance",
      "title": "UI performance",
      "description": "Keep imports, styles, responsive rules, and server-rendered component trees predictable without relying on unsupported size claims.",
      "keywords": [
        "performance",
        "bundle",
        "CSS",
        "SSR benchmark"
      ],
      "kind": "guide",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Keep imports, styles, responsive rules, and server-rendered component trees predictable without relying on unsupported size claims."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/performance",
      "sections": [
        {
          "id": "application-guidance",
          "title": "Keep application cost understandable",
          "markdown": "-   Use focused imports when ownership and review clarity matter; use grouped or root imports when they make a feature easier to maintain.\n    \n-   Do not load both plugin-managed theme CSS and a separately generated theme file.\n    \n-   Prefer component props for repeated responsive behavior and reserve sx for genuinely local exceptions.\n    \n-   Reuse stable sx objects where practical instead of generating a different rule on every render.\n    \n-   Keep large overlays, tables, charts, and route-only compositions out of application shells that render on every page.\n    \n\n**Avoid guessing from import spelling**\n\nPublic root, grouped, and focused entry points are supported, and CSS files are declared as package side effects. Measure the built application before making bundle-size claims or mechanical import rewrites."
        },
        {
          "id": "style-and-benchmark-contract",
          "title": "Understand style deduplication and benchmarks",
          "markdown": "The client style cache indexes hydrated style records once and then resolves them by id. Server benchmarks include both component markup and style collection, so a realistic regression review considers render time and output size together.\n\n-   The repository benchmark records mean, median, p95, min, max, operations per second, HTML bytes, style count, style bytes, and heap delta.\n    \n-   Missing component fixtures and render errors fail the benchmark.\n    \n-   Timing and size regressions are currently reported as warnings rather than enforced thresholds.\n    \n-   Repository benchmark methodology is useful for maintainers; applications should measure their own routes and interactions."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:theme-config-reference",
      "section": "ui",
      "slug": "theme-config-reference",
      "title": "Theme configuration reference",
      "description": "Look up every theme configuration group, default, range, merge rule, and validation failure.",
      "keywords": [
        "theme config",
        "TavoUiThemeConfig",
        "defaults",
        "validation",
        "preset"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Look up every theme configuration group, default, range, merge rule, and validation failure."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/theme-config-reference",
      "sections": [
        {
          "id": "config-color",
          "title": "Color, modes, and semantic status",
          "markdown": "-   `color.light.primary` is the only required value. Hex colors accept three or six digits.\n    \n-   `color.light.secondary` is derived from primary when omitted.\n    \n-   `color.dark` is partial and inherits missing anchors from light.\n    \n-   `color.method` defaults to analogous; supported values are analogous, monochromatic, and glass.\n    \n-   `color.fixShade` defaults to true. It centers the source at shade 500; false places it near its inferred lightness.\n    \n-   `defaultTheme` defaults to system. semantic values can be shared, then overridden under `semantic.light` or `semantic.dark`."
        },
        {
          "id": "config-scale",
          "title": "Scale and interaction fields",
          "markdown": "Scale field\n\nValid range\n\nDefault or derivation\n\n`unit`\n\n\\> 0\n\nunset; derives several scales when set\n\n`controlHeight`\n\n\\> 0\n\n40px at comfortable density\n\n`spacing`\n\n\\> 0\n\nunit or 20% of control height\n\n`radius`\n\n\\>= 0\n\nunit or 8px\n\n`shadow`\n\n\\>= 0\n\n0.5\n\n`border`\n\n\\>= 0\n\n1px\n\n`focus`\n\n\\>= 0\n\n3px or 0.375× unit\n\n`motion`\n\n\\>= 0\n\n1×\n\n`opacity`\n\n0–1\n\n0.58\n\n`blur`\n\n\\>= 0\n\n22px or 2.75× unit\n\n`glassAlpha`\n\n0–1\n\n0.62\n\nInteraction defaults are hoverLift 1px, hoverShadow 1, activeScale 0.98, focusAlpha 0.28, disabledOpacity equal to the scale opacity, and transition equal to the motion multiplier."
        },
        {
          "id": "config-typography-viewport",
          "title": "Typography and viewport fields",
          "markdown": "-   `fontFamily` is the shared fallback. `textFontFamily` and `headingFontFamily` override it independently.\n    \n-   `bodySize` defaults to 16px, `captionSize` to 13px, `labelSize` to 14px, and `headingScale` to 1.24 unless unit derives the first three.\n    \n-   All typography sizes and `headingScale` must be positive.\n    \n-   viewport defaults to `rootMin` 14, `rootMax` 16, `minWidth` 320, and `maxWidth` 960.\n    \n-   The generated root font-size uses clamp, so rem-backed dimensions scale smoothly between viewport bounds.\n    \n-   `rootMin` may equal `rootMax` for a fixed root size; `minWidth` must remain lower than `maxWidth`."
        },
        {
          "id": "config-output",
          "title": "Output, breakpoints, and token overrides",
          "markdown": "-   Generated token names use the canonical `--tui` prefix.\n    \n-   `output.selector` defaults to :root and `darkSelector` defaults to the `data-tavo-theme` dark selector.\n    \n-   `includeMediaQuery` defaults to true but emits a system-dark query only when `defaultTheme` is system.\n    \n-   breakpoint defaults are sm 480, md 768, and lg 1024 and must be strictly ascending.\n    \n-   The current web package compiles responsive props and sx at its published breakpoints; changing config emits different token/build data but does not rebuild packaged media queries.\n    \n-   `tokens.light` and `tokens.dark` are arbitrary name-to-string maps applied after generation."
        },
        {
          "id": "config-accessibility",
          "title": "Accessibility configuration",
          "markdown": "-   Without `accessibility.contrast`, theme generation produces no contrast warnings.\n    \n-   AA checks at 4.5:1 and AAA checks at 7:1 for six supported token pairs.\n    \n-   `failOnViolation` defaults to false. When true, `buildThemeTokens` and `buildTheme` throw when warnings exist.\n    \n-   `auditThemeA11y` converts those thrown violations into error-severity structured issues.\n    \n-   Token overrides can create violations after palette generation, so run the audit on the final project config."
        },
        {
          "id": "config-presets",
          "title": "Compare preset starting values",
          "markdown": "-   minimal: monochromatic, square quiet surfaces, no shadows, comfortable density, reduced motion.\n    \n-   glass: translucent glass color method, 22px blur, stronger surface rounding and moderate shadow.\n    \n-   enterprise: analogous fixed-shade palette, compact density, restrained radii and shadows.\n    \n-   editorial: spacious density, larger surface radius and heading scale, half-pixel borders.\n    \n-   dense: compact density, 36px medium controls, small radii and quiet shadows.\n    \n-   mobile: spacious density, 46px controls, larger control and surface radii, glass method.\n    \n-   monochrome: strict black primary, monochromatic method, zero radius and shadow.\n    \n\n**Presets merge before project config**\n\nEvery explicit project field wins over its preset value, including nested mode colors, semantic values, and token overrides."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:metadata",
      "section": "ui",
      "slug": "metadata",
      "title": "Component metadata",
      "description": "Query public component records for documentation, design-system tooling, search, and agent guidance.",
      "keywords": [
        "metadata",
        "registry",
        "component search",
        "agent guide"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Query public component records for documentation, design-system tooling, search, and agent guidance."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/metadata",
      "sections": [
        {
          "id": "metadata-api",
          "title": "Metadata query API",
          "markdown": "**Reference Reference snippet**\n\n```ts\nimport {\n  componentMetadata,\n  findComponentsForIntent,\n  getAgentComponentGuide,\n  getComponentMetadata,\n  getComponentsByCategory\n} from \"@tavojs/ui/metadata\";\n\nconst button = getComponentMetadata(\"button\");\nconst formComponents = getComponentsByCategory(\"forms\");\nconst suggestions = findComponentsForIntent(\"search with clear action\");\nconst compactGuide = getAgentComponentGuide(\"SearchInput\");\n```\n\nAPI / option\n\nType\n\nDefault\n\nBehavior\n\n`componentMetadata`\n\n`ComponentMetadata[]`\n\n80 records\n\nComplete public web component registry.\n\n`getComponentMetadata(name)`\n\n`ComponentMetadata | undefined`\n\n—\n\nCase-insensitive lookup by component name or slug.\n\n`getComponentsByCategory(category)`\n\n`ComponentMetadata[]`\n\n\\[\\]\n\nReturns a copy of one category collection.\n\n`findComponentsForIntent(query)`\n\n`ComponentMetadata[]`\n\n\\[\\]\n\nRanks exact names, slugs, search terms, categories, descriptions, props, examples, and accessibility guidance.\n\n`getAgentComponentGuide(name)`\n\n`AgentComponentGuide | undefined`\n\n—\n\nReturns compact imports, usage advice, props, examples, accessibility, and related components."
        },
        {
          "id": "metadata-contract",
          "title": "Read a component record",
          "markdown": "-   Identity: name, slug, category, `importPath`, `cssImportPath`, description, summary, and status.\n    \n-   Decision support: `whenToUse`, `avoidWhen`, `searchTerms`, and related components.\n    \n-   API: prop names, types, required flags, documented defaults, descriptions, and examples.\n    \n-   Composition: compound members, common pairings, and related components.\n    \n-   Accessibility: summary and checklist for the reusable component contract.\n    \n\nCategory values are layout, forms, data, feedback, content, recipes, and navigation. Status supports stable and experimental; every component in the current 80-component web catalog is stable."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:stability",
      "section": "ui",
      "slug": "stability",
      "title": "Versioning and stability",
      "description": "Check Core compatibility, component status, public entry points, and release notes before upgrading Tavo.js UI.",
      "keywords": [
        "version",
        "stability",
        "release"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Check Core compatibility, component status, public entry points, and release notes before upgrading Tavo.js UI."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/stability",
      "sections": [
        {
          "id": "current-contract",
          "title": "Current package contract",
          "markdown": "-   The current web package is in the 0.1 release line and declares `@tavojs/core` ^0.1.0 as a peer dependency.\n    \n-   Every component in the current public metadata catalog is marked stable.\n    \n-   The metadata type supports stable and experimental component status.\n    \n-   Only `package.json` entry points are public; source-internal paths are not application APIs.\n    \n-   The package changelog is the source of release additions and breaking changes.\n    \n\n**Stable does not mean frozen**\n\nThe package is pre-1.0. Check release notes and the installed Core peer range for each upgrade instead of assuming compatibility across unrelated minor release lines."
        },
        {
          "id": "upgrade-checklist",
          "title": "Upgrade without relying on internals",
          "markdown": "-   Read the changelog and confirm the matching `@tavojs/core` peer range.\n    \n-   Upgrade `@tavojs/ui` as one unit; its bundled `tavo-ui` command follows the same package version and is not upgraded separately.\n    \n-   Keep imports on root, grouped, focused, theme, plugin, metadata, or accessibility package entry points.\n    \n-   Run type checking, theme checks, CSS token validation, SSR tests, and full browser flows.\n    \n-   Regenerate physical theme assets when the project does not use plugin injection.\n    \n-   Inspect metadata status when tooling automatically recommends or scaffolds components."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:api",
      "section": "ui",
      "slug": "api",
      "title": "Tavo.js UI API reference",
      "description": "Reference Tavo.js UI theme, accessibility audit, metadata, and plugin APIs. Components and their props are documented on dedicated component pages.",
      "keywords": [
        "api",
        "exports",
        "types",
        "theme",
        "metadata",
        "plugin"
      ],
      "kind": "reference",
      "prerequisites": [
        "A Tavo.js application with @tavojs/ui installed."
      ],
      "outcomes": [
        "Reference Tavo.js UI theme, accessibility audit, metadata, and plugin APIs. Components and their props are documented on dedicated component pages."
      ],
      "runtime": [
        "browser",
        "server",
        "build"
      ],
      "related": [
        {
          "title": "Install Tavo.js UI",
          "href": "/docs/ui/installation",
          "description": "Add the component library and bundled theme command."
        }
      ],
      "canonicalPath": "/docs/ui/api",
      "sections": [
        {
          "id": "public-export-inventory",
          "title": "Browse by package entry point",
          "markdown": "[\n\n## Theme and tokens\n\n36 public exports`@tavojs/ui/theme`\n\nTheme configuration, token generation, runtime mode control, snapshots, subscriptions, and token metadata.\n\nRead guide →\n\n](/docs/ui/api/theme)[\n\n## Accessibility audits\n\n4 public exports`@tavojs/ui/a11y`\n\nComponent and theme accessibility audit functions, issues, severities, and result contracts.\n\nRead guide →\n\n](/docs/ui/api/accessibility)[\n\n## Component metadata\n\n13 public exports`@tavojs/ui/metadata`\n\nMachine-readable component guidance, composition metadata, examples, intent matching, and lookup helpers.\n\nRead guide →\n\n](/docs/ui/api/metadata)[\n\n## Tavo.js UI plugin\n\n2 public exports`@tavojs/ui/plugin`\n\nThe Tavo.js plugin descriptor and options for theme generation, injection, output, watching, and diagnostics.\n\nRead guide →\n\n](/docs/ui/api/plugin)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:api/theme",
      "section": "ui",
      "slug": "api/theme",
      "title": "Theme and tokens API",
      "description": "Theme configuration, token generation, runtime mode control, snapshots, subscriptions, and token metadata.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/ui/theme",
        "buildTheme",
        "createThemeController",
        "createThemeControllerFromConfig",
        "getTavoUiTokenGroup",
        "getTavoUiTokenMetadata",
        "getThemeSnapshot",
        "mountThemeController",
        "ResolvedThemeMode",
        "subscribeTheme",
        "TavoUiThemeConfig",
        "TavoUiTokenGroup",
        "tavoUiTokenMetadata",
        "TavoUiTokenMetadata",
        "tavoUiTokenNames",
        "ThemeAccessibilityConfig",
        "ThemeBreakpointsConfig",
        "ThemeBuildResult",
        "ThemeColorConfig",
        "ThemeColorPair",
        "ThemeController",
        "ThemeDensity",
        "ThemeInteractionConfig",
        "ThemeMethod",
        "ThemeMode",
        "ThemeModeSemanticConfig",
        "ThemeOutputConfig",
        "ThemePreset",
        "ThemeRamp",
        "ThemeResolvedColorSet",
        "ThemeRuntimeState",
        "ThemeScaleConfig",
        "ThemeSemanticConfig",
        "ThemeSnapshot",
        "ThemeTokenOverrides",
        "ThemeTypographyConfig",
        "ThemeViewportConfig"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/ui package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public theme and tokens contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "UI API index",
          "href": "/docs/ui/api",
          "description": "Browse every public Tavo.js UI package boundary."
        },
        {
          "title": "Versioning and stability",
          "href": "/docs/ui/stability",
          "description": "Understand UI compatibility and stability labels."
        }
      ],
      "canonicalPath": "/docs/ui/api/theme",
      "sections": [
        {
          "id": "public-exports",
          "title": "Theme and tokens exports",
          "markdown": "### @tavojs/ui/theme\n\nCanonical import boundary for every symbol in this section.\n\n#### buildTheme[#](#api-tavojs-ui-theme--buildtheme)\n\n```\nbuildTheme(config: TavoUiThemeConfig): ThemeBuildResult\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### createThemeController[#](#api-tavojs-ui-theme--createthemecontroller)\n\n```\ncreateThemeController(defaultMode?: ThemeMode | undefined): ThemeController\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### createThemeControllerFromConfig[#](#api-tavojs-ui-theme--createthemecontrollerfromconfig)\n\n```\ncreateThemeControllerFromConfig(config: Pick<TavoUiThemeConfig, \"defaultTheme\">): ThemeController\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### getTavoUiTokenGroup[#](#api-tavojs-ui-theme--gettavouitokengroup)\n\n```\ngetTavoUiTokenGroup(name: string): TavoUiTokenGroup\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### getTavoUiTokenMetadata[#](#api-tavojs-ui-theme--gettavouitokenmetadata)\n\n```\ngetTavoUiTokenMetadata(config?: TavoUiThemeConfig | undefined): TavoUiTokenMetadata[]\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### getThemeSnapshot[#](#api-tavojs-ui-theme--getthemesnapshot)\n\n```\ngetThemeSnapshot(controller: ThemeController): ThemeSnapshot\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### mountThemeController[#](#api-tavojs-ui-theme--mountthemecontroller)\n\n```\nmountThemeController(controller: ThemeController): () => void\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ResolvedThemeMode[#](#api-tavojs-ui-theme--resolvedthememode)\n\n```\ntype ResolvedThemeMode = \"light\" | \"dark\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### subscribeTheme[#](#api-tavojs-ui-theme--subscribetheme)\n\n```\nsubscribeTheme(controller: ThemeController, listener: (snapshot: ThemeSnapshot) => void, options?: { immediate?: boolean | undefined; } | undefined): () => void\n```\n\nPublic function exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### TavoUiThemeConfig[#](#api-tavojs-ui-theme--tavouithemeconfig)\n\n```\ntype TavoUiThemeConfig = {\n    $schema?: string;\n    preset?: ThemePreset;\n    defaultTheme?: ThemeMode;\n    color: ThemeColorConfig;\n    scale?: ThemeScaleConfig;\n    typography?: ThemeTypographyConfig;\n    interaction?: ThemeInteractionConfig;\n    viewport?: ThemeViewportConfig;\n    breakpoints?: ThemeBreakpointsConfig;\n    semantic?: ThemeModeSemanticConfig;\n    output?: ThemeOutputConfig;\n    accessibility?: ThemeAccessibilityConfig;\n    tokens?: ThemeTokenOverrides;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### TavoUiTokenGroup[#](#api-tavojs-ui-theme--tavouitokengroup)\n\n```\ntype TavoUiTokenGroup = \"color\" | \"sizing\" | \"spacing\" | \"radius\" | \"border\" | \"focus\" | \"motion\" | \"opacity\" | \"interaction\" | \"effects\" | \"breakpoint\" | \"typography\" | \"custom\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### tavoUiTokenMetadata[#](#api-tavojs-ui-theme--tavouitokenmetadata)\n\n```\ntavoUiTokenMetadata: readonly TavoUiTokenMetadata[]\n```\n\nComplete built-in Tavo.js UI CSS variable catalog.\n\n[Related guide](/docs/ui/theming)\n\n#### TavoUiTokenMetadata[#](#api-tavojs-ui-theme--tavouitokenmetadata)\n\n```\ntype TavoUiTokenMetadata = {\n    name: string;\n    cssVariable: `--tui-${string}`;\n    group: TavoUiTokenGroup;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### tavoUiTokenNames[#](#api-tavojs-ui-theme--tavouitokennames)\n\n```\ntavoUiTokenNames: readonly `--tui-${string}`[]\n```\n\nComplete built-in Tavo.js UI CSS variable names.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeAccessibilityConfig[#](#api-tavojs-ui-theme--themeaccessibilityconfig)\n\n```\ntype ThemeAccessibilityConfig = {\n    contrast?: \"AA\" | \"AAA\";\n    failOnViolation?: boolean;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeBreakpointsConfig[#](#api-tavojs-ui-theme--themebreakpointsconfig)\n\n```\ntype ThemeBreakpointsConfig = {\n    sm?: number;\n    md?: number;\n    lg?: number;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeBuildResult[#](#api-tavojs-ui-theme--themebuildresult)\n\n```\ntype ThemeBuildResult = {\n    cssText: string;\n    modes: Record<ResolvedThemeMode, ThemeResolvedColorSet>;\n    staticTokens: Record<string, string>;\n    config: TavoUiThemeConfig;\n    warnings: string[];\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeColorConfig[#](#api-tavojs-ui-theme--themecolorconfig)\n\n```\ntype ThemeColorConfig = {\n    light: ThemeColorPair;\n    dark?: Partial<ThemeColorPair>;\n    method?: ThemeMethod;\n    fixShade?: boolean;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeColorPair[#](#api-tavojs-ui-theme--themecolorpair)\n\n```\ntype ThemeColorPair = {\n    primary: string;\n    secondary?: string;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeController[#](#api-tavojs-ui-theme--themecontroller)\n\n```\ntype ThemeController = {\n    store: Store<ThemeRuntimeState>;\n    setMode(mode: ThemeMode): void;\n    toggleMode(): void;\n    syncDocument(): void;\n    watchSystem(): () => void;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeDensity[#](#api-tavojs-ui-theme--themedensity)\n\n```\ntype ThemeDensity = \"compact\" | \"comfortable\" | \"spacious\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeInteractionConfig[#](#api-tavojs-ui-theme--themeinteractionconfig)\n\n```\ntype ThemeInteractionConfig = {\n    hoverLift?: number;\n    hoverShadow?: number;\n    activeScale?: number;\n    focusAlpha?: number;\n    disabledOpacity?: number;\n    transition?: number;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeMethod[#](#api-tavojs-ui-theme--thememethod)\n\n```\ntype ThemeMethod = \"analogous\" | \"monochromatic\" | \"glass\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeMode[#](#api-tavojs-ui-theme--thememode)\n\n```\ntype ThemeMode = \"light\" | \"dark\" | \"system\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeModeSemanticConfig[#](#api-tavojs-ui-theme--thememodesemanticconfig)\n\n```\ntype ThemeModeSemanticConfig = ThemeSemanticConfig & {\n    light?: ThemeSemanticConfig;\n    dark?: ThemeSemanticConfig;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeOutputConfig[#](#api-tavojs-ui-theme--themeoutputconfig)\n\n```\ntype ThemeOutputConfig = {\n    selector?: string;\n    darkSelector?: string;\n    includeMediaQuery?: boolean;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemePreset[#](#api-tavojs-ui-theme--themepreset)\n\n```\ntype ThemePreset = \"minimal\" | \"glass\" | \"enterprise\" | \"editorial\" | \"dense\" | \"mobile\" | \"monochrome\";\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeRamp[#](#api-tavojs-ui-theme--themeramp)\n\n```\ntype ThemeRamp = Record<number, string>;\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeResolvedColorSet[#](#api-tavojs-ui-theme--themeresolvedcolorset)\n\n```\ntype ThemeResolvedColorSet = {\n    primary: ThemeRamp;\n    secondary: ThemeRamp;\n    neutral: ThemeRamp;\n    semantic: Required<ThemeSemanticConfig>;\n    tokens: Record<string, string>;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeRuntimeState[#](#api-tavojs-ui-theme--themeruntimestate)\n\n```\ntype ThemeRuntimeState = {\n    mode: ThemeMode;\n    resolvedMode: ResolvedThemeMode;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeScaleConfig[#](#api-tavojs-ui-theme--themescaleconfig)\n\n```\ntype ThemeScaleConfig = {\n    unit?: number;\n    controlHeight?: number;\n    spacing?: number;\n    radius?: number;\n    shadow?: number;\n    border?: number;\n    density?: ThemeDensity;\n    focus?: number;\n    motion?: number;\n    opacity?: number;\n    blur?: number;\n    glassAlpha?: number;\n    controlRadius?: number;\n    surfaceRadius?: number;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeSemanticConfig[#](#api-tavojs-ui-theme--themesemanticconfig)\n\n```\ntype ThemeSemanticConfig = {\n    success?: string;\n    warning?: string;\n    danger?: string;\n    info?: string;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeSnapshot[#](#api-tavojs-ui-theme--themesnapshot)\n\n```\ntype ThemeSnapshot = ThemeRuntimeState & {\n    setMode(mode: ThemeMode): void;\n    toggleMode(): void;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeTokenOverrides[#](#api-tavojs-ui-theme--themetokenoverrides)\n\n```\ntype ThemeTokenOverrides = Partial<Record<ResolvedThemeMode, Record<string, string>>>;\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeTypographyConfig[#](#api-tavojs-ui-theme--themetypographyconfig)\n\n```\ntype ThemeTypographyConfig = {\n    fontFamily?: string;\n    textFontFamily?: string;\n    headingFontFamily?: string;\n    bodySize?: number;\n    captionSize?: number;\n    labelSize?: number;\n    headingScale?: number;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)\n\n#### ThemeViewportConfig[#](#api-tavojs-ui-theme--themeviewportconfig)\n\n```\ntype ThemeViewportConfig = {\n    rootMin?: number;\n    rootMax?: number;\n    minWidth?: number;\n    maxWidth?: number;\n};\n```\n\nPublic type exported from @tavojs/ui/theme.\n\n[Related guide](/docs/ui/theming)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:api/accessibility",
      "section": "ui",
      "slug": "api/accessibility",
      "title": "Accessibility audits API",
      "description": "Component and theme accessibility audit functions, issues, severities, and result contracts.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/ui/a11y",
        "A11yAuditIssue",
        "A11yAuditResult",
        "A11yAuditSeverity",
        "auditThemeA11y"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/ui package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public accessibility audits contract from its canonical package boundary."
      ],
      "runtime": [
        "browser",
        "server"
      ],
      "related": [
        {
          "title": "UI API index",
          "href": "/docs/ui/api",
          "description": "Browse every public Tavo.js UI package boundary."
        },
        {
          "title": "Versioning and stability",
          "href": "/docs/ui/stability",
          "description": "Understand UI compatibility and stability labels."
        }
      ],
      "canonicalPath": "/docs/ui/api/accessibility",
      "sections": [
        {
          "id": "public-exports",
          "title": "Accessibility audits exports",
          "markdown": "### @tavojs/ui/a11y\n\nCanonical import boundary for every symbol in this section.\n\n#### A11yAuditIssue[#](#api-tavojs-ui-a11y--a11yauditissue)\n\n```\ntype A11yAuditIssue = {\n    id: string;\n    severity: A11yAuditSeverity;\n    message: string;\n    target?: string;\n};\n```\n\nPublic type exported from @tavojs/ui/a11y.\n\n[Related guide](/docs/ui/accessibility)\n\n#### A11yAuditResult[#](#api-tavojs-ui-a11y--a11yauditresult)\n\n```\ntype A11yAuditResult = {\n    passed: boolean;\n    issues: A11yAuditIssue[];\n};\n```\n\nPublic type exported from @tavojs/ui/a11y.\n\n[Related guide](/docs/ui/accessibility)\n\n#### A11yAuditSeverity[#](#api-tavojs-ui-a11y--a11yauditseverity)\n\n```\ntype A11yAuditSeverity = \"error\" | \"warning\" | \"info\";\n```\n\nPublic type exported from @tavojs/ui/a11y.\n\n[Related guide](/docs/ui/accessibility)\n\n#### auditThemeA11y[#](#api-tavojs-ui-a11y--auditthemea11y)\n\n```\nauditThemeA11y(config: TavoUiThemeConfig): A11yAuditResult\n```\n\nPublic function exported from @tavojs/ui/a11y.\n\n[Related guide](/docs/ui/accessibility)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:api/metadata",
      "section": "ui",
      "slug": "api/metadata",
      "title": "Component metadata API",
      "description": "Machine-readable component guidance, composition metadata, examples, intent matching, and lookup helpers.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/ui/metadata",
        "AgentComponentGuide",
        "ComponentAccessibilityGuidance",
        "ComponentCategory",
        "ComponentCompositionMetadata",
        "ComponentExample",
        "componentMetadata",
        "ComponentMetadata",
        "ComponentPropMetadata",
        "ComponentStatus",
        "findComponentsForIntent",
        "getAgentComponentGuide",
        "getComponentMetadata",
        "getComponentsByCategory"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/ui package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public component metadata contract from its canonical package boundary."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "UI API index",
          "href": "/docs/ui/api",
          "description": "Browse every public Tavo.js UI package boundary."
        },
        {
          "title": "Versioning and stability",
          "href": "/docs/ui/stability",
          "description": "Understand UI compatibility and stability labels."
        }
      ],
      "canonicalPath": "/docs/ui/api/metadata",
      "sections": [
        {
          "id": "public-exports",
          "title": "Component metadata exports",
          "markdown": "### @tavojs/ui/metadata\n\nCanonical import boundary for every symbol in this section.\n\n#### AgentComponentGuide[#](#api-tavojs-ui-metadata--agentcomponentguide)\n\n```\ntype AgentComponentGuide = {\n    component: string;\n    importPath: string;\n    cssImportPath: string;\n    summary: string;\n    whenToUse: string;\n    avoidWhen: string;\n    props: ComponentPropMetadata[];\n    examples: ComponentExample[];\n    accessibility: ComponentAccessibilityGuidance;\n    related: string[];\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentAccessibilityGuidance[#](#api-tavojs-ui-metadata--componentaccessibilityguidance)\n\n```\ntype ComponentAccessibilityGuidance = {\n    summary: string;\n    checklist: string[];\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentCategory[#](#api-tavojs-ui-metadata--componentcategory)\n\n```\ntype ComponentCategory = \"layout\" | \"forms\" | \"data\" | \"feedback\" | \"content\" | \"recipes\" | \"navigation\";\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentCompositionMetadata[#](#api-tavojs-ui-metadata--componentcompositionmetadata)\n\n```\ntype ComponentCompositionMetadata = {\n    related?: string[];\n    compoundMembers?: string[];\n    commonPairings?: string[];\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentExample[#](#api-tavojs-ui-metadata--componentexample)\n\n```\ntype ComponentExample = {\n    title: string;\n    code: string;\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### componentMetadata[#](#api-tavojs-ui-metadata--componentmetadata)\n\n```\ncomponentMetadata: ComponentMetadata[]\n```\n\nPublic value exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentMetadata[#](#api-tavojs-ui-metadata--componentmetadata)\n\n```\ntype ComponentMetadata = {\n    name: string;\n    slug: string;\n    category: ComponentCategory;\n    importPath: string;\n    cssImportPath: string;\n    description: string;\n    status: ComponentStatus;\n    summary: string;\n    whenToUse: string;\n    avoidWhen: string;\n    props: ComponentPropMetadata[];\n    examples: ComponentExample[];\n    composition: ComponentCompositionMetadata;\n    related?: string[];\n    accessibility?: string;\n    accessibilityGuidance: ComponentAccessibilityGuidance;\n    searchTerms: string[];\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentPropMetadata[#](#api-tavojs-ui-metadata--componentpropmetadata)\n\n```\ntype ComponentPropMetadata = {\n    name: string;\n    type: string;\n    required?: boolean;\n    defaultValue?: string;\n    description: string;\n};\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### ComponentStatus[#](#api-tavojs-ui-metadata--componentstatus)\n\n```\ntype ComponentStatus = \"stable\" | \"experimental\";\n```\n\nPublic type exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### findComponentsForIntent[#](#api-tavojs-ui-metadata--findcomponentsforintent)\n\n```\nfindComponentsForIntent(query: string): ComponentMetadata[]\n```\n\nPublic function exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### getAgentComponentGuide[#](#api-tavojs-ui-metadata--getagentcomponentguide)\n\n```\ngetAgentComponentGuide(name: string): AgentComponentGuide | undefined\n```\n\nPublic function exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### getComponentMetadata[#](#api-tavojs-ui-metadata--getcomponentmetadata)\n\n```\ngetComponentMetadata(name: string): ComponentMetadata | undefined\n```\n\nPublic function exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)\n\n#### getComponentsByCategory[#](#api-tavojs-ui-metadata--getcomponentsbycategory)\n\n```\ngetComponentsByCategory(category: ComponentCategory): ComponentMetadata[]\n```\n\nPublic function exported from @tavojs/ui/metadata.\n\n[Related guide](/docs/ui/metadata)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui:api/plugin",
      "section": "ui",
      "slug": "api/plugin",
      "title": "Tavo.js UI plugin API",
      "description": "The Tavo.js plugin descriptor and options for theme generation, injection, output, watching, and diagnostics.",
      "keywords": [
        "api",
        "reference",
        "@tavojs/ui/plugin",
        "tavoUi",
        "TavoUiPluginOptions"
      ],
      "kind": "reference",
      "prerequisites": [
        "The installed @tavojs/ui package whose declarations you need to inspect."
      ],
      "outcomes": [
        "Locate and import every public tavo.js ui plugin contract from its canonical package boundary."
      ],
      "runtime": [
        "build",
        "server",
        "browser"
      ],
      "related": [
        {
          "title": "UI API index",
          "href": "/docs/ui/api",
          "description": "Browse every public Tavo.js UI package boundary."
        },
        {
          "title": "Versioning and stability",
          "href": "/docs/ui/stability",
          "description": "Understand UI compatibility and stability labels."
        }
      ],
      "canonicalPath": "/docs/ui/api/plugin",
      "sections": [
        {
          "id": "public-exports",
          "title": "Tavo.js UI plugin exports",
          "markdown": "### @tavojs/ui/plugin\n\nCanonical import boundary for every symbol in this section.\n\n#### tavoUi[#](#api-tavojs-ui-plugin--tavoui)\n\n```\ntavoUi(options?: TavoUiPluginOptions | undefined): TavoPlugin\n```\n\nCreates the Tavo.js plugin descriptor for project theme generation. Build and server implementations stay lazy so Node-only theme generation code is not loaded while the framework compiles the plugin graph.\n\n[Related guide](/docs/ui/css-and-plugin)\n\n#### TavoUiPluginOptions[#](#api-tavojs-ui-plugin--tavouipluginoptions)\n\n```\ntype TavoUiPluginOptions = {\n    config?: string;\n    out?: string | false;\n    watch?: boolean;\n    silent?: boolean;\n    required?: boolean;\n    inject?: boolean;\n};\n```\n\nPublic type exported from @tavojs/ui/plugin.\n\n[Related guide](/docs/ui/css-and-plugin)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:index",
      "section": "ui-core",
      "slug": "",
      "title": "UI Core overview",
      "description": "Resolve Tavo.js theme configuration and tokens in platform-neutral tooling without importing a web or native renderer.",
      "keywords": [
        "ui core",
        "theme engine",
        "platform neutral",
        "tokens"
      ],
      "kind": "concept",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Resolve Tavo.js theme configuration and tokens in platform-neutral tooling without importing a web or native renderer."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core",
      "sections": [
        {
          "id": "boundary",
          "title": "Use UI Core only at a tooling boundary",
          "markdown": "@tavojs/ui-core validates theme configuration and returns color ramps, semantic modes, static tokens, resolved breakpoints, and accessibility warnings as plain data. It has no DOM, component renderer, Tavo.js runtime, Vite, CSS module, or React Native dependency.\n\n**Most web applications should not install this directly**\n\nUse @tavojs/ui for web components, theme CSS, runtime theme controls, and the web CLI. UI Core is for custom renderers, design-token exporters, build tools, and platform-neutral pipelines."
        },
        {
          "id": "pipeline",
          "title": "Understand the resolution pipeline",
          "markdown": "-   Validate the required config shape and supported values.\n    \n-   Apply the selected preset.\n    \n-   Merge explicit project values over preset defaults.\n    \n-   Resolve viewport and breakpoint values.\n    \n-   Generate light and dark color modes plus mode-independent tokens.\n    \n-   Collect contrast warnings or fail when configured to enforce them.\n    \n\nThe result contains plain records, so the consuming platform decides whether to emit CSS variables, native objects, JSON, or design-tool data."
        },
        {
          "id": "guides",
          "title": "Choose a UI Core guide",
          "markdown": "[\n\n## Resolve configuration\n\nLearn required values, preset precedence, overrides, and validation behavior.Read guide →\n\n](/docs/ui-core/config)[\n\n## Install for custom tooling\n\nAdd the platform-neutral package and export a validated token artifact without importing web components.Read guide →\n\n](/docs/ui-core/installation)[\n\n## Generate tokens\n\nUse the complete build result and emit platform-specific output.Read guide →\n\n](/docs/ui-core/tokens)[\n\n## Choose color behavior\n\nCompare presets, methods, ramps, and exact action colors.Read guide →\n\n](/docs/ui-core/presets-and-colors)[\n\n## Enforce constraints\n\nResolve responsive thresholds and contrast warnings.Read guide →\n\n](/docs/ui-core/breakpoints-and-accessibility)"
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:installation",
      "section": "ui-core",
      "slug": "installation",
      "title": "Install UI Core for tooling",
      "description": "Install the platform-neutral theme engine, export a deterministic token artifact, and fail CI when theme validation reports problems.",
      "keywords": [
        "install",
        "token export",
        "CI",
        "buildThemeTokens"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Install the platform-neutral theme engine, export a deterministic token artifact, and fail CI when theme validation reports problems."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/installation",
      "sections": [
        {
          "id": "choose-ui-core",
          "title": "Start at the correct package boundary",
          "markdown": "Install UI Core directly only when you are building a token exporter, design-tool integration, custom renderer, or another Node-based pipeline. A normal Tavo.js website should install @tavojs/ui and use its plugin and bundled tavo-ui command instead.\n\n**Run Terminal**\n\n```bash\nnpm install --save-dev @tavojs/ui-core\n```\n\n**Runtime boundary**\n\nThe exporter below runs in Node during build or CI. It returns and writes plain data; it does not render components, access the DOM, or inject CSS into an application."
        },
        {
          "id": "export-script",
          "title": "Create a deterministic token exporter",
          "markdown": "**Create scripts/export-tokens.mjs**\n\n```js\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { buildThemeTokens } from \"@tavojs/ui-core\";\n\nconst theme = buildThemeTokens({\n  color: {\n    light: {\n      primary: \"#116a67\",\n      secondary: \"#d86c3d\",\n    },\n  },\n  accessibility: {\n    contrast: \"AA\",\n    failOnViolation: false,\n  },\n});\n\nconst artifact = {\n  schemaVersion: 1,\n  breakpoints: theme.breakpoints,\n  modes: {\n    light: {\n      ...theme.staticTokens,\n      ...theme.modes.light.tokens,\n    },\n    dark: {\n      ...theme.staticTokens,\n      ...theme.modes.dark.tokens,\n    },\n  },\n  warnings: theme.warnings,\n};\n\nawait mkdir(\"dist\", { recursive: true });\nawait writeFile(\n  \"dist/design-tokens.json\",\n  `${JSON.stringify(artifact, null, 2)}\n`,\n);\n\nif (theme.warnings.length > 0) {\n  console.error(theme.warnings.join(\"\n\"));\n  process.exitCode = 1;\n}\n```\n\n**Merge package.json**\n\n```json\n{\n  \"scripts\": {\n    \"tokens:export\": \"node scripts/export-tokens.mjs\"\n  }\n}\n```"
        },
        {
          "id": "verify-output",
          "title": "Run it and inspect the output contract",
          "markdown": "**Run Terminal**\n\n```bash\nnpm run tokens:export\nnode --check scripts/export-tokens.mjs\n```\n\nA successful run creates dist/design-tokens.json with schemaVersion, breakpoints, light and dark token maps, and a warnings array. The command exits nonzero when contrast warnings exist, so the same script is a CI validation step.\n\n**Common failure: missing primary color**\n\nIf resolution reports that color.light.primary is required, add a valid CSS color to the exporter configuration before adding presets or overrides."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:config",
      "section": "ui-core",
      "slug": "config",
      "title": "Resolve theme configuration",
      "description": "Validate a minimal config, apply preset defaults, and produce the exact configuration used by token generation.",
      "keywords": [
        "config",
        "resolveThemeConfig",
        "validation",
        "merge"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Validate a minimal config, apply preset defaults, and produce the exact configuration used by token generation."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/config",
      "sections": [
        {
          "id": "minimum",
          "title": "Require one light primary color",
          "markdown": "color.light.primary is the only required theme value. UI Core derives a secondary anchor when it is omitted and produces a dark mode when no complete dark palette is supplied.\n\n**Reference Reference snippet**\n\n```ts\nimport type { TavoUiThemeConfig } from \"@tavojs/ui-core\";\n\nconst config: TavoUiThemeConfig = {\n  color: { light: { primary: \"#116a67\" } }\n};\n```"
        },
        {
          "id": "precedence",
          "title": "Apply configuration in a predictable order",
          "markdown": "resolveThemeConfig starts from internal defaults, applies the chosen preset, then deeply merges explicit project values. A preset is a starting point, never a lock on the final design.\n\n**Reference Reference snippet**\n\n```ts\nimport { resolveThemeConfig } from \"@tavojs/ui-core\";\n\nconst resolved = resolveThemeConfig({\n  preset: \"enterprise\",\n  color: { light: { primary: \"#7c5cff\" } },\n  scale: { density: \"spacious\", shadow: 0.2 }\n});\n```\n\nHere the enterprise preset supplies unspecified values, while spacious density and the explicit shadow override its scale choices."
        },
        {
          "id": "validation",
          "title": "Fail close to the configuration error",
          "markdown": "-   Use the published schema for editor validation when configuration lives in JSON.\n    \n-   Keep numeric scale values within documented ranges.\n    \n-   Use supported preset, method, mode, density, and contrast names.\n    \n-   Validate output selectors and token records before emitting platform files.\n    \n-   Run resolution in CI so invalid theme changes fail before package or app builds.\n    \n\n**Resolved config is inspectable**\n\nThe result of buildThemeTokens includes config, making it easy for tooling to show the exact values that survived defaults, presets, and explicit overrides."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:tokens",
      "section": "ui-core",
      "slug": "tokens",
      "title": "Generate tokens",
      "description": "Build resolved theme modes and static token records, then serialize them for the platform that owns rendering.",
      "keywords": [
        "buildThemeTokens",
        "tokens",
        "modes",
        "serialization"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Build resolved theme modes and static token records, then serialize them for the platform that owns rendering."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/tokens",
      "sections": [
        {
          "id": "build-result",
          "title": "Read the complete build result",
          "markdown": "buildThemeTokens is the main orchestration API. It returns light and dark color sets, static tokens, resolved breakpoints, the resolved config, and accessibility warnings in one deterministic value.\n\n**Reference Reference snippet**\n\n```ts\nimport { buildThemeTokens } from \"@tavojs/ui-core\";\n\nconst theme = buildThemeTokens({\n  color: { light: { primary: \"#116a67\", secondary: \"#d86c3d\" } },\n  accessibility: { contrast: \"AA\" }\n});\n\nconsole.log(theme.modes.light.tokens[\"color-primary-bg\"]);\nconsole.log(theme.staticTokens[\"radius-md\"]);\nconsole.log(theme.breakpoints.md);\nconsole.log(theme.warnings);\n```"
        },
        {
          "id": "mode-and-static",
          "title": "Keep mode-specific and static tokens separate",
          "markdown": "-   modes.light and modes.dark contain ramps, semantic colors, and mode-specific color tokens.\n    \n-   staticTokens contains scale, spacing, radius, typography, interaction, motion, opacity, blur, and breakpoint values.\n    \n-   breakpoints contains numeric sm, md, and lg thresholds for programmatic consumers.\n    \n-   config contains the fully resolved configuration.\n    \n-   warnings contains contrast messages when auditing is enabled."
        },
        {
          "id": "emit",
          "title": "Let the platform own serialization",
          "markdown": "UI Core deliberately does not write CSS. A web tool can join static and mode tokens into variables, while another renderer can map the same result into a typed theme object.\n\n**Reference Reference snippet**\n\n```ts\nfunction toVariables(tokens: Record<string, string>, prefix = \"tui\") {\n  return Object.entries(tokens)\n    .map(([name, value]) => `--${prefix}-${name}: ${value};`)\n    .join(\"\n\");\n}\n\nconst lightVariables = toVariables({\n  ...theme.staticTokens,\n  ...theme.modes.light.tokens\n});\n```\n\n**Do not duplicate the web emitter casually**\n\nIf the target is a normal Tavo.js website, @tavojs/ui and tavo-ui already own CSS generation, selectors, theme injection, and runtime mode behavior."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:presets-and-colors",
      "section": "ui-core",
      "slug": "presets-and-colors",
      "title": "Presets and color methods",
      "description": "Choose coordinated defaults and a color-generation strategy without losing exact brand action colors.",
      "keywords": [
        "presets",
        "color",
        "ramps",
        "contrast"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Choose coordinated defaults and a color-generation strategy without losing exact brand action colors."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/presets-and-colors",
      "sections": [
        {
          "id": "presets",
          "title": "Use presets as product starting points",
          "markdown": "-   minimal: balanced general-purpose defaults.\n    \n-   glass: translucent structural surfaces and blur.\n    \n-   enterprise: restrained depth for product dashboards.\n    \n-   editorial: stronger typography-led hierarchy.\n    \n-   dense: compact controls and spacing.\n    \n-   mobile: touch-oriented sizing and density.\n    \n-   monochrome: strict neutral structure with exact action anchors.\n    \n\nApply product-specific values in the same config. Explicit nested values always override their preset counterparts."
        },
        {
          "id": "methods",
          "title": "Choose how colors become structure",
          "markdown": "-   analogous builds tonal primary, secondary, and neutral ramps and uses shade-driven surfaces.\n    \n-   monochromatic uses strict white and black canvases with neutral structure while preserving exact configured action colors.\n    \n-   glass emits translucent surfaces, borders, and backdrop-filter values while retaining solid action colors.\n    \n\nfixShade controls how the source color is placed in the interior ramp. It defaults to true so related primary and secondary colors align around a common center."
        },
        {
          "id": "color-utilities",
          "title": "Use exported color utilities in tooling",
          "markdown": "The public package includes normalization, conversion, ramp, luminance, readable-text, and contrast helpers. These are useful for inspectors and custom token tooling that must explain how a theme result was produced.\n\n**Reference Reference snippet**\n\n```ts\nimport {\n  contrastRatio,\n  generateColorRamp,\n  normalizeHex,\n  readContrastColor\n} from \"@tavojs/ui-core\";\n\nconst primary = normalizeHex(\"#7C5CFF\");\nconst ramp = generateColorRamp(primary, \"analogous\", true);\nconst text = readContrastColor(primary);\nconst ratio = contrastRatio(text, primary);\n```\n\n**Action colors remain exact**\n\nSolid action backgrounds use the configured primary or secondary value. The generator chooses black or white action text based on contrast rather than silently shifting the brand anchor."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:breakpoints-and-accessibility",
      "section": "ui-core",
      "slug": "breakpoints-and-accessibility",
      "title": "Breakpoints and accessibility",
      "description": "Resolve a shared responsive contract and turn contrast problems into inspectable warnings or enforced failures.",
      "keywords": [
        "breakpoints",
        "viewport",
        "accessibility",
        "AA",
        "AAA"
      ],
      "kind": "guide",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Resolve a shared responsive contract and turn contrast problems into inspectable warnings or enforced failures."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/breakpoints-and-accessibility",
      "sections": [
        {
          "id": "breakpoints",
          "title": "Resolve mobile-first thresholds",
          "markdown": "resolveThemeBreakpoints merges project overrides with defaults and always returns numeric sm, md, and lg values. UI packages can use the same result for component props, generated CSS variables, and stylesheet media-query helpers.\n\n**Reference Reference snippet**\n\n```ts\nimport { resolveThemeBreakpoints } from \"@tavojs/ui-core\";\n\nconst breakpoints = resolveThemeBreakpoints({\n  color: { light: { primary: \"#116a67\" } },\n  breakpoints: { md: 820 }\n});\n\n// { sm: 480, md: 820, lg: 1024 }\n```"
        },
        {
          "id": "viewport",
          "title": "Keep viewport scaling separate",
          "markdown": "Breakpoints decide when a layout switches. Viewport configuration describes fluid root-size scaling between minimum and maximum widths. Resolve it separately when a renderer needs to generate clamp-based typography or size behavior.\n\n**Reference Reference snippet**\n\n```ts\nimport { resolveThemeViewport } from \"@tavojs/ui-core\";\n\nconst viewport = resolveThemeViewport({\n  color: { light: { primary: \"#116a67\" } },\n  viewport: { rootMin: 14, rootMax: 16, minWidth: 320, maxWidth: 960 }\n});\n```"
        },
        {
          "id": "contrast",
          "title": "Collect or enforce contrast warnings",
          "markdown": "Set accessibility.contrast to AA or AAA to evaluate important foreground and background pairs during generation. Warnings stay in the result by default so design tooling can display them alongside the affected theme.\n\n**Reference Reference snippet**\n\n```ts\nconst review = buildThemeTokens({\n  color: { light: { primary: \"#777777\" } },\n  accessibility: { contrast: \"AAA\", failOnViolation: false }\n});\n\nif (review.warnings.length) console.warn(review.warnings);\n```\n\n**Enforce in CI deliberately**\n\nSet failOnViolation to true when theme changes must fail the build. Keep it false in interactive design tools that need to show incomplete work and explain every issue."
        }
      ],
      "sourceId": "tavo-website"
    },
    {
      "id": "ui-core:api",
      "section": "ui-core",
      "slug": "api",
      "title": "UI Core API reference",
      "description": "Use the small public orchestration surface, public theme contracts, and color utilities exported by @tavojs/ui-core.",
      "keywords": [
        "api",
        "buildThemeTokens",
        "resolveThemeConfig",
        "types"
      ],
      "kind": "reference",
      "prerequisites": [
        "Node.js 20.19+ or 22.12+ and an advanced tooling use case for @tavojs/ui-core."
      ],
      "outcomes": [
        "Use the small public orchestration surface, public theme contracts, and color utilities exported by @tavojs/ui-core."
      ],
      "runtime": [
        "build"
      ],
      "related": [
        {
          "title": "Install UI Core",
          "href": "/docs/ui-core/installation",
          "description": "Set up token tooling and its supported boundary."
        }
      ],
      "canonicalPath": "/docs/ui-core/api",
      "sections": [
        {
          "id": "orchestration",
          "title": "Theme orchestration",
          "markdown": "-   buildThemeTokens(config): validate and build the complete resolved theme result.\n    \n-   resolveThemeConfig(config): apply defaults, preset values, and explicit overrides.\n    \n-   resolveThemeBreakpoints(config): return required numeric sm, md, and lg thresholds.\n    \n-   resolveThemeViewport(config): return the resolved fluid viewport scale configuration.\n    \n\n**Reference Reference snippet**\n\n```ts\nimport {\n  buildThemeTokens,\n  resolveThemeBreakpoints,\n  resolveThemeConfig,\n  resolveThemeViewport\n} from \"@tavojs/ui-core\";\n```"
        },
        {
          "id": "types",
          "title": "Public contracts",
          "markdown": "The package exports its config, result, color, mode, scale, typography, interaction, viewport, breakpoint, output, accessibility, ramp, and runtime-state types. Use these types at custom renderer and tooling boundaries instead of recreating partial interfaces.\n\n**Reference Reference snippet**\n\n```ts\nimport type {\n  TavoUiThemeConfig,\n  ThemeTokenBuildResult,\n  ThemeResolvedColorSet,\n  ThemePreset,\n  ThemeMethod\n} from \"@tavojs/ui-core\";\n```"
        },
        {
          "id": "color",
          "title": "Color utilities",
          "markdown": "normalizeHex, hexToHsl, hslToHex, generateNeutralRamp, generateColorRamp, inferShade, relativeLuminance, readContrastColor, and contrastRatio are public for tools that need lower-level color inspection.\n\n**Declarations are authoritative**\n\nUse the TypeScript declarations from the installed package for exact parameter and return types. Import only from @tavojs/ui-core; internal theme module paths are not public contracts."
        }
      ],
      "sourceId": "tavo-website"
    }
  ],
  "api": {
    "core": [
      {
        "entrypoint": "@tavojs/core",
        "symbols": [
          {
            "name": "Action",
            "anchor": "api-tavojs-core--action",
            "kind": "type",
            "signature": "type Action<TInput, TResult> = {\n    store: Store<ActionState<TResult>>;\n    getState(): ActionState<TResult>;\n    run(input: TInput): Promise<ActionState<TResult>>;\n    abort(): void;\n    reset(): void;\n};",
            "description": "Defines the action contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#action-primitive-reference"
          },
          {
            "name": "ActionContext",
            "anchor": "api-tavojs-core--actioncontext",
            "kind": "type",
            "signature": "type ActionContext<TInput> = {\n    input: TInput;\n    signal: AbortSignal;\n};",
            "description": "Provides the context passed to action in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#action-primitive-reference"
          },
          {
            "name": "ActionState",
            "anchor": "api-tavojs-core--actionstate",
            "kind": "type",
            "signature": "type ActionState<TResult = unknown> = {\n    status: ActionStatus;\n    data: TResult | null;\n    error: unknown;\n    submittedAt: number | null;\n    completedAt: number | null;\n};",
            "description": "Represents the observable state of action in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#action-primitive-reference"
          },
          {
            "name": "ActionStatus",
            "anchor": "api-tavojs-core--actionstatus",
            "kind": "type",
            "signature": "type ActionStatus = \"idle\" | \"running\" | \"success\" | \"error\";",
            "description": "Defines the action status contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#action-primitive-reference"
          },
          {
            "name": "AnyI18nService",
            "anchor": "api-tavojs-core--anyi18nservice",
            "kind": "type",
            "signature": "type AnyI18nService = I18nService<any, string>;",
            "description": "Defines the any i18n service contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "ApiStability",
            "anchor": "api-tavojs-core--apistability",
            "kind": "type",
            "signature": "type ApiStability = \"stable\" | \"experimental\";",
            "description": "Defines the api stability contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/api-stability#stability-contract"
          },
          {
            "name": "ApiStabilityEntry",
            "anchor": "api-tavojs-core--apistabilityentry",
            "kind": "type",
            "signature": "type ApiStabilityEntry = {\n    level: ApiStability;\n    since: string;\n    note: string;\n};",
            "description": "Describes one entry in api stability in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/api-stability#stability-contract"
          },
          {
            "name": "autoFocus",
            "anchor": "api-tavojs-core--autofocus",
            "kind": "function",
            "signature": "autoFocus<T extends HTMLElement = HTMLElement>(options?: FocusOptions | undefined): ElementDirective<T>",
            "description": "Creates a directive that focuses the element after it is mounted.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "bootTavo",
            "anchor": "api-tavojs-core--boottavo",
            "kind": "function",
            "signature": "bootTavo(options?: BootTavoOptions | undefined): Promise<BootTavoResult>",
            "description": "Boots the default Tavo.js app behavior for projects that use file-based pages.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#boot-and-hydration-reference"
          },
          {
            "name": "BootTavoOptions",
            "anchor": "api-tavojs-core--boottavooptions",
            "kind": "type",
            "signature": "type BootTavoOptions = BootTavoClientOptions & BootTavoServerOptions;",
            "description": "Configures boot tavo in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#boot-and-hydration-reference"
          },
          {
            "name": "BootTavoResult",
            "anchor": "api-tavojs-core--boottavoresult",
            "kind": "type",
            "signature": "type BootTavoResult = {\n    mode: \"client\";\n    root: Root;\n} | {\n    mode: \"server\";\n    handle: ReturnType<typeof createNodeRequestHandler>;\n    modules: PageModules;\n} | {\n    mode: \"none\";\n};",
            "description": "Describes the result returned by boot tavo in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#boot-and-hydration-reference"
          },
          {
            "name": "captureFocusRestore",
            "anchor": "api-tavojs-core--capturefocusrestore",
            "kind": "function",
            "signature": "captureFocusRestore(documentRef?: Document | undefined): () => void",
            "description": "Captures current focus and returns a function that restores it later.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#focus-ownership"
          },
          {
            "name": "Child",
            "anchor": "api-tavojs-core--child",
            "kind": "type",
            "signature": "type Child = Primitive | VNode | Child[];",
            "description": "Defines the child contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#functional-components"
          },
          {
            "name": "ClassName",
            "anchor": "api-tavojs-core--classname",
            "kind": "type",
            "signature": "type ClassName = string | string[];",
            "description": "Defines the class name contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#intrinsic-runtime"
          },
          {
            "name": "Component",
            "anchor": "api-tavojs-core--component",
            "kind": "type",
            "signature": "type Component<P extends Record<string, unknown> = Record<string, unknown>> = (props: PropsWithChildren<P>) => Child;",
            "description": "Defines the component contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#functional-components"
          },
          {
            "name": "computedStore",
            "anchor": "api-tavojs-core--computedstore",
            "kind": "function",
            "signature": "computedStore<T extends Record<string, unknown>, S extends Record<string, unknown>>(source: Store<T>, selector: StoreSelector<T, S>, options?: { isEqual?: ((left: S, right: S) => boolean) | undefined; } | undefined): Store<S>",
            "description": "Creates a derived readonly store that updates whenever the source store's selected value changes.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#external-stores"
          },
          {
            "name": "createAction",
            "anchor": "api-tavojs-core--createaction",
            "kind": "function",
            "signature": "createAction<TInput = void, TResult = unknown>(handler: (context: ActionContext<TInput>) => TResult | Promise<TResult>): Action<TInput, TResult>",
            "description": "Creates an MVC-friendly mutation primitive with status, result, error, and abort handling.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#action-primitive-reference"
          },
          {
            "name": "createDeferredValue",
            "anchor": "api-tavojs-core--createdeferredvalue",
            "kind": "function",
            "signature": "createDeferredValue<T>(promise: Promise<T>, options?: { id?: string | undefined; serialize?: ((value: T) => unknown) | undefined; deserialize?: ((value: unknown) => T) | undefined; timeoutMs?: number | undefined; timeoutFallback?: DeferredTimeoutFallback; signal?: AbortSignal | undefined; } | undefined): DeferredValue<T>",
            "description": "Creates a reusable deferred wrapper so nested SSR trees can share one async unit by id.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "createDirective",
            "anchor": "api-tavojs-core--createdirective",
            "kind": "function",
            "signature": "createDirective<T extends HTMLElement = HTMLElement>(directive: ElementDirective<T>): ElementDirective<T>",
            "description": "Creates a reusable element directive from a function.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "createExternalStore",
            "anchor": "api-tavojs-core--createexternalstore",
            "kind": "function",
            "signature": "createExternalStore<T>(store: ExternalStore<T>): ExternalStore<T>",
            "description": "Creates external store for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#external-stores"
          },
          {
            "name": "createFormAction",
            "anchor": "api-tavojs-core--createformaction",
            "kind": "function",
            "signature": "createFormAction<TResult = unknown>(handler: (values: FormValues, context: { signal: AbortSignal; }) => TResult | Promise<TResult>): FormAction<TResult>",
            "description": "Creates a form-oriented action for MVC controllers without introducing hook-style APIs.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "createI18n",
            "anchor": "api-tavojs-core--createi18n",
            "kind": "function",
            "signature": "createI18n<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string>(options: CreateI18nOptions<TMessages, TDefaultLocale>): I18nService<TMessages, TDefaultLocale>",
            "description": "Creates a reactive i18n service with direct object access through `i18n.text`.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#localization-example"
          },
          {
            "name": "CreateI18nOptions",
            "anchor": "api-tavojs-core--createi18noptions",
            "kind": "type",
            "signature": "type CreateI18nOptions<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string> = {\n    defaultLocale: TDefaultLocale;\n    locale?: keyof TMessages & string;\n    fallbackLocale?: keyof TMessages & string;\n    messages: TMessages;\n    locales?: Partial<Record<keyof TMessages & string, I18nLocaleInfo>>;\n    routing?: false | I18nRoutingOptions;\n    serviceName?: string | false;\n    onMissingKey?: (payload: I18nMissingKeyPayload) => string | void;\n};",
            "description": "Configures create i18n in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-options-reference"
          },
          {
            "name": "createListRefs",
            "anchor": "api-tavojs-core--createlistrefs",
            "kind": "function",
            "signature": "createListRefs<K extends string | number, T extends Element = Element>(): { get(key: K): DomRefObject<T>; delete(key: K): boolean; clear(): void; entries(): IterableIterator<[K, DomRefObject<T>]>; }",
            "description": "Creates a keyed collection of refs for dynamic lists.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "createRef",
            "anchor": "api-tavojs-core--createref",
            "kind": "function",
            "signature": "createRef<T extends Element = Element>(): DomRefObject<T>",
            "description": "Creates a mutable DOM ref object for controller-owned element access.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "createResource",
            "anchor": "api-tavojs-core--createresource",
            "kind": "function",
            "signature": "createResource<T>(loader: (context: { signal: AbortSignal; }) => Promise<T>): Resource<T>",
            "description": "Creates an MVC-friendly async resource with explicit load/reset methods and observable state.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#resource-reference"
          },
          {
            "name": "createRoot",
            "anchor": "api-tavojs-core--createroot",
            "kind": "function",
            "signature": "createRoot(container: Element | DocumentFragment): Root",
            "description": "Creates root for the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#manual-rendering"
          },
          {
            "name": "createServerFormAction",
            "anchor": "api-tavojs-core--createserverformaction",
            "kind": "function",
            "signature": "createServerFormAction<TResult = unknown>(url: string, options?: ServerFormActionOptions<TResult> | undefined): FormAction<TResult>",
            "description": "Creates a form action that submits to an SSR route action endpoint.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "createServiceKey",
            "anchor": "api-tavojs-core--createservicekey",
            "kind": "function",
            "signature": "createServiceKey<T>(name: string): ServiceKey<T>",
            "description": "Creates a typed key for registering and resolving a named service.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#typed-services"
          },
          {
            "name": "createStore",
            "anchor": "api-tavojs-core--createstore",
            "kind": "function",
            "signature": "createStore<T extends Record<string, unknown>>(initialState: T | StoreInitializer<T>): Store<T>",
            "description": "Creates store for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-contract"
          },
          {
            "name": "createStyleRegistry",
            "anchor": "api-tavojs-core--createstyleregistry",
            "kind": "function",
            "signature": "createStyleRegistry(): StyleRegistry",
            "description": "Creates style registry for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "createTavo",
            "anchor": "api-tavojs-core--createtavo",
            "kind": "function",
            "signature": "createTavo<P extends AnyRecord, S extends AnyRecord, C = unknown>(definition: MvcComponentDefinition<P, S, C>): Component<P>",
            "description": "Creates tavo for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/mvc#definition-contract"
          },
          {
            "name": "DEFAULT_I18N_SERVICE_NAME",
            "anchor": "api-tavojs-core--default-i18n-service-name",
            "kind": "value",
            "signature": "DEFAULT_I18N_SERVICE_NAME: \"tavo:i18n\"",
            "description": "Exposes the default i18 n service name constant used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "Deferred",
            "anchor": "api-tavojs-core--deferred",
            "kind": "function",
            "signature": "Deferred<T>(props: DeferredProps<T>): Child",
            "description": "Progressive SSR boundary that renders stable fallback UI during pure CSR rendering.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "DeferredProps",
            "anchor": "api-tavojs-core--deferredprops",
            "kind": "type",
            "signature": "type DeferredProps<T> = {\n    value: Promise<T> | T | DeferredValue<T>;\n    fallback?: Child;\n    children: DeferredRender<T> | Child;\n    id?: string;\n    as?: string;\n    errorFallback?: DeferredErrorFallback;\n    serialize?: (value: T) => unknown;\n    deserialize?: (value: unknown) => T;\n    timeoutMs?: number;\n    timeoutFallback?: DeferredTimeoutFallback;\n    signal?: AbortSignal;\n};",
            "description": "Defines the props accepted by deferred in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "DeferredState",
            "anchor": "api-tavojs-core--deferredstate",
            "kind": "type",
            "signature": "type DeferredState<T> = {\n    status: \"pending\";\n    data: null;\n    error: null;\n} | {\n    status: \"resolved\";\n    data: T;\n    error: null;\n} | {\n    status: \"rejected\";\n    data: null;\n    error: unknown;\n};",
            "description": "Represents the observable state of deferred in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "DeferredTimeoutError",
            "anchor": "api-tavojs-core--deferredtimeouterror",
            "kind": "type",
            "signature": "type DeferredTimeoutError = {\n    code: \"TAVO_DEFERRED_TIMEOUT\";\n    id?: string;\n    timeoutMs: number;\n    message: string;\n};",
            "description": "Represents a failure raised by deferred timeout in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "DeferredValue",
            "anchor": "api-tavojs-core--deferredvalue",
            "kind": "type",
            "signature": "type DeferredValue<T> = {\n    id?: string;\n    promise: Promise<T>;\n    serialize?: (value: T) => unknown;\n    deserialize?: (value: unknown) => T;\n    timeoutMs?: number;\n    timeoutFallback?: DeferredTimeoutFallback;\n    signal?: AbortSignal;\n};",
            "description": "Defines the deferred value contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/streaming-and-async#deferred-api-reference"
          },
          {
            "name": "DefinedI18nMessages",
            "anchor": "api-tavojs-core--definedi18nmessages",
            "kind": "type",
            "signature": "type DefinedI18nMessages<TMessages extends I18nMessages> = TMessages & {\n    readonly __tavo_defined_messages__?: true;\n};",
            "description": "Defines the defined i18n messages contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#localization-example"
          },
          {
            "name": "defineGlobalStore",
            "anchor": "api-tavojs-core--defineglobalstore",
            "kind": "function",
            "signature": "defineGlobalStore<T extends AnyRecord>(name: string, initialState: T | StoreInitializer<T>): Store<T>",
            "description": "Defines a named global store once and returns the shared instance.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#global-stores"
          },
          {
            "name": "defineMessages",
            "anchor": "api-tavojs-core--definemessages",
            "kind": "function",
            "signature": "defineMessages<const TMessages extends I18nMessages>(messages: TMessages): DefinedI18nMessages<TMessages>",
            "description": "Marks a central translation catalog for build-time i18n splitting.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#localization-example"
          },
          {
            "name": "DomRef",
            "anchor": "api-tavojs-core--domref",
            "kind": "type",
            "signature": "type DomRef<T extends Element = Element> = DomRefObject<T> | DomRefCallback<T> | null | undefined;",
            "description": "Public DOM ref value accepted by intrinsic JSX elements.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "DomRefCallback",
            "anchor": "api-tavojs-core--domrefcallback",
            "kind": "type",
            "signature": "type DomRefCallback<T extends Element = Element> = (node: T | null) => void;",
            "description": "Callback ref shape for one-off DOM element access.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "DomRefObject",
            "anchor": "api-tavojs-core--domrefobject",
            "kind": "type",
            "signature": "type DomRefObject<T extends Element = Element> = {\n    current: T | null;\n};",
            "description": "Object ref shape used by MVC controllers to keep direct DOM handles.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "ElementCleanup",
            "anchor": "api-tavojs-core--elementcleanup",
            "kind": "type",
            "signature": "type ElementCleanup = () => void;",
            "description": "Defines the element cleanup contract used by the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "ElementDirective",
            "anchor": "api-tavojs-core--elementdirective",
            "kind": "type",
            "signature": "type ElementDirective<T extends HTMLElement = HTMLElement> = (element: T) => void | ElementCleanup;",
            "description": "Defines the element directive contract used by the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "ElementDirectiveInput",
            "anchor": "api-tavojs-core--elementdirectiveinput",
            "kind": "type",
            "signature": "type ElementDirectiveInput<T extends HTMLElement = HTMLElement> = ElementDirective<T> | Array<ElementDirective<T> | null | undefined | false> | null | undefined | false;",
            "description": "Defines the element directive input contract used by the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "ElementTarget",
            "anchor": "api-tavojs-core--elementtarget",
            "kind": "type",
            "signature": "type ElementTarget<T extends Element = Element> = T | DomRefObject<T>;",
            "description": "Defines the element target contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "runtimeNote": "Server-safe no-op",
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#managed-observers"
          },
          {
            "name": "ensureClientStyle",
            "anchor": "api-tavojs-core--ensureclientstyle",
            "kind": "function",
            "signature": "ensureClientStyle(id: string, css: string, options?: StyleOptions | undefined): void",
            "description": "Ensures client style for the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "ErrorBoundary",
            "anchor": "api-tavojs-core--errorboundary",
            "kind": "function",
            "signature": "ErrorBoundary(props: ErrorBoundaryProps): ErrorBoundaryVNode",
            "description": "Creates an error boundary vnode that captures descendant render errors.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#error-boundary"
          },
          {
            "name": "ErrorBoundaryProps",
            "anchor": "api-tavojs-core--errorboundaryprops",
            "kind": "type",
            "signature": "type ErrorBoundaryProps = {\n    children?: Child;\n    fallback: ErrorBoundaryFallback;\n    resetKey?: unknown;\n};",
            "description": "Defines the props accepted by error boundary in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#error-boundary"
          },
          {
            "name": "ExternalStore",
            "anchor": "api-tavojs-core--externalstore",
            "kind": "type",
            "signature": "type ExternalStore<T> = {\n    getSnapshot(): T;\n    getServerSnapshot?: () => T;\n    subscribe(listener: () => void): Unsubscribe;\n};",
            "description": "Defines storage behavior for external in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#external-stores"
          },
          {
            "name": "focusFirst",
            "anchor": "api-tavojs-core--focusfirst",
            "kind": "function",
            "signature": "focusFirst(root: ParentNode, options?: FocusOptions | undefined): HTMLElement | null",
            "description": "Focuses the first focusable descendant inside a root node.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#focus-ownership"
          },
          {
            "name": "focusFirstInvalid",
            "anchor": "api-tavojs-core--focusfirstinvalid",
            "kind": "function",
            "signature": "focusFirstInvalid(root: ParentNode, options?: FocusOptions | undefined): HTMLElement | null",
            "description": "Focuses the first invalid form control inside a root node.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#focus-ownership"
          },
          {
            "name": "Font",
            "anchor": "api-tavojs-core--font",
            "kind": "function",
            "signature": "Font(props: FontProps): Child",
            "description": "Loads external or self-hosted fonts into the document head for SSR and CSR usage.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#font-script-reference"
          },
          {
            "name": "FontDisplay",
            "anchor": "api-tavojs-core--fontdisplay",
            "kind": "type",
            "signature": "type FontDisplay = \"auto\" | \"block\" | \"swap\" | \"fallback\" | \"optional\";",
            "description": "Defines the font display contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#font-script-reference"
          },
          {
            "name": "FontProps",
            "anchor": "api-tavojs-core--fontprops",
            "kind": "type",
            "signature": "type FontProps = {\n    href?: string;\n    src?: string;\n    family?: string;\n    local?: string[];\n    weight?: string | number;\n    style?: \"normal\" | \"italic\" | \"oblique\";\n    display?: FontDisplay;\n    preload?: boolean;\n    preconnect?: string[];\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    type?: string;\n    variable?: `--${string}`;\n    fallback?: string;\n};",
            "description": "Defines the props accepted by font in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#font-script-reference"
          },
          {
            "name": "FormAction",
            "anchor": "api-tavojs-core--formaction",
            "kind": "type",
            "signature": "type FormAction<TResult = unknown> = {\n    action: Action<FormValues, TResult>;\n    store: Store<FormState<TResult>>;\n    submit(form: HTMLFormElement | FormData | FormValues): Promise<FormState<TResult>>;\n    reset(): void;\n};",
            "description": "Defines the form action contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "formatTavoError",
            "anchor": "api-tavojs-core--formattavoerror",
            "kind": "function",
            "signature": "formatTavoError(error: TavoError): string",
            "description": "Produces a human-readable diagnostic while preserving the stable code for logs and tooling.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "formDataToObject",
            "anchor": "api-tavojs-core--formdatatoobject",
            "kind": "function",
            "signature": "formDataToObject(formData: FormData): FormValues",
            "description": "Converts browser FormData into a plain object while preserving repeated field names.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "FormState",
            "anchor": "api-tavojs-core--formstate",
            "kind": "type",
            "signature": "type FormState<TResult = unknown> = ActionState<TResult> & {\n    values: FormValues;\n};",
            "description": "Represents the observable state of form in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "FormValues",
            "anchor": "api-tavojs-core--formvalues",
            "kind": "type",
            "signature": "type FormValues = Record<string, FormDataEntryValue | FormDataEntryValue[]>;",
            "description": "Defines the form values contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "Fragment",
            "anchor": "api-tavojs-core--fragment",
            "kind": "value",
            "signature": "Fragment: typeof Fragment",
            "description": "Provides fragment behavior for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#functional-components"
          },
          {
            "name": "getActiveStyleRegistry",
            "anchor": "api-tavojs-core--getactivestyleregistry",
            "kind": "function",
            "signature": "getActiveStyleRegistry(): StyleRegistry | null",
            "description": "Reads active style registry for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "getApiStability",
            "anchor": "api-tavojs-core--getapistability",
            "kind": "function",
            "signature": "getApiStability(entryPoint: \"@tavojs/core\" | \"@tavojs/core/config\" | \"@tavojs/core/dev\" | \"@tavojs/core/jsx-dev-runtime\" | \"@tavojs/core/jsx-runtime\" | \"@tavojs/core/plugin\" | \"@tavojs/core/router\" | \"@tavojs/core/server\" | \"@tavojs/core/server-only\"): ApiStabilityEntry",
            "description": "Reads api stability for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/api-stability#stability-contract"
          },
          {
            "name": "getFocusableElements",
            "anchor": "api-tavojs-core--getfocusableelements",
            "kind": "function",
            "signature": "getFocusableElements(root: ParentNode): HTMLElement[]",
            "description": "Finds focusable descendants in DOM order.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#focus-ownership"
          },
          {
            "name": "getGlobalStore",
            "anchor": "api-tavojs-core--getglobalstore",
            "kind": "function",
            "signature": "getGlobalStore<T extends AnyRecord>(name: string): Store<T>",
            "description": "Looks up a previously defined global store by name.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#global-stores"
          },
          {
            "name": "getService",
            "anchor": "api-tavojs-core--getservice",
            "kind": "function",
            "signature": "getService<T>(identifier: ServiceIdentifier<T>): T",
            "description": "Looks up a previously registered service by name.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#selection"
          },
          {
            "name": "getTavoBootMode",
            "anchor": "api-tavojs-core--gettavobootmode",
            "kind": "function",
            "signature": "getTavoBootMode(options?: Pick<BootTavoOptions, \"root\" | \"rootSelector\" | \"hydrate\"> | undefined): TavoBootMode",
            "description": "Returns the boot mode Tavo.js will use for the current document.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#boot-and-hydration-reference"
          },
          {
            "name": "h",
            "anchor": "api-tavojs-core--h",
            "kind": "function",
            "signature": "h(type: NodeType, props: (Record<string, unknown> & { children?: Child }) | null, ...children: Child[]): VNode",
            "description": "Provides h behavior for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#intrinsic-runtime"
          },
          {
            "name": "hasGlobalStore",
            "anchor": "api-tavojs-core--hasglobalstore",
            "kind": "function",
            "signature": "hasGlobalStore(name: string): boolean",
            "description": "Returns true when a named global store exists in the shared registry.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#global-stores"
          },
          {
            "name": "hasService",
            "anchor": "api-tavojs-core--hasservice",
            "kind": "function",
            "signature": "hasService(identifier: ServiceIdentifier<unknown>): boolean",
            "description": "Returns true when a named service exists in the shared registry.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#selection"
          },
          {
            "name": "Head",
            "anchor": "api-tavojs-core--head",
            "kind": "value",
            "signature": "Head(props: PropsWithChildren<HeadProps>): Child",
            "description": "Provides head behavior for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "HeadProps",
            "anchor": "api-tavojs-core--headprops",
            "kind": "type",
            "signature": "type HeadProps = {\n    title?: string;\n    unsafeHeadHtml?: string;\n    children?: Child;\n};",
            "description": "Defines the props accepted by head in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "I18nDetectLocaleInput",
            "anchor": "api-tavojs-core--i18ndetectlocaleinput",
            "kind": "type",
            "signature": "type I18nDetectLocaleInput = {\n    pathname?: string;\n    request?: unknown;\n    headers?: Headers | Record<string, string | string[] | undefined>;\n    cookie?: string;\n};",
            "description": "Defines the i18n detect locale input contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-options-reference"
          },
          {
            "name": "I18nLocaleDirection",
            "anchor": "api-tavojs-core--i18nlocaledirection",
            "kind": "type",
            "signature": "type I18nLocaleDirection = \"ltr\" | \"rtl\" | \"auto\";",
            "description": "Defines the i18n locale direction contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nLocaleInfo",
            "anchor": "api-tavojs-core--i18nlocaleinfo",
            "kind": "type",
            "signature": "type I18nLocaleInfo = {\n    label?: string;\n    dir?: I18nLocaleDirection;\n};",
            "description": "Defines the i18n locale info contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nMessages",
            "anchor": "api-tavojs-core--i18nmessages",
            "kind": "type",
            "signature": "type I18nMessages = Record<string, I18nTextTree>;",
            "description": "Defines the i18n messages contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nMissingKeyPayload",
            "anchor": "api-tavojs-core--i18nmissingkeypayload",
            "kind": "type",
            "signature": "type I18nMissingKeyPayload = {\n    key: string;\n    locale: string;\n    fallbackLocale: string;\n};",
            "description": "Defines the i18n missing key payload contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nParams",
            "anchor": "api-tavojs-core--i18nparams",
            "kind": "type",
            "signature": "type I18nParams = Record<string, string | number | boolean | null | undefined>;",
            "description": "Defines the i18n params contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nPrimitive",
            "anchor": "api-tavojs-core--i18nprimitive",
            "kind": "type",
            "signature": "type I18nPrimitive = string | number | boolean | null;",
            "description": "Defines the i18n primitive contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nResolvedPath",
            "anchor": "api-tavojs-core--i18nresolvedpath",
            "kind": "type",
            "signature": "type I18nResolvedPath<TLocale extends string = string> = {\n    pathname: string;\n    locale: TLocale;\n    localized: boolean;\n};",
            "description": "Defines the i18n resolved path contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nRoutingOptions",
            "anchor": "api-tavojs-core--i18nroutingoptions",
            "kind": "type",
            "signature": "type I18nRoutingOptions = {\n    enabled?: boolean;\n    defaultLocalePrefix?: \"always\" | \"never\";\n    cookieName?: string;\n    detectFrom?: Array<\"path\" | \"cookie\" | \"header\">;\n};",
            "description": "Configures i18n routing in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-options-reference"
          },
          {
            "name": "I18nService",
            "anchor": "api-tavojs-core--i18nservice",
            "kind": "type",
            "signature": "type I18nService<TMessages extends I18nMessages, TDefaultLocale extends keyof TMessages & string> = {\n    readonly locale: keyof TMessages & string;\n    readonly defaultLocale: TDefaultLocale;\n    readonly fallbackLocale: keyof TMessages & string;\n    readonly locales: Array<keyof TMessages & string>;\n    readonly dir: I18nLocaleDirection;\n    readonly messages: TMessages;\n    readonly text: TMessages[TDefaultLocale];\n    readonly store: Store<I18nState<TMessages>>;\n    setLocale(locale: keyof TMessages & string, options?: I18nSetLocaleOptions): I18nState<TMessages>;\n    setMessages(locale: keyof TMessages & string, messages: TMessages[keyof TMessages], options?: {\n        merge?: boolean;\n    }): I18nState<TMessages>;\n    getLocaleInfo(locale?: keyof TMessages & string): I18nLocaleInfo;\n    detectLocale(input?: I18nDetectLocaleInput): keyof TMessages & string;\n    resolvePath(pathname: string): I18nResolvedPath<keyof TMessages & string>;\n    localizePath(pathname: string, locale?: keyof TMessages & string, options?: {\n        includeDefaultLocale?: boolean;\n    }): string;\n    setLocaleFromRequest(input?: I18nDetectLocaleInput): I18nState<TMessages>;\n    setLocaleFromPath(pathname: string): I18nState<TMessages>;\n    t(key: I18nTranslationKey<TMessages[TDefaultLocale]>, params?: I18nParams): string;\n    t(key: string, params?: I18nParams): string;\n    subscribe(listener: StoreListener<I18nState<TMessages>>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    watchLocale(listener: StoreWatchListener<keyof TMessages & string, I18nState<TMessages>>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n};",
            "description": "Defines the i18n service contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nSetLocaleOptions",
            "anchor": "api-tavojs-core--i18nsetlocaleoptions",
            "kind": "type",
            "signature": "type I18nSetLocaleOptions = {\n    persist?: boolean;\n};",
            "description": "Configures i18n set locale in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-options-reference"
          },
          {
            "name": "I18nState",
            "anchor": "api-tavojs-core--i18nstate",
            "kind": "type",
            "signature": "type I18nState<TMessages extends I18nMessages> = {\n    locale: keyof TMessages & string;\n    fallbackLocale: keyof TMessages & string;\n    messages: TMessages;\n};",
            "description": "Represents the observable state of i18n in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nTextTree",
            "anchor": "api-tavojs-core--i18ntexttree",
            "kind": "type",
            "signature": "type I18nTextTree = {\n    readonly [key: string]: I18nTextValue;\n};",
            "description": "Defines the i18n text tree contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nTextValue",
            "anchor": "api-tavojs-core--i18ntextvalue",
            "kind": "type",
            "signature": "type I18nTextValue = I18nPrimitive | I18nTextTree | readonly I18nTextValue[];",
            "description": "Defines the i18n text value contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "I18nTranslationKey",
            "anchor": "api-tavojs-core--i18ntranslationkey",
            "kind": "type",
            "signature": "type I18nTranslationKey<TTree> = TTree extends I18nTextTree ? {\n    [K in StringKeyOf<TTree>]: TTree[K] extends I18nTextTree ? `${K}` | `${K}.${I18nTranslationKey<TTree[K]>}` : `${K}`;\n}[StringKeyOf<TTree>] : never;",
            "description": "Defines the i18n translation key contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/localization#i18n-service-reference"
          },
          {
            "name": "Image",
            "anchor": "api-tavojs-core--image",
            "kind": "function",
            "signature": "Image(props: ImageProps): Child",
            "description": "SEO-friendly image component that emits responsive SSR optimizer URLs.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#image-reference"
          },
          {
            "name": "ImageFormat",
            "anchor": "api-tavojs-core--imageformat",
            "kind": "type",
            "signature": "type ImageFormat = \"webp\" | \"avif\" | \"jpeg\" | \"png\" | \"original\";",
            "description": "Defines the image format contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#image-reference"
          },
          {
            "name": "ImageProps",
            "anchor": "api-tavojs-core--imageprops",
            "kind": "type",
            "signature": "type ImageProps = {\n    src: string;\n    alt: string;\n    width?: number;\n    height?: number;\n    widths?: number[];\n    sizes?: string;\n    quality?: number;\n    format?: ImageFormat;\n    priority?: boolean;\n    unoptimized?: boolean;\n    loading?: \"lazy\" | \"eager\";\n    decoding?: \"async\" | \"sync\" | \"auto\";\n    fetchPriority?: \"high\" | \"low\" | \"auto\";\n    srcset?: string;\n    className?: ClassName;\n    style?: string | Record<string, unknown>;\n    [key: string]: unknown;\n};",
            "description": "Defines the props accepted by image in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#image-reference"
          },
          {
            "name": "isTavoError",
            "anchor": "api-tavojs-core--istavoerror",
            "kind": "function",
            "signature": "isTavoError(error: unknown): error is TavoError",
            "description": "Reports whether the current value satisfies tavo error for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "lazy",
            "anchor": "api-tavojs-core--lazy",
            "kind": "function",
            "signature": "lazy<P extends Record<string, unknown> = Record<string, unknown>>(loader: LazyLoader<P>, options?: LazyOptions | undefined): LazyComponent<P>",
            "description": "Creates a component that loads its implementation with a dynamic import on first render.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyComponent",
            "anchor": "api-tavojs-core--lazycomponent",
            "kind": "type",
            "signature": "type LazyComponent<P extends Record<string, unknown>> = Component<P> & {\n    preload(): Promise<Component<P>>;\n    getStatus(): LazyStatus<P>;\n};",
            "description": "Defines the lazy component contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyErrorFallback",
            "anchor": "api-tavojs-core--lazyerrorfallback",
            "kind": "type",
            "signature": "type LazyErrorFallback = Child | ((state: LazyErrorState) => Child);",
            "description": "Defines the lazy error fallback contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyErrorState",
            "anchor": "api-tavojs-core--lazyerrorstate",
            "kind": "type",
            "signature": "type LazyErrorState = {\n    status: \"error\";\n    error: unknown;\n};",
            "description": "Represents the observable state of lazy error in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyFallback",
            "anchor": "api-tavojs-core--lazyfallback",
            "kind": "type",
            "signature": "type LazyFallback = Child | ((state: LazyPendingState) => Child);",
            "description": "Defines the lazy fallback contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyLoader",
            "anchor": "api-tavojs-core--lazyloader",
            "kind": "type",
            "signature": "type LazyLoader<P extends Record<string, unknown>> = () => Promise<LazyModule<P>>;",
            "description": "Defines the lazy loader contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyModule",
            "anchor": "api-tavojs-core--lazymodule",
            "kind": "type",
            "signature": "type LazyModule<P extends Record<string, unknown>> = Component<P> | {\n    default: Component<P>;\n};",
            "description": "Defines the lazy module contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyOptions",
            "anchor": "api-tavojs-core--lazyoptions",
            "kind": "type",
            "signature": "type LazyOptions = {\n    fallback?: LazyFallback;\n    errorFallback?: LazyErrorFallback;\n};",
            "description": "Configures lazy in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyPendingState",
            "anchor": "api-tavojs-core--lazypendingstate",
            "kind": "type",
            "signature": "type LazyPendingState = {\n    status: \"idle\" | \"loading\";\n};",
            "description": "Represents the observable state of lazy pending in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "LazyStatus",
            "anchor": "api-tavojs-core--lazystatus",
            "kind": "type",
            "signature": "type LazyStatus<P extends Record<string, unknown>> = {\n    status: \"idle\";\n    component: null;\n    error: null;\n} | {\n    status: \"loading\";\n    component: null;\n    error: null;\n} | {\n    status: \"loaded\";\n    component: Component<P>;\n    error: null;\n} | {\n    status: \"error\";\n    component: null;\n    error: unknown;\n};",
            "description": "Defines the lazy status contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/errors-and-code-splitting#lazy-components"
          },
          {
            "name": "listGlobalStores",
            "anchor": "api-tavojs-core--listglobalstores",
            "kind": "function",
            "signature": "listGlobalStores(): string[]",
            "description": "Lists all registered global store names.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#global-stores"
          },
          {
            "name": "listServices",
            "anchor": "api-tavojs-core--listservices",
            "kind": "function",
            "signature": "listServices(): string[]",
            "description": "Lists all registered service names.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#selection"
          },
          {
            "name": "mergeRefs",
            "anchor": "api-tavojs-core--mergerefs",
            "kind": "function",
            "signature": "mergeRefs<T extends Element>(...refs: DomRef<T>[]): DomRefCallback<T>",
            "description": "Combines several refs into one callback ref.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "MvcComponentDefinition",
            "anchor": "api-tavojs-core--mvccomponentdefinition",
            "kind": "type",
            "signature": "type MvcComponentDefinition<P extends AnyRecord, S extends AnyRecord, C> = {\n    model?: (props: P) => S | Store<S>;\n    controller?: new (ctx: MvcControllerContext<P, S>) => C;\n    createController?: (ctx: MvcControllerContext<P, S>) => C;\n    view: (ctx: MvcContext<P, S, C>) => Child;\n};",
            "description": "Defines the mvc component definition contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/mvc#definition-contract"
          },
          {
            "name": "observeIntersection",
            "anchor": "api-tavojs-core--observeintersection",
            "kind": "function",
            "signature": "observeIntersection<T extends Element>(target: ElementTarget<T>, listener: IntersectionObserverCallback, options?: IntersectionObserverInit | undefined): Unsubscribe",
            "description": "Observes element viewport intersection changes and returns an unsubscribe function.",
            "runtime": [
              "browser",
              "server"
            ],
            "runtimeNote": "Server-safe no-op",
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#managed-observers"
          },
          {
            "name": "observeMutation",
            "anchor": "api-tavojs-core--observemutation",
            "kind": "function",
            "signature": "observeMutation<T extends Node>(target: T | { current: T | null; }, listener: MutationCallback, options?: MutationObserverInit | undefined): Unsubscribe",
            "description": "Observes DOM mutations and returns an unsubscribe function.",
            "runtime": [
              "browser",
              "server"
            ],
            "runtimeNote": "Server-safe no-op",
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#managed-observers"
          },
          {
            "name": "observeResize",
            "anchor": "api-tavojs-core--observeresize",
            "kind": "function",
            "signature": "observeResize<T extends Element>(target: ElementTarget<T>, listener: ResizeObserverCallback, options?: ResizeObserverOptions | undefined): Unsubscribe",
            "description": "Observes element size changes and returns an unsubscribe function.",
            "runtime": [
              "browser",
              "server"
            ],
            "runtimeNote": "Server-safe no-op",
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#managed-observers"
          },
          {
            "name": "persistStore",
            "anchor": "api-tavojs-core--persiststore",
            "kind": "function",
            "signature": "persistStore<T extends Record<string, unknown>>(store: Store<T>, options: PersistStoreOptions<T>): Unsubscribe",
            "description": "Persists store updates to browser storage and hydrates an initial saved snapshot when available.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#derived-and-persistent-stores"
          },
          {
            "name": "PersistStoreOptions",
            "anchor": "api-tavojs-core--persiststoreoptions",
            "kind": "type",
            "signature": "type PersistStoreOptions<T extends Record<string, unknown>> = {\n    key: string;\n    storage?: StorageLike;\n    serialize?: (state: T) => string;\n    deserialize?: (raw: string) => Partial<T> | T;\n    pick?: (state: T) => Partial<T> | T;\n};",
            "description": "Configures persist store in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#derived-and-persistent-stores"
          },
          {
            "name": "PropsWithChildren",
            "anchor": "api-tavojs-core--propswithchildren",
            "kind": "type",
            "signature": "type PropsWithChildren<P extends Record<string, unknown> = Record<string, unknown>> = P & {\n    children?: Child;\n};",
            "description": "Defines the props with children contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#functional-components"
          },
          {
            "name": "registerService",
            "anchor": "api-tavojs-core--registerservice",
            "kind": "function",
            "signature": "registerService<T>(identifier: ServiceIdentifier<T>, service: T, options?: RegisterServiceOptions | undefined): T",
            "description": "Registers a named app/service dependency and returns the same instance.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#registration"
          },
          {
            "name": "RegisterServiceOptions",
            "anchor": "api-tavojs-core--registerserviceoptions",
            "kind": "type",
            "signature": "type RegisterServiceOptions = {\n    override?: boolean;\n};",
            "description": "Configures register service in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#registration"
          },
          {
            "name": "render",
            "anchor": "api-tavojs-core--render",
            "kind": "function",
            "signature": "render(node: Child, container: Element | DocumentFragment): void",
            "description": "Renders  for the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#manual-rendering"
          },
          {
            "name": "renderStyleTags",
            "anchor": "api-tavojs-core--renderstyletags",
            "kind": "function",
            "signature": "renderStyleTags(registry: StyleRegistry, options?: RenderStyleTagsOptions | undefined): string",
            "description": "Renders style tags for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "renderToString",
            "anchor": "api-tavojs-core--rendertostring",
            "kind": "function",
            "signature": "renderToString(node: Child): string",
            "description": "Renders to string for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#manual-rendering"
          },
          {
            "name": "Resource",
            "anchor": "api-tavojs-core--resource",
            "kind": "type",
            "signature": "type Resource<T> = {\n    store: Store<ResourceState<T>>;\n    read(): ResourceState<T>;\n    load(options?: {\n        signal?: AbortSignal;\n    }): Promise<ResourceState<T>>;\n    preload(options?: {\n        signal?: AbortSignal;\n    }): Promise<ResourceState<T>>;\n    abort(reason?: unknown): void;\n    reset(): void;\n};",
            "description": "Defines the resource contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#resource-reference"
          },
          {
            "name": "ResourceState",
            "anchor": "api-tavojs-core--resourcestate",
            "kind": "type",
            "signature": "type ResourceState<T> = {\n    status: \"idle\" | \"loading\" | \"success\" | \"error\";\n    data: T | null;\n    error: unknown;\n    updatedAt: number | null;\n};",
            "description": "Represents the observable state of resource in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#resource-reference"
          },
          {
            "name": "Root",
            "anchor": "api-tavojs-core--root",
            "kind": "type",
            "signature": "type Root = {\n    render(node: Child): void;\n    hydrate(node: Child): void;\n    unmount(): void;\n};",
            "description": "Defines the root contract used by the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#manual-rendering"
          },
          {
            "name": "Script",
            "anchor": "api-tavojs-core--script",
            "kind": "function",
            "signature": "Script(props: ScriptProps): Child",
            "description": "Injects external or inline scripts into the document head for CSR and SSR flows.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#font-script-reference"
          },
          {
            "name": "ScriptProps",
            "anchor": "api-tavojs-core--scriptprops",
            "kind": "type",
            "signature": "type ScriptProps = {\n    src?: string;\n    type?: string;\n    async?: boolean;\n    defer?: boolean;\n    module?: boolean;\n    noModule?: boolean;\n    preload?: boolean;\n    content?: string;\n    json?: unknown;\n    id?: string;\n    nonce?: string;\n    integrity?: string;\n    crossOrigin?: \"anonymous\" | \"use-credentials\";\n    referrerPolicy?: \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\";\n    fetchPriority?: \"high\" | \"low\" | \"auto\";\n};",
            "description": "Defines the props accepted by script in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#font-script-reference"
          },
          {
            "name": "SelectorListener",
            "anchor": "api-tavojs-core--selectorlistener",
            "kind": "type",
            "signature": "type SelectorListener<S, T> = (selected: S, previousSelected: S, state: T) => void;",
            "description": "Defines a callback notified by selector in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-subscriptions"
          },
          {
            "name": "Seo",
            "anchor": "api-tavojs-core--seo",
            "kind": "function",
            "signature": "Seo(props: SeoProps): Child",
            "description": "Injects common SEO metadata into the document head for CSR and SSR apps.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "SeoOpenGraph",
            "anchor": "api-tavojs-core--seoopengraph",
            "kind": "type",
            "signature": "type SeoOpenGraph = {\n    title?: string;\n    description?: string;\n    type?: string;\n    url?: string;\n    image?: string;\n    imageAlt?: string;\n    siteName?: string;\n    locale?: string;\n};",
            "description": "Defines the seo open graph contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "SeoProps",
            "anchor": "api-tavojs-core--seoprops",
            "kind": "type",
            "signature": "type SeoProps = {\n    title?: string;\n    description?: string;\n    canonical?: string;\n    robots?: string;\n    noIndex?: boolean;\n    noFollow?: boolean;\n    keywords?: string | string[];\n    author?: string;\n    themeColor?: string;\n    openGraph?: SeoOpenGraph;\n    twitter?: SeoTwitter;\n};",
            "description": "Defines the props accepted by seo in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "SeoTwitter",
            "anchor": "api-tavojs-core--seotwitter",
            "kind": "type",
            "signature": "type SeoTwitter = {\n    card?: \"summary\" | \"summary_large_image\" | \"app\" | \"player\";\n    title?: string;\n    description?: string;\n    image?: string;\n    creator?: string;\n    site?: string;\n};",
            "description": "Defines the seo twitter contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#head-seo-reference"
          },
          {
            "name": "ServerFormActionBody",
            "anchor": "api-tavojs-core--serverformactionbody",
            "kind": "type",
            "signature": "type ServerFormActionBody = ServerFormActionBodyValue | Partial<Record<TavoBootMode | \"default\", ServerFormActionBodyValue>>;",
            "description": "Defines the server form action body contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "ServerFormActionBodyContext",
            "anchor": "api-tavojs-core--serverformactionbodycontext",
            "kind": "type",
            "signature": "type ServerFormActionBodyContext = {\n    bootMode: TavoBootMode;\n    url: string;\n};",
            "description": "Provides the context passed to server form action body in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "ServerFormActionBodyValue",
            "anchor": "api-tavojs-core--serverformactionbodyvalue",
            "kind": "type",
            "signature": "type ServerFormActionBodyValue = \"form-data\" | \"json\" | ((values: FormValues, context: ServerFormActionBodyContext) => BodyInit | Promise<BodyInit>);",
            "description": "Defines the server form action body value contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "ServerFormActionContentType",
            "anchor": "api-tavojs-core--serverformactioncontenttype",
            "kind": "type",
            "signature": "type ServerFormActionContentType = ActionContentType | Partial<Record<TavoBootMode | \"default\", ActionContentType>>;",
            "description": "Defines the server form action content type contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "ServerFormActionOptions",
            "anchor": "api-tavojs-core--serverformactionoptions",
            "kind": "type",
            "signature": "type ServerFormActionOptions<TResult = unknown> = {\n    body?: ServerFormActionBody;\n    contentType?: ServerFormActionContentType;\n    credentials?: RequestCredentials;\n    fetch?: typeof fetch;\n    headers?: HeadersInit;\n    method?: string;\n    parseResponse?: (response: Response) => Promise<TResult> | TResult;\n};",
            "description": "Configures server form action in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#form-action-reference"
          },
          {
            "name": "ServiceIdentifier",
            "anchor": "api-tavojs-core--serviceidentifier",
            "kind": "type",
            "signature": "type ServiceIdentifier<T = unknown> = string | ServiceKey<T>;",
            "description": "Defines the service identifier contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#typed-services"
          },
          {
            "name": "ServiceKey",
            "anchor": "api-tavojs-core--servicekey",
            "kind": "type",
            "signature": "type ServiceKey<T> = {\n    readonly name: string;\n    readonly __tavoServiceType?: T;\n};",
            "description": "Defines the service key contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#typed-services"
          },
          {
            "name": "setRef",
            "anchor": "api-tavojs-core--setref",
            "kind": "function",
            "signature": "setRef<T extends Element>(ref: DomRef<T>, node: T | null): void",
            "description": "Sets a ref to a DOM node or null. Useful when writing framework adapters.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#ref-lifecycle"
          },
          {
            "name": "shallowEqual",
            "anchor": "api-tavojs-core--shallowequal",
            "kind": "function",
            "signature": "shallowEqual(left: unknown, right: unknown): boolean",
            "description": "Provides shallow equal behavior for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-subscriptions"
          },
          {
            "name": "StatePatch",
            "anchor": "api-tavojs-core--statepatch",
            "kind": "type",
            "signature": "type StatePatch<T extends Record<string, unknown>> = Partial<T> | ((previous: T) => Partial<T>);",
            "description": "Defines the state patch contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-contract"
          },
          {
            "name": "StateUpdater",
            "anchor": "api-tavojs-core--stateupdater",
            "kind": "type",
            "signature": "type StateUpdater<T extends Record<string, unknown>> = T | ((previous: T) => T);",
            "description": "Defines the state updater contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-contract"
          },
          {
            "name": "StorageLike",
            "anchor": "api-tavojs-core--storagelike",
            "kind": "type",
            "signature": "type StorageLike = {\n    getItem(key: string): string | null;\n    setItem(key: string, value: string): void;\n    removeItem?(key: string): void;\n};",
            "description": "Defines the storage like contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#derived-and-persistent-stores"
          },
          {
            "name": "Store",
            "anchor": "api-tavojs-core--store",
            "kind": "type",
            "signature": "type Store<T extends Record<string, unknown>> = {\n    getState(): T;\n    setState(next: StateUpdater<T>): T;\n    set<K extends keyof T>(key: K, value: StoreSetValue<T, T[K]>): T;\n    set<S = unknown>(path: StorePath, value: StoreSetValue<T, S>): T;\n    patch(partial: StatePatch<T>): T;\n    subscribe(listener: StoreListener<T>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    subscribeSelector<S>(selector: StoreSelector<T, S>, listener: SelectorListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<K extends keyof T>(key: K, listener: StoreWatchListener<T[K], T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: T[K], b: T[K]) => boolean;\n    }): Unsubscribe;\n    watch<S>(selector: StoreSelector<T, S>, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<S = unknown>(path: StorePath, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n};",
            "description": "Defines storage behavior for application runtime in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-contract"
          },
          {
            "name": "StoreInitializer",
            "anchor": "api-tavojs-core--storeinitializer",
            "kind": "type",
            "signature": "type StoreInitializer<T extends Record<string, unknown>> = (set: StoreInitializerSet<T>, get: () => T) => T;",
            "description": "Defines the store initializer contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-initializers"
          },
          {
            "name": "StoreInitializerSet",
            "anchor": "api-tavojs-core--storeinitializerset",
            "kind": "type",
            "signature": "type StoreInitializerSet<T extends Record<string, unknown>> = (partial: StatePatch<T>) => T;",
            "description": "Defines the store initializer set contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-initializers"
          },
          {
            "name": "StoreListener",
            "anchor": "api-tavojs-core--storelistener",
            "kind": "type",
            "signature": "type StoreListener<T> = (state: T, previous: T) => void;",
            "description": "Defines a callback notified by store in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-subscriptions"
          },
          {
            "name": "StorePath",
            "anchor": "api-tavojs-core--storepath",
            "kind": "type",
            "signature": "type StorePath = StorePathSegment | readonly StorePathSegment[];",
            "description": "Defines the store path contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#nested-store-paths"
          },
          {
            "name": "StorePathSegment",
            "anchor": "api-tavojs-core--storepathsegment",
            "kind": "type",
            "signature": "type StorePathSegment = string | number;",
            "description": "Defines the store path segment contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#nested-store-paths"
          },
          {
            "name": "StoreSelector",
            "anchor": "api-tavojs-core--storeselector",
            "kind": "type",
            "signature": "type StoreSelector<T, S> = (state: T) => S;",
            "description": "Defines the store selector contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#store-subscriptions"
          },
          {
            "name": "StoreWatchListener",
            "anchor": "api-tavojs-core--storewatchlistener",
            "kind": "type",
            "signature": "type StoreWatchListener<S, T> = (selected: S, previousSelected: S, state: T, previousState: T) => void;",
            "description": "Defines a callback notified by store watch in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/stores#nested-store-paths"
          },
          {
            "name": "style",
            "anchor": "api-tavojs-core--style",
            "kind": "function",
            "signature": "style(id: string, css: string, options?: StyleOptions | undefined): void",
            "description": "Provides style behavior for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "StyleOptions",
            "anchor": "api-tavojs-core--styleoptions",
            "kind": "type",
            "signature": "type StyleOptions = {\n    attributes?: Record<string, string | number | boolean>;\n};",
            "description": "Configures style in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "StyleRegistry",
            "anchor": "api-tavojs-core--styleregistry",
            "kind": "type",
            "signature": "type StyleRegistry = {\n    add(id: string, css: string, options?: StyleOptions): void;\n    has(id: string): boolean;\n    entries(): StyleRegistryEntry[];\n};",
            "description": "Defines the style registry contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "StyleRegistryEntry",
            "anchor": "api-tavojs-core--styleregistryentry",
            "kind": "type",
            "signature": "type StyleRegistryEntry = {\n    id: string;\n    css: string;\n    attributes?: Record<string, string | number | boolean>;\n};",
            "description": "Describes one entry in style registry in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          },
          {
            "name": "TAVO_API_STABILITY",
            "anchor": "api-tavojs-core--tavo-api-stability",
            "kind": "value",
            "signature": "TAVO_API_STABILITY: Readonly<{ \"@tavojs/core\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/config\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/dev\": { level: \"experimental\"; since: string; note: string; }; \"@tavojs/core/jsx-dev-runtime\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/jsx-runtime\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/plugin\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/router\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/server\": { level: \"stable\"; since: string; note: string; }; \"@tavojs/core/server-only\": { level: \"stable\"; since: string; note: string; }; }>",
            "description": "Machine-readable stability contract for public package entry points.\nStable entry points follow semantic versioning from Tavo.js 1.0 onward.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/api-stability#stability-contract"
          },
          {
            "name": "TAVO_DIAGNOSTIC_MESSAGES",
            "anchor": "api-tavojs-core--tavo-diagnostic-messages",
            "kind": "value",
            "signature": "TAVO_DIAGNOSTIC_MESSAGES: Readonly<{ readonly TAVO_PAGES_001: \"The resolved page cache limit is invalid.\"; readonly TAVO_PAGES_002: \"The client root element is missing.\"; readonly TAVO_PAGES_003: \"The auto-discovery pattern is unsupported.\"; readonly TAVO_PAGES_004: \"The bundler page-discovery API is unavailable.\"; readonly TAVO_PAGES_005: \"Server bootstrap is missing page modules.\"; readonly TAVO_PAGES_006: \"A page module declares conflicting static generation options.\"; readonly TAVO_SSR_001: \"The canonical SSR origin is invalid.\"; readonly TAVO_CONFIG_001: \"A server-only module reached the client bundle.\"; readonly TAVO_CONFIG_002: \"A likely secret environment value is referenced by client code.\"; readonly TAVO_PLUGIN_001: \"A plugin targets an unsupported Tavo.js plugin API version.\"; readonly TAVO_PLUGIN_002: \"A plugin manifest or identity is invalid.\"; readonly TAVO_PLUGIN_003: \"Plugin ownership or contribution is duplicated.\"; readonly TAVO_PLUGIN_004: \"A plugin dependency or capability requirement is not satisfied.\"; readonly TAVO_PLUGIN_005: \"A plugin dependency or ordering graph contains a cycle.\"; readonly TAVO_PLUGIN_006: \"A plugin requested a reserved resource or missing permission.\"; readonly TAVO_PLUGIN_007: \"A plugin phase does not implement its declared manifest.\"; readonly TAVO_PLUGIN_008: \"A plugin failed during initialization or build.\"; readonly TAVO_PLUGIN_009: \"A plugin failed while handling or disposing a request.\"; readonly TAVO_HYDRATION_001: \"Strict hydration detected a server/client mismatch.\"; }>",
            "description": "Exposes the tavo diagnostic messages constant used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "TavoAction",
            "anchor": "api-tavojs-core--tavoaction",
            "kind": "type",
            "signature": "type TavoAction<TResult, TArgs extends unknown[]> = {\n    readonly pending: boolean;\n    readonly error: unknown;\n    readonly result: TResult | null;\n    run(...args: TArgs): Promise<TResult>;\n    reset(): void;\n};",
            "description": "Defines the tavo action contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/mvc#controller-actions"
          },
          {
            "name": "TavoBootMode",
            "anchor": "api-tavojs-core--tavobootmode",
            "kind": "type",
            "signature": "type TavoBootMode = \"server\" | \"ssr\" | \"csr\" | \"none\";",
            "description": "Defines the tavo boot mode contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#boot-and-hydration-reference"
          },
          {
            "name": "TavoController",
            "anchor": "api-tavojs-core--tavocontroller",
            "kind": "class",
            "signature": "class TavoController implements MvcControllerTools {\n    #private;\n    model: Store<any>;\n    props: AnyRecord;\n    router: MvcControllerFrameworkContext[\"router\"];\n    stores: MvcControllerFrameworkContext[\"stores\"];\n    services: MvcControllerFrameworkContext[\"services\"];\n    capabilities: MvcControllerFrameworkContext[\"capabilities\"];\n    page: MvcControllerFrameworkContext[\"page\"];\n    __setTavoControllerContext(context: Pick<MvcControllerContext<AnyRecord, AnyRecord>, \"model\" | \"props\">): void;\n    __setTavoControllerTools(tools: MvcControllerTools): void;\n    cleanup(fn: Unsubscribe): Unsubscribe;\n    createId(prefix?: string): string;\n    setTimeout(fn: () => void, delay?: number): Unsubscribe;\n    setInterval(fn: () => void, delay?: number): Unsubscribe;\n    action<TResult, TArgs extends unknown[]>(fn: (...args: TArgs) => Promise<TResult> | TResult): TavoAction<TResult, TArgs>;\n    scheduleLayoutEffect(fn: () => void | Unsubscribe): Unsubscribe;\n    scheduleAfterRender(fn: () => void): Unsubscribe;\n    scheduleOnMount(fn: () => void | Unsubscribe): Unsubscribe;\n    listen<T extends AnyRecord>(store: Store<T>, listener: StoreListener<T>, options?: {\n        immediate?: boolean;\n    }): Unsubscribe;\n    select<T extends AnyRecord, S>(store: Store<T>, selector: StoreSelector<T, S>, listener: SelectorListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    watch<T extends AnyRecord, S>(store: Store<T>, target: StorePath | StoreSelector<T, S>, listener: StoreWatchListener<S, T>, options?: {\n        immediate?: boolean;\n        isEqual?: (a: S, b: S) => boolean;\n    }): Unsubscribe;\n    listenExternal<T>(store: ExternalStore<T>, listener: (snapshot: T, previousSnapshot: T) => void, options?: {\n        immediate?: boolean;\n        isEqual?: (a: T, b: T) => boolean;\n    }): Unsubscribe;\n    observeResize<T extends Element>(target: ElementTarget<T>, listener: ResizeObserverCallback, options?: ResizeObserverOptions): Unsubscribe;\n    observeIntersection<T extends Element>(target: ElementTarget<T>, listener: IntersectionObserverCallback, options?: IntersectionObserverInit): Unsubscribe;\n    observeMutation<T extends Node>(target: T | {\n        current: T | null;\n    }, listener: MutationCallback, options?: MutationObserverInit): Unsubscribe;\n}",
            "description": "Defines the tavo controller contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/mvc#lifecycle-reference"
          },
          {
            "name": "TavoDiagnosticCode",
            "anchor": "api-tavojs-core--tavodiagnosticcode",
            "kind": "type",
            "signature": "type TavoDiagnosticCode = keyof typeof TAVO_DIAGNOSTIC_MESSAGES;",
            "description": "Defines the tavo diagnostic code contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "TavoError",
            "anchor": "api-tavojs-core--tavoerror",
            "kind": "class",
            "signature": "class TavoError extends Error {\n    readonly code: TavoDiagnosticCode;\n    readonly details?: Readonly<Record<string, unknown>>;\n    readonly hint?: string;\n    constructor(code: TavoDiagnosticCode, message?: string, options?: TavoErrorOptions);\n}",
            "description": "Framework error with a stable code and optional structured remediation context.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "TavoErrorOptions",
            "anchor": "api-tavojs-core--tavoerroroptions",
            "kind": "type",
            "signature": "type TavoErrorOptions = {\n    cause?: unknown;\n    details?: Readonly<Record<string, unknown>>;\n    hint?: string;\n};",
            "description": "Configures tavo error in the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/diagnostics#coded-errors"
          },
          {
            "name": "TavoPublicEntryPoint",
            "anchor": "api-tavojs-core--tavopublicentrypoint",
            "kind": "type",
            "signature": "type TavoPublicEntryPoint = keyof typeof TAVO_API_STABILITY;",
            "description": "Defines the tavo public entry point contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/api-stability#stability-contract"
          },
          {
            "name": "transition",
            "anchor": "api-tavojs-core--transition",
            "kind": "function",
            "signature": "transition<T extends HTMLElement = HTMLElement>(options?: TransitionOptions<T> | undefined): ElementDirective<T>",
            "description": "Creates a small class/callback transition directive for mounted elements.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "TransitionClassNames",
            "anchor": "api-tavojs-core--transitionclassnames",
            "kind": "type",
            "signature": "type TransitionClassNames = {\n    enter?: string;\n    enterActive?: string;\n    leave?: string;\n    leaveActive?: string;\n};",
            "description": "Defines the transition class names contract used by the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "TransitionOptions",
            "anchor": "api-tavojs-core--transitionoptions",
            "kind": "type",
            "signature": "type TransitionOptions<T extends HTMLElement = HTMLElement> = {\n    classes?: TransitionClassNames;\n    onEnter?: (element: T) => void;\n    onLeave?: (element: T) => void;\n};",
            "description": "Configures transition in the application runtime.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#directives"
          },
          {
            "name": "trapFocus",
            "anchor": "api-tavojs-core--trapfocus",
            "kind": "function",
            "signature": "trapFocus(root: HTMLElement): () => void",
            "description": "Keeps Tab navigation inside a container until the returned cleanup runs.",
            "runtime": [
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/dom-and-accessibility#focus-ownership"
          },
          {
            "name": "tryGetService",
            "anchor": "api-tavojs-core--trygetservice",
            "kind": "function",
            "signature": "tryGetService<T>(identifier: ServiceIdentifier<T>): T | undefined",
            "description": "Looks up an optional service by name without throwing when it is missing.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/services-and-dependencies#selection"
          },
          {
            "name": "Unsubscribe",
            "anchor": "api-tavojs-core--unsubscribe",
            "kind": "type",
            "signature": "type Unsubscribe = () => void;",
            "description": "Defines the unsubscribe contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/mvc#lifecycle-and-cleanup"
          },
          {
            "name": "VNode",
            "anchor": "api-tavojs-core--vnode",
            "kind": "type",
            "signature": "type VNode = {\n    type: NodeType;\n    props: {\n        children: Child[];\n        [key: string]: unknown;\n    };\n};",
            "description": "Defines the v node contract used by the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/components-and-jsx#intrinsic-runtime"
          },
          {
            "name": "withStyleRegistry",
            "anchor": "api-tavojs-core--withstyleregistry",
            "kind": "function",
            "signature": "withStyleRegistry<T>(registry: StyleRegistry, fn: () => T): T",
            "description": "Runs work with style registry for the application runtime.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#styling"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/router",
        "symbols": [
          {
            "name": "createRouter",
            "anchor": "api-tavojs-core-router--createrouter",
            "kind": "function",
            "signature": "createRouter(routes: RouteConfig[]): Router",
            "description": "Creates a client router with history navigation and pattern matching.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "defineAction",
            "anchor": "api-tavojs-core-router--defineaction",
            "kind": "function",
            "signature": "defineAction<T extends PageAction>(action: T, options?: PageActionOptions | undefined): T",
            "description": "Defines a server route action for non-GET requests while preserving handler types.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#route-action-reference"
          },
          {
            "name": "defineLoader",
            "anchor": "api-tavojs-core-router--defineloader",
            "kind": "function",
            "signature": "defineLoader<T>(loader: (context: PageLoadContext) => T | Promise<T>, options?: PageLoaderOptions | undefined): (context: PageLoadContext) => T | Promise<T>",
            "description": "Defines a route loader while preserving its return type for app-level helpers.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "defineMiddleware",
            "anchor": "api-tavojs-core-router--definemiddleware",
            "kind": "function",
            "signature": "defineMiddleware<T extends PageMiddleware | PageMiddleware[]>(middleware: T, options?: PageMiddlewareOptions | undefined): T",
            "description": "Defines route middleware with a stable signature.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "defineRoutePage",
            "anchor": "api-tavojs-core-router--defineroutepage",
            "kind": "function",
            "signature": "defineRoutePage<TPath extends string, TData = unknown>(path: TPath, page: TypedPageModule<TPath, TData>): TypedPageModule<TPath, TData>",
            "description": "Defines a page module with a filename path hint for typed params and loader data.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#page-module-reference"
          },
          {
            "name": "defineServerLoader",
            "anchor": "api-tavojs-core-router--defineserverloader",
            "kind": "function",
            "signature": "defineServerLoader<T>(loader: (context: PageLoadContext) => T | Promise<T>): (context: PageLoadContext) => T | Promise<T>",
            "description": "Defines a route loader that only runs during server-side route resolution.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "defineServerMiddleware",
            "anchor": "api-tavojs-core-router--defineservermiddleware",
            "kind": "function",
            "signature": "defineServerMiddleware<T extends PageMiddleware | PageMiddleware[]>(middleware: T): T",
            "description": "Defines route middleware that only runs during server-side route resolution.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "getAvailableRoutes",
            "anchor": "api-tavojs-core-router--getavailableroutes",
            "kind": "function",
            "signature": "getAvailableRoutes(): PageRouteDefinition[]",
            "description": "Reads current available routes from the reactive route store.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#subscriptions"
          },
          {
            "name": "getCurrentPathname",
            "anchor": "api-tavojs-core-router--getcurrentpathname",
            "kind": "function",
            "signature": "getCurrentPathname(): string",
            "description": "Reads current pathname from the reactive navigation store.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#subscriptions"
          },
          {
            "name": "getResolvedRoute",
            "anchor": "api-tavojs-core-router--getresolvedroute",
            "kind": "function",
            "signature": "getResolvedRoute(pathname?: string): {\n    pathname: string;\n    params: RouterParams;\n    route: PageRouteDefinition | null;\n    status: number;\n    data: unknown;\n    error: unknown;\n    layers: RouteDataLayer[];\n    layerData: Record<string, unknown>;\n    head: PageHead;\n    cache: PageCachePolicy;\n    renderMode: PageRenderMode;\n    node: Child;\n    redirect?: string;\n    i18n?: {\n        locale: string;\n        dir: I18nLocaleDirection;\n    };\n} | null",
            "description": "Reads the resolved route payload for one pathname or the current active location.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#subscriptions"
          },
          {
            "name": "getRouteStatus",
            "anchor": "api-tavojs-core-router--getroutestatus",
            "kind": "function",
            "signature": "getRouteStatus(pathname?: string | undefined): RouteStatus",
            "description": "Reads current route status state for a pathname.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#status"
          },
          {
            "name": "isClientRuntime",
            "anchor": "api-tavojs-core-router--isclientruntime",
            "kind": "function",
            "signature": "isClientRuntime(): boolean",
            "description": "Reports whether the current value satisfies client runtime for the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/route-files-and-matching#module-shape"
          },
          {
            "name": "isServerRuntime",
            "anchor": "api-tavojs-core-router--isserverruntime",
            "kind": "function",
            "signature": "isServerRuntime(): boolean",
            "description": "Reports whether the current value satisfies server runtime for the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/route-files-and-matching#module-shape"
          },
          {
            "name": "Link",
            "anchor": "api-tavojs-core-router--link",
            "kind": "value",
            "signature": "Link(props: PropsWithChildren<LinkProps>): Child",
            "description": "Anchor component with SPA navigation behavior and browser fallback semantics.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#navigation"
          },
          {
            "name": "LinkProps",
            "anchor": "api-tavojs-core-router--linkprops",
            "kind": "type",
            "signature": "type LinkProps = {\n    to: string;\n    replace?: boolean;\n    scroll?: boolean;\n    className?: ClassName;\n    children?: Child;\n};",
            "description": "Defines the props accepted by link in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#navigation"
          },
          {
            "name": "LoaderData",
            "anchor": "api-tavojs-core-router--loaderdata",
            "kind": "type",
            "signature": "type LoaderData<TLoader> = TLoader extends (...args: any[]) => infer TResult ? Awaited<TResult> : never;",
            "description": "Defines the loader data contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "MiddlewareResult",
            "anchor": "api-tavojs-core-router--middlewareresult",
            "kind": "type",
            "signature": "type MiddlewareResult = void | {\n    redirect?: string;\n    status?: number;\n};",
            "description": "Describes the result returned by middleware in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "MiddlewareRuntime",
            "anchor": "api-tavojs-core-router--middlewareruntime",
            "kind": "type",
            "signature": "type MiddlewareRuntime = RuntimeEnvironment | \"both\";",
            "description": "Defines the middleware runtime contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "navigate",
            "anchor": "api-tavojs-core-router--navigate",
            "kind": "function",
            "signature": "navigate(to: string, options?: RouterNavigateOptions | undefined): void",
            "description": "Navigates using active router when available, with history fallback.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#navigation"
          },
          {
            "name": "notFound",
            "anchor": "api-tavojs-core-router--notfound",
            "kind": "function",
            "signature": "notFound(): never",
            "description": "Stops route resolution and renders the application's reserved 404 page.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/route-files-and-matching#special-modules"
          },
          {
            "name": "PageAction",
            "anchor": "api-tavojs-core-router--pageaction",
            "kind": "type",
            "signature": "type PageAction = ((context: PageActionContext) => Response | ActionResult | void | Promise<Response | ActionResult | void>) & {\n    __tavo_action_options__?: PageActionOptions;\n};",
            "description": "Defines the page action contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#route-action-reference"
          },
          {
            "name": "PageActionContext",
            "anchor": "api-tavojs-core-router--pageactioncontext",
            "kind": "type",
            "signature": "type PageActionContext = PageLoadContext;",
            "description": "Provides the context passed to page action in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#route-action-reference"
          },
          {
            "name": "PageActionOptions",
            "anchor": "api-tavojs-core-router--pageactionoptions",
            "kind": "type",
            "signature": "type PageActionOptions = {\n    contentType?: ActionContentType;\n    validateOrigin?: boolean;\n};",
            "description": "Configures page action in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#route-action-reference"
          },
          {
            "name": "PageCachePolicy",
            "anchor": "api-tavojs-core-router--pagecachepolicy",
            "kind": "type",
            "signature": "type PageCachePolicy = {\n    static: boolean;\n    revalidate: number | null;\n    vary: string[];\n    tags: string[];\n};",
            "description": "Defines the page cache policy contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/static-output-and-cache#choose-policy"
          },
          {
            "name": "PageCacheTags",
            "anchor": "api-tavojs-core-router--pagecachetags",
            "kind": "type",
            "signature": "type PageCacheTags = string | string[] | ((context: PageLoadContext) => string | string[] | Promise<string | string[]>);",
            "description": "Defines the page cache tags contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/static-output-and-cache#choose-policy"
          },
          {
            "name": "PageErrorProps",
            "anchor": "api-tavojs-core-router--pageerrorprops",
            "kind": "type",
            "signature": "type PageErrorProps<TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = PagePendingProps<TParams, TLayers> & {\n    data: unknown;\n    error: unknown;\n};",
            "description": "Defines the props accepted by page error in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#route-pending-error-reference"
          },
          {
            "name": "PageHead",
            "anchor": "api-tavojs-core-router--pagehead",
            "kind": "type",
            "signature": "type PageHead = {\n    title?: string;\n    unsafeHeadHtml?: string;\n    status?: number;\n    htmlAttributes?: Record<string, string | number | boolean>;\n    bodyAttributes?: Record<string, string | number | boolean>;\n};",
            "description": "Defines the page head contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/rendering-head-and-hydration#head-contract"
          },
          {
            "name": "PageHeadExport",
            "anchor": "api-tavojs-core-router--pageheadexport",
            "kind": "type",
            "signature": "type PageHeadExport = PageHead | Child;",
            "description": "Defines the page head export contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/rendering-head-and-hydration#head-contract"
          },
          {
            "name": "PageLoadContext",
            "anchor": "api-tavojs-core-router--pageloadcontext",
            "kind": "type",
            "signature": "type PageLoadContext = {\n    pathname: string;\n    params: RouterParams;\n    request: Request;\n    rawRequest?: unknown;\n    url: URL;\n    headers: Headers;\n    method: string;\n    signal: AbortSignal;\n    layers?: Record<string, unknown>;\n};",
            "description": "Provides the context passed to page load in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "PageLoader",
            "anchor": "api-tavojs-core-router--pageloader",
            "kind": "type",
            "signature": "type PageLoader = ((context: PageLoadContext) => unknown | Promise<unknown>) & {\n    __tavo_loader_options__?: PageLoaderOptions;\n};",
            "description": "Defines the page loader contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "PageLoaderOptions",
            "anchor": "api-tavojs-core-router--pageloaderoptions",
            "kind": "type",
            "signature": "type PageLoaderOptions = {\n    runtime?: LoaderRuntime;\n};",
            "description": "Configures page loader in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#loader-contract-reference"
          },
          {
            "name": "PageMiddleware",
            "anchor": "api-tavojs-core-router--pagemiddleware",
            "kind": "type",
            "signature": "type PageMiddleware = ((context: {\n    to: string;\n    from?: string;\n    params: RouterParams;\n    request: Request;\n    rawRequest?: unknown;\n    url: URL;\n    headers: Headers;\n    method: string;\n    signal: AbortSignal;\n}) => MiddlewareResult | Promise<MiddlewareResult>) & {\n    __tavo_middleware_options__?: PageMiddlewareOptions;\n};",
            "description": "Defines the page middleware contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "PageMiddlewareOptions",
            "anchor": "api-tavojs-core-router--pagemiddlewareoptions",
            "kind": "type",
            "signature": "type PageMiddlewareOptions = {\n    runtime?: MiddlewareRuntime;\n};",
            "description": "Configures page middleware in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/data-and-middleware#middleware-contract-reference"
          },
          {
            "name": "PagePendingProps",
            "anchor": "api-tavojs-core-router--pagependingprops",
            "kind": "type",
            "signature": "type PagePendingProps<TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = {\n    pathname: string;\n    params: TParams;\n    layers: RouteDataLayer[];\n    layerData: TLayers;\n};",
            "description": "Defines the props accepted by page pending in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#route-pending-error-reference"
          },
          {
            "name": "PageProps",
            "anchor": "api-tavojs-core-router--pageprops",
            "kind": "type",
            "signature": "type PageProps<TData = unknown, TParams extends RouterParams = RouterParams, TLayers extends Record<string, unknown> = Record<string, unknown>> = {\n    pathname?: string;\n    params: TParams;\n    data?: TData;\n    error?: unknown;\n    layers?: RouteDataLayer[];\n    layerData?: TLayers;\n};",
            "description": "Defines the props accepted by page in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#page-module-reference"
          },
          {
            "name": "PageRenderMode",
            "anchor": "api-tavojs-core-router--pagerendermode",
            "kind": "type",
            "signature": "type PageRenderMode = \"ssr\" | \"csr\";",
            "description": "Defines the page render mode contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#render-mode-reference"
          },
          {
            "name": "PageRevalidate",
            "anchor": "api-tavojs-core-router--pagerevalidate",
            "kind": "type",
            "signature": "type PageRevalidate = number | false;",
            "description": "Defines the page revalidate contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/static-output-and-cache#choose-policy"
          },
          {
            "name": "PageRouteDefinition",
            "anchor": "api-tavojs-core-router--pageroutedefinition",
            "kind": "type",
            "signature": "type PageRouteDefinition = {\n    file: string;\n    path: string;\n    component: Component<AnyRecord>;\n    pending?: Component<AnyRecord>;\n    error?: Component<AnyRecord>;\n    layouts: Component<AnyRecord>[];\n    layoutLayers: Array<{\n        kind: \"root\" | \"layout\";\n        id: string;\n        file: string;\n        component: Component<AnyRecord>;\n        load?: PageModuleRecord[\"load\"];\n        head?: PageModuleRecord[\"head\"];\n        middleware: PageMiddleware[];\n        render?: PageModuleRecord[\"render\"];\n        layout?: PageModuleRecord[\"layout\"];\n        prerender?: boolean;\n        static?: boolean;\n        revalidate?: PageRevalidate;\n        vary?: string | string[];\n        cacheTags?: PageCacheTags;\n    }>;\n    load?: PageModuleRecord[\"load\"];\n    action?: PageModuleRecord[\"action\"];\n    head?: PageModuleRecord[\"head\"];\n    middleware: PageMiddleware[];\n    cacheTags?: PageCacheTags;\n    cacheTagResolvers: PageCacheTags[];\n    generateStaticParams?: PageModuleRecord[\"generateStaticParams\"];\n    renderMode: PageRenderMode;\n    cache: PageCachePolicy;\n};",
            "description": "Defines the page route definition contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#page-module-reference"
          },
          {
            "name": "PageStaticParams",
            "anchor": "api-tavojs-core-router--pagestaticparams",
            "kind": "type",
            "signature": "type PageStaticParams = RouterParams[];",
            "description": "Defines the page static params contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#route-conventions-reference"
          },
          {
            "name": "prefetchRoute",
            "anchor": "api-tavojs-core-router--prefetchroute",
            "kind": "function",
            "signature": "prefetchRoute(pathname: string, options?: { signal?: AbortSignal | undefined; } | undefined): Promise<void>",
            "description": "Prefetches a route by resolving its loaders without changing browser location.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#prefetch"
          },
          {
            "name": "RouteConfig",
            "anchor": "api-tavojs-core-router--routeconfig",
            "kind": "type",
            "signature": "type RouteConfig = {\n    path: string;\n    component: Component<{\n        params: RouterParams;\n    }>;\n};",
            "description": "Defines the route config contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "RouteParamsFromPath",
            "anchor": "api-tavojs-core-router--routeparamsfrompath",
            "kind": "type",
            "signature": "type RouteParamsFromPath<TPath extends string> = RouteParamsFromSegments<TPath>;",
            "description": "Defines the route params from path contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#page-module-reference"
          },
          {
            "name": "Router",
            "anchor": "api-tavojs-core-router--router",
            "kind": "type",
            "signature": "type Router = {\n    navigate(to: string, options?: RouterNavigateOptions): void;\n    getPathname(): string;\n    match(pathname: string): {\n        route: RouteConfig | null;\n        params: RouterParams;\n    };\n};",
            "description": "Defines the router contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "RouterNavigateOptions",
            "anchor": "api-tavojs-core-router--routernavigateoptions",
            "kind": "type",
            "signature": "type RouterNavigateOptions = {\n    replace?: boolean;\n    scroll?: boolean;\n};",
            "description": "Configures router navigate in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "RouterParams",
            "anchor": "api-tavojs-core-router--routerparams",
            "kind": "type",
            "signature": "type RouterParams = Record<string, string>;",
            "description": "Defines the router params contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "RouterProvider",
            "anchor": "api-tavojs-core-router--routerprovider",
            "kind": "value",
            "signature": "RouterProvider(props: PropsWithChildren<RouterProviderProps>): Child",
            "description": "Provides router context and renders either explicit children or matched route view.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/routing#standalone-router-reference"
          },
          {
            "name": "RouteStatus",
            "anchor": "api-tavojs-core-router--routestatus",
            "kind": "type",
            "signature": "type RouteStatus = {\n    pathname: string;\n    status: \"idle\" | \"loading\" | \"prefetching\" | \"ready\" | \"redirecting\" | \"error\";\n    error: unknown;\n    redirect?: string;\n};",
            "description": "Defines the route status contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#status"
          },
          {
            "name": "RouteStatusState",
            "anchor": "api-tavojs-core-router--routestatusstate",
            "kind": "type",
            "signature": "type RouteStatusState = {\n    byPath: Record<string, RouteStatus>;\n};",
            "description": "Represents the observable state of route status in the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#status"
          },
          {
            "name": "subscribeAvailableRoutes",
            "anchor": "api-tavojs-core-router--subscribeavailableroutes",
            "kind": "function",
            "signature": "subscribeAvailableRoutes(listener: (routes: PageRouteDefinition[]) => void): () => void",
            "description": "Subscribes to route catalog updates.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#subscriptions"
          },
          {
            "name": "subscribePathname",
            "anchor": "api-tavojs-core-router--subscribepathname",
            "kind": "function",
            "signature": "subscribePathname(listener: (pathname: string) => void): () => void",
            "description": "Subscribes to pathname changes.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#subscriptions"
          },
          {
            "name": "subscribeRouteStatus",
            "anchor": "api-tavojs-core-router--subscriberoutestatus",
            "kind": "function",
            "signature": "subscribeRouteStatus(listener: (status: RouteStatus, all: RouteStatusState) => void, pathname?: string | undefined): () => void",
            "description": "Subscribes to route status changes for one pathname or all routes.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/navigation-and-route-state#status"
          },
          {
            "name": "TypedPageModule",
            "anchor": "api-tavojs-core-router--typedpagemodule",
            "kind": "type",
            "signature": "type TypedPageModule<TPath extends string, TData = unknown> = Omit<PageModuleRecord, \"default\" | \"pending\" | \"error\" | \"prerender\"> & {\n    default: Component<PageProps<TData, RouteParamsFromPath<TPath>>>;\n    pending?: Component<PagePendingProps<RouteParamsFromPath<TPath>>>;\n    error?: Component<PageErrorProps<RouteParamsFromPath<TPath>>>;\n};",
            "description": "Defines the typed page module contract used by the file routing and route modules.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#page-module-reference"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/server",
        "symbols": [
          {
            "name": "createMemorySessionStore",
            "anchor": "api-tavojs-core-server--creatememorysessionstore",
            "kind": "function",
            "signature": "createMemorySessionStore<T extends Record<string, unknown>>(options?: MemorySessionStoreOptions | undefined): SessionStore<T> & { size(): number; }",
            "description": "Creates memory session store for the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-store-reference"
          },
          {
            "name": "createMemoryStaticCache",
            "anchor": "api-tavojs-core-server--creatememorystaticcache",
            "kind": "function",
            "signature": "createMemoryStaticCache(options?: MemoryStaticCacheOptions | undefined): SsrStaticCache & { size(): number; clear(): void; }",
            "description": "Creates the default process-local static SSR cache used by the Node request handler.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#static-cache-contract"
          },
          {
            "name": "createNodeRequestHandler",
            "anchor": "api-tavojs-core-server--createnoderequesthandler",
            "kind": "function",
            "signature": "createNodeRequestHandler(options: NodeHandlerOptions, runtime?: PagesRuntime | Promise<PagesRuntime> | undefined): ((req: { url?: string | undefined; method?: string | undefined; headers?: Record<string, string | undefined> | undefined; once?: ((event: string, listener: () => void) => unknown) | undefined; off?: ((event: string, listener: () => void) => unknown) | undefined; }, res: { writeHead: (status: number, headers: Record<string, string | string[]>) => void; write: (chunk: Uint8Array<ArrayBufferLike>) => boolean | void; end: (body?: string | Uint8Array<ArrayBufferLike> | undefined) => void; headersSent?: boolean | undefined; destroyed?: boolean | undefined; once?: ((event: string, listener: () => void) => unknown) | undefined; off?: ((event: string, listener: () => void) => unknown) | undefined; }) => Promise<void>) & { invalidateCache: (tags: string | string[]) => Promise<number>; clearCache: () => Promise<void>; }",
            "description": "Creates a Node-style request handler that renders framework pages to HTML.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/node-runtime#handler-http"
          },
          {
            "name": "createPagesRuntimeAsync",
            "anchor": "api-tavojs-core-server--createpagesruntimeasync",
            "kind": "function",
            "signature": "createPagesRuntimeAsync(modules: PageModules, options?: PageRuntimeOptions | undefined): Promise<PagesRuntime>",
            "description": "Async variant for SSR/build flows that use async plugin lifecycle hooks.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#pages-runtime-reference"
          },
          {
            "name": "createSessionStorage",
            "anchor": "api-tavojs-core-server--createsessionstorage",
            "kind": "function",
            "signature": "createSessionStorage<T extends Record<string, unknown>>(options: SessionStorageOptions<T>): SessionStorage<T>",
            "description": "Creates session storage for the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-storage-reference"
          },
          {
            "name": "defineServerOnly",
            "anchor": "api-tavojs-core-server--defineserveronly",
            "kind": "function",
            "signature": "defineServerOnly<T extends (...args: any[]) => unknown>(fn: T): T",
            "description": "Defines and type-checks server only for the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/security#server-only-reference"
          },
          {
            "name": "ImageOptimizerOptions",
            "anchor": "api-tavojs-core-server--imageoptimizeroptions",
            "kind": "type",
            "signature": "type ImageOptimizerOptions = {\n    enabled?: boolean;\n    allowRemote?: boolean;\n    remotePatterns?: Array<string | RemoteImagePattern>;\n    publicDir?: string;\n    quality?: number;\n    cacheMaxAge?: number;\n    defaultFormat?: ImageFormat;\n    sizes?: number[];\n    timeoutMs?: number;\n    maxBytes?: number;\n    memoryCacheMaxEntries?: number;\n    maxConcurrentTransforms?: number;\n    maxPendingTransforms?: number;\n    allowInsecureRemote?: boolean;\n    resolveHostname?: (hostname: string) => Promise<Array<{\n        address: string;\n    }>>;\n};",
            "description": "Configures image optimizer in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/seo-assets-and-styling#image-reference"
          },
          {
            "name": "invalidateStaticCache",
            "anchor": "api-tavojs-core-server--invalidatestaticcache",
            "kind": "function",
            "signature": "invalidateStaticCache(cache: SsrStaticCache, tags: string | string[]): Promise<number>",
            "description": "Invalidates tagged entries when supported by a cache adapter.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#static-cache-contract"
          },
          {
            "name": "loadServerEnv",
            "anchor": "api-tavojs-core-server--loadserverenv",
            "kind": "function",
            "signature": "loadServerEnv(options?: LoadServerEnvOptions | undefined): Record<string, string>",
            "description": "Loads server-only .env files into process.env without exposing them to client code.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/environment-variables#server-example"
          },
          {
            "name": "LoadServerEnvOptions",
            "anchor": "api-tavojs-core-server--loadserverenvoptions",
            "kind": "type",
            "signature": "type LoadServerEnvOptions = {\n    mode?: string;\n    root?: string;\n};",
            "description": "Configures load server env in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/environment-variables#server-example"
          },
          {
            "name": "MemorySessionStoreOptions",
            "anchor": "api-tavojs-core-server--memorysessionstoreoptions",
            "kind": "type",
            "signature": "type MemorySessionStoreOptions = {\n    /** Maximum process-local sessions. Set to 0 to disable persistence. */\n    maxEntries?: number;\n};",
            "description": "Configures memory session store in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-store-reference"
          },
          {
            "name": "MemoryStaticCacheOptions",
            "anchor": "api-tavojs-core-server--memorystaticcacheoptions",
            "kind": "type",
            "signature": "type MemoryStaticCacheOptions = {\n    /** Maximum process-local entries. Set to 0 to disable storage. */\n    maxEntries?: number;\n};",
            "description": "Configures memory static cache in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#static-cache-contract"
          },
          {
            "name": "NodeHandlerOptions",
            "anchor": "api-tavojs-core-server--nodehandleroptions",
            "kind": "type",
            "signature": "type NodeHandlerOptions = PageRuntimeOptions & {\n    modules: PageModules;\n    /** Public origin used when Node runs behind TLS termination, e.g. https://app.example.com. */\n    canonicalOrigin?: string;\n    document?: RenderDocumentOptions;\n    stream?: boolean;\n    images?: ImageOptimizerOptions;\n    staticCache?: SsrStaticCache;\n    maxRequestBodyBytes?: number;\n};",
            "description": "Configures node handler in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/node-runtime#handler-http"
          },
          {
            "name": "renderDocument",
            "anchor": "api-tavojs-core-server--renderdocument",
            "kind": "function",
            "signature": "renderDocument(node: Child, options?: RenderDocumentOptions | undefined): string",
            "description": "Renders document for the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#server-rendering-methods"
          },
          {
            "name": "RenderDocumentOptions",
            "anchor": "api-tavojs-core-server--renderdocumentoptions",
            "kind": "type",
            "signature": "type RenderDocumentOptions = {\n    lang?: string;\n    title?: string;\n    unsafeHeadHtml?: string;\n    bodyAttributes?: Record<string, string | number | boolean>;\n    htmlAttributes?: Record<string, string | number | boolean>;\n    appAttributes?: Record<string, string | number | boolean>;\n    doctype?: string;\n    appContainerId?: string;\n    initialState?: unknown;\n    stateScriptId?: string;\n    nonce?: string;\n    beforeRender?: () => void;\n    styleRegistry?: StyleRegistry;\n};",
            "description": "Configures render document in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#server-rendering-methods"
          },
          {
            "name": "renderDocumentStream",
            "anchor": "api-tavojs-core-server--renderdocumentstream",
            "kind": "function",
            "signature": "renderDocumentStream(node: Child, options?: RenderDocumentOptions | undefined): ReadableStream<Uint8Array<ArrayBufferLike>>",
            "description": "Renders document stream for the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#server-rendering-methods"
          },
          {
            "name": "renderPagesResponseFromRuntimeAsync",
            "anchor": "api-tavojs-core-server--renderpagesresponsefromruntimeasync",
            "kind": "function",
            "signature": "renderPagesResponseFromRuntimeAsync(runtime: PagesRuntime, pathname: string, options?: RenderPagesDocumentAsyncOptions | undefined): Promise<RenderPagesResponse>",
            "description": "Resolves route data/head with a prebuilt runtime and returns HTML with HTTP response metadata.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/pages-and-layouts#pages-runtime-reference"
          },
          {
            "name": "Session",
            "anchor": "api-tavojs-core-server--session",
            "kind": "type",
            "signature": "type Session<T extends Record<string, unknown>> = {\n    readonly data: T;\n    readonly id: string;\n    readonly isNew: boolean;\n    readonly rotated: boolean;\n    readonly secure: boolean;\n    delete(key: keyof T & string): void;\n    destroy(): void;\n    get<K extends keyof T & string>(key: K): T[K] | undefined;\n    has(key: keyof T & string): boolean;\n    rotate(): void;\n    set<K extends keyof T & string>(key: K, value: T[K]): void;\n};",
            "description": "Defines the session contract used by the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-api-reference"
          },
          {
            "name": "SessionCommitOptions",
            "anchor": "api-tavojs-core-server--sessioncommitoptions",
            "kind": "type",
            "signature": "type SessionCommitOptions = {\n    maxAge?: number;\n};",
            "description": "Configures session commit in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-api-reference"
          },
          {
            "name": "SessionCookieOptions",
            "anchor": "api-tavojs-core-server--sessioncookieoptions",
            "kind": "type",
            "signature": "type SessionCookieOptions = {\n    domain?: string;\n    httpOnly?: boolean;\n    maxAge?: number;\n    name: string;\n    path?: string;\n    sameSite?: SessionCookieSameSite;\n    secrets: string[];\n    secure?: boolean;\n};",
            "description": "Configures session cookie in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-api-reference"
          },
          {
            "name": "SessionCookieSameSite",
            "anchor": "api-tavojs-core-server--sessioncookiesamesite",
            "kind": "type",
            "signature": "type SessionCookieSameSite = \"lax\" | \"strict\" | \"none\";",
            "description": "Defines the session cookie same site contract used by the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-api-reference"
          },
          {
            "name": "SessionStorage",
            "anchor": "api-tavojs-core-server--sessionstorage",
            "kind": "type",
            "signature": "type SessionStorage<T extends Record<string, unknown>> = {\n    commitSession(session: Session<T>, options?: SessionCommitOptions): Promise<string>;\n    destroySession(session: Session<T>, options?: SessionCommitOptions): Promise<string>;\n    getSession(contextOrRequest?: unknown): Promise<Session<T>>;\n    redirect(to: string, session: Session<T>, init?: ResponseInit): Promise<Response>;\n};",
            "description": "Defines the session storage contract used by the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-storage-reference"
          },
          {
            "name": "SessionStorageOptions",
            "anchor": "api-tavojs-core-server--sessionstorageoptions",
            "kind": "type",
            "signature": "type SessionStorageOptions<T extends Record<string, unknown>> = {\n    cookie: SessionCookieOptions;\n    store?: SessionStore<T>;\n};",
            "description": "Configures session storage in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-storage-reference"
          },
          {
            "name": "SessionStore",
            "anchor": "api-tavojs-core-server--sessionstore",
            "kind": "type",
            "signature": "type SessionStore<T extends Record<string, unknown>> = {\n    get(id: string): Promise<SessionStoreEntry<T> | null> | SessionStoreEntry<T> | null;\n    set(id: string, entry: SessionStoreEntry<T>): Promise<void> | void;\n    delete(id: string): Promise<void> | void;\n};",
            "description": "Defines storage behavior for session in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-store-reference"
          },
          {
            "name": "SessionStoreEntry",
            "anchor": "api-tavojs-core-server--sessionstoreentry",
            "kind": "type",
            "signature": "type SessionStoreEntry<T extends Record<string, unknown>> = {\n    data: T;\n    expiresAt: number | null;\n};",
            "description": "Describes one entry in session store in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/sessions-and-authentication#session-store-reference"
          },
          {
            "name": "SsrStaticCache",
            "anchor": "api-tavojs-core-server--ssrstaticcache",
            "kind": "type",
            "signature": "type SsrStaticCache = {\n    get(key: string): SsrStaticCacheEntry | null | Promise<SsrStaticCacheEntry | null>;\n    set(key: string, entry: SsrStaticCacheEntry): void | Promise<void>;\n    delete(key: string): void | Promise<void>;\n    invalidateTags?(tags: string[]): number | Promise<number>;\n    clear?(): void | Promise<void>;\n};",
            "description": "Defines the ssr static cache contract used by the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#static-cache-contract"
          },
          {
            "name": "SsrStaticCacheEntry",
            "anchor": "api-tavojs-core-server--ssrstaticcacheentry",
            "kind": "type",
            "signature": "type SsrStaticCacheEntry = {\n    response: RenderPagesResponse;\n    expiresAt: number | null;\n    tags: string[];\n};",
            "description": "Describes one entry in ssr static cache in the server runtime.",
            "runtime": [
              "server"
            ],
            "stability": "public",
            "related": "/docs/core/ssr-and-hydration#static-cache-contract"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/config",
        "symbols": [
          {
            "name": "defineConfig",
            "anchor": "api-tavojs-core-config--defineconfig",
            "kind": "function",
            "signature": "defineConfig<const T extends TavoConfig>(config: ExactTavoConfig<T>): T",
            "description": "Defines the single project configuration object and brands it for runtime validation.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#tavo-config"
          },
          {
            "name": "defineTavoViteConfig",
            "anchor": "api-tavojs-core-config--definetavoviteconfig",
            "kind": "function",
            "signature": "defineTavoViteConfig(config?: TavoViteConfigExport | undefined): TavoViteConfigExport",
            "description": "Defines a Vite config with the JSX runtime settings required by Tavo.js.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#vite-config"
          },
          {
            "name": "ExactTavoConfig",
            "anchor": "api-tavojs-core-config--exacttavoconfig",
            "kind": "type",
            "signature": "type ExactTavoConfig<T extends TavoConfig> = T & {\n    [K in Exclude<keyof T, keyof TavoConfig>]: never;\n};",
            "description": "Defines the exact tavo config contract used by the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#top-level-reference"
          },
          {
            "name": "TavoConfig",
            "anchor": "api-tavojs-core-config--tavoconfig",
            "kind": "type",
            "signature": "type TavoConfig = {\n    pagesDir?: string;\n    cssEntries?: string[];\n    plugins?: TavoPluginInput;\n    diagnostics?: {\n        devOverlay?: boolean;\n        traces?: boolean;\n    };\n    build?: {\n        prerenderStyles?: \"inline\" | \"external\";\n        budgets?: {\n            firstLoadJs?: number | string;\n            routeJs?: number | string;\n        };\n    };\n    ssr?: Omit<NodeHandlerOptions, \"modules\" | \"plugins\"> & {\n        modules?: NodeHandlerOptions[\"modules\"];\n    };\n};",
            "description": "Defines the tavo config contract used by the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#top-level-reference"
          },
          {
            "name": "TavoViteConfig",
            "anchor": "api-tavojs-core-config--tavoviteconfig",
            "kind": "type",
            "signature": "type TavoViteConfig = Record<string, unknown> & {\n    esbuild?: ViteEsbuildOptions | false;\n};",
            "description": "Defines the tavo vite config contract used by the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#vite-config"
          },
          {
            "name": "TavoViteConfigEnv",
            "anchor": "api-tavojs-core-config--tavoviteconfigenv",
            "kind": "type",
            "signature": "type TavoViteConfigEnv = Record<string, unknown> & {\n    command?: string;\n    mode?: string;\n    isPreview?: boolean;\n    isSsrBuild?: boolean;\n};",
            "description": "Defines the tavo vite config env contract used by the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#vite-config"
          },
          {
            "name": "TavoViteConfigExport",
            "anchor": "api-tavojs-core-config--tavoviteconfigexport",
            "kind": "type",
            "signature": "type TavoViteConfigExport = TavoViteConfig | Promise<TavoViteConfig> | ((env: TavoViteConfigEnv) => TavoViteConfig | Promise<TavoViteConfig>);",
            "description": "Defines the tavo vite config export contract used by the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#vite-config"
          },
          {
            "name": "ViteEsbuildOptions",
            "anchor": "api-tavojs-core-config--viteesbuildoptions",
            "kind": "type",
            "signature": "type ViteEsbuildOptions = Record<string, unknown> & {\n    jsx?: string;\n    jsxImportSource?: string;\n};",
            "description": "Configures vite esbuild in the project configuration.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#vite-config"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/plugin",
        "symbols": [
          {
            "name": "AnyPluginToken",
            "anchor": "api-tavojs-core-plugin--anyplugintoken",
            "kind": "type",
            "signature": "type AnyPluginToken = PluginCapabilityToken<any, any> | PluginStoreToken<any>;",
            "description": "Defines the any plugin token contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "checkPluginCompatibility",
            "anchor": "api-tavojs-core-plugin--checkplugincompatibility",
            "kind": "function",
            "signature": "checkPluginCompatibility(plugin: { id: string; apiVersion: number; }): { compatible: boolean; currentVersion: 1; requestedVersion: number; diagnostic?: PluginDiagnostic | undefined; }",
            "description": "Checks a plugin descriptor without running phase code.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "defineCapability",
            "anchor": "api-tavojs-core-plugin--definecapability",
            "kind": "function",
            "signature": "defineCapability<T, TScope extends \"runtime\" | \"request\">(definition: { provider: string; name: string; scope: TScope; }): PluginCapabilityToken<T, TScope>",
            "description": "Defines and type-checks capability for the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "definePlugin",
            "anchor": "api-tavojs-core-plugin--defineplugin",
            "kind": "function",
            "signature": "definePlugin<T extends TavoPlugin>(plugin: T): T",
            "description": "Defines a Plugin API v1 descriptor. Validation occurs during graph compilation.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "definePluginFactory",
            "anchor": "api-tavojs-core-plugin--definepluginfactory",
            "kind": "function",
            "signature": "definePluginFactory<TOptions, TPlugin extends TavoPlugin>(factory: (options: TOptions) => TPlugin): (options: TOptions) => TPlugin",
            "description": "Defines a typed plugin factory.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#installation"
          },
          {
            "name": "definePluginPhase",
            "anchor": "api-tavojs-core-plugin--definepluginphase",
            "kind": "function",
            "signature": "definePluginPhase<T extends TavoPluginPhase>(phase: T): T",
            "description": "Defines a phase implementation while preserving its literal keys.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "definePluginStore",
            "anchor": "api-tavojs-core-plugin--definepluginstore",
            "kind": "function",
            "signature": "definePluginStore<T extends AnyRecord>(definition: Omit<PluginStoreToken<T>, \"hydrate\" | \"kind\" | \"scope\"> & { hydrate?: boolean | undefined; }): PluginStoreToken<T>",
            "description": "Defines an owned runtime store and its optional hydration contract.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#stores"
          },
          {
            "name": "MaybePromise",
            "anchor": "api-tavojs-core-plugin--maybepromise",
            "kind": "type",
            "signature": "type MaybePromise<T> = T | Promise<T>;",
            "description": "Defines the maybe promise contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "PluginBuildDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginbuilddeclaration",
            "kind": "type",
            "signature": "type PluginBuildDeclaration = {\n    aliases?: Readonly<Record<string, string>>;\n    defines?: Readonly<Record<string, string>>;\n    plugins?: readonly PluginBuildItemDeclaration[];\n};",
            "description": "Defines the plugin build declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginBuildItemDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginbuilditemdeclaration",
            "kind": "type",
            "signature": "type PluginBuildItemDeclaration = {\n    id: string;\n    before?: readonly string[];\n    after?: readonly string[];\n};",
            "description": "Defines the plugin build item declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginCapabilityResolver",
            "anchor": "api-tavojs-core-plugin--plugincapabilityresolver",
            "kind": "type",
            "signature": "type PluginCapabilityResolver = {\n    resolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T;\n    tryResolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T | undefined;\n};",
            "description": "Defines the plugin capability resolver contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginCapabilityToken",
            "anchor": "api-tavojs-core-plugin--plugincapabilitytoken",
            "kind": "type",
            "signature": "type PluginCapabilityToken<T = unknown, TScope extends PluginScope = PluginScope> = {\n    readonly kind: \"capability\";\n    readonly provider: string;\n    readonly name: string;\n    readonly scope: TScope;\n    readonly __tavoCapabilityType?: T;\n};",
            "description": "Defines the plugin capability token contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginDependency",
            "anchor": "api-tavojs-core-plugin--plugindependency",
            "kind": "type",
            "signature": "type PluginDependency = {\n    id: string;\n    instanceId?: string;\n    version: string;\n    optional?: boolean;\n    capabilities?: readonly AnyPluginToken[];\n};",
            "description": "Defines the plugin dependency contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "PluginDiagnostic",
            "anchor": "api-tavojs-core-plugin--plugindiagnostic",
            "kind": "type",
            "signature": "type PluginDiagnostic = {\n    code: PluginDiagnosticCode;\n    severity: \"error\" | \"warning\";\n    phase: \"compile\" | \"initialize\" | \"build\" | \"request\" | \"dispose\";\n    message: string;\n    resource?: string;\n    owners?: readonly string[];\n    hint?: string;\n};",
            "description": "Defines the plugin diagnostic contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#plugin-verification"
          },
          {
            "name": "PluginDiagnosticCode",
            "anchor": "api-tavojs-core-plugin--plugindiagnosticcode",
            "kind": "type",
            "signature": "type PluginDiagnosticCode = \"TAVO_PLUGIN_001\" | \"TAVO_PLUGIN_002\" | \"TAVO_PLUGIN_003\" | \"TAVO_PLUGIN_004\" | \"TAVO_PLUGIN_005\" | \"TAVO_PLUGIN_006\" | \"TAVO_PLUGIN_007\" | \"TAVO_PLUGIN_008\" | \"TAVO_PLUGIN_009\";",
            "description": "Defines the plugin diagnostic code contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#plugin-verification"
          },
          {
            "name": "PluginEndpointDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginendpointdeclaration",
            "kind": "type",
            "signature": "type PluginEndpointDeclaration = {\n    id: string;\n    methods: readonly string[];\n    match: PluginEndpointMatcher;\n    validateOrigin?: boolean;\n};",
            "description": "Defines the plugin endpoint declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginEndpointMatcher",
            "anchor": "api-tavojs-core-plugin--pluginendpointmatcher",
            "kind": "type",
            "signature": "type PluginEndpointMatcher = {\n    kind: \"exact\";\n    path: string;\n} | {\n    kind: \"subtree\";\n    path: string;\n};",
            "description": "Defines the plugin endpoint matcher contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginExposureDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginexposuredeclaration",
            "kind": "type",
            "signature": "type PluginExposureDeclaration = {\n    target: \"page\" | \"server\";\n    from?: string;\n    to: string;\n    reason: string;\n};",
            "description": "Defines the plugin exposure declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginExposureTarget",
            "anchor": "api-tavojs-core-plugin--pluginexposuretarget",
            "kind": "type",
            "signature": "type PluginExposureTarget = string | {\n    from?: string;\n    to: string;\n};",
            "description": "Defines the plugin exposure target contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginHeadDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginheaddeclaration",
            "kind": "type",
            "signature": "type PluginHeadDeclaration = {\n    id: string;\n    key: string;\n    cardinality: \"singleton\" | \"multi\";\n    unsafeHeadHtml?: boolean;\n};",
            "description": "Defines the plugin head declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginHeadImplementation",
            "anchor": "api-tavojs-core-plugin--pluginheadimplementation",
            "kind": "type",
            "signature": "type PluginHeadImplementation = Child | string | ((context: PluginResolveContext) => MaybePromise<Child | string>);",
            "description": "Defines the plugin head implementation contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginMiddlewareDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginmiddlewaredeclaration",
            "kind": "type",
            "signature": "type PluginMiddlewareDeclaration = {\n    id: string;\n    target: PluginMiddlewareTarget;\n    stage: PluginMiddlewareStage;\n    before?: readonly string[];\n    after?: readonly string[];\n};",
            "description": "Defines the plugin middleware declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginMiddlewareStage",
            "anchor": "api-tavojs-core-plugin--pluginmiddlewarestage",
            "kind": "type",
            "signature": "type PluginMiddlewareStage = \"server:before-handler\" | \"page:before-app\" | \"page:after-app\";",
            "description": "Defines the plugin middleware stage contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginMiddlewareTarget",
            "anchor": "api-tavojs-core-plugin--pluginmiddlewaretarget",
            "kind": "type",
            "signature": "type PluginMiddlewareTarget = \"server\" | \"page\";",
            "description": "Defines the plugin middleware target contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginOverride",
            "anchor": "api-tavojs-core-plugin--pluginoverride",
            "kind": "type",
            "signature": "type PluginOverride = {\n    kind: \"page\" | \"endpoint\" | \"head\" | \"alias\" | \"define\";\n    key: string;\n    replace: {\n        plugin: string;\n        instanceId?: string;\n    };\n    with: {\n        owner: \"app\" | string;\n        instanceId?: string;\n        key?: string;\n    };\n};",
            "description": "Defines the plugin override contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#installation"
          },
          {
            "name": "PluginPageDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginpagedeclaration",
            "kind": "type",
            "signature": "type PluginPageDeclaration = {\n    id: string;\n    path: string;\n};",
            "description": "Defines the plugin page declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginPermissionDeclaration",
            "anchor": "api-tavojs-core-plugin--pluginpermissiondeclaration",
            "kind": "type",
            "signature": "type PluginPermissionDeclaration = {\n    name: \"unsafeHeadHtml\";\n    /** Required permissions are part of the plugin's installation contract. */\n    required?: boolean;\n    reason: string;\n};",
            "description": "Defines the plugin permission declaration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "PluginPhaseLoader",
            "anchor": "api-tavojs-core-plugin--pluginphaseloader",
            "kind": "type",
            "signature": "type PluginPhaseLoader = () => MaybePromise<TavoPluginPhase | {\n    default: TavoPluginPhase;\n}>;",
            "description": "Defines the plugin phase loader contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "PluginPhaseTarget",
            "anchor": "api-tavojs-core-plugin--pluginphasetarget",
            "kind": "type",
            "signature": "type PluginPhaseTarget = \"client\" | \"server\" | \"build\";",
            "description": "Defines the plugin phase target contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "PluginRequestResolveContext",
            "anchor": "api-tavojs-core-plugin--pluginrequestresolvecontext",
            "kind": "type",
            "signature": "type PluginRequestResolveContext = Omit<PluginResolveContext, \"resolve\" | \"tryResolve\"> & {\n    readonly request: Request;\n    resolve<T>(token: PluginCapabilityToken<T, any> | PluginStoreToken<any>): Promise<T>;\n    tryResolve<T>(token: PluginCapabilityToken<T, any> | PluginStoreToken<any>): Promise<T | undefined>;\n};",
            "description": "Provides the context passed to plugin request resolve in the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginRequestResourceFactory",
            "anchor": "api-tavojs-core-plugin--pluginrequestresourcefactory",
            "kind": "type",
            "signature": "type PluginRequestResourceFactory<T = unknown> = (context: PluginRequestResolveContext) => MaybePromise<T>;",
            "description": "Defines the plugin request resource factory contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginResolveContext",
            "anchor": "api-tavojs-core-plugin--pluginresolvecontext",
            "kind": "type",
            "signature": "type PluginResolveContext = {\n    readonly instanceId: string;\n    resolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T;\n    tryResolve<T>(token: PluginCapabilityToken<T, \"runtime\"> | PluginStoreToken<any>): T | undefined;\n};",
            "description": "Provides the context passed to plugin resolve in the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginResourceFactory",
            "anchor": "api-tavojs-core-plugin--pluginresourcefactory",
            "kind": "type",
            "signature": "type PluginResourceFactory<T = unknown> = (context: PluginResolveContext) => MaybePromise<T>;",
            "description": "Defines the plugin resource factory contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginScope",
            "anchor": "api-tavojs-core-plugin--pluginscope",
            "kind": "type",
            "signature": "type PluginScope = \"runtime\" | \"request\";",
            "description": "Defines the plugin scope contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "PluginServerHandler",
            "anchor": "api-tavojs-core-plugin--pluginserverhandler",
            "kind": "type",
            "signature": "type PluginServerHandler = (context: PluginServerHandlerContext) => MaybePromise<Response>;",
            "description": "Defines the plugin server handler contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginServerHandlerContext",
            "anchor": "api-tavojs-core-plugin--pluginserverhandlercontext",
            "kind": "type",
            "signature": "type PluginServerHandlerContext = PluginRequestResolveContext & {\n    params: Record<string, string>;\n};",
            "description": "Provides the context passed to plugin server handler in the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginServerMiddleware",
            "anchor": "api-tavojs-core-plugin--pluginservermiddleware",
            "kind": "type",
            "signature": "type PluginServerMiddleware = (context: PluginServerHandlerContext) => MaybePromise<Response | void>;",
            "description": "Defines the plugin server middleware contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#capabilities"
          },
          {
            "name": "PluginStoreFactory",
            "anchor": "api-tavojs-core-plugin--pluginstorefactory",
            "kind": "type",
            "signature": "type PluginStoreFactory<T extends AnyRecord = AnyRecord> = (context: PluginResolveContext) => MaybePromise<T | Store<T>>;",
            "description": "Defines the plugin store factory contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#stores"
          },
          {
            "name": "PluginStoreToken",
            "anchor": "api-tavojs-core-plugin--pluginstoretoken",
            "kind": "type",
            "signature": "type PluginStoreToken<T extends AnyRecord = AnyRecord> = {\n    readonly kind: \"store\";\n    readonly provider: string;\n    readonly name: string;\n    readonly scope: \"runtime\";\n    readonly hydrate: boolean;\n    readonly validate?: (value: unknown) => value is T;\n    readonly serialize?: (value: T) => unknown;\n    readonly deserialize?: (value: unknown) => T;\n    readonly __tavoStoreType?: T;\n};",
            "description": "Defines the plugin store token contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#stores"
          },
          {
            "name": "PluginUse",
            "anchor": "api-tavojs-core-plugin--pluginuse",
            "kind": "type",
            "signature": "type PluginUse = TavoPlugin | (PluginInstallation & {\n    /** Remaps this installation's manifest-declared public exposure. */\n    expose?: {\n        page?: PluginExposureTarget;\n        server?: PluginExposureTarget;\n    };\n});",
            "description": "Application-owned ergonomic installation record.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#installation"
          },
          {
            "name": "PluginUseConfiguration",
            "anchor": "api-tavojs-core-plugin--pluginuseconfiguration",
            "kind": "type",
            "signature": "type PluginUseConfiguration = {\n    use: readonly PluginUse[];\n    overrides?: readonly PluginOverride[];\n};",
            "description": "Defines the plugin use configuration contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#installation"
          },
          {
            "name": "TAVO_PLUGIN_API_VERSION",
            "anchor": "api-tavojs-core-plugin--tavo-plugin-api-version",
            "kind": "value",
            "signature": "TAVO_PLUGIN_API_VERSION: 1",
            "description": "Current public contract implemented by the Tavo.js plugin runtime.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "TavoPlugin",
            "anchor": "api-tavojs-core-plugin--tavoplugin",
            "kind": "type",
            "signature": "type TavoPlugin = {\n    id: string;\n    version: string;\n    apiVersion: typeof TAVO_PLUGIN_API_VERSION;\n    manifest: TavoPluginManifest;\n    client?: PluginPhaseLoader;\n    server?: PluginPhaseLoader;\n    build?: PluginPhaseLoader;\n};",
            "description": "Defines the tavo plugin contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          },
          {
            "name": "TavoPluginInput",
            "anchor": "api-tavojs-core-plugin--tavoplugininput",
            "kind": "type",
            "signature": "type TavoPluginInput = PluginUseConfiguration | readonly PluginUse[];",
            "description": "Author input; normalized to the compiler's internal graph configuration.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#installation"
          },
          {
            "name": "TavoPluginManifest",
            "anchor": "api-tavojs-core-plugin--tavopluginmanifest",
            "kind": "type",
            "signature": "type TavoPluginManifest = {\n    provides?: readonly AnyPluginToken[];\n    dependencies?: readonly PluginDependency[];\n    stores?: readonly PluginStoreToken<any>[];\n    pages?: readonly PluginPageDeclaration[];\n    endpoints?: readonly PluginEndpointDeclaration[];\n    middleware?: readonly PluginMiddlewareDeclaration[];\n    head?: readonly PluginHeadDeclaration[];\n    build?: PluginBuildDeclaration;\n    /** Framework permissions enabled by installing this trusted plugin. */\n    permissions?: readonly PluginPermissionDeclaration[];\n    /** Default public mounts enabled by installing this trusted plugin. */\n    exposure?: readonly PluginExposureDeclaration[];\n};",
            "description": "Defines the tavo plugin manifest contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#manifest-contributions"
          },
          {
            "name": "TavoPluginPhase",
            "anchor": "api-tavojs-core-plugin--tavopluginphase",
            "kind": "type",
            "signature": "type TavoPluginPhase = {\n    capabilities?: Readonly<Record<string, PluginResourceFactory | PluginRequestResourceFactory>>;\n    stores?: Readonly<Record<string, PluginStoreFactory>>;\n    pages?: Readonly<Record<string, PageModule>>;\n    endpoints?: Readonly<Record<string, PluginServerHandler>>;\n    middleware?: Readonly<Record<string, PageMiddleware | PluginServerMiddleware>>;\n    head?: Readonly<Record<string, PluginHeadImplementation>>;\n    build?: {\n        plugins?: Readonly<Record<string, unknown>>;\n    };\n    setup?: (context: PluginResolveContext) => MaybePromise<void>;\n    dispose?: () => MaybePromise<void>;\n};",
            "description": "Defines the tavo plugin phase contract used by the Plugin API v1.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#descriptor"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/dev",
        "symbols": [
          {
            "name": "captureDiagnostics",
            "anchor": "api-tavojs-core-dev--capturediagnostics",
            "kind": "function",
            "signature": "captureDiagnostics(): { traces: DevTraceEvent[]; mismatches: HydrationMismatchEvent[]; restore(): void; }",
            "description": "Captures diagnostics for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "clearServices",
            "anchor": "api-tavojs-core-dev--clearservices",
            "kind": "function",
            "signature": "clearServices(): void",
            "description": "Clears the shared service registry. Intended primarily for tests.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "configureDevDiagnostics",
            "anchor": "api-tavojs-core-dev--configuredevdiagnostics",
            "kind": "function",
            "signature": "configureDevDiagnostics(options: DevDiagnosticsOptions): void",
            "description": "Updates runtime diagnostics callbacks used by the DOM renderer.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "createInstrumentation",
            "anchor": "api-tavojs-core-dev--createinstrumentation",
            "kind": "function",
            "signature": "createInstrumentation(listener: TavoInstrumentationListener): TavoInstrumentation",
            "description": "Creates an isolated observer. Listener failures never interrupt framework work.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "createOpenTelemetryInstrumentation",
            "anchor": "api-tavojs-core-dev--createopentelemetryinstrumentation",
            "kind": "function",
            "signature": "createOpenTelemetryInstrumentation(tracer: OpenTelemetryTracerLike, options?: { recordErrors?: boolean | undefined; } | undefined): TavoInstrumentation",
            "description": "Adapts Tavo.js events to the stable tracing subset shared by OpenTelemetry implementations.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#opentelemetry"
          },
          {
            "name": "createPagesManifest",
            "anchor": "api-tavojs-core-dev--createpagesmanifest",
            "kind": "function",
            "signature": "createPagesManifest(modules: PageModules): PageRouteDefinition[]",
            "description": "Convenience helper returning only sorted route definitions.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#manifest-inspection"
          },
          {
            "name": "createPagesManifestDetailed",
            "anchor": "api-tavojs-core-dev--createpagesmanifestdetailed",
            "kind": "function",
            "signature": "createPagesManifestDetailed(modules: PageModules): PagesManifest",
            "description": "Builds the full pages manifest with routes, layouts, and diagnostics.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#manifest-inspection"
          },
          {
            "name": "createPagesTestHarness",
            "anchor": "api-tavojs-core-dev--createpagestestharness",
            "kind": "function",
            "signature": "createPagesTestHarness(modules: PageModules, options?: PageRuntimeOptions | undefined): { runtime: PagesRuntime; renderPath(pathname: string): string; resolvePath(pathname: string): Promise<unknown>; }",
            "description": "Creates pages test harness for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "createTestRoot",
            "anchor": "api-tavojs-core-dev--createtestroot",
            "kind": "function",
            "signature": "createTestRoot(): TestRoot",
            "description": "Creates test root for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "defineValidatedAction",
            "anchor": "api-tavojs-core-dev--definevalidatedaction",
            "kind": "function",
            "signature": "defineValidatedAction<TInput>(schema: TavoSchema<TInput>, handler: (context: ValidatedActionContext<TInput>) => void | Response | ActionResult | Promise<void | Response | ActionResult>, options?: PageActionOptions | undefined): PageAction",
            "description": "Defines a route action with portable schema validation and structured 400 failures.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "DevDiagnosticsOptions",
            "anchor": "api-tavojs-core-dev--devdiagnosticsoptions",
            "kind": "type",
            "signature": "type DevDiagnosticsOptions = {\n    enabled?: boolean;\n    devMode?: boolean;\n    onTrace?: ((event: DevTraceEvent) => void) | null;\n    onHydrationMismatch?: ((event: HydrationMismatchEvent) => void) | null;\n    onError?: ((error: unknown) => void) | null;\n    strictHydration?: boolean;\n};",
            "description": "Configures dev diagnostics in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "DevTraceEvent",
            "anchor": "api-tavojs-core-dev--devtraceevent",
            "kind": "type",
            "signature": "type DevTraceEvent = {\n    phase: DevTracePhase;\n    kind: string;\n    key?: string | number | null;\n    detail?: string;\n};",
            "description": "Describes an event emitted by dev trace in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "DevTracePhase",
            "anchor": "api-tavojs-core-dev--devtracephase",
            "kind": "type",
            "signature": "type DevTracePhase = \"mount\" | \"patch\" | \"hydrate\";",
            "description": "Defines the dev trace phase contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "expectTextContent",
            "anchor": "api-tavojs-core-dev--expecttextcontent",
            "kind": "function",
            "signature": "expectTextContent(root: TestRoot, expected: string): void",
            "description": "Asserts text content for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "flushMicrotasks",
            "anchor": "api-tavojs-core-dev--flushmicrotasks",
            "kind": "function",
            "signature": "flushMicrotasks(): Promise<void>",
            "description": "Flushes microtasks for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "flushSync",
            "anchor": "api-tavojs-core-dev--flushsync",
            "kind": "function",
            "signature": "flushSync<T>(callback: () => T): T",
            "description": "Flushes sync for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#flush-sync"
          },
          {
            "name": "getAutoPagesInspection",
            "anchor": "api-tavojs-core-dev--getautopagesinspection",
            "kind": "function",
            "signature": "getAutoPagesInspection(): AutoPagesInspection",
            "description": "Returns a privacy-safe snapshot for first-party development tools.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#manifest-inspection"
          },
          {
            "name": "getCurrentUpdatePriority",
            "anchor": "api-tavojs-core-dev--getcurrentupdatepriority",
            "kind": "function",
            "signature": "getCurrentUpdatePriority(): UpdatePriority",
            "description": "Reads current update priority for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#priorities"
          },
          {
            "name": "HydrationMismatchEvent",
            "anchor": "api-tavojs-core-dev--hydrationmismatchevent",
            "kind": "type",
            "signature": "type HydrationMismatchEvent = {\n    message: string;\n    expected?: string;\n    found?: string;\n    path?: string;\n    pathSegments?: string[];\n    phase?: DevTracePhase;\n    kind?: string;\n    recovery?: \"text\" | \"subtree\" | \"cleanup\";\n};",
            "description": "Describes an event emitted by hydration mismatch in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-diagnostics#diagnostic-options"
          },
          {
            "name": "inspectPages",
            "anchor": "api-tavojs-core-dev--inspectpages",
            "kind": "function",
            "signature": "inspectPages(modules: PageModules): { routes: PageRouteDefinition[]; diagnostics: string[]; }",
            "description": "Returns route data and diagnostics without creating runtime objects.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#manifest-inspection"
          },
          {
            "name": "inspectPluginGraph",
            "anchor": "api-tavojs-core-dev--inspectplugingraph",
            "kind": "function",
            "signature": "inspectPluginGraph(config?: TavoPluginInput | undefined, options?: PluginCompileOptions | undefined): PluginGraphInspection",
            "description": "Returns a serializable inspection without executing plugin code.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/plugin-api-v1#plugin-verification"
          },
          {
            "name": "inspectTavoRuntime",
            "anchor": "api-tavojs-core-dev--inspecttavoruntime",
            "kind": "function",
            "signature": "inspectTavoRuntime(): TavoDevtoolsSnapshot",
            "description": "Returns an inspection of tavo runtime for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#runtime-snapshot"
          },
          {
            "name": "installDevOverlay",
            "anchor": "api-tavojs-core-dev--installdevoverlay",
            "kind": "function",
            "signature": "installDevOverlay(options?: { traces?: boolean | undefined; } | undefined): void",
            "description": "Enables a browser overlay for runtime errors and hydration mismatches during development.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#overlay-and-dom"
          },
          {
            "name": "installTavoDevtoolsPanel",
            "anchor": "api-tavojs-core-dev--installtavodevtoolspanel",
            "kind": "function",
            "signature": "installTavoDevtoolsPanel(options?: { target?: HTMLElement | undefined; initiallyOpen?: boolean | undefined; } | undefined): TavoDevtoolsPanel",
            "description": "Installs an opt-in, dependency-free browser panel backed by privacy-safe snapshots.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-devtools#snapshot-api"
          },
          {
            "name": "loadTavoConfig",
            "anchor": "api-tavojs-core-dev--loadtavoconfig",
            "kind": "function",
            "signature": "loadTavoConfig(rootDir?: string | undefined, options?: LoadTavoConfigOptions | undefined): Promise<TavoConfig>",
            "description": "Loads the root `tavo.config.ts` default export once for the current process.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#loading-behavior"
          },
          {
            "name": "LoadTavoConfigOptions",
            "anchor": "api-tavojs-core-dev--loadtavoconfigoptions",
            "kind": "type",
            "signature": "type LoadTavoConfigOptions = {\n    mode?: string;\n};",
            "description": "Configures load tavo config in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/configuration#loading-behavior"
          },
          {
            "name": "OpenTelemetrySpanLike",
            "anchor": "api-tavojs-core-dev--opentelemetryspanlike",
            "kind": "type",
            "signature": "type OpenTelemetrySpanLike = {\n    setAttribute?(name: string, value: string | number | boolean): unknown;\n    recordException?(error: unknown): unknown;\n    setStatus?(status: {\n        code: number;\n        message?: string;\n    }): unknown;\n    end?(endTime?: number): unknown;\n};",
            "description": "Defines the open telemetry span like contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#opentelemetry"
          },
          {
            "name": "OpenTelemetryTracerLike",
            "anchor": "api-tavojs-core-dev--opentelemetrytracerlike",
            "kind": "type",
            "signature": "type OpenTelemetryTracerLike = {\n    startSpan(name: string, options?: {\n        attributes?: Record<string, string | number | boolean>;\n        startTime?: number;\n    }): OpenTelemetrySpanLike;\n};",
            "description": "Defines the open telemetry tracer like contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#opentelemetry"
          },
          {
            "name": "ParseSchema",
            "anchor": "api-tavojs-core-dev--parseschema",
            "kind": "type",
            "signature": "type ParseSchema<T> = {\n    parse?(value: unknown): T;\n    parseAsync?(value: unknown): Promise<T>;\n};",
            "description": "Defines the parse schema contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "RunningDevServer",
            "anchor": "api-tavojs-core-dev--runningdevserver",
            "kind": "type",
            "signature": "type RunningDevServer = {\n    close(): Promise<void>;\n    url: string;\n};",
            "description": "Defines the running dev server contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#ssr-dev-host"
          },
          {
            "name": "runWithUpdatePriority",
            "anchor": "api-tavojs-core-dev--runwithupdatepriority",
            "kind": "function",
            "signature": "runWithUpdatePriority<T>(priority: UpdatePriority, callback: () => T): T",
            "description": "Runs with update priority for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#priorities"
          },
          {
            "name": "SafeParseSchema",
            "anchor": "api-tavojs-core-dev--safeparseschema",
            "kind": "type",
            "signature": "type SafeParseSchema<T> = {\n    safeParse?(value: unknown): unknown;\n    safeParseAsync?(value: unknown): Promise<unknown>;\n};",
            "description": "Defines the safe parse schema contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "StandardSchema",
            "anchor": "api-tavojs-core-dev--standardschema",
            "kind": "type",
            "signature": "type StandardSchema<T> = {\n    \"~standard\": {\n        validate(value: unknown): {\n            value: T;\n            issues?: undefined;\n        } | {\n            value?: undefined;\n            issues: ReadonlyArray<{\n                message: string;\n                path?: ReadonlyArray<PropertyKey | {\n                    key: PropertyKey;\n                }>;\n            }>;\n        } | Promise<{\n            value: T;\n            issues?: undefined;\n        } | {\n            value?: undefined;\n            issues: ReadonlyArray<{\n                message: string;\n                path?: ReadonlyArray<PropertyKey | {\n                    key: PropertyKey;\n                }>;\n            }>;\n        }>;\n    };\n};",
            "description": "Defines the standard schema contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "startTransition",
            "anchor": "api-tavojs-core-dev--starttransition",
            "kind": "function",
            "signature": "startTransition(callback: () => void): void",
            "description": "Starts transition for the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#transition"
          },
          {
            "name": "startViteAutoPagesDevServer",
            "anchor": "api-tavojs-core-dev--startviteautopagesdevserver",
            "kind": "function",
            "signature": "startViteAutoPagesDevServer(options?: ViteAutoPagesDevServerOptions | undefined): Promise<RunningDevServer>",
            "description": "Starts a Vite middleware-mode server that SSR-renders file-based pages.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#ssr-dev-host"
          },
          {
            "name": "subscribeTavoRuntime",
            "anchor": "api-tavojs-core-dev--subscribetavoruntime",
            "kind": "function",
            "signature": "subscribeTavoRuntime(listener: (snapshot: TavoDevtoolsSnapshot) => void, options?: { immediate?: boolean | undefined; } | undefined): () => void",
            "description": "Subscribes to navigation and route lifecycle changes with privacy-safe snapshots.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#runtime-snapshot"
          },
          {
            "name": "TavoDevtoolsPanel",
            "anchor": "api-tavojs-core-dev--tavodevtoolspanel",
            "kind": "type",
            "signature": "type TavoDevtoolsPanel = {\n    element: HTMLElement;\n    refresh(): void;\n    dispose(): void;\n};",
            "description": "Defines the tavo devtools panel contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-devtools#snapshot-api"
          },
          {
            "name": "TavoDevtoolsSnapshot",
            "anchor": "api-tavojs-core-dev--tavodevtoolssnapshot",
            "kind": "type",
            "signature": "type TavoDevtoolsSnapshot = AutoPagesInspection & {\n    dom: {\n        mountedComponents: number;\n        pendingPassiveEffects: number;\n        pendingUpdates: number;\n    };\n};",
            "description": "Defines the tavo devtools snapshot contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/runtime-devtools#snapshot-api"
          },
          {
            "name": "TavoInstrumentation",
            "anchor": "api-tavojs-core-dev--tavoinstrumentation",
            "kind": "type",
            "signature": "type TavoInstrumentation = {\n    emit(event: TavoInstrumentationEvent): void;\n};",
            "description": "Defines the tavo instrumentation contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "TavoInstrumentationEvent",
            "anchor": "api-tavojs-core-dev--tavoinstrumentationevent",
            "kind": "type",
            "signature": "type TavoInstrumentationEvent = {\n    name: TavoInstrumentationEventName;\n    phase: TavoInstrumentationPhase;\n    timestamp: number;\n    requestId?: string;\n    route?: string;\n    layer?: string;\n    durationMs?: number;\n    status?: number;\n    count?: number;\n    cacheTags?: string[];\n    error?: unknown;\n};",
            "description": "Describes an event emitted by tavo instrumentation in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "TavoInstrumentationEventName",
            "anchor": "api-tavojs-core-dev--tavoinstrumentationeventname",
            "kind": "type",
            "signature": "type TavoInstrumentationEventName = \"route.resolve\" | \"route.middleware\" | \"route.loader\" | \"route.action\" | \"route.cache\";",
            "description": "Defines the tavo instrumentation event name contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "TavoInstrumentationListener",
            "anchor": "api-tavojs-core-dev--tavoinstrumentationlistener",
            "kind": "type",
            "signature": "type TavoInstrumentationListener = (event: TavoInstrumentationEvent) => void;",
            "description": "Defines a callback notified by tavo instrumentation in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "TavoInstrumentationPhase",
            "anchor": "api-tavojs-core-dev--tavoinstrumentationphase",
            "kind": "type",
            "signature": "type TavoInstrumentationPhase = \"start\" | \"end\" | \"error\" | \"abort\" | \"hit\" | \"miss\" | \"invalidate\";",
            "description": "Defines the tavo instrumentation phase contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#custom-listener"
          },
          {
            "name": "TavoSchema",
            "anchor": "api-tavojs-core-dev--tavoschema",
            "kind": "type",
            "signature": "type TavoSchema<T> = StandardSchema<T> | SafeParseSchema<T> | ParseSchema<T>;",
            "description": "Defines the tavo schema contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "TestRoot",
            "anchor": "api-tavojs-core-dev--testroot",
            "kind": "type",
            "signature": "type TestRoot = {\n    container: HTMLElement;\n    render(node: Child): void;\n    hydrate(node: Child): void;\n    unmount(): void;\n    text(): string;\n    html(): string;\n};",
            "description": "Defines the test root contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "unregisterService",
            "anchor": "api-tavojs-core-dev--unregisterservice",
            "kind": "function",
            "signature": "unregisterService(identifier: ServiceIdentifier<unknown>): boolean",
            "description": "Removes a service registration. Intended primarily for tests.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/testing-and-diagnostics#testing-api-reference"
          },
          {
            "name": "UpdatePriority",
            "anchor": "api-tavojs-core-dev--updatepriority",
            "kind": "type",
            "signature": "type UpdatePriority = \"immediate\" | \"user-blocking\" | \"normal\" | \"background\" | \"idle\";",
            "description": "Defines the update priority contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/scheduling-and-instrumentation#priorities"
          },
          {
            "name": "ValidatedActionContext",
            "anchor": "api-tavojs-core-dev--validatedactioncontext",
            "kind": "type",
            "signature": "type ValidatedActionContext<TInput> = PageActionContext & {\n    input: TInput;\n};",
            "description": "Provides the context passed to validated action in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "validateInput",
            "anchor": "api-tavojs-core-dev--validateinput",
            "kind": "function",
            "signature": "validateInput<T>(schema: TavoSchema<T>, input: unknown): Promise<ValidationResult<T>>",
            "description": "Validates through Standard Schema or common safeParse/parse-compatible validators.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "ValidationFailure",
            "anchor": "api-tavojs-core-dev--validationfailure",
            "kind": "type",
            "signature": "type ValidationFailure = {\n    ok: false;\n    issues: ValidationIssue[];\n};",
            "description": "Defines the validation failure contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "ValidationIssue",
            "anchor": "api-tavojs-core-dev--validationissue",
            "kind": "type",
            "signature": "type ValidationIssue = {\n    message: string;\n    path?: ReadonlyArray<PropertyKey>;\n};",
            "description": "Defines the validation issue contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "ValidationResult",
            "anchor": "api-tavojs-core-dev--validationresult",
            "kind": "type",
            "signature": "type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;",
            "description": "Describes the result returned by validation in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "ValidationSuccess",
            "anchor": "api-tavojs-core-dev--validationsuccess",
            "kind": "type",
            "signature": "type ValidationSuccess<T> = {\n    ok: true;\n    value: T;\n};",
            "description": "Defines the validation success contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/actions-and-forms#validation-reference"
          },
          {
            "name": "ViteAutoPagesDevServerOptions",
            "anchor": "api-tavojs-core-dev--viteautopagesdevserveroptions",
            "kind": "type",
            "signature": "type ViteAutoPagesDevServerOptions = {\n    root?: string;\n    pagesDir?: string;\n    cssEntries?: string[];\n    mode?: string;\n    images?: ImageOptimizerOptions;\n    port?: number;\n    host?: string;\n};",
            "description": "Configures vite auto pages dev server in the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#ssr-dev-host"
          },
          {
            "name": "ViteDevServerLike",
            "anchor": "api-tavojs-core-dev--vitedevserverlike",
            "kind": "type",
            "signature": "type ViteDevServerLike = {\n    middlewares: (req: unknown, res: unknown, next: (error?: unknown) => void) => void;\n    transformRequest(url: string, options?: {\n        ssr?: boolean;\n    }): Promise<null | {\n        code: string;\n    }>;\n    pluginContainer?: {\n        resolveId(id: string, importer?: string, options?: {\n            ssr?: boolean;\n        }): Promise<string | null | {\n            id: string;\n        }>;\n    };\n    ssrLoadModule(id: string): Promise<unknown>;\n    ssrFixStacktrace(error: unknown): void;\n    close(): Promise<void>;\n};",
            "description": "Defines the vite dev server like contract used by the experimental development tooling.",
            "runtime": [
              "browser",
              "server",
              "build"
            ],
            "stability": "public",
            "related": "/docs/core/development-tooling#ssr-dev-host"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/core/server-only",
        "symbols": []
      }
    ],
    "ui": [
      {
        "entrypoint": "@tavojs/ui/theme",
        "symbols": [
          {
            "name": "buildTheme",
            "anchor": "api-tavojs-ui-theme--buildtheme",
            "kind": "function",
            "signature": "buildTheme(config: TavoUiThemeConfig): ThemeBuildResult",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "createThemeController",
            "anchor": "api-tavojs-ui-theme--createthemecontroller",
            "kind": "function",
            "signature": "createThemeController(defaultMode?: ThemeMode | undefined): ThemeController",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "createThemeControllerFromConfig",
            "anchor": "api-tavojs-ui-theme--createthemecontrollerfromconfig",
            "kind": "function",
            "signature": "createThemeControllerFromConfig(config: Pick<TavoUiThemeConfig, \"defaultTheme\">): ThemeController",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "getTavoUiTokenGroup",
            "anchor": "api-tavojs-ui-theme--gettavouitokengroup",
            "kind": "function",
            "signature": "getTavoUiTokenGroup(name: string): TavoUiTokenGroup",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "getTavoUiTokenMetadata",
            "anchor": "api-tavojs-ui-theme--gettavouitokenmetadata",
            "kind": "function",
            "signature": "getTavoUiTokenMetadata(config?: TavoUiThemeConfig | undefined): TavoUiTokenMetadata[]",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "getThemeSnapshot",
            "anchor": "api-tavojs-ui-theme--getthemesnapshot",
            "kind": "function",
            "signature": "getThemeSnapshot(controller: ThemeController): ThemeSnapshot",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "mountThemeController",
            "anchor": "api-tavojs-ui-theme--mountthemecontroller",
            "kind": "function",
            "signature": "mountThemeController(controller: ThemeController): () => void",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ResolvedThemeMode",
            "anchor": "api-tavojs-ui-theme--resolvedthememode",
            "kind": "type",
            "signature": "type ResolvedThemeMode = \"light\" | \"dark\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "subscribeTheme",
            "anchor": "api-tavojs-ui-theme--subscribetheme",
            "kind": "function",
            "signature": "subscribeTheme(controller: ThemeController, listener: (snapshot: ThemeSnapshot) => void, options?: { immediate?: boolean | undefined; } | undefined): () => void",
            "description": "Public function exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "TavoUiThemeConfig",
            "anchor": "api-tavojs-ui-theme--tavouithemeconfig",
            "kind": "type",
            "signature": "type TavoUiThemeConfig = {\n    $schema?: string;\n    preset?: ThemePreset;\n    defaultTheme?: ThemeMode;\n    color: ThemeColorConfig;\n    scale?: ThemeScaleConfig;\n    typography?: ThemeTypographyConfig;\n    interaction?: ThemeInteractionConfig;\n    viewport?: ThemeViewportConfig;\n    breakpoints?: ThemeBreakpointsConfig;\n    semantic?: ThemeModeSemanticConfig;\n    output?: ThemeOutputConfig;\n    accessibility?: ThemeAccessibilityConfig;\n    tokens?: ThemeTokenOverrides;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "TavoUiTokenGroup",
            "anchor": "api-tavojs-ui-theme--tavouitokengroup",
            "kind": "type",
            "signature": "type TavoUiTokenGroup = \"color\" | \"sizing\" | \"spacing\" | \"radius\" | \"border\" | \"focus\" | \"motion\" | \"opacity\" | \"interaction\" | \"effects\" | \"breakpoint\" | \"typography\" | \"custom\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "tavoUiTokenMetadata",
            "anchor": "api-tavojs-ui-theme--tavouitokenmetadata",
            "kind": "value",
            "signature": "tavoUiTokenMetadata: readonly TavoUiTokenMetadata[]",
            "description": "Complete built-in Tavo.js UI CSS variable catalog.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "TavoUiTokenMetadata",
            "anchor": "api-tavojs-ui-theme--tavouitokenmetadata",
            "kind": "type",
            "signature": "type TavoUiTokenMetadata = {\n    name: string;\n    cssVariable: `--tui-${string}`;\n    group: TavoUiTokenGroup;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "tavoUiTokenNames",
            "anchor": "api-tavojs-ui-theme--tavouitokennames",
            "kind": "value",
            "signature": "tavoUiTokenNames: readonly `--tui-${string}`[]",
            "description": "Complete built-in Tavo.js UI CSS variable names.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeAccessibilityConfig",
            "anchor": "api-tavojs-ui-theme--themeaccessibilityconfig",
            "kind": "type",
            "signature": "type ThemeAccessibilityConfig = {\n    contrast?: \"AA\" | \"AAA\";\n    failOnViolation?: boolean;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeBreakpointsConfig",
            "anchor": "api-tavojs-ui-theme--themebreakpointsconfig",
            "kind": "type",
            "signature": "type ThemeBreakpointsConfig = {\n    sm?: number;\n    md?: number;\n    lg?: number;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeBuildResult",
            "anchor": "api-tavojs-ui-theme--themebuildresult",
            "kind": "type",
            "signature": "type ThemeBuildResult = {\n    cssText: string;\n    modes: Record<ResolvedThemeMode, ThemeResolvedColorSet>;\n    staticTokens: Record<string, string>;\n    config: TavoUiThemeConfig;\n    warnings: string[];\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeColorConfig",
            "anchor": "api-tavojs-ui-theme--themecolorconfig",
            "kind": "type",
            "signature": "type ThemeColorConfig = {\n    light: ThemeColorPair;\n    dark?: Partial<ThemeColorPair>;\n    method?: ThemeMethod;\n    fixShade?: boolean;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeColorPair",
            "anchor": "api-tavojs-ui-theme--themecolorpair",
            "kind": "type",
            "signature": "type ThemeColorPair = {\n    primary: string;\n    secondary?: string;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeController",
            "anchor": "api-tavojs-ui-theme--themecontroller",
            "kind": "type",
            "signature": "type ThemeController = {\n    store: Store<ThemeRuntimeState>;\n    setMode(mode: ThemeMode): void;\n    toggleMode(): void;\n    syncDocument(): void;\n    watchSystem(): () => void;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeDensity",
            "anchor": "api-tavojs-ui-theme--themedensity",
            "kind": "type",
            "signature": "type ThemeDensity = \"compact\" | \"comfortable\" | \"spacious\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeInteractionConfig",
            "anchor": "api-tavojs-ui-theme--themeinteractionconfig",
            "kind": "type",
            "signature": "type ThemeInteractionConfig = {\n    hoverLift?: number;\n    hoverShadow?: number;\n    activeScale?: number;\n    focusAlpha?: number;\n    disabledOpacity?: number;\n    transition?: number;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeMethod",
            "anchor": "api-tavojs-ui-theme--thememethod",
            "kind": "type",
            "signature": "type ThemeMethod = \"analogous\" | \"monochromatic\" | \"glass\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeMode",
            "anchor": "api-tavojs-ui-theme--thememode",
            "kind": "type",
            "signature": "type ThemeMode = \"light\" | \"dark\" | \"system\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeModeSemanticConfig",
            "anchor": "api-tavojs-ui-theme--thememodesemanticconfig",
            "kind": "type",
            "signature": "type ThemeModeSemanticConfig = ThemeSemanticConfig & {\n    light?: ThemeSemanticConfig;\n    dark?: ThemeSemanticConfig;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeOutputConfig",
            "anchor": "api-tavojs-ui-theme--themeoutputconfig",
            "kind": "type",
            "signature": "type ThemeOutputConfig = {\n    selector?: string;\n    darkSelector?: string;\n    includeMediaQuery?: boolean;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemePreset",
            "anchor": "api-tavojs-ui-theme--themepreset",
            "kind": "type",
            "signature": "type ThemePreset = \"minimal\" | \"glass\" | \"enterprise\" | \"editorial\" | \"dense\" | \"mobile\" | \"monochrome\";",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeRamp",
            "anchor": "api-tavojs-ui-theme--themeramp",
            "kind": "type",
            "signature": "type ThemeRamp = Record<number, string>;",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeResolvedColorSet",
            "anchor": "api-tavojs-ui-theme--themeresolvedcolorset",
            "kind": "type",
            "signature": "type ThemeResolvedColorSet = {\n    primary: ThemeRamp;\n    secondary: ThemeRamp;\n    neutral: ThemeRamp;\n    semantic: Required<ThemeSemanticConfig>;\n    tokens: Record<string, string>;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeRuntimeState",
            "anchor": "api-tavojs-ui-theme--themeruntimestate",
            "kind": "type",
            "signature": "type ThemeRuntimeState = {\n    mode: ThemeMode;\n    resolvedMode: ResolvedThemeMode;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeScaleConfig",
            "anchor": "api-tavojs-ui-theme--themescaleconfig",
            "kind": "type",
            "signature": "type ThemeScaleConfig = {\n    unit?: number;\n    controlHeight?: number;\n    spacing?: number;\n    radius?: number;\n    shadow?: number;\n    border?: number;\n    density?: ThemeDensity;\n    focus?: number;\n    motion?: number;\n    opacity?: number;\n    blur?: number;\n    glassAlpha?: number;\n    controlRadius?: number;\n    surfaceRadius?: number;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeSemanticConfig",
            "anchor": "api-tavojs-ui-theme--themesemanticconfig",
            "kind": "type",
            "signature": "type ThemeSemanticConfig = {\n    success?: string;\n    warning?: string;\n    danger?: string;\n    info?: string;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeSnapshot",
            "anchor": "api-tavojs-ui-theme--themesnapshot",
            "kind": "type",
            "signature": "type ThemeSnapshot = ThemeRuntimeState & {\n    setMode(mode: ThemeMode): void;\n    toggleMode(): void;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeTokenOverrides",
            "anchor": "api-tavojs-ui-theme--themetokenoverrides",
            "kind": "type",
            "signature": "type ThemeTokenOverrides = Partial<Record<ResolvedThemeMode, Record<string, string>>>;",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeTypographyConfig",
            "anchor": "api-tavojs-ui-theme--themetypographyconfig",
            "kind": "type",
            "signature": "type ThemeTypographyConfig = {\n    fontFamily?: string;\n    textFontFamily?: string;\n    headingFontFamily?: string;\n    bodySize?: number;\n    captionSize?: number;\n    labelSize?: number;\n    headingScale?: number;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          },
          {
            "name": "ThemeViewportConfig",
            "anchor": "api-tavojs-ui-theme--themeviewportconfig",
            "kind": "type",
            "signature": "type ThemeViewportConfig = {\n    rootMin?: number;\n    rootMax?: number;\n    minWidth?: number;\n    maxWidth?: number;\n};",
            "description": "Public type exported from @tavojs/ui/theme.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/theming"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/ui/a11y",
        "symbols": [
          {
            "name": "A11yAuditIssue",
            "anchor": "api-tavojs-ui-a11y--a11yauditissue",
            "kind": "type",
            "signature": "type A11yAuditIssue = {\n    id: string;\n    severity: A11yAuditSeverity;\n    message: string;\n    target?: string;\n};",
            "description": "Public type exported from @tavojs/ui/a11y.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/accessibility"
          },
          {
            "name": "A11yAuditResult",
            "anchor": "api-tavojs-ui-a11y--a11yauditresult",
            "kind": "type",
            "signature": "type A11yAuditResult = {\n    passed: boolean;\n    issues: A11yAuditIssue[];\n};",
            "description": "Public type exported from @tavojs/ui/a11y.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/accessibility"
          },
          {
            "name": "A11yAuditSeverity",
            "anchor": "api-tavojs-ui-a11y--a11yauditseverity",
            "kind": "type",
            "signature": "type A11yAuditSeverity = \"error\" | \"warning\" | \"info\";",
            "description": "Public type exported from @tavojs/ui/a11y.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/accessibility"
          },
          {
            "name": "auditThemeA11y",
            "anchor": "api-tavojs-ui-a11y--auditthemea11y",
            "kind": "function",
            "signature": "auditThemeA11y(config: TavoUiThemeConfig): A11yAuditResult",
            "description": "Public function exported from @tavojs/ui/a11y.",
            "runtime": [
              "browser",
              "server"
            ],
            "stability": "public",
            "related": "/docs/ui/accessibility"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/ui/metadata",
        "symbols": [
          {
            "name": "AgentComponentGuide",
            "anchor": "api-tavojs-ui-metadata--agentcomponentguide",
            "kind": "type",
            "signature": "type AgentComponentGuide = {\n    component: string;\n    importPath: string;\n    cssImportPath: string;\n    summary: string;\n    whenToUse: string;\n    avoidWhen: string;\n    props: ComponentPropMetadata[];\n    examples: ComponentExample[];\n    accessibility: ComponentAccessibilityGuidance;\n    related: string[];\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentAccessibilityGuidance",
            "anchor": "api-tavojs-ui-metadata--componentaccessibilityguidance",
            "kind": "type",
            "signature": "type ComponentAccessibilityGuidance = {\n    summary: string;\n    checklist: string[];\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentCategory",
            "anchor": "api-tavojs-ui-metadata--componentcategory",
            "kind": "type",
            "signature": "type ComponentCategory = \"layout\" | \"forms\" | \"data\" | \"feedback\" | \"content\" | \"recipes\" | \"navigation\";",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentCompositionMetadata",
            "anchor": "api-tavojs-ui-metadata--componentcompositionmetadata",
            "kind": "type",
            "signature": "type ComponentCompositionMetadata = {\n    related?: string[];\n    compoundMembers?: string[];\n    commonPairings?: string[];\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentExample",
            "anchor": "api-tavojs-ui-metadata--componentexample",
            "kind": "type",
            "signature": "type ComponentExample = {\n    title: string;\n    code: string;\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "componentMetadata",
            "anchor": "api-tavojs-ui-metadata--componentmetadata",
            "kind": "value",
            "signature": "componentMetadata: ComponentMetadata[]",
            "description": "Public value exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentMetadata",
            "anchor": "api-tavojs-ui-metadata--componentmetadata",
            "kind": "type",
            "signature": "type ComponentMetadata = {\n    name: string;\n    slug: string;\n    category: ComponentCategory;\n    importPath: string;\n    cssImportPath: string;\n    description: string;\n    status: ComponentStatus;\n    summary: string;\n    whenToUse: string;\n    avoidWhen: string;\n    props: ComponentPropMetadata[];\n    examples: ComponentExample[];\n    composition: ComponentCompositionMetadata;\n    related?: string[];\n    accessibility?: string;\n    accessibilityGuidance: ComponentAccessibilityGuidance;\n    searchTerms: string[];\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentPropMetadata",
            "anchor": "api-tavojs-ui-metadata--componentpropmetadata",
            "kind": "type",
            "signature": "type ComponentPropMetadata = {\n    name: string;\n    type: string;\n    required?: boolean;\n    defaultValue?: string;\n    description: string;\n};",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "ComponentStatus",
            "anchor": "api-tavojs-ui-metadata--componentstatus",
            "kind": "type",
            "signature": "type ComponentStatus = \"stable\" | \"experimental\";",
            "description": "Public type exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "findComponentsForIntent",
            "anchor": "api-tavojs-ui-metadata--findcomponentsforintent",
            "kind": "function",
            "signature": "findComponentsForIntent(query: string): ComponentMetadata[]",
            "description": "Public function exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "getAgentComponentGuide",
            "anchor": "api-tavojs-ui-metadata--getagentcomponentguide",
            "kind": "function",
            "signature": "getAgentComponentGuide(name: string): AgentComponentGuide | undefined",
            "description": "Public function exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "getComponentMetadata",
            "anchor": "api-tavojs-ui-metadata--getcomponentmetadata",
            "kind": "function",
            "signature": "getComponentMetadata(name: string): ComponentMetadata | undefined",
            "description": "Public function exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          },
          {
            "name": "getComponentsByCategory",
            "anchor": "api-tavojs-ui-metadata--getcomponentsbycategory",
            "kind": "function",
            "signature": "getComponentsByCategory(category: ComponentCategory): ComponentMetadata[]",
            "description": "Public function exported from @tavojs/ui/metadata.",
            "runtime": [
              "build"
            ],
            "stability": "public",
            "related": "/docs/ui/metadata"
          }
        ]
      },
      {
        "entrypoint": "@tavojs/ui/plugin",
        "symbols": [
          {
            "name": "tavoUi",
            "anchor": "api-tavojs-ui-plugin--tavoui",
            "kind": "function",
            "signature": "tavoUi(options?: TavoUiPluginOptions | undefined): TavoPlugin",
            "description": "Creates the Tavo.js plugin descriptor for project theme generation.\nBuild and server implementations stay lazy so Node-only theme generation\ncode is not loaded while the framework compiles the plugin graph.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/ui/css-and-plugin"
          },
          {
            "name": "TavoUiPluginOptions",
            "anchor": "api-tavojs-ui-plugin--tavouipluginoptions",
            "kind": "type",
            "signature": "type TavoUiPluginOptions = {\n    config?: string;\n    out?: string | false;\n    watch?: boolean;\n    silent?: boolean;\n    required?: boolean;\n    inject?: boolean;\n};",
            "description": "Public type exported from @tavojs/ui/plugin.",
            "runtime": [
              "build",
              "server",
              "browser"
            ],
            "stability": "public",
            "related": "/docs/ui/css-and-plugin"
          }
        ]
      }
    ]
  },
  "components": [
    {
      "name": "Alert",
      "slug": "alert",
      "category": "feedback",
      "importPath": "@tavojs/ui/alert",
      "cssImportPath": "@tavojs/ui/css/alert",
      "description": "Inline status message for success, warning, danger, and info states.",
      "status": "stable",
      "summary": "Inline status message for success, warning, danger, and info states.",
      "whenToUse": "Use `Alert` for inline feedback that belongs inside page flow",
      "avoidWhen": "Avoid Alert when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "tone",
          "type": "\"info\" | \"success\" | \"warning\" | \"danger\"",
          "required": false,
          "description": "Configures tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Alert example",
          "code": "<Alert title=\"Saved\" tone=\"success\">\n  Your changes were stored locally.\n</Alert>",
          "requiredImports": [
            "@tavojs/ui/alert"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Link",
          "Toast"
        ],
        "commonPairings": [
          "Button",
          "Link",
          "Toast"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `role=\"status\"` by default.",
        "checklist": [
          "Uses `role=\"status\"` by default."
        ]
      },
      "searchTerms": [
        "inline status",
        "message",
        "feedback",
        "success warning danger info"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/alert"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Alert when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "AppBar",
      "slug": "app-bar",
      "category": "layout",
      "importPath": "@tavojs/ui/app-bar",
      "cssImportPath": "@tavojs/ui/css/app-bar",
      "description": "Top application bar for navigation and product actions.",
      "status": "stable",
      "summary": "Top application bar for navigation and product actions.",
      "whenToUse": "Use `AppBar` for page or app headers",
      "avoidWhen": "Avoid AppBar when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "position",
          "type": "\"static\" | \"sticky\" | \"fixed\" | \"relative\"",
          "required": false,
          "description": "Configures position for this component."
        },
        {
          "name": "direction",
          "type": "ResponsiveValue<\"row\" | \"column\" | \"row-reverse\" | \"column-reverse\">",
          "required": false,
          "description": "Configures direction for this component."
        },
        {
          "name": "align",
          "type": "ResponsiveValue<\"start\" | \"center\" | \"end\" | \"stretch\">",
          "required": false,
          "description": "Configures align for this component."
        },
        {
          "name": "justify",
          "type": "ResponsiveValue<\"start\" | \"center\" | \"end\" | \"between\" | \"around\">",
          "required": false,
          "description": "Configures justify for this component."
        },
        {
          "name": "gap",
          "type": "ResponsiveValue<Gap | number | string>",
          "required": false,
          "description": "Configures gap for this component."
        },
        {
          "name": "sx",
          "type": "Sx",
          "required": false,
          "description": "Configures sx for this component."
        }
      ],
      "examples": [
        {
          "title": "AppBar example",
          "code": "<AppBar align=\"center\" justify=\"between\" gap={{ base: \"sm\", md: \"lg\" }}>\n  <Toolbar>...</Toolbar>\n</AppBar>",
          "requiredImports": [
            "@tavojs/ui/app-bar",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Toolbar",
          "NavigationMenu",
          "Button"
        ],
        "commonPairings": [
          "Toolbar",
          "NavigationMenu",
          "Button"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Defaults to `header`; use `as=\"nav\"` and labels when the bar is navigational.",
        "checklist": [
          "Defaults to `header`; use `as=\"nav\"` and labels when the bar is navigational."
        ]
      },
      "searchTerms": [
        "top navigation",
        "header bar",
        "app chrome"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/app-bar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid AppBar when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "AspectRatio",
      "slug": "aspect-ratio",
      "category": "layout",
      "importPath": "@tavojs/ui/aspect-ratio",
      "cssImportPath": "@tavojs/ui/css/aspect-ratio",
      "description": "Fixed-ratio media and content frame primitive.",
      "status": "stable",
      "summary": "Fixed-ratio media and content frame primitive.",
      "whenToUse": "Use `AspectRatio` for media, previews, embeds, and thumbnails that need stable dimensions",
      "avoidWhen": "Avoid AspectRatio when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "ratio",
          "type": "ResponsiveValue<number | \"\\${number}/\\${number}\">",
          "required": false,
          "description": "Configures ratio for this component."
        }
      ],
      "examples": [
        {
          "title": "AspectRatio example",
          "code": "<AspectRatio ratio={{ base: \"1/1\", md: \"16/9\" }}>\n  <img src=\"/cover.jpg\" alt=\"Product preview\" />\n</AspectRatio>",
          "requiredImports": [
            "@tavojs/ui/aspect-ratio"
          ]
        }
      ],
      "composition": {
        "related": [
          "Image",
          "Card",
          "Box"
        ],
        "commonPairings": [
          "Image",
          "Card",
          "Box"
        ]
      },
      "accessibilityGuidance": {
        "summary": "The wrapper is semantic-neutral; keep accessible labels on the media or content inside.",
        "checklist": [
          "The wrapper is semantic-neutral; keep accessible labels on the media or content inside."
        ]
      },
      "searchTerms": [
        "AspectRatio",
        "aspect-ratio",
        "Fixed-ratio media and content frame primitive."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/aspect-ratio"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid AspectRatio when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Avatar",
      "slug": "avatar",
      "category": "content",
      "importPath": "@tavojs/ui/avatar",
      "cssImportPath": "@tavojs/ui/css/avatar",
      "description": "User or entity avatar with image, initials, and fallback rendering.",
      "status": "stable",
      "summary": "User or entity avatar with image, initials, and fallback rendering.",
      "whenToUse": "Use `Avatar` for users, teams, and entities",
      "avoidWhen": "Avoid Avatar when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "src",
          "type": "string | null",
          "required": false,
          "description": "Configures src for this component."
        },
        {
          "name": "alt",
          "type": "string",
          "required": false,
          "description": "Configures alt for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "initials",
          "type": "string",
          "required": false,
          "description": "Configures initials for this component."
        }
      ],
      "examples": [
        {
          "title": "Avatar example",
          "code": "<Avatar src=\"/user.png\" alt=\"Ari Lane\" />\n<Avatar initials=\"AL\" />",
          "requiredImports": [
            "@tavojs/ui/avatar"
          ]
        }
      ],
      "composition": {
        "related": [
          "Text",
          "Chip",
          "Timeline"
        ],
        "commonPairings": [
          "Text",
          "Chip",
          "Timeline"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Provide meaningful `alt` for real people; use empty `alt` for decorative avatars.",
        "checklist": [
          "Provide meaningful `alt` for real people; use empty `alt` for decorative avatars."
        ]
      },
      "searchTerms": [
        "Avatar",
        "avatar",
        "User or entity avatar with image, initials, and fallback rendering."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/avatar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Avatar when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Box",
      "slug": "box",
      "category": "layout",
      "importPath": "@tavojs/ui/box",
      "cssImportPath": "@tavojs/ui/css/box",
      "description": "Generic token-backed layout and surface primitive.",
      "status": "stable",
      "summary": "Generic token-backed layout and surface primitive.",
      "whenToUse": "Use `Box` for generic token-backed surfaces, page width constraints, and one-off layout wrappers",
      "avoidWhen": "Avoid Box when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "surface",
          "type": "\"default\" | \"raised\" | \"subtle\" | \"primary\" | \"secondary\" | \"neutral\"",
          "required": false,
          "description": "Configures surface for this component."
        },
        {
          "name": "padding",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures padding for this component."
        },
        {
          "name": "paddingInline",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures paddingInline for this component."
        },
        {
          "name": "maxWidth",
          "type": "\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\"",
          "required": false,
          "description": "Configures maxWidth for this component."
        },
        {
          "name": "center",
          "type": "boolean",
          "required": false,
          "description": "Configures center for this component."
        },
        {
          "name": "fullWidth",
          "type": "boolean",
          "required": false,
          "description": "Configures fullWidth for this component."
        },
        {
          "name": "radius",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures radius for this component."
        },
        {
          "name": "shadow",
          "type": "boolean",
          "required": false,
          "description": "Configures shadow for this component."
        }
      ],
      "examples": [
        {
          "title": "Box example",
          "code": "<Box surface=\"raised\" padding=\"lg\" radius=\"lg\" border>\n  Content\n</Box>\n\n<Box as=\"main\" maxWidth=\"lg\" paddingInline=\"lg\" center fullWidth>\n  Page content\n</Box>",
          "requiredImports": [
            "@tavojs/ui/box"
          ]
        }
      ],
      "composition": {
        "related": [
          "Stack",
          "Inline",
          "Grid"
        ],
        "commonPairings": [
          "Stack",
          "Inline",
          "Grid"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Box",
        "box",
        "Generic token-backed layout and surface primitive."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/box"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Box when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Breadcrumbs",
      "slug": "breadcrumbs",
      "category": "navigation",
      "importPath": "@tavojs/ui/breadcrumbs",
      "cssImportPath": "@tavojs/ui/css/breadcrumbs",
      "description": "Page hierarchy navigation with current-page semantics.",
      "status": "stable",
      "summary": "Page hierarchy navigation with current-page semantics.",
      "whenToUse": "Use `Breadcrumbs` for page hierarchy",
      "avoidWhen": "Avoid Breadcrumbs when for arbitrary button groups that do not navigate.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "items",
          "type": "{ label: Child; href?: string; current?: boolean }[]",
          "required": false,
          "description": "Configures items for this component."
        },
        {
          "name": "separator",
          "type": "Child",
          "required": false,
          "description": "Configures separator for this component."
        }
      ],
      "examples": [
        {
          "title": "Breadcrumbs example",
          "code": "<Breadcrumbs items={[{ label: \"Home\", href: \"/\" }, { label: \"Settings\", current: true }]} />",
          "requiredImports": [
            "@tavojs/ui/breadcrumbs"
          ]
        }
      ],
      "composition": {
        "related": [
          "Section",
          "Link",
          "NavigationMenu"
        ],
        "commonPairings": [
          "Section",
          "Link",
          "NavigationMenu"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Renders navigation with current-page state when provided.",
        "checklist": [
          "Renders navigation with current-page state when provided."
        ]
      },
      "searchTerms": [
        "Breadcrumbs",
        "breadcrumbs",
        "Page hierarchy navigation with current-page semantics."
      ],
      "capability": "navigation",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/breadcrumbs"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Breadcrumbs when for arbitrary button groups that do not navigate."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Button",
      "slug": "button",
      "category": "forms",
      "importPath": "@tavojs/ui/button",
      "cssImportPath": "@tavojs/ui/css/button",
      "description": "Action control with solid, soft, outline, and ghost variants.",
      "status": "stable",
      "summary": "Action control with solid, soft, outline, and ghost variants.",
      "whenToUse": "Use Button for primary, secondary, destructive, or link-style actions.",
      "avoidWhen": "Avoid for navigation lists; use Link, Menubar, NavigationMenu, or Breadcrumbs.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "variant",
          "type": "\"solid\" | \"soft\" | \"outline\" | \"ghost\" | \"text\"",
          "defaultValue": "solid",
          "description": "Visual treatment."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\" | \"danger\"",
          "defaultValue": "primary",
          "description": "Action tone."
        },
        {
          "name": "loading",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Disables the action and exposes aria-busy."
        },
        {
          "name": "iconOnly",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Uses square icon-only sizing; pair with label or aria-label."
        }
      ],
      "examples": [
        {
          "title": "Primary action",
          "code": "<Button variant=\"solid\" tone=\"primary\">Save</Button>",
          "requiredImports": [
            "@tavojs/ui/button"
          ]
        },
        {
          "title": "Link action",
          "code": "<Button as=\"a\" href=\"/settings\" variant=\"soft\">Settings</Button>",
          "requiredImports": [
            "@tavojs/ui/button"
          ]
        }
      ],
      "composition": {
        "related": [
          "ButtonGroup",
          "Icon",
          "Toolbar"
        ],
        "commonPairings": [
          "ButtonGroup",
          "Icon",
          "Toolbar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "`loading` sets `aria-busy` and disables the button or link action.",
        "checklist": [
          "`loading` sets `aria-busy` and disables the button or link action."
        ]
      },
      "searchTerms": [
        "action",
        "submit",
        "primary action",
        "link action",
        "icon only action",
        "accessible icon button"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/button"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid for navigation lists; use Link, Menubar, NavigationMenu, or Breadcrumbs."
      ],
      "preview": {
        "available": true,
        "fixture": "Button"
      }
    },
    {
      "name": "ButtonGroup",
      "slug": "button-group",
      "category": "forms",
      "importPath": "@tavojs/ui/button-group",
      "cssImportPath": "@tavojs/ui/css/button-group",
      "description": "Grouped action container for related buttons.",
      "status": "stable",
      "summary": "Grouped action container for related buttons.",
      "whenToUse": "Use `ButtonGroup` to group related button actions",
      "avoidWhen": "Avoid ButtonGroup when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "orientation",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures orientation for this component."
        },
        {
          "name": "fullWidth",
          "type": "boolean",
          "required": false,
          "description": "Configures fullWidth for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\" | \"danger\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "variant",
          "type": "\"solid\" | \"soft\" | \"outline\" | \"ghost\" | \"text\"",
          "required": false,
          "description": "Configures variant for this component."
        }
      ],
      "examples": [
        {
          "title": "ButtonGroup example",
          "code": "<ButtonGroup tone=\"neutral\" variant=\"outline\">\n  <Button>Day</Button>\n  <Button variant=\"soft\">Week</Button>\n</ButtonGroup>",
          "requiredImports": [
            "@tavojs/ui/button-group",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Toggle",
          "Toolbar"
        ],
        "commonPairings": [
          "Button",
          "Toggle",
          "Toolbar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "ButtonGroup",
        "button-group",
        "Grouped action container for related buttons."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/button-group"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid ButtonGroup when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Calendar",
      "slug": "calendar",
      "category": "forms",
      "importPath": "@tavojs/ui/calendar",
      "cssImportPath": "@tavojs/ui/css/calendar",
      "description": "Month grid date selection primitive.",
      "status": "stable",
      "summary": "Application-controlled month grid for date selection; month and year navigation are composed by the application.",
      "whenToUse": "Use Calendar when an application needs an inline month grid and owns the visible month, year, selected date, and navigation controls.",
      "avoidWhen": "Use DatePicker for a form field with a trigger and floating calendar. Calendar does not provide built-in previous-month, next-month, month-select, or year-select controls.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "defaultValue": "md",
          "description": "Control scale: sm, md, or lg when supported. Applies to Calendar."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Disables the control when supported. Applies to Calendar."
        },
        {
          "name": "aria-*",
          "type": "unknown",
          "description": "ARIA attributes are passed through for accessible labeling and state. Applies to Calendar."
        }
      ],
      "examples": [
        {
          "title": "Calendar example",
          "code": "<Calendar />",
          "requiredImports": [
            "@tavojs/ui/calendar"
          ]
        }
      ],
      "composition": {
        "related": [
          "DatePicker",
          "Popover",
          "Field"
        ],
        "commonPairings": [
          "DatePicker",
          "Popover",
          "Field"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "month grid",
        "calendar",
        "date selection"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/calendar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Use DatePicker for a form field with a trigger and floating calendar. Calendar does not provide built-in previous-month, next-month, month-select, or year-select controls."
      ],
      "preview": {
        "available": true,
        "fixture": "Calendar"
      }
    },
    {
      "name": "Card",
      "slug": "card",
      "category": "layout",
      "importPath": "@tavojs/ui/card",
      "cssImportPath": "@tavojs/ui/css/card",
      "description": "Discrete content surface with header, media, content, and actions.",
      "status": "stable",
      "summary": "Discrete content surface with header, media, content, and actions.",
      "whenToUse": "Use `Card` for discrete content blocks. Supports compound API",
      "avoidWhen": "Avoid Card when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "eyebrow",
          "type": "Child",
          "required": false,
          "description": "Configures eyebrow for this component."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "actions",
          "type": "Child",
          "required": false,
          "description": "Configures actions for this component."
        },
        {
          "name": "surface",
          "type": "\"default\" | \"raised\"",
          "required": false,
          "description": "Configures surface for this component."
        }
      ],
      "examples": [
        {
          "title": "Card example",
          "code": "<Card.Root eyebrow=\"Plan\" title=\"Scale\" actions={<Chip>Popular</Chip>}>\n  <Card.Content>Plan details</Card.Content>\n</Card.Root>",
          "requiredImports": [
            "@tavojs/ui/card",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Stack",
          "Button",
          "Chip"
        ],
        "compoundMembers": [
          "Root",
          "Header",
          "Media",
          "Content",
          "Actions"
        ],
        "commonPairings": [
          "Stack",
          "Button",
          "Chip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "content card",
        "discrete surface",
        "content block"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/card"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Card when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Card"
      }
    },
    {
      "name": "Chart",
      "slug": "chart",
      "category": "data",
      "importPath": "@tavojs/ui/chart",
      "cssImportPath": "@tavojs/ui/css/chart",
      "description": "Token-backed bar chart primitive for compact metrics.",
      "status": "stable",
      "summary": "Token-backed bar chart primitive for compact metrics.",
      "whenToUse": "Use Chart when you need token-backed bar chart primitive for compact metrics.",
      "avoidWhen": "Avoid Chart when using data components as decorative layout containers.",
      "props": [
        {
          "name": "children",
          "type": "Child",
          "description": "Structured data content or component-specific slots. Applies to Chart."
        },
        {
          "name": "tone",
          "type": "Tone",
          "description": "Semantic tone where status or emphasis is supported. Applies to Chart."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Optional class hook for app-level styling. Applies to Chart."
        }
      ],
      "examples": [
        {
          "title": "Chart example",
          "code": "<Chart />",
          "requiredImports": [
            "@tavojs/ui/chart"
          ]
        }
      ],
      "composition": {
        "related": [
          "Stat",
          "Grid",
          "Table"
        ],
        "commonPairings": [
          "Stat",
          "Grid",
          "Table"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "Chart",
        "chart",
        "Token-backed bar chart primitive for compact metrics."
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/chart"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Chart when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Checkbox",
      "slug": "checkbox",
      "category": "forms",
      "importPath": "@tavojs/ui/checkbox",
      "cssImportPath": "@tavojs/ui/css/checkbox",
      "description": "Token-styled checkbox control with indeterminate support.",
      "status": "stable",
      "summary": "Token-styled checkbox control with indeterminate support.",
      "whenToUse": "Use `Checkbox` for binary choices",
      "avoidWhen": "Avoid Checkbox when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "checked",
          "type": "boolean",
          "required": false,
          "description": "Configures checked for this component."
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "required": false,
          "description": "Configures defaultChecked for this component."
        },
        {
          "name": "indeterminate",
          "type": "boolean",
          "required": false,
          "description": "Configures indeterminate for this component."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "required": false,
          "description": "Configures disabled for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\"",
          "required": false,
          "description": "Configures tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Checkbox example",
          "code": "<Checkbox checked aria-label=\"Enable notifications\" />",
          "requiredImports": [
            "@tavojs/ui/checkbox"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "FormControlLabel",
          "FormControl"
        ],
        "commonPairings": [
          "Field",
          "FormControlLabel",
          "FormControl"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Use with `FormControlLabel` or provide `aria-label`.",
        "checklist": [
          "Use with `FormControlLabel` or provide `aria-label`."
        ]
      },
      "searchTerms": [
        "boolean option",
        "multi select",
        "checked"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/checkbox"
      ],
      "stateOwnership": "Application controlled through checked and the matching callback.",
      "limitations": [
        "Avoid Checkbox when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Chip",
      "slug": "chip",
      "category": "content",
      "importPath": "@tavojs/ui/chip",
      "cssImportPath": "@tavojs/ui/css/chip",
      "description": "Compact selected, filter, or metadata token.",
      "status": "stable",
      "summary": "Compact selected, filter, or metadata token.",
      "whenToUse": "Use `Chip` for selectable-looking tags, filters, and compact tokens",
      "avoidWhen": "Avoid Chip when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "tone",
          "type": "Tone",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "selected",
          "type": "boolean",
          "required": false,
          "description": "Configures selected for this component."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "required": false,
          "description": "Configures disabled for this component."
        }
      ],
      "examples": [
        {
          "title": "Chip example",
          "code": "<Chip tone=\"primary\" selected>Active</Chip>",
          "requiredImports": [
            "@tavojs/ui/chip"
          ]
        }
      ],
      "composition": {
        "related": [
          "Toolbar",
          "StatusDot",
          "Card"
        ],
        "commonPairings": [
          "Toolbar",
          "StatusDot",
          "Card"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "Chip",
        "chip",
        "Compact selected, filter, or metadata token."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/chip"
      ],
      "stateOwnership": "Application controlled through selected and the matching callback.",
      "limitations": [
        "Avoid Chip when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "CodeBlock",
      "slug": "code-block",
      "category": "content",
      "importPath": "@tavojs/ui/code-block",
      "cssImportPath": "@tavojs/ui/css/code-block",
      "description": "Preformatted code surface for docs and examples.",
      "status": "stable",
      "summary": "Preformatted code surface for docs and examples.",
      "whenToUse": "Use `CodeBlock` for code examples",
      "avoidWhen": "Avoid CodeBlock when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "code",
          "type": "string",
          "required": false,
          "description": "Configures code for this component."
        },
        {
          "name": "language",
          "type": "string",
          "required": false,
          "description": "Configures language for this component."
        },
        {
          "name": "highlighted",
          "type": "boolean",
          "required": false,
          "description": "defaults to `true` for string code."
        },
        {
          "name": "editorTheme",
          "type": "\"auto\" | \"light\" | \"dark\"",
          "required": false,
          "description": "defaults to `auto` and inherits the active Tavo.js theme tokens."
        },
        {
          "name": "wrap",
          "type": "boolean",
          "required": false,
          "description": "Configures wrap for this component."
        }
      ],
      "examples": [
        {
          "title": "CodeBlock example",
          "code": "<CodeBlock language=\"bash\" code=\"npm install @tavojs/ui\" />",
          "requiredImports": [
            "@tavojs/ui/code-block"
          ]
        }
      ],
      "composition": {
        "related": [
          "Tabs",
          "Card",
          "Text"
        ],
        "commonPairings": [
          "Tabs",
          "Card",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "CodeBlock",
        "code-block",
        "Preformatted code surface for docs and examples."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/code-block"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid CodeBlock when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Collapsible",
      "slug": "collapsible",
      "category": "content",
      "importPath": "@tavojs/ui/collapsible",
      "cssImportPath": "@tavojs/ui/css/collapsible",
      "description": "Native disclosure primitive with trigger and content slots.",
      "status": "stable",
      "summary": "Native details/summary disclosure for progressively revealing secondary content.",
      "whenToUse": "Use Collapsible for optional details that should open and close without leaving the page, such as advanced settings or supporting explanations.",
      "avoidWhen": "Use Dialog or Sheet for focused modal workflows, and Tabs when multiple peer sections switch within one persistent region.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        }
      ],
      "examples": [
        {
          "title": "Collapsible example",
          "code": "<Collapsible open>\n  <Collapsible.Trigger>Advanced settings</Collapsible.Trigger>\n  <Collapsible.Content>Developer-only controls.</Collapsible.Content>\n</Collapsible>",
          "requiredImports": [
            "@tavojs/ui/collapsible"
          ]
        }
      ],
      "composition": {
        "related": [
          "Section",
          "Button",
          "Text"
        ],
        "compoundMembers": [
          "Root",
          "Trigger",
          "Content"
        ],
        "commonPairings": [
          "Section",
          "Button",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Built on native `details` and `summary`.",
        "checklist": [
          "Built on native `details` and `summary`."
        ]
      },
      "searchTerms": [
        "Collapsible",
        "collapsible",
        "Native disclosure primitive with trigger and content slots."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/collapsible"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Use Dialog or Sheet for focused modal workflows, and Tabs when multiple peer sections switch within one persistent region."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Combobox",
      "slug": "combobox",
      "category": "forms",
      "importPath": "@tavojs/ui/combobox",
      "cssImportPath": "@tavojs/ui/css/combobox",
      "description": "Input with datalist-backed option suggestions.",
      "status": "stable",
      "summary": "Input with datalist-backed option suggestions.",
      "whenToUse": "Use `Combobox` for datalist-backed suggestions",
      "avoidWhen": "Avoid Combobox when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Configures name for this component."
        },
        {
          "name": "options",
          "type": "{ label: string; value: string }[]",
          "required": true,
          "description": "Configures options for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "listId",
          "type": "string",
          "required": false,
          "description": "Configures listId for this component."
        }
      ],
      "examples": [
        {
          "title": "Combobox example",
          "code": "<Combobox name=\"framework\" options={[{ label: \"Tavo.js\", value: \"tavo\" }]} />",
          "requiredImports": [
            "@tavojs/ui/combobox"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "InputGroup",
          "Toolbar"
        ],
        "commonPairings": [
          "Field",
          "InputGroup",
          "Toolbar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses native `input` plus `datalist`.",
        "checklist": [
          "Uses native `input` plus `datalist`."
        ]
      },
      "searchTerms": [
        "Combobox",
        "combobox",
        "Input with datalist-backed option suggestions."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/combobox"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Combobox when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "CommandMenu",
      "slug": "command-menu",
      "category": "recipes",
      "importPath": "@tavojs/ui/command-menu",
      "cssImportPath": "@tavojs/ui/css/command-menu",
      "description": "Command palette-style recipe for action discovery.",
      "status": "stable",
      "summary": "Command palette-style recipe for action discovery.",
      "whenToUse": "Use `CommandMenu` for command palette style action lists",
      "avoidWhen": "Avoid CommandMenu when when a low-level primitive would express a simpler one-off layout more clearly.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "items",
          "type": "{ label: string; description?: string; shortcut?: string; href?: string; disabled?: boolean; onSelect?: () => void }[]",
          "required": true,
          "description": "Configures items for this component."
        },
        {
          "name": "placeholder",
          "type": "string",
          "required": false,
          "description": "Configures placeholder for this component."
        }
      ],
      "examples": [
        {
          "title": "CommandMenu example",
          "code": "<CommandMenu items={[{ label: \"Generate theme\", shortcut: \"G\" }, { label: \"Docs\", href: \"/docs\" }]} />",
          "requiredImports": [
            "@tavojs/ui/command-menu"
          ]
        }
      ],
      "composition": {
        "related": [
          "Dialog",
          "SearchInput",
          "Kbd"
        ],
        "commonPairings": [
          "Dialog",
          "SearchInput",
          "Kbd"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Recipes compose lower-level components and inherit their labeling and keyboard expectations.",
        "checklist": [
          "Keep recipe titles descriptive.",
          "Use real controls in action slots.",
          "Preserve list, table, or form semantics inside the composition."
        ]
      },
      "searchTerms": [
        "command palette",
        "quick actions",
        "search commands"
      ],
      "capability": "recipes",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/command-menu"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid CommandMenu when when a low-level primitive would express a simpler one-off layout more clearly."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "ConfirmDialog",
      "slug": "confirm-dialog",
      "category": "feedback",
      "importPath": "@tavojs/ui/confirm-dialog",
      "cssImportPath": "@tavojs/ui/css/confirm-dialog",
      "description": "Confirmation dialog composition for important or destructive actions.",
      "status": "stable",
      "summary": "Confirmation dialog composition for important or destructive actions.",
      "whenToUse": "Use `ConfirmDialog` for confirmation flows",
      "avoidWhen": "Avoid ConfirmDialog when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "description",
          "type": "Child",
          "required": false,
          "description": "Configures description for this component."
        },
        {
          "name": "confirmLabel",
          "type": "Child",
          "required": false,
          "description": "Configures confirmLabel for this component."
        },
        {
          "name": "cancelLabel",
          "type": "Child",
          "required": false,
          "description": "Configures cancelLabel for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"danger\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "onConfirm",
          "type": "() => void",
          "required": false,
          "description": "Configures onConfirm for this component."
        },
        {
          "name": "onCancel",
          "type": "() => void",
          "required": false,
          "description": "Configures onCancel for this component."
        }
      ],
      "examples": [
        {
          "title": "ConfirmDialog example",
          "code": "<ConfirmDialog open title=\"Delete file\" onConfirm={remove} onCancel={close} />",
          "requiredImports": [
            "@tavojs/ui/confirm-dialog"
          ]
        }
      ],
      "composition": {
        "related": [
          "Dialog",
          "Button",
          "Alert"
        ],
        "commonPairings": [
          "Dialog",
          "Button",
          "Alert"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Built on `Dialog`, so it inherits modal roles, escape behavior, and focus trapping.",
        "checklist": [
          "Built on `Dialog`, so it inherits modal roles, escape behavior, and focus trapping."
        ]
      },
      "searchTerms": [
        "confirmation",
        "destructive action",
        "confirm delete"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/confirm-dialog"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Avoid ConfirmDialog when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "DatePicker",
      "slug": "date-picker",
      "category": "forms",
      "importPath": "@tavojs/ui/date-picker",
      "cssImportPath": "@tavojs/ui/css/date-picker",
      "description": "Date input and calendar popover composition.",
      "status": "stable",
      "summary": "Date input and calendar popover composition.",
      "whenToUse": "Use `DatePicker` for date input with a calendar popover. For a plain native date field, use `TextInput type=\"date\"`",
      "avoidWhen": "Avoid DatePicker when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "name",
          "type": "string",
          "required": false,
          "description": "Configures name for this component."
        },
        {
          "name": "value",
          "type": "string",
          "required": false,
          "description": "Configures value for this component."
        },
        {
          "name": "min",
          "type": "string",
          "required": false,
          "description": "Configures min for this component."
        },
        {
          "name": "max",
          "type": "string",
          "required": false,
          "description": "Configures max for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "year",
          "type": "number",
          "required": false,
          "description": "Configures year for this component."
        },
        {
          "name": "month",
          "type": "number",
          "required": false,
          "description": "Configures month for this component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        }
      ],
      "examples": [
        {
          "title": "DatePicker example",
          "code": "<DatePicker name=\"due\" value=\"2026-05-09\" />",
          "requiredImports": [
            "@tavojs/ui/date-picker"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "Calendar",
          "Popover"
        ],
        "commonPairings": [
          "Field",
          "Calendar",
          "Popover"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "date input",
        "date field",
        "calendar popover",
        "due date"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/date-picker"
      ],
      "stateOwnership": "Application controlled through open, value and the matching callback.",
      "limitations": [
        "Avoid DatePicker when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Dialog",
      "slug": "dialog",
      "category": "feedback",
      "importPath": "@tavojs/ui/dialog",
      "cssImportPath": "@tavojs/ui/css/dialog",
      "description": "Modal dialog with escape handling and focus support.",
      "status": "stable",
      "summary": "Modal dialog with escape handling and focus support.",
      "whenToUse": "Use Dialog for modal workflows that require focused user attention.",
      "avoidWhen": "Avoid for simple inline messages; use Alert or Toast.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "description": "Controls whether the dialog is visible."
        },
        {
          "name": "title",
          "type": "Child",
          "description": "Dialog title."
        },
        {
          "name": "onClose",
          "type": "TavoEventHandler",
          "description": "Close callback for escape or dismiss actions where supported."
        }
      ],
      "examples": [
        {
          "title": "Modal content",
          "code": "<Dialog open title=\"Invite teammate\">...</Dialog>",
          "requiredImports": [
            "@tavojs/ui/dialog"
          ]
        }
      ],
      "composition": {
        "related": [
          "FocusTrap",
          "Overlay",
          "Button"
        ],
        "commonPairings": [
          "FocusTrap",
          "Overlay",
          "Button"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `role=\"dialog\"`, `aria-modal`, escape close, backdrop close, and tab focus trapping.",
        "checklist": [
          "Uses `role=\"dialog\"`, `aria-modal`, escape close, backdrop close, and tab focus trapping."
        ]
      },
      "searchTerms": [
        "modal",
        "modal dialog",
        "focused workflow"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/dialog"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Avoid for simple inline messages; use Alert or Toast."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Divider",
      "slug": "divider",
      "category": "layout",
      "importPath": "@tavojs/ui/divider",
      "cssImportPath": "@tavojs/ui/css/divider",
      "description": "Horizontal or vertical separator using theme border tokens.",
      "status": "stable",
      "summary": "Horizontal or vertical separator using theme border tokens.",
      "whenToUse": "Use `Divider` to separate sections",
      "avoidWhen": "Avoid Divider when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "orientation",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures orientation for this component."
        },
        {
          "name": "label",
          "type": "Child",
          "required": false,
          "description": "Configures label for this component."
        }
      ],
      "examples": [
        {
          "title": "Divider example",
          "code": "<Divider label=\"Details\" />",
          "requiredImports": [
            "@tavojs/ui/divider"
          ]
        }
      ],
      "composition": {
        "related": [
          "Stack",
          "Section",
          "Card"
        ],
        "commonPairings": [
          "Stack",
          "Section",
          "Card"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Divider",
        "divider",
        "Horizontal or vertical separator using theme border tokens."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/divider"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Divider when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "DropdownMenu",
      "slug": "dropdown-menu",
      "category": "feedback",
      "importPath": "@tavojs/ui/dropdown-menu",
      "cssImportPath": "@tavojs/ui/css/dropdown-menu",
      "description": "Menu primitive for trigger-driven contextual actions.",
      "status": "stable",
      "summary": "Trigger-driven menu of contextual commands with menu semantics and keyboard item navigation.",
      "whenToUse": "Use DropdownMenu for a compact list of actions such as Edit, Duplicate, Archive, or Download.",
      "avoidWhen": "Use Popover when the floating surface contains arbitrary content, fields, filters, or explanations rather than a command list.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        },
        {
          "name": "align",
          "type": "\"start\" | \"end\"",
          "required": false,
          "description": "Configures align for this component."
        },
        {
          "name": "onClose",
          "type": "() => void",
          "required": false,
          "description": "Configures onClose for this component."
        }
      ],
      "examples": [
        {
          "title": "DropdownMenu example",
          "code": "<DropdownMenu>\n  <DropdownMenu.Trigger>Actions</DropdownMenu.Trigger>\n  <DropdownMenu.Content>\n    <DropdownMenu.Item href=\"/settings\">Settings</DropdownMenu.Item>\n  </DropdownMenu.Content>\n</DropdownMenu>",
          "requiredImports": [
            "@tavojs/ui/dropdown-menu"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Icon",
          "Toolbar"
        ],
        "compoundMembers": [
          "Root",
          "Trigger",
          "Content",
          "Item"
        ],
        "commonPairings": [
          "Button",
          "Icon",
          "Toolbar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content uses `role=\"menu\"` and items use `role=\"menuitem\"`.",
        "checklist": [
          "Content uses `role=\"menu\"` and items use `role=\"menuitem\"`."
        ]
      },
      "searchTerms": [
        "DropdownMenu",
        "dropdown-menu",
        "Menu primitive for trigger-driven contextual actions."
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/dropdown-menu"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Use Popover when the floating surface contains arbitrary content, fields, filters, or explanations rather than a command list."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "EmptyState",
      "slug": "empty-state",
      "category": "feedback",
      "importPath": "@tavojs/ui/empty-state",
      "cssImportPath": "@tavojs/ui/css/empty-state",
      "description": "Empty, error, or onboarding state composition.",
      "status": "stable",
      "summary": "Empty, error, or onboarding state composition.",
      "whenToUse": "Use `EmptyState` for empty lists, empty search results, and first-run screens",
      "avoidWhen": "Avoid EmptyState when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "icon",
          "type": "Child",
          "required": false,
          "description": "Configures icon for this component."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "description",
          "type": "Child",
          "required": false,
          "description": "Configures description for this component."
        },
        {
          "name": "actions",
          "type": "Child",
          "required": false,
          "description": "Configures actions for this component."
        }
      ],
      "examples": [
        {
          "title": "EmptyState example",
          "code": "<EmptyState title=\"No files\" description=\"Upload a file to get started.\" actions={<Button>Upload</Button>} />",
          "requiredImports": [
            "@tavojs/ui/empty-state",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Card",
          "Text"
        ],
        "commonPairings": [
          "Button",
          "Card",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "empty state",
        "no results",
        "error state",
        "onboarding state"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/empty-state"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid EmptyState when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Field",
      "slug": "field",
      "category": "forms",
      "importPath": "@tavojs/ui/field",
      "cssImportPath": "@tavojs/ui/css/field",
      "description": "Label, message, and ARIA wiring wrapper for form controls.",
      "status": "stable",
      "summary": "Label, hint, validation message, required state, and ARIA wiring around one form control.",
      "whenToUse": "Use Field around TextInput, Select, Textarea, or another single control when it needs a visible label and correctly connected supporting or validation text.",
      "avoidWhen": "Field is not the input itself and is not a form submission boundary. Use TextInput for the native control and FormControl for the enclosing form.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "label",
          "type": "Child",
          "description": "Visible field label."
        },
        {
          "name": "description",
          "type": "Child",
          "description": "Helper text announced with the control."
        },
        {
          "name": "error",
          "type": "Child",
          "description": "Validation message and invalid state."
        },
        {
          "name": "required",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Marks the field as required."
        }
      ],
      "examples": [
        {
          "title": "Labeled text input",
          "code": "<Field label=\"Email\" error={emailError}><TextInput type=\"email\" /></Field>",
          "requiredImports": [
            "@tavojs/ui/field",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "TextInput",
          "FormLabel"
        ],
        "commonPairings": [
          "TextInput",
          "FormLabel"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Adds id, aria-describedby, and aria-invalid to child controls.",
        "checklist": [
          "Adds id, aria-describedby, and aria-invalid to child controls."
        ]
      },
      "searchTerms": [
        "form field",
        "label input",
        "validation message",
        "aria describedby"
      ],
      "accessibility": "Adds id, aria-describedby, and aria-invalid to child controls.",
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/field"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Field is not the input itself and is not a form submission boundary. Use TextInput for the native control and FormControl for the enclosing form."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Flex",
      "slug": "flex",
      "category": "layout",
      "importPath": "@tavojs/ui/flex",
      "cssImportPath": "@tavojs/ui/css/flex",
      "description": "Flexbox layout primitive with token-backed gap options.",
      "status": "stable",
      "summary": "Flexbox layout primitive with token-backed gap options.",
      "whenToUse": "Use `Flex` for token-backed flex layouts",
      "avoidWhen": "Avoid Flex when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "direction",
          "type": "\"row\" | \"column\"",
          "required": false,
          "description": "Configures direction for this component."
        },
        {
          "name": "gap",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\" | number | string",
          "required": false,
          "description": "Configures gap for this component."
        },
        {
          "name": "align",
          "type": "\"start\" | \"center\" | \"end\" | \"stretch\"",
          "required": false,
          "description": "Configures align for this component."
        },
        {
          "name": "justify",
          "type": "\"start\" | \"center\" | \"end\" | \"between\"",
          "required": false,
          "description": "Configures justify for this component."
        },
        {
          "name": "wrap",
          "type": "boolean",
          "required": false,
          "description": "Configures wrap for this component."
        }
      ],
      "examples": [
        {
          "title": "Flex example",
          "code": "<Flex align=\"center\" justify=\"between\">...</Flex>",
          "requiredImports": [
            "@tavojs/ui/flex"
          ]
        }
      ],
      "composition": {
        "related": [
          "Box",
          "Stack",
          "Inline"
        ],
        "commonPairings": [
          "Box",
          "Stack",
          "Inline"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Flex",
        "flex",
        "Flexbox layout primitive with token-backed gap options."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/flex"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Flex when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "FocusTrap",
      "slug": "focus-trap",
      "category": "feedback",
      "importPath": "@tavojs/ui/focus-trap",
      "cssImportPath": "@tavojs/ui/css/focus-trap",
      "description": "Keyboard focus containment helper for overlays.",
      "status": "stable",
      "summary": "Keyboard focus containment helper for overlays.",
      "whenToUse": "Use `FocusTrap` to keep keyboard focus inside a subtree",
      "avoidWhen": "Avoid FocusTrap when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "active",
          "type": "boolean",
          "required": false,
          "description": "Configures active for this component."
        }
      ],
      "examples": [
        {
          "title": "FocusTrap example",
          "code": "<FocusTrap active>{content}</FocusTrap>",
          "requiredImports": [
            "@tavojs/ui/focus-trap"
          ]
        }
      ],
      "composition": {
        "related": [
          "Dialog",
          "Sheet",
          "Overlay"
        ],
        "commonPairings": [
          "Dialog",
          "Sheet",
          "Overlay"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Traps `Tab` and `Shift+Tab` within focusable descendants.",
        "checklist": [
          "Traps `Tab` and `Shift+Tab` within focusable descendants."
        ]
      },
      "searchTerms": [
        "FocusTrap",
        "focus-trap",
        "Keyboard focus containment helper for overlays."
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/focus-trap"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid FocusTrap when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "FormControl",
      "slug": "form-control",
      "category": "forms",
      "importPath": "@tavojs/ui/form-control",
      "cssImportPath": "@tavojs/ui/css/form-control",
      "description": "Form wrapper primitive for grouped controls.",
      "status": "stable",
      "summary": "Native form submission boundary with optional full-width layout styling.",
      "whenToUse": "Use FormControl to group fields and submit actions inside a real form element.",
      "avoidWhen": "Do not use FormControl as a replacement for Field. It does not create labels, hints, validation messages, or ARIA relationships for individual controls.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "fullWidth",
          "type": "boolean",
          "required": false,
          "description": "Configures fullWidth for this component."
        }
      ],
      "examples": [
        {
          "title": "FormControl example",
          "code": "<FormControl fullWidth><TextInput /></FormControl>",
          "requiredImports": [
            "@tavojs/ui/form-control",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "FormLabel"
        ],
        "commonPairings": [
          "Field",
          "FormLabel"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "FormControl",
        "form-control",
        "Form wrapper primitive for grouped controls."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/form-control"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Do not use FormControl as a replacement for Field. It does not create labels, hints, validation messages, or ARIA relationships for individual controls."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "FormControlLabel",
      "slug": "form-control-label",
      "category": "forms",
      "importPath": "@tavojs/ui/form-control-label",
      "cssImportPath": "@tavojs/ui/css/form-control-label",
      "description": "Label composition for checkbox, radio, and switch controls.",
      "status": "stable",
      "summary": "Clickable label composition for checkbox, radio, and switch controls.",
      "whenToUse": "Use FormControlLabel when the label and compact control should form one clickable choice row.",
      "avoidWhen": "Use Field for text-like inputs that need a label above the control plus hints, errors, success, or warning messages.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "label",
          "type": "Child",
          "required": false,
          "description": "Configures label for this component."
        },
        {
          "name": "control",
          "type": "Child",
          "required": false,
          "description": "Configures control for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        }
      ],
      "examples": [
        {
          "title": "FormControlLabel example",
          "code": "<FormControlLabel label=\"Subscribe\" control={<Checkbox />} />",
          "requiredImports": [
            "@tavojs/ui/form-control-label",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Checkbox",
          "Radio",
          "Switch"
        ],
        "commonPairings": [
          "Checkbox",
          "Radio",
          "Switch"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "FormControlLabel",
        "form-control-label",
        "Label composition for checkbox, radio, and switch controls."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/form-control-label"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Use Field for text-like inputs that need a label above the control plus hints, errors, success, or warning messages."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "FormLabel",
      "slug": "form-label",
      "category": "forms",
      "importPath": "@tavojs/ui/form-label",
      "cssImportPath": "@tavojs/ui/css/form-label",
      "description": "Standalone form label primitive.",
      "status": "stable",
      "summary": "Low-level standalone label for manually composed form layouts.",
      "whenToUse": "Use FormLabel when a custom form composition needs an explicit label element and you will wire its for value to the control ID yourself.",
      "avoidWhen": "Prefer Field for common inputs because Field generates label, message, required-state, and ARIA wiring together.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "defaultValue": "md",
          "description": "Control scale: sm, md, or lg when supported. Applies to FormLabel."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Disables the control when supported. Applies to FormLabel."
        },
        {
          "name": "aria-*",
          "type": "unknown",
          "description": "ARIA attributes are passed through for accessible labeling and state. Applies to FormLabel."
        }
      ],
      "examples": [
        {
          "title": "FormLabel example",
          "code": "<FormLabel>Account settings</FormLabel>",
          "requiredImports": [
            "@tavojs/ui/form-label"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "FormControl",
          "TextInput"
        ],
        "commonPairings": [
          "Field",
          "FormControl",
          "TextInput"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "FormLabel",
        "form-label",
        "Standalone form label primitive."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/form-label"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Prefer Field for common inputs because Field generates label, message, required-state, and ARIA wiring together."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Grid",
      "slug": "grid",
      "category": "layout",
      "importPath": "@tavojs/ui/grid",
      "cssImportPath": "@tavojs/ui/css/grid",
      "description": "Responsive grid primitive with column and item sizing controls.",
      "status": "stable",
      "summary": "Responsive grid primitive with column and item sizing controls.",
      "whenToUse": "Use `Grid` for responsive grid layouts",
      "avoidWhen": "Avoid Grid when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "columns",
          "type": "ResponsiveValue<number>",
          "required": false,
          "description": "Configures columns for this component."
        },
        {
          "name": "minItemWidth",
          "type": "ResponsiveValue<string>",
          "required": false,
          "description": "Configures minItemWidth for this component."
        },
        {
          "name": "spacing",
          "type": "ResponsiveValue<Spacing>",
          "required": false,
          "description": "Configures spacing for this component."
        },
        {
          "name": "align",
          "type": "ResponsiveValue<\"start\" | \"center\" | \"end\" | \"stretch\">",
          "required": false,
          "description": "Configures align for this component."
        }
      ],
      "examples": [
        {
          "title": "Grid example",
          "code": "<Grid minItemWidth=\"18rem\" spacing=\"lg\">...</Grid>",
          "requiredImports": [
            "@tavojs/ui/grid"
          ]
        }
      ],
      "composition": {
        "related": [
          "Card",
          "Box",
          "Stat"
        ],
        "commonPairings": [
          "Card",
          "Box",
          "Stat"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "responsive grid",
        "columns",
        "layout grid"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/grid"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Grid when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "GridRuler",
      "slug": "grid-ruler",
      "category": "layout",
      "importPath": "@tavojs/ui/grid-ruler",
      "cssImportPath": "@tavojs/ui/css/grid-ruler",
      "description": "Visual grid helper for spacing and layout debugging.",
      "status": "stable",
      "summary": "Visual grid helper for spacing and layout debugging.",
      "whenToUse": "Use `GridRuler` as a visual design/debug utility",
      "avoidWhen": "Avoid GridRuler when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "spacing",
          "type": "ResponsiveValue<Spacing>",
          "required": false,
          "description": "Configures spacing for this component."
        }
      ],
      "examples": [
        {
          "title": "GridRuler example",
          "code": "<GridRuler spacing=\"md\" />",
          "requiredImports": [
            "@tavojs/ui/grid-ruler"
          ]
        }
      ],
      "composition": {
        "related": [
          "Grid",
          "Box",
          "Section"
        ],
        "commonPairings": [
          "Grid",
          "Box",
          "Section"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "GridRuler",
        "grid-ruler",
        "Visual grid helper for spacing and layout debugging."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/grid-ruler"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid GridRuler when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "HoverCard",
      "slug": "hover-card",
      "category": "feedback",
      "importPath": "@tavojs/ui/hover-card",
      "cssImportPath": "@tavojs/ui/css/hover-card",
      "description": "Hover and focus card for supplemental contextual content.",
      "status": "stable",
      "summary": "Hover and focus card for supplemental contextual content.",
      "whenToUse": "Use HoverCard when you need hover and focus card for supplemental contextual content.",
      "avoidWhen": "Avoid HoverCard when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "tone",
          "type": "Tone",
          "description": "Semantic tone where status messaging is supported. Applies to HoverCard."
        },
        {
          "name": "open",
          "type": "boolean",
          "description": "Controlled visibility state for overlay-style components when supported. Applies to HoverCard."
        },
        {
          "name": "children",
          "type": "Child",
          "description": "Feedback message or overlay content. Applies to HoverCard."
        }
      ],
      "examples": [
        {
          "title": "HoverCard example",
          "code": "<HoverCard />",
          "requiredImports": [
            "@tavojs/ui/hover-card"
          ]
        }
      ],
      "composition": {
        "related": [
          "Avatar",
          "Button",
          "Text"
        ],
        "compoundMembers": [
          "Root",
          "Trigger",
          "Content"
        ],
        "commonPairings": [
          "Avatar",
          "Button",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "HoverCard",
        "hover-card",
        "Hover and focus card for supplemental contextual content."
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/hover-card"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Avoid HoverCard when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Icon",
      "slug": "icon",
      "category": "content",
      "importPath": "@tavojs/ui/icon",
      "cssImportPath": "@tavojs/ui/css/icon",
      "description": "SVG icon wrapper with currentColor styling.",
      "status": "stable",
      "summary": "SVG icon wrapper with currentColor styling.",
      "whenToUse": "Use `Icon` as a simple SVG wrapper",
      "avoidWhen": "Avoid Icon when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "width",
          "type": "number",
          "required": false,
          "description": "Configures width for this component."
        },
        {
          "name": "height",
          "type": "number",
          "required": false,
          "description": "Configures height for this component."
        },
        {
          "name": "viewBox",
          "type": "string",
          "required": false,
          "description": "Configures viewBox for this component."
        },
        {
          "name": "component",
          "type": "Component<Record<string, unknown>>",
          "required": false,
          "description": "Configures component for this component."
        },
        {
          "name": "sx",
          "type": "Sx",
          "required": false,
          "description": "Configures sx for this component."
        }
      ],
      "examples": [
        {
          "title": "Icon example",
          "code": "<Icon><path d=\"...\" /></Icon>",
          "requiredImports": [
            "@tavojs/ui/icon"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Tooltip",
          "StatusDot"
        ],
        "commonPairings": [
          "Button",
          "Tooltip",
          "StatusDot"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Add `aria-hidden` for decorative icons or a label for meaningful ones.",
        "checklist": [
          "Add `aria-hidden` for decorative icons or a label for meaningful ones."
        ]
      },
      "searchTerms": [
        "Icon",
        "icon",
        "SVG icon wrapper with currentColor styling."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/icon"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Icon when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Image",
      "slug": "image",
      "category": "content",
      "importPath": "@tavojs/ui/image",
      "cssImportPath": "@tavojs/ui/css/image",
      "description": "Image primitive with skeleton and fallback support.",
      "status": "stable",
      "summary": "Image primitive with skeleton and fallback support.",
      "whenToUse": "Use `Image` for responsive image surfaces",
      "avoidWhen": "Avoid Image when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "src",
          "type": "string",
          "required": false,
          "description": "Configures src for this component."
        },
        {
          "name": "alt",
          "type": "string",
          "required": false,
          "description": "Configures alt for this component."
        },
        {
          "name": "width",
          "type": "number | string",
          "required": false,
          "description": "Configures width for this component."
        },
        {
          "name": "height",
          "type": "number | string",
          "required": false,
          "description": "Configures height for this component."
        },
        {
          "name": "objectFit",
          "type": "\"cover\" | \"contain\" | \"fill\" | \"none\" | \"scale-down\"",
          "required": false,
          "description": "Configures objectFit for this component."
        },
        {
          "name": "skeleton",
          "type": "\"text\" | \"circular\" | \"rectangular\" | \"rounded\"",
          "required": false,
          "description": "Configures skeleton for this component."
        },
        {
          "name": "fallback",
          "type": "string",
          "required": false,
          "description": "Configures fallback for this component."
        },
        {
          "name": "widths",
          "type": "number[]",
          "required": false,
          "description": "Configures widths for this component."
        }
      ],
      "examples": [
        {
          "title": "Image example",
          "code": "<Image src=\"/preview.png\" alt=\"Dashboard preview\" width=\"100%\" height={320} objectFit=\"cover\" />",
          "requiredImports": [
            "@tavojs/ui/image"
          ]
        }
      ],
      "composition": {
        "related": [
          "AspectRatio",
          "Card",
          "Avatar"
        ],
        "commonPairings": [
          "AspectRatio",
          "Card",
          "Avatar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "Image",
        "image",
        "Image primitive with skeleton and fallback support."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/image"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Image when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Inline",
      "slug": "inline",
      "category": "layout",
      "importPath": "@tavojs/ui/inline",
      "cssImportPath": "@tavojs/ui/css/inline",
      "description": "Inline layout primitive for compact horizontal groups.",
      "status": "stable",
      "summary": "Inline layout primitive for compact horizontal groups.",
      "whenToUse": "Use `Inline` for horizontal wrapping layouts",
      "avoidWhen": "Avoid Inline when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "gap",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures gap for this component."
        }
      ],
      "examples": [
        {
          "title": "Inline example",
          "code": "<Inline><Button>Save</Button><Button variant=\"ghost\">Cancel</Button></Inline>",
          "requiredImports": [
            "@tavojs/ui/inline",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Chip",
          "Button",
          "StatusDot"
        ],
        "commonPairings": [
          "Chip",
          "Button",
          "StatusDot"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Inline",
        "inline",
        "Inline layout primitive for compact horizontal groups."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/inline"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Inline when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "InputGroup",
      "slug": "input-group",
      "category": "forms",
      "importPath": "@tavojs/ui/input-group",
      "cssImportPath": "@tavojs/ui/css/input-group",
      "description": "Composed input with addons and inline action controls.",
      "status": "stable",
      "summary": "Composed input with addons and inline action controls.",
      "whenToUse": "Use `InputGroup` for controls with prefixes, suffixes, or inline actions",
      "avoidWhen": "Avoid InputGroup when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        }
      ],
      "examples": [
        {
          "title": "InputGroup example",
          "code": "<InputGroup>\n  <InputGroup.Addon>$</InputGroup.Addon>\n  <InputGroup.Input name=\"amount\" placeholder=\"Amount\" />\n  <InputGroup.Button>Apply</InputGroup.Button>\n</InputGroup>",
          "requiredImports": [
            "@tavojs/ui/input-group"
          ]
        }
      ],
      "composition": {
        "related": [
          "TextInput",
          "Button",
          "SearchInput"
        ],
        "compoundMembers": [
          "Root",
          "Addon",
          "Input",
          "Button"
        ],
        "commonPairings": [
          "TextInput",
          "Button",
          "SearchInput"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "input addon",
        "input with button",
        "combined input"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/input-group"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid InputGroup when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Kbd",
      "slug": "kbd",
      "category": "content",
      "importPath": "@tavojs/ui/kbd",
      "cssImportPath": "@tavojs/ui/css/kbd",
      "description": "Keyboard shortcut and keycap text primitive.",
      "status": "stable",
      "summary": "Keyboard shortcut and keycap text primitive.",
      "whenToUse": "Use `Kbd` for keyboard shortcut labels",
      "avoidWhen": "Avoid Kbd when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "children",
          "type": "Child",
          "description": "Visible content rendered by the component. Applies to Kbd."
        },
        {
          "name": "className",
          "type": "string",
          "description": "Optional class hook for app-level styling. Applies to Kbd."
        },
        {
          "name": "sx",
          "type": "Sx",
          "description": "Mobile-first responsive style overrides where supported. Applies to Kbd."
        }
      ],
      "examples": [
        {
          "title": "Kbd example",
          "code": "<Inline gap=\"sm\"><Kbd>Cmd</Kbd><Kbd>K</Kbd></Inline>",
          "requiredImports": [
            "@tavojs/ui/kbd",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "CommandMenu",
          "Text",
          "Tooltip"
        ],
        "commonPairings": [
          "CommandMenu",
          "Text",
          "Tooltip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "Kbd",
        "kbd",
        "Keyboard shortcut and keycap text primitive."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/kbd"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Kbd when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Link",
      "slug": "link",
      "category": "content",
      "importPath": "@tavojs/ui/link",
      "cssImportPath": "@tavojs/ui/css/link",
      "description": "Token-styled link primitive with disabled and underline options.",
      "status": "stable",
      "summary": "Token-styled link primitive with disabled and underline options.",
      "whenToUse": "Use `Link` for anchors or anchor-like actions",
      "avoidWhen": "Avoid Link when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "href",
          "type": "string",
          "required": false,
          "description": "Configures href for this component."
        },
        {
          "name": "to",
          "type": "string",
          "required": false,
          "description": "Configures to for this component."
        },
        {
          "name": "replace",
          "type": "boolean",
          "required": false,
          "description": "Configures replace for this component."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "required": false,
          "description": "Configures disabled for this component."
        },
        {
          "name": "noUnderline",
          "type": "boolean",
          "required": false,
          "description": "Configures noUnderline for this component."
        }
      ],
      "examples": [
        {
          "title": "Link example",
          "code": "<Link href=\"/docs\">Read docs</Link>\n<Link to=\"/docs\">Read docs</Link>",
          "requiredImports": [
            "@tavojs/ui/link"
          ]
        }
      ],
      "composition": {
        "related": [
          "Text",
          "Breadcrumbs",
          "Alert"
        ],
        "commonPairings": [
          "Text",
          "Breadcrumbs",
          "Alert"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "Link",
        "link",
        "Token-styled link primitive with disabled and underline options."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/link"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Link when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "List",
      "slug": "list",
      "category": "content",
      "importPath": "@tavojs/ui/list",
      "cssImportPath": "@tavojs/ui/css/list",
      "description": "List primitives for structured textual content.",
      "status": "stable",
      "summary": "List primitives for structured textual content.",
      "whenToUse": "Use `List` and `ListItem` for structured prose lists",
      "avoidWhen": "Avoid List when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "ordered",
          "type": "boolean",
          "required": false,
          "description": "Configures ordered for this component."
        },
        {
          "name": "marker",
          "type": "Tone",
          "required": false,
          "description": "Configures marker for this component."
        },
        {
          "name": "spacing",
          "type": "\"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures spacing for this component."
        },
        {
          "name": "ListItem.title",
          "type": "Child",
          "required": false,
          "description": "Configures ListItem.title for this component."
        },
        {
          "name": "ListItem.meta",
          "type": "Child",
          "required": false,
          "description": "Configures ListItem.meta for this component."
        }
      ],
      "examples": [
        {
          "title": "List example",
          "code": "<List marker=\"secondary\">\n  <ListItem title=\"Theme\">Generated tokens.</ListItem>\n</List>",
          "requiredImports": [
            "@tavojs/ui/list",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Card",
          "Section",
          "Text"
        ],
        "compoundMembers": [
          "Root",
          "Item"
        ],
        "commonPairings": [
          "Card",
          "Section",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "List",
        "list",
        "List primitives for structured textual content."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/list"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid List when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Menubar",
      "slug": "menubar",
      "category": "navigation",
      "importPath": "@tavojs/ui/menubar",
      "cssImportPath": "@tavojs/ui/css/menubar",
      "description": "Horizontal application menu bar with link and button items.",
      "status": "stable",
      "summary": "Horizontal application menu bar with link and button items.",
      "whenToUse": "Use Menubar when you need horizontal application menu bar with link and button items.",
      "avoidWhen": "Avoid Menubar when for arbitrary button groups that do not navigate.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "items",
          "type": "Array",
          "description": "Navigation items when supported by the component. Applies to Menubar."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Accessible label for navigation landmarks when needed. Applies to Menubar."
        },
        {
          "name": "children",
          "type": "Child",
          "description": "Navigation content or custom item structure. Applies to Menubar."
        }
      ],
      "examples": [
        {
          "title": "Menubar example",
          "code": "<Menubar />",
          "requiredImports": [
            "@tavojs/ui/menubar"
          ]
        }
      ],
      "composition": {
        "related": [
          "NavigationMenu",
          "AppBar",
          "Link"
        ],
        "commonPairings": [
          "NavigationMenu",
          "AppBar",
          "Link"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Navigation components should expose current-page state and landmark labels when context is not obvious.",
        "checklist": [
          "Use aria-current for active destinations where supported.",
          "Add aria-label when multiple nav landmarks exist.",
          "Keep link text descriptive."
        ]
      },
      "searchTerms": [
        "Menubar",
        "menubar",
        "Horizontal application menu bar with link and button items."
      ],
      "capability": "navigation",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/menubar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Menubar when for arbitrary button groups that do not navigate."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "NavigationMenu",
      "slug": "navigation-menu",
      "category": "navigation",
      "importPath": "@tavojs/ui/navigation-menu",
      "cssImportPath": "@tavojs/ui/css/navigation-menu",
      "description": "Responsive navigation list with current-page semantics.",
      "status": "stable",
      "summary": "Horizontal or vertical destination list with current-page semantics.",
      "whenToUse": "Use NavigationMenu for persistent links between product or documentation sections, usually inside AppBar or Sidebar.",
      "avoidWhen": "Use DropdownMenu for contextual commands, Tabs for switching panels without navigation, and ToggleGroup for choosing a value.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "items",
          "type": "Array",
          "description": "Navigation items when supported by the component. Applies to NavigationMenu."
        },
        {
          "name": "aria-label",
          "type": "string",
          "description": "Accessible label for navigation landmarks when needed. Applies to NavigationMenu."
        },
        {
          "name": "children",
          "type": "Child",
          "description": "Navigation content or custom item structure. Applies to NavigationMenu."
        }
      ],
      "examples": [
        {
          "title": "NavigationMenu example",
          "code": "<NavigationMenu />",
          "requiredImports": [
            "@tavojs/ui/navigation-menu"
          ]
        }
      ],
      "composition": {
        "related": [
          "AppBar",
          "Sidebar",
          "Link"
        ],
        "commonPairings": [
          "AppBar",
          "Sidebar",
          "Link"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Navigation components should expose current-page state and landmark labels when context is not obvious.",
        "checklist": [
          "Use aria-current for active destinations where supported.",
          "Add aria-label when multiple nav landmarks exist.",
          "Keep link text descriptive."
        ]
      },
      "searchTerms": [
        "navigation",
        "current page",
        "nav links"
      ],
      "capability": "navigation",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/navigation-menu"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Use DropdownMenu for contextual commands, Tabs for switching panels without navigation, and ToggleGroup for choosing a value."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Overlay",
      "slug": "overlay",
      "category": "feedback",
      "importPath": "@tavojs/ui/overlay",
      "cssImportPath": "@tavojs/ui/css/overlay",
      "description": "Screen overlay and scrim primitive for modal content.",
      "status": "stable",
      "summary": "Screen overlay and scrim primitive for modal content.",
      "whenToUse": "Use `Overlay` for centered overlay content and scrims",
      "avoidWhen": "Avoid Overlay when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        },
        {
          "name": "scrim",
          "type": "\"soft\" | \"strong\" | \"none\"",
          "required": false,
          "description": "Configures scrim for this component."
        },
        {
          "name": "center",
          "type": "boolean",
          "required": false,
          "description": "Configures center for this component."
        }
      ],
      "examples": [
        {
          "title": "Overlay example",
          "code": "<Overlay open><Spinner /></Overlay>",
          "requiredImports": [
            "@tavojs/ui/overlay",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Dialog",
          "Sheet",
          "FocusTrap"
        ],
        "commonPairings": [
          "Dialog",
          "Sheet",
          "FocusTrap"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "Overlay",
        "overlay",
        "Screen overlay and scrim primitive for modal content."
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/overlay"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Avoid Overlay when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Page",
      "slug": "page",
      "category": "layout",
      "importPath": "@tavojs/ui/page",
      "cssImportPath": "@tavojs/ui/css/page",
      "description": "Responsive page wrapper with token-backed sizing and padding.",
      "status": "stable",
      "summary": "Responsive page wrapper with token-backed sizing and padding.",
      "whenToUse": "Use `Page` as a main document region",
      "avoidWhen": "Avoid Page when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "ResponsiveValue<\"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\">",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "padding",
          "type": "ResponsiveValue<\"none\" | \"sm\" | \"md\" | \"lg\">",
          "required": false,
          "description": "Configures padding for this component."
        }
      ],
      "examples": [
        {
          "title": "Page example",
          "code": "<Page\n  size={{ base: \"full\", lg: \"xl\" }}\n  padding={{ base: \"sm\", md: \"lg\" }}\n>\n  ...\n</Page>",
          "requiredImports": [
            "@tavojs/ui/page"
          ]
        }
      ],
      "composition": {
        "related": [
          "Section",
          "Shell",
          "Toolbar"
        ],
        "commonPairings": [
          "Section",
          "Shell",
          "Toolbar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "page layout",
        "main region",
        "document page"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/page"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Page when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Pagination",
      "slug": "pagination",
      "category": "data",
      "importPath": "@tavojs/ui/pagination",
      "cssImportPath": "@tavojs/ui/css/pagination",
      "description": "Pagination navigation for paged data views.",
      "status": "stable",
      "summary": "Pagination navigation for paged data views.",
      "whenToUse": "Use `Pagination` for paginated data",
      "avoidWhen": "Avoid Pagination when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "page",
          "type": "number",
          "required": true,
          "description": "Configures page for this component."
        },
        {
          "name": "pageCount",
          "type": "number",
          "required": true,
          "description": "Configures pageCount for this component."
        },
        {
          "name": "siblingCount",
          "type": "number",
          "required": false,
          "description": "Configures siblingCount for this component."
        },
        {
          "name": "onChange",
          "type": "(page: number) => void",
          "required": false,
          "description": "Configures onChange for this component."
        },
        {
          "name": "getHref",
          "type": "(page: number) => string",
          "required": false,
          "description": "renders page and control actions as links when provided."
        },
        {
          "name": "label",
          "type": "string",
          "required": false,
          "description": "Configures label for this component."
        }
      ],
      "examples": [
        {
          "title": "Pagination example",
          "code": "<Pagination page={2} pageCount={12} onChange={setPage} />\n<Pagination page={2} pageCount={12} getHref={(page) => `/docs?page=${page}`} />",
          "requiredImports": [
            "@tavojs/ui/pagination"
          ]
        }
      ],
      "composition": {
        "related": [
          "Table",
          "Toolbar",
          "Button"
        ],
        "commonPairings": [
          "Table",
          "Toolbar",
          "Button"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `nav`, `aria-label`, and `aria-current`.",
        "checklist": [
          "Uses `nav`, `aria-label`, and `aria-current`."
        ]
      },
      "searchTerms": [
        "paged data",
        "page navigation",
        "next previous"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/pagination"
      ],
      "stateOwnership": "Application controlled through page and the matching callback.",
      "limitations": [
        "Avoid Pagination when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Portal",
      "slug": "portal",
      "category": "feedback",
      "importPath": "@tavojs/ui/portal",
      "cssImportPath": "@tavojs/ui/css/portal",
      "description": "Portal placeholder primitive for future framework-level mounts.",
      "status": "stable",
      "summary": "Portal placeholder primitive for future framework-level mounts.",
      "whenToUse": "Use `Portal` as a structural placeholder for future runtime portal support",
      "avoidWhen": "Avoid Portal when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "children",
          "type": "Child",
          "required": false,
          "description": "Configures children for this component."
        }
      ],
      "examples": [
        {
          "title": "Portal example",
          "code": "<Portal />",
          "requiredImports": [
            "@tavojs/ui/portal"
          ]
        }
      ],
      "composition": {
        "related": [
          "Dialog",
          "Popover",
          "Tooltip"
        ],
        "commonPairings": [
          "Dialog",
          "Popover",
          "Tooltip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "Portal",
        "portal",
        "Portal placeholder primitive for future framework-level mounts."
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/portal"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Portal when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Popover",
      "slug": "popover",
      "category": "feedback",
      "importPath": "@tavojs/ui/popover",
      "cssImportPath": "@tavojs/ui/css/popover",
      "description": "Floating disclosure panel for contextual content.",
      "status": "stable",
      "summary": "Floating contextual panel that can contain arbitrary interactive or explanatory content.",
      "whenToUse": "Use Popover for filters, compact forms, calendars, help, or other contextual UI anchored to a trigger.",
      "avoidWhen": "Use DropdownMenu when every item is a command, Tooltip for a short non-interactive hint, and Dialog or Sheet for a focused modal workflow.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "open",
          "type": "boolean",
          "required": false,
          "description": "Configures open for this component."
        },
        {
          "name": "placement",
          "type": "\"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\"",
          "required": false,
          "description": "Configures placement for this component."
        }
      ],
      "examples": [
        {
          "title": "Popover example",
          "code": "<Popover>\n  <Popover.Trigger>Filters</Popover.Trigger>\n  <Popover.Content>Filter controls go here.</Popover.Content>\n</Popover>",
          "requiredImports": [
            "@tavojs/ui/popover"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Calendar",
          "DropdownMenu"
        ],
        "compoundMembers": [
          "Root",
          "Trigger",
          "Content"
        ],
        "commonPairings": [
          "Button",
          "Calendar",
          "DropdownMenu"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Trigger exposes `aria-haspopup=\"dialog\"` and content uses dialog semantics.",
        "checklist": [
          "Trigger exposes `aria-haspopup=\"dialog\"` and content uses dialog semantics."
        ]
      },
      "searchTerms": [
        "floating panel",
        "contextual disclosure",
        "popup"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/popover"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Use DropdownMenu when every item is a command, Tooltip for a short non-interactive hint, and Dialog or Sheet for a focused modal workflow."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Progress",
      "slug": "progress",
      "category": "data",
      "importPath": "@tavojs/ui/progress",
      "cssImportPath": "@tavojs/ui/css/progress",
      "description": "Linear progress indicator with semantic tones.",
      "status": "stable",
      "summary": "Linear progress indicator with semantic tones.",
      "whenToUse": "Use `Progress` for determinate progress bars",
      "avoidWhen": "Avoid Progress when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "value",
          "type": "number",
          "required": false,
          "description": "Configures value for this component."
        },
        {
          "name": "max",
          "type": "number",
          "required": false,
          "description": "Configures max for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "label",
          "type": "string",
          "required": false,
          "description": "Configures label for this component."
        },
        {
          "name": "showValue",
          "type": "boolean",
          "required": false,
          "description": "Configures showValue for this component."
        }
      ],
      "examples": [
        {
          "title": "Progress example",
          "code": "<Progress label=\"Storage\" value={54} showValue />",
          "requiredImports": [
            "@tavojs/ui/progress"
          ]
        }
      ],
      "composition": {
        "related": [
          "StatusDot",
          "Toast",
          "Spinner"
        ],
        "commonPairings": [
          "StatusDot",
          "Toast",
          "Spinner"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "progress",
        "loading progress",
        "completion"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/progress"
      ],
      "stateOwnership": "Application controlled through value and the matching callback.",
      "limitations": [
        "Avoid Progress when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "PropertyList",
      "slug": "property-list",
      "category": "data",
      "importPath": "@tavojs/ui/property-list",
      "cssImportPath": "@tavojs/ui/css/property-list",
      "description": "Responsive key-value details for product records.",
      "status": "stable",
      "summary": "Responsive key-value details for product records.",
      "whenToUse": "Use `PropertyList` for responsive key-value records",
      "avoidWhen": "Avoid PropertyList when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "divided",
          "type": "boolean",
          "required": false,
          "description": "Configures divided for this component."
        },
        {
          "name": "PropertyItem.label",
          "type": "string",
          "required": true,
          "description": "Configures PropertyItem.label for this component."
        },
        {
          "name": "PropertyItem.value",
          "type": "Child",
          "required": false,
          "description": "Configures PropertyItem.value for this component."
        }
      ],
      "examples": [
        {
          "title": "PropertyList example",
          "code": "<PropertyList>\n  <PropertyItem label=\"Owner\">Design Team</PropertyItem>\n</PropertyList>",
          "requiredImports": [
            "@tavojs/ui/property-list",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Card",
          "Table",
          "Chip"
        ],
        "commonPairings": [
          "Card",
          "Table",
          "Chip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "key value",
        "details list",
        "record details"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/property-list"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid PropertyList when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Radio",
      "slug": "radio",
      "category": "forms",
      "importPath": "@tavojs/ui/radio",
      "cssImportPath": "@tavojs/ui/css/radio",
      "description": "Token-styled radio input primitive.",
      "status": "stable",
      "summary": "Token-styled radio input primitive.",
      "whenToUse": "Use `Radio` for individual radio controls",
      "avoidWhen": "Avoid Radio when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "checked",
          "type": "boolean",
          "required": false,
          "description": "Configures checked for this component."
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "required": false,
          "description": "Configures defaultChecked for this component."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "required": false,
          "description": "Configures disabled for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\"",
          "required": false,
          "description": "Configures tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Radio example",
          "code": "<Radio name=\"plan\" value=\"scale\" />",
          "requiredImports": [
            "@tavojs/ui/radio"
          ]
        }
      ],
      "composition": {
        "related": [
          "RadioGroup",
          "FormControlLabel",
          "Field"
        ],
        "commonPairings": [
          "RadioGroup",
          "FormControlLabel",
          "Field"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "Radio",
        "radio",
        "Token-styled radio input primitive."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/radio"
      ],
      "stateOwnership": "Application controlled through checked and the matching callback.",
      "limitations": [
        "Avoid Radio when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "RadioGroup",
      "slug": "radio-group",
      "category": "forms",
      "importPath": "@tavojs/ui/radio-group",
      "cssImportPath": "@tavojs/ui/css/radio-group",
      "description": "Radio fieldset that propagates names to child radio controls.",
      "status": "stable",
      "summary": "Radio fieldset that propagates names to child radio controls.",
      "whenToUse": "Use `RadioGroup` to group radio options",
      "avoidWhen": "Avoid RadioGroup when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Configures name for this component."
        },
        {
          "name": "orientation",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures orientation for this component."
        }
      ],
      "examples": [
        {
          "title": "RadioGroup example",
          "code": "<RadioGroup name=\"plan\">\n  <Radio value=\"starter\" />\n  <Radio value=\"scale\" />\n</RadioGroup>",
          "requiredImports": [
            "@tavojs/ui/radio-group",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Radio",
          "Field",
          "FormControl"
        ],
        "commonPairings": [
          "Radio",
          "Field",
          "FormControl"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `fieldset` semantics and propagates `name` to child radios when possible.",
        "checklist": [
          "Uses `fieldset` semantics and propagates `name` to child radios when possible."
        ]
      },
      "searchTerms": [
        "single choice",
        "radio options",
        "fieldset"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/radio-group"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid RadioGroup when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Resizable",
      "slug": "resizable",
      "category": "layout",
      "importPath": "@tavojs/ui/resizable",
      "cssImportPath": "@tavojs/ui/css/resizable",
      "description": "Resizable panel layout primitive with separator handles.",
      "status": "stable",
      "summary": "Panel and separator layout anatomy for application-supplied resizing behavior.",
      "whenToUse": "Use Resizable when you need the visual panel, handle, and flex-basis structure and will implement pointer, keyboard, constraint, and state behavior in the application.",
      "avoidWhen": "Do not present the handle as functional without adding resizing logic and updating separator ARIA values. Use SplitPane for a fixed two-region layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "direction",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures direction for this component."
        },
        {
          "name": "Resizable.Panel.defaultSize",
          "type": "ResponsiveValue<string>",
          "required": false,
          "description": "Configures Resizable.Panel.defaultSize for this component."
        }
      ],
      "examples": [
        {
          "title": "Resizable example",
          "code": "<Resizable>\n  <Resizable.Panel defaultSize={{ base: \"100%\", lg: \"40%\" }}>Filters</Resizable.Panel>\n  <Resizable.Handle />\n  <Resizable.Panel>Results</Resizable.Panel>\n</Resizable>",
          "requiredImports": [
            "@tavojs/ui/resizable"
          ]
        }
      ],
      "composition": {
        "related": [
          "SplitPane",
          "Card",
          "Sidebar"
        ],
        "compoundMembers": [
          "Root",
          "Panel",
          "Handle"
        ],
        "commonPairings": [
          "SplitPane",
          "Card",
          "Sidebar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Resizable",
        "resizable",
        "Resizable panel layout primitive with separator handles."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/resizable"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Do not present the handle as functional without adding resizing logic and updating separator ARIA values. Use SplitPane for a fixed two-region layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "SearchInput",
      "slug": "search-input",
      "category": "forms",
      "importPath": "@tavojs/ui/search-input",
      "cssImportPath": "@tavojs/ui/css/search-input",
      "description": "Search input primitive with consistent control sizing.",
      "status": "stable",
      "summary": "Search input primitive with consistent control sizing.",
      "whenToUse": "Use `SearchInput` for labeled search and filtering fields. It keeps query state, filtering, debouncing, and result rendering in the consuming application",
      "avoidWhen": "Avoid SearchInput when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "value",
          "type": "string",
          "required": false,
          "description": "Configures value for this component."
        },
        {
          "name": "defaultValue",
          "type": "string",
          "required": false,
          "description": "Configures defaultValue for this component."
        },
        {
          "name": "clearable",
          "type": "boolean",
          "required": false,
          "description": "Configures clearable for this component."
        },
        {
          "name": "clearLabel",
          "type": "string",
          "required": false,
          "description": "Configures clearLabel for this component."
        },
        {
          "name": "loading",
          "type": "boolean",
          "required": false,
          "description": "Configures loading for this component."
        },
        {
          "name": "leading",
          "type": "Child",
          "required": false,
          "description": "Configures leading for this component."
        },
        {
          "name": "trailing",
          "type": "Child",
          "required": false,
          "description": "Configures trailing for this component."
        }
      ],
      "examples": [
        {
          "title": "SearchInput example",
          "code": "<Field label=\"Search resources\">\n  <SearchInput\n    value={query}\n    placeholder=\"Name or category\"\n    clearable\n    loading={isSearching}\n    onInput={(event) => setQuery(event.currentTarget.value)}\n    onClear={() => setQuery(\"\")}\n  />\n</Field>",
          "requiredImports": [
            "@tavojs/ui/search-input",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "Toolbar",
          "CommandMenu"
        ],
        "commonPairings": [
          "Field",
          "Toolbar",
          "CommandMenu"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Pair the control with `Field`, a visible label, or `aria-label`. Loading sets `aria-busy` on the native input, and the clear action uses `clearLabel` as its accessible name.",
        "checklist": [
          "Pair the control with `Field`, a visible label, or `aria-label`. Loading sets `aria-busy` on the native input, and the clear action uses `clearLabel` as its accessible name."
        ]
      },
      "searchTerms": [
        "search",
        "query input",
        "filter search"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/search-input"
      ],
      "stateOwnership": "Application controlled through value and the matching callback.",
      "limitations": [
        "Avoid SearchInput when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "ScrollArea",
      "slug": "scroll-area",
      "category": "layout",
      "importPath": "@tavojs/ui/scroll-area",
      "cssImportPath": "@tavojs/ui/css/scroll-area",
      "description": "Styled scroll container with directional overflow controls.",
      "status": "stable",
      "summary": "Styled scroll container with directional overflow controls.",
      "whenToUse": "Use `ScrollArea` to constrain overflowing content",
      "avoidWhen": "Avoid ScrollArea when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "orientation",
          "type": "\"vertical\" | \"horizontal\" | \"both\"",
          "required": false,
          "description": "Configures orientation for this component."
        },
        {
          "name": "maxHeight",
          "type": "ResponsiveValue<string>",
          "required": false,
          "description": "Configures maxHeight for this component."
        }
      ],
      "examples": [
        {
          "title": "ScrollArea example",
          "code": "<ScrollArea maxHeight={{ base: \"12rem\", md: \"24rem\" }}>...</ScrollArea>",
          "requiredImports": [
            "@tavojs/ui/scroll-area"
          ]
        }
      ],
      "composition": {
        "related": [
          "Table",
          "Card",
          "Sidebar"
        ],
        "commonPairings": [
          "Table",
          "Card",
          "Sidebar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "ScrollArea",
        "scroll-area",
        "Styled scroll container with directional overflow controls."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/scroll-area"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid ScrollArea when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Section",
      "slug": "section",
      "category": "layout",
      "importPath": "@tavojs/ui/section",
      "cssImportPath": "@tavojs/ui/css/section",
      "description": "Page section wrapper with title, description, and actions.",
      "status": "stable",
      "summary": "Page section wrapper with title, description, and actions.",
      "whenToUse": "Use `Section` for page sections with optional heading, description, and actions",
      "avoidWhen": "Avoid Section when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "eyebrow",
          "type": "Child",
          "required": false,
          "description": "Configures eyebrow for this component."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "titleSize",
          "type": "\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\"",
          "required": false,
          "description": "Configures titleSize for this component."
        },
        {
          "name": "description",
          "type": "Child",
          "required": false,
          "description": "Configures description for this component."
        },
        {
          "name": "actions",
          "type": "Child",
          "required": false,
          "description": "Configures actions for this component."
        },
        {
          "name": "spacing",
          "type": "ResponsiveValue<Spacing>",
          "required": false,
          "description": "Configures spacing for this component."
        }
      ],
      "examples": [
        {
          "title": "Section example",
          "code": "<Section title=\"Latest\" description=\"Recent updates\">...</Section>\n<Section title=\"Related settings\" titleSize=\"h3\">...</Section>",
          "requiredImports": [
            "@tavojs/ui/section"
          ]
        }
      ],
      "composition": {
        "related": [
          "Page",
          "Card",
          "Stack"
        ],
        "commonPairings": [
          "Page",
          "Card",
          "Stack"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Section",
        "section",
        "Page section wrapper with title, description, and actions."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/section"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Section when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Select",
      "slug": "select",
      "category": "forms",
      "importPath": "@tavojs/ui/select",
      "cssImportPath": "@tavojs/ui/css/select",
      "description": "Token-styled select primitive.",
      "status": "stable",
      "summary": "Token-styled select primitive.",
      "whenToUse": "Use `Select` for native select menus",
      "avoidWhen": "Avoid Select when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        }
      ],
      "examples": [
        {
          "title": "Select example",
          "code": "<Select><option>All states</option></Select>",
          "requiredImports": [
            "@tavojs/ui/select"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "Toolbar",
          "Table"
        ],
        "commonPairings": [
          "Field",
          "Toolbar",
          "Table"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "select",
        "dropdown field",
        "native select"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/select"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Select when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Sheet",
      "slug": "sheet",
      "category": "feedback",
      "importPath": "@tavojs/ui/sheet",
      "cssImportPath": "@tavojs/ui/css/sheet",
      "description": "Edge-attached dialog panel supporting four sides.",
      "status": "stable",
      "summary": "Temporary modal panel that slides from a viewport edge with backdrop, focus containment, and dismissal.",
      "whenToUse": "Use Sheet for a temporary settings, filter, detail, or mobile-navigation workflow that should overlay the current page.",
      "avoidWhen": "Use Sidebar for persistent navigation that participates in page layout. A Sheet is modal and temporary; a Sidebar is structural and continuously visible.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "tone",
          "type": "Tone",
          "description": "Semantic tone where status messaging is supported. Applies to Sheet."
        },
        {
          "name": "open",
          "type": "boolean",
          "description": "Controlled visibility state for overlay-style components when supported. Applies to Sheet."
        },
        {
          "name": "children",
          "type": "Child",
          "description": "Feedback message or overlay content. Applies to Sheet."
        }
      ],
      "examples": [
        {
          "title": "Sheet example",
          "code": "<Sheet />",
          "requiredImports": [
            "@tavojs/ui/sheet"
          ]
        }
      ],
      "composition": {
        "related": [
          "Overlay",
          "Button",
          "FocusTrap"
        ],
        "compoundMembers": [
          "Root",
          "Trigger",
          "Content",
          "Close"
        ],
        "commonPairings": [
          "Overlay",
          "Button",
          "FocusTrap"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "edge dialog",
        "bottom sheet",
        "side sheet"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/sheet"
      ],
      "stateOwnership": "Application controlled through open and the matching callback.",
      "limitations": [
        "Use Sidebar for persistent navigation that participates in page layout. A Sheet is modal and temporary; a Sidebar is structural and continuously visible."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Shell",
      "slug": "shell",
      "category": "layout",
      "importPath": "@tavojs/ui/shell",
      "cssImportPath": "@tavojs/ui/css/shell",
      "description": "Application shell with optional header and sidebar regions.",
      "status": "stable",
      "summary": "Application shell with optional header and sidebar regions.",
      "whenToUse": "Use `Shell` for app frames",
      "avoidWhen": "Avoid Shell when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "sidebar",
          "type": "Child",
          "required": false,
          "description": "Configures sidebar for this component."
        },
        {
          "name": "header",
          "type": "Child",
          "required": false,
          "description": "Configures header for this component."
        },
        {
          "name": "rail",
          "type": "\"left\" | \"right\"",
          "required": false,
          "description": "Configures rail for this component."
        }
      ],
      "examples": [
        {
          "title": "Shell example",
          "code": "<Shell header={<AppBar />} sidebar={<Sidebar />}>Content</Shell>",
          "requiredImports": [
            "@tavojs/ui/shell",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "AppBar",
          "Sidebar",
          "Page"
        ],
        "commonPairings": [
          "AppBar",
          "Sidebar",
          "Page"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "application shell",
        "sidebar layout",
        "app layout"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/shell"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Shell when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Sidebar",
      "slug": "sidebar",
      "category": "layout",
      "importPath": "@tavojs/ui/sidebar",
      "cssImportPath": "@tavojs/ui/css/sidebar",
      "description": "Sidebar region with token-backed padding.",
      "status": "stable",
      "summary": "Persistent navigation region with responsive token-backed padding.",
      "whenToUse": "Use Sidebar for navigation or supporting content that remains part of the application layout.",
      "avoidWhen": "Use Sheet when the panel should temporarily overlay the page, trap focus, provide a backdrop, and close after the task.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "padding",
          "type": "ResponsiveValue<\"none\" | \"sm\" | \"md\" | \"lg\">",
          "required": false,
          "description": "Configures padding for this component."
        }
      ],
      "examples": [
        {
          "title": "Sidebar example",
          "code": "<Sidebar><Button variant=\"soft\">Overview</Button></Sidebar>",
          "requiredImports": [
            "@tavojs/ui/sidebar",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Shell",
          "NavigationMenu",
          "ScrollArea"
        ],
        "commonPairings": [
          "Shell",
          "NavigationMenu",
          "ScrollArea"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "sidebar layout",
        "navigation rail",
        "side navigation"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/sidebar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Use Sheet when the panel should temporarily overlay the page, trap focus, provide a backdrop, and close after the task."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Skeleton",
      "slug": "skeleton",
      "category": "feedback",
      "importPath": "@tavojs/ui/skeleton",
      "cssImportPath": "@tavojs/ui/css/skeleton",
      "description": "Loading placeholder primitive.",
      "status": "stable",
      "summary": "Loading placeholder primitive.",
      "whenToUse": "Use `Skeleton` for loading placeholders",
      "avoidWhen": "Avoid Skeleton when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "width",
          "type": "number | string",
          "required": false,
          "description": "Configures width for this component."
        },
        {
          "name": "height",
          "type": "number | string",
          "required": false,
          "description": "Configures height for this component."
        },
        {
          "name": "variant",
          "type": "\"text\" | \"circular\" | \"rectangular\" | \"rounded\"",
          "required": false,
          "description": "Configures variant for this component."
        }
      ],
      "examples": [
        {
          "title": "Skeleton example",
          "code": "<Skeleton height=\"2rem\" />",
          "requiredImports": [
            "@tavojs/ui/skeleton"
          ]
        }
      ],
      "composition": {
        "related": [
          "Card",
          "Table",
          "Image"
        ],
        "commonPairings": [
          "Card",
          "Table",
          "Image"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "loading placeholder",
        "skeleton state",
        "placeholder"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/skeleton"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Skeleton when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Slider",
      "slug": "slider",
      "category": "forms",
      "importPath": "@tavojs/ui/slider",
      "cssImportPath": "@tavojs/ui/css/slider",
      "description": "Range input primitive.",
      "status": "stable",
      "summary": "Range input primitive.",
      "whenToUse": "Use `Slider` for numeric range input",
      "avoidWhen": "Avoid Slider when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "min",
          "type": "number",
          "required": false,
          "description": "Configures min for this component."
        },
        {
          "name": "max",
          "type": "number",
          "required": false,
          "description": "Configures max for this component."
        },
        {
          "name": "step",
          "type": "number",
          "required": false,
          "description": "Configures step for this component."
        }
      ],
      "examples": [
        {
          "title": "Slider example",
          "code": "<Slider min={0} max={100} value={72} />",
          "requiredImports": [
            "@tavojs/ui/slider"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "TextInput",
          "Text"
        ],
        "commonPairings": [
          "Field",
          "TextInput",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "range input",
        "numeric range",
        "slider"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/slider"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Slider when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Spacer",
      "slug": "spacer",
      "category": "layout",
      "importPath": "@tavojs/ui/spacer",
      "cssImportPath": "@tavojs/ui/css/spacer",
      "description": "Spacing primitive for block and inline rhythm.",
      "status": "stable",
      "summary": "Decorative token-sized empty space along the block or inline axis.",
      "whenToUse": "Use Spacer for an explicit semantic spacing break when a parent gap or margin cannot express the intended rhythm.",
      "avoidWhen": "Prefer Stack, Inline, Flex, or Grid gap for repeated layout spacing. SplitPane is unrelated: it creates two content regions with a responsive ratio.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "ResponsiveValue<\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\">",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "axis",
          "type": "\"block\" | \"inline\"",
          "required": false,
          "description": "Configures axis for this component."
        }
      ],
      "examples": [
        {
          "title": "Spacer example",
          "code": "<Spacer size=\"lg\" />",
          "requiredImports": [
            "@tavojs/ui/spacer"
          ]
        }
      ],
      "composition": {
        "related": [
          "Stack",
          "Inline",
          "Box"
        ],
        "commonPairings": [
          "Stack",
          "Inline",
          "Box"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Spacer",
        "spacer",
        "Spacing primitive for block and inline rhythm."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/spacer"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Prefer Stack, Inline, Flex, or Grid gap for repeated layout spacing. SplitPane is unrelated: it creates two content regions with a responsive ratio."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Spinner",
      "slug": "spinner",
      "category": "feedback",
      "importPath": "@tavojs/ui/spinner",
      "cssImportPath": "@tavojs/ui/css/spinner",
      "description": "Loading spinner with status labeling.",
      "status": "stable",
      "summary": "Loading spinner with status labeling.",
      "whenToUse": "Use `Spinner` for indeterminate loading",
      "avoidWhen": "Avoid Spinner when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "label",
          "type": "string",
          "required": false,
          "description": "Configures label for this component."
        }
      ],
      "examples": [
        {
          "title": "Spinner example",
          "code": "<Spinner label=\"Loading report\" />",
          "requiredImports": [
            "@tavojs/ui/spinner"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Progress",
          "StatusDot"
        ],
        "commonPairings": [
          "Button",
          "Progress",
          "StatusDot"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `label` for screen-reader context.",
        "checklist": [
          "Uses `label` for screen-reader context."
        ]
      },
      "searchTerms": [
        "loading spinner",
        "busy indicator",
        "progress"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/spinner"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Spinner when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "SplitPane",
      "slug": "split-pane",
      "category": "layout",
      "importPath": "@tavojs/ui/split-pane",
      "cssImportPath": "@tavojs/ui/css/split-pane",
      "description": "Two-column split layout primitive.",
      "status": "stable",
      "summary": "Fixed two-region main/aside layout with responsive ratio, side, and gap.",
      "whenToUse": "Use SplitPane for stable main-and-aside layouts such as navigation plus content or inspector plus canvas.",
      "avoidWhen": "Use Spacer only for empty distance, and Resizable only when the application will add adjustable panel behavior.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "aside",
          "type": "Child",
          "required": false,
          "description": "Configures aside for this component."
        },
        {
          "name": "side",
          "type": "\"left\" | \"right\"",
          "required": false,
          "description": "Configures side for this component."
        },
        {
          "name": "ratio",
          "type": "ResponsiveValue<\"third\" | \"half\" | \"golden\">",
          "required": false,
          "description": "Configures ratio for this component."
        },
        {
          "name": "gap",
          "type": "ResponsiveValue<\"none\" | \"sm\" | \"md\" | \"lg\">",
          "required": false,
          "description": "Configures gap for this component."
        }
      ],
      "examples": [
        {
          "title": "SplitPane example",
          "code": "<SplitPane aside={<Card />}>Main content</SplitPane>",
          "requiredImports": [
            "@tavojs/ui/split-pane",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Card",
          "Resizable",
          "Sidebar"
        ],
        "compoundMembers": [
          "Root",
          "Aside",
          "Main"
        ],
        "commonPairings": [
          "Card",
          "Resizable",
          "Sidebar"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "SplitPane",
        "split-pane",
        "Two-column split layout primitive."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/split-pane"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Use Spacer only for empty distance, and Resizable only when the application will add adjustable panel behavior."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Stack",
      "slug": "stack",
      "category": "layout",
      "importPath": "@tavojs/ui/stack",
      "cssImportPath": "@tavojs/ui/css/stack",
      "description": "Vertical layout primitive with token-backed gap options.",
      "status": "stable",
      "summary": "Vertical layout primitive with token-backed gap options.",
      "whenToUse": "Use `Stack` for vertical spacing",
      "avoidWhen": "Avoid Stack when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "gap",
          "type": "\"none\" | \"sm\" | \"md\" | \"lg\"",
          "required": false,
          "description": "Configures gap for this component."
        }
      ],
      "examples": [
        {
          "title": "Stack example",
          "code": "<Stack gap=\"lg\">...</Stack>",
          "requiredImports": [
            "@tavojs/ui/stack"
          ]
        }
      ],
      "composition": {
        "related": [
          "Box",
          "Card",
          "Section"
        ],
        "commonPairings": [
          "Box",
          "Card",
          "Section"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "Stack",
        "stack",
        "Vertical layout primitive with token-backed gap options."
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/stack"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Stack when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Stat",
      "slug": "stat",
      "category": "data",
      "importPath": "@tavojs/ui/stat",
      "cssImportPath": "@tavojs/ui/css/stat",
      "description": "Metric card primitive for dashboard values.",
      "status": "stable",
      "summary": "Metric card primitive for dashboard values.",
      "whenToUse": "Use `Stat` for metric cards",
      "avoidWhen": "Avoid Stat when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "label",
          "type": "Child",
          "required": false,
          "description": "Configures label for this component."
        },
        {
          "name": "value",
          "type": "Child",
          "required": false,
          "description": "Configures value for this component."
        },
        {
          "name": "hint",
          "type": "Child",
          "required": false,
          "description": "Configures hint for this component."
        },
        {
          "name": "trend",
          "type": "Child",
          "required": false,
          "description": "Configures trend for this component."
        },
        {
          "name": "tone",
          "type": "Tone",
          "required": false,
          "description": "Configures tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Stat example",
          "code": "<Stat label=\"Revenue\" value=\"$84k\" trend=\"+11%\" tone=\"success\" />",
          "requiredImports": [
            "@tavojs/ui/stat"
          ]
        }
      ],
      "composition": {
        "related": [
          "Grid",
          "Chart",
          "Chip"
        ],
        "commonPairings": [
          "Grid",
          "Chart",
          "Chip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "metric",
        "kpi",
        "dashboard stat"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/stat"
      ],
      "stateOwnership": "Application controlled through value and the matching callback.",
      "limitations": [
        "Avoid Stat when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "StatusDot",
      "slug": "status-dot",
      "category": "data",
      "importPath": "@tavojs/ui/status-dot",
      "cssImportPath": "@tavojs/ui/css/status-dot",
      "description": "Compact semantic status indicator.",
      "status": "stable",
      "summary": "Compact semantic status indicator.",
      "whenToUse": "Use `StatusDot` for compact live or static statuses",
      "avoidWhen": "Avoid StatusDot when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "tone",
          "type": "Tone",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "pulse",
          "type": "boolean",
          "required": false,
          "description": "Configures pulse for this component."
        },
        {
          "name": "label",
          "type": "string",
          "required": false,
          "description": "Configures label for this component."
        }
      ],
      "examples": [
        {
          "title": "StatusDot example",
          "code": "<StatusDot tone=\"success\" label=\"Online\" pulse />",
          "requiredImports": [
            "@tavojs/ui/status-dot"
          ]
        }
      ],
      "composition": {
        "related": [
          "Chip",
          "Table",
          "Timeline"
        ],
        "commonPairings": [
          "Chip",
          "Table",
          "Timeline"
        ]
      },
      "accessibilityGuidance": {
        "summary": "`label` becomes the accessible label.",
        "checklist": [
          "`label` becomes the accessible label."
        ]
      },
      "searchTerms": [
        "status indicator",
        "online offline",
        "semantic dot"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/status-dot"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid StatusDot when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Stepper",
      "slug": "stepper",
      "category": "data",
      "importPath": "@tavojs/ui/stepper",
      "cssImportPath": "@tavojs/ui/css/stepper",
      "description": "Horizontal or vertical progress steps for setup and checkout flows.",
      "status": "stable",
      "summary": "Horizontal or vertical progress steps for setup and checkout flows.",
      "whenToUse": "Use `Stepper` for multi-step flows",
      "avoidWhen": "Avoid Stepper when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "steps",
          "type": "{ id?: string; title?: Child; label?: Child; description?: Child; status?: \"complete\" | \"current\" | \"upcoming\" | \"error\" }[]",
          "required": true,
          "description": "Configures steps for this component."
        },
        {
          "name": "orientation",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures orientation for this component."
        }
      ],
      "examples": [
        {
          "title": "Stepper example",
          "code": "<Stepper steps={[{ id: \"profile\", title: \"Profile\", status: \"current\" }]} />\n<Stepper steps={[{ label: \"Billing\", status: \"upcoming\" }]} />",
          "requiredImports": [
            "@tavojs/ui/stepper"
          ]
        }
      ],
      "composition": {
        "related": [
          "Progress",
          "Button",
          "Card"
        ],
        "commonPairings": [
          "Progress",
          "Button",
          "Card"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Current step receives `aria-current=\"step\"`.",
        "checklist": [
          "Current step receives `aria-current=\"step\"`."
        ]
      },
      "searchTerms": [
        "wizard steps",
        "checkout steps",
        "setup progress"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/stepper"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Stepper when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Switch",
      "slug": "switch",
      "category": "forms",
      "importPath": "@tavojs/ui/switch",
      "cssImportPath": "@tavojs/ui/css/switch",
      "description": "Toggle switch control.",
      "status": "stable",
      "summary": "Toggle switch control.",
      "whenToUse": "Use `Switch` for boolean settings",
      "avoidWhen": "Avoid Switch when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "checked",
          "type": "boolean",
          "required": false,
          "description": "Configures checked for this component."
        },
        {
          "name": "defaultChecked",
          "type": "boolean",
          "required": false,
          "description": "Configures defaultChecked for this component."
        },
        {
          "name": "disabled",
          "type": "boolean",
          "required": false,
          "description": "Configures disabled for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "tone",
          "type": "\"primary\" | \"secondary\" | \"neutral\"",
          "required": false,
          "description": "Configures tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Switch example",
          "code": "<Switch checked aria-label=\"Enable alerts\" />",
          "requiredImports": [
            "@tavojs/ui/switch"
          ]
        }
      ],
      "composition": {
        "related": [
          "FormControlLabel",
          "Field",
          "Card"
        ],
        "commonPairings": [
          "FormControlLabel",
          "Field",
          "Card"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Renders an input with `role=\"switch\"`.",
        "checklist": [
          "Renders an input with `role=\"switch\"`."
        ]
      },
      "searchTerms": [
        "Switch",
        "switch",
        "Toggle switch control."
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/switch"
      ],
      "stateOwnership": "Application controlled through checked and the matching callback.",
      "limitations": [
        "Avoid Switch when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Table",
      "slug": "table",
      "category": "data",
      "importPath": "@tavojs/ui/table",
      "cssImportPath": "@tavojs/ui/css/table",
      "description": "Accessible table primitives with caption, head, rows, and cells.",
      "status": "stable",
      "summary": "Accessible table primitives with caption, head, rows, and cells.",
      "whenToUse": "Use Table for structured rows and columns of comparable data.",
      "avoidWhen": "Avoid for purely visual grids; use Grid or Stack instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "compact",
          "type": "boolean",
          "defaultValue": "false",
          "description": "Uses denser row spacing when supported."
        },
        {
          "name": "caption",
          "type": "Child",
          "description": "Accessible table caption when supported."
        },
        {
          "name": "columns",
          "type": "TableDataColumn[]",
          "description": "Column definitions for Table.Data."
        },
        {
          "name": "rows",
          "type": "Record<string, unknown>[]",
          "description": "Rows for Table.Data."
        }
      ],
      "examples": [
        {
          "title": "Compound table",
          "code": "<Table.Root caption=\"Invoices\"><Table.Head><Table.Row><Table.HeaderCell>Status</Table.HeaderCell></Table.Row></Table.Head><Table.Body><Table.Row><Table.Cell>Paid</Table.Cell></Table.Row></Table.Body></Table.Root>",
          "requiredImports": [
            "@tavojs/ui/table"
          ]
        }
      ],
      "composition": {
        "related": [
          "Toolbar",
          "Pagination",
          "ScrollArea"
        ],
        "compoundMembers": [
          "Root",
          "Head",
          "Body",
          "Row",
          "HeaderCell",
          "Cell",
          "Data"
        ],
        "commonPairings": [
          "Toolbar",
          "Pagination",
          "ScrollArea"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "data table",
        "rows columns",
        "records",
        "tabular data"
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/table"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid for purely visual grids; use Grid or Stack instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Tabs",
      "slug": "tabs",
      "category": "content",
      "importPath": "@tavojs/ui/tabs",
      "cssImportPath": "@tavojs/ui/css/tabs",
      "description": "Tabbed interface primitive with keyboard navigation.",
      "status": "stable",
      "summary": "Tabbed interface primitive with keyboard navigation.",
      "whenToUse": "Use `Tabs` for tabbed content. Supports item-array mode and compound helpers",
      "avoidWhen": "Avoid Tabs when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "tabs",
          "type": "{ id: string; label: Child; content?: Child }[]",
          "required": true,
          "description": "Configures tabs for this component."
        },
        {
          "name": "activeId",
          "type": "string",
          "required": true,
          "description": "Configures activeId for this component."
        },
        {
          "name": "onChange",
          "type": "(tabId: string) => void",
          "required": false,
          "description": "Configures onChange for this component."
        },
        {
          "name": "idPrefix",
          "type": "string",
          "required": false,
          "description": "Configures idPrefix for this component."
        },
        {
          "name": "orientation",
          "type": "\"horizontal\" | \"vertical\"",
          "required": false,
          "description": "Configures orientation for this component."
        }
      ],
      "examples": [
        {
          "title": "Tabs example",
          "code": "<Tabs tabs={tabs} activeId=\"overview\" onChange={setTab} />",
          "requiredImports": [
            "@tavojs/ui/tabs"
          ]
        }
      ],
      "composition": {
        "related": [
          "CodeBlock",
          "Card",
          "ToggleGroup"
        ],
        "compoundMembers": [
          "Root",
          "List",
          "Trigger",
          "Content",
          "Indicator"
        ],
        "commonPairings": [
          "CodeBlock",
          "Card",
          "ToggleGroup"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses tablist, tab, tabpanel roles and arrow/Home/End keyboard navigation.",
        "checklist": [
          "Uses tablist, tab, tabpanel roles and arrow/Home/End keyboard navigation."
        ]
      },
      "searchTerms": [
        "tabbed interface",
        "switch panels",
        "tabs"
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/tabs"
      ],
      "stateOwnership": "Application controlled through activeId and the matching callback.",
      "limitations": [
        "Avoid Tabs when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Tabs"
      }
    },
    {
      "name": "Text",
      "slug": "text",
      "category": "content",
      "importPath": "@tavojs/ui/text",
      "cssImportPath": "@tavojs/ui/css/text",
      "description": "Theme-aware typography primitive.",
      "status": "stable",
      "summary": "Theme-aware typography primitive.",
      "whenToUse": "Use `Text` for token-backed typography",
      "avoidWhen": "Avoid Text when replacing interactive controls with content-only components.",
      "props": [
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook for app-level styling."
        },
        {
          "name": "variant",
          "type": "\"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"body\" | \"hint\" | \"span\"",
          "required": false,
          "description": "Configures variant for this component."
        },
        {
          "name": "color",
          "type": "\"auto\" | \"heading\" | \"muted\" | \"inherit\" | \"primary\" | \"secondary\" | Tone",
          "required": false,
          "description": "Configures color for this component."
        },
        {
          "name": "tone",
          "type": "Tone | \"default\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "error",
          "type": "boolean",
          "required": false,
          "description": "Configures error for this component."
        }
      ],
      "examples": [
        {
          "title": "Text example",
          "code": "<Text variant=\"h1\">Dashboard</Text>\n<Text variant=\"p\">Paragraph copy.</Text>\n<Text color=\"muted\">Updated just now.</Text>",
          "requiredImports": [
            "@tavojs/ui/text"
          ]
        }
      ],
      "composition": {
        "related": [
          "Link",
          "Chip",
          "Kbd"
        ],
        "commonPairings": [
          "Link",
          "Chip",
          "Kbd"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Content components should keep meaningful text and media alternatives available to assistive technology.",
        "checklist": [
          "Provide alt text for meaningful images.",
          "Use semantic text variants for headings and paragraphs.",
          "Do not hide essential content visually unless VisuallyHidden is intentional."
        ]
      },
      "searchTerms": [
        "Text",
        "text",
        "Theme-aware typography primitive."
      ],
      "capability": "content",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/text"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Text when replacing interactive controls with content-only components."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "TextInput",
      "slug": "text-input",
      "category": "forms",
      "importPath": "@tavojs/ui/text-input",
      "cssImportPath": "@tavojs/ui/css/text-input",
      "description": "Token-styled text input primitive.",
      "status": "stable",
      "summary": "Token-styled native input element for text-like values.",
      "whenToUse": "Use TextInput as the actual text, email, password, URL, or similar native input control.",
      "avoidWhen": "TextInput does not generate a visible label or supporting messages. Wrap it in Field for label, hint, validation, required-state, and ARIA wiring.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        }
      ],
      "examples": [
        {
          "title": "TextInput example",
          "code": "<TextInput placeholder=\"Email\" />",
          "requiredImports": [
            "@tavojs/ui/text-input"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "InputGroup",
          "SearchInput"
        ],
        "commonPairings": [
          "Field",
          "InputGroup",
          "SearchInput"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "text input",
        "email input",
        "field input"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/text-input"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "TextInput does not generate a visible label or supporting messages. Wrap it in Field for label, hint, validation, required-state, and ARIA wiring."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Textarea",
      "slug": "textarea",
      "category": "forms",
      "importPath": "@tavojs/ui/textarea",
      "cssImportPath": "@tavojs/ui/css/textarea",
      "description": "Token-styled multiline text input.",
      "status": "stable",
      "summary": "Token-styled multiline text input.",
      "whenToUse": "Use `Textarea` for multiline input",
      "avoidWhen": "Avoid Textarea when wrapping controls without labels or accessible names.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "resize",
          "type": "\"none\" | \"vertical\" | \"horizontal\" | \"both\"",
          "required": false,
          "description": "Configures resize for this component."
        },
        {
          "name": "rows",
          "type": "number",
          "required": false,
          "description": "Configures rows for this component."
        }
      ],
      "examples": [
        {
          "title": "Textarea example",
          "code": "<Textarea rows={6} resize=\"vertical\" />",
          "requiredImports": [
            "@tavojs/ui/textarea"
          ]
        }
      ],
      "composition": {
        "related": [
          "Field",
          "Button"
        ],
        "commonPairings": [
          "Field",
          "Button"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "multiline input",
        "long text",
        "message input"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/textarea"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Textarea when wrapping controls without labels or accessible names."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Timeline",
      "slug": "timeline",
      "category": "data",
      "importPath": "@tavojs/ui/timeline",
      "cssImportPath": "@tavojs/ui/css/timeline",
      "description": "Chronological timeline for events and milestones.",
      "status": "stable",
      "summary": "Chronological timeline for events and milestones.",
      "whenToUse": "Use `Timeline` and `TimelineItem` for chronological milestones",
      "avoidWhen": "Avoid Timeline when using data components as decorative layout containers.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "TimelineItem.title",
          "type": "Child",
          "required": false,
          "description": "Configures TimelineItem.title for this component."
        },
        {
          "name": "TimelineItem.meta",
          "type": "Child",
          "required": false,
          "description": "Configures TimelineItem.meta for this component."
        },
        {
          "name": "TimelineItem.tone",
          "type": "Tone",
          "required": false,
          "description": "Configures TimelineItem.tone for this component."
        }
      ],
      "examples": [
        {
          "title": "Timeline example",
          "code": "<Timeline>\n  <TimelineItem title=\"Released\" meta=\"today\" tone=\"success\">Version shipped.</TimelineItem>\n</Timeline>",
          "requiredImports": [
            "@tavojs/ui/timeline",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "StatusDot",
          "Card",
          "Text"
        ],
        "commonPairings": [
          "StatusDot",
          "Card",
          "Text"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Data components should preserve readable order and expose labels for non-textual values.",
        "checklist": [
          "Use captions or nearby headings for tables and charts.",
          "Do not rely on color alone for status.",
          "Keep values and labels available as text."
        ]
      },
      "searchTerms": [
        "Timeline",
        "timeline",
        "Chronological timeline for events and milestones."
      ],
      "capability": "data",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/timeline"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Timeline when using data components as decorative layout containers."
      ],
      "preview": {
        "available": true,
        "fixture": "Timeline"
      }
    },
    {
      "name": "Toast",
      "slug": "toast",
      "category": "feedback",
      "importPath": "@tavojs/ui/toast",
      "cssImportPath": "@tavojs/ui/css/toast",
      "description": "Inline notification surface and fixed toast stack.",
      "status": "stable",
      "summary": "Inline notification surface and fixed toast stack.",
      "whenToUse": "Use `Toast` for transient notifications and `ToastStack` for fixed positioning",
      "avoidWhen": "Avoid Toast when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "title",
          "type": "Child",
          "required": false,
          "description": "Configures title for this component."
        },
        {
          "name": "tone",
          "type": "\"info\" | \"success\" | \"warning\" | \"danger\"",
          "required": false,
          "description": "Configures tone for this component."
        },
        {
          "name": "action",
          "type": "Child",
          "required": false,
          "description": "Configures action for this component."
        },
        {
          "name": "onClose",
          "type": "() => void",
          "required": false,
          "description": "Configures onClose for this component."
        },
        {
          "name": "closeLabel",
          "type": "string",
          "required": false,
          "description": "Configures closeLabel for this component."
        }
      ],
      "examples": [
        {
          "title": "Toast example",
          "code": "<ToastStack>\n  <Toast title=\"Saved\" tone=\"success\" onClose={dismiss}>Changes saved.</Toast>\n</ToastStack>",
          "requiredImports": [
            "@tavojs/ui/toast",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Alert",
          "StatusDot"
        ],
        "commonPairings": [
          "Button",
          "Alert",
          "StatusDot"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Uses `role=\"status\"`. Manage focus intentionally for destructive or blocking notifications.",
        "checklist": [
          "Uses `role=\"status\"`. Manage focus intentionally for destructive or blocking notifications."
        ]
      },
      "searchTerms": [
        "notification",
        "toast",
        "temporary feedback"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/toast"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Toast when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Toggle",
      "slug": "toggle",
      "category": "forms",
      "importPath": "@tavojs/ui/toggle",
      "cssImportPath": "@tavojs/ui/css/toggle",
      "description": "Pressed/unpressed button primitive with link support.",
      "status": "stable",
      "summary": "Button with an application-controlled pressed/unpressed state.",
      "whenToUse": "Use Toggle for an action that remains on or off, such as bold formatting, pinning, muting, or showing a layer.",
      "avoidWhen": "Use Checkbox or Switch for form settings, Button for one-time actions, and Tabs for switching content panels.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "pressed",
          "type": "boolean",
          "required": false,
          "description": "Configures pressed for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "variant",
          "type": "\"default\" | \"outline\" | \"ghost\"",
          "required": false,
          "description": "Configures variant for this component."
        },
        {
          "name": "href",
          "type": "string",
          "required": false,
          "description": "Configures href for this component."
        }
      ],
      "examples": [
        {
          "title": "Toggle example",
          "code": "<Toggle pressed>Preview</Toggle>",
          "requiredImports": [
            "@tavojs/ui/toggle"
          ]
        }
      ],
      "composition": {
        "related": [
          "ToggleGroup",
          "Toolbar",
          "Button"
        ],
        "commonPairings": [
          "ToggleGroup",
          "Toolbar",
          "Button"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Emits `aria-pressed`.",
        "checklist": [
          "Emits `aria-pressed`."
        ]
      },
      "searchTerms": [
        "pressed state",
        "toggle button",
        "on off action"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/toggle"
      ],
      "stateOwnership": "Application controlled through pressed and the matching callback.",
      "limitations": [
        "Use Checkbox or Switch for form settings, Button for one-time actions, and Tabs for switching content panels."
      ],
      "preview": {
        "available": true,
        "fixture": "Toggle"
      }
    },
    {
      "name": "ToggleGroup",
      "slug": "toggle-group",
      "category": "forms",
      "importPath": "@tavojs/ui/toggle-group",
      "cssImportPath": "@tavojs/ui/css/toggle-group",
      "description": "Single or multiple selection group built from toggle controls.",
      "status": "stable",
      "summary": "Compact single- or multi-select choice set rendered as connected toggles.",
      "whenToUse": "Use ToggleGroup for choices such as view mode, alignment, density, or active tools when labels are short and options fit on one line.",
      "avoidWhen": "Use Tabs when selection changes a labelled content panel, RadioGroup for conventional form choices, and Select when space is constrained or options are numerous.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "name",
          "type": "string",
          "required": false,
          "description": "Configures name for this component."
        },
        {
          "name": "value",
          "type": "string | string[]",
          "required": false,
          "description": "Configures value for this component."
        },
        {
          "name": "items",
          "type": "{ label: string; value: string; disabled?: boolean }[]",
          "required": true,
          "description": "Configures items for this component."
        },
        {
          "name": "type",
          "type": "\"single\" | \"multiple\"",
          "required": false,
          "description": "Configures type for this component."
        },
        {
          "name": "size",
          "type": "Size",
          "required": false,
          "description": "Configures size for this component."
        },
        {
          "name": "variant",
          "type": "\"default\" | \"outline\" | \"ghost\"",
          "required": false,
          "description": "Configures variant for this component."
        }
      ],
      "examples": [
        {
          "title": "ToggleGroup example",
          "code": "<ToggleGroup\n  name=\"view\"\n  value=\"grid\"\n  items={[{ label: \"List\", value: \"list\" }, { label: \"Grid\", value: \"grid\" }]}\n/>",
          "requiredImports": [
            "@tavojs/ui/toggle-group"
          ]
        }
      ],
      "composition": {
        "related": [
          "Toggle",
          "Toolbar",
          "Tabs"
        ],
        "compoundMembers": [
          "Root",
          "Item"
        ],
        "commonPairings": [
          "Toggle",
          "Toolbar",
          "Tabs"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Form components pass through native attributes and should be paired with visible labels or accessible names.",
        "checklist": [
          "Use Field, FormLabel, FormControlLabel, or aria-label for labeling.",
          "Preserve native input semantics whenever possible.",
          "Expose validation with error text and aria-invalid where relevant."
        ]
      },
      "searchTerms": [
        "toggle group",
        "segmented toggles",
        "multi toggle"
      ],
      "capability": "forms",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/toggle-group"
      ],
      "stateOwnership": "Application controlled through value and the matching callback.",
      "limitations": [
        "Use Tabs when selection changes a labelled content panel, RadioGroup for conventional form choices, and Select when space is constrained or options are numerous."
      ],
      "preview": {
        "available": true,
        "fixture": "ToggleGroup"
      }
    },
    {
      "name": "Toolbar",
      "slug": "toolbar",
      "category": "layout",
      "importPath": "@tavojs/ui/toolbar",
      "cssImportPath": "@tavojs/ui/css/toolbar",
      "description": "Flexible toolbar for control groups and page actions.",
      "status": "stable",
      "summary": "Flexible toolbar for control groups and page actions.",
      "whenToUse": "Use `Toolbar` to align groups of controls",
      "avoidWhen": "Avoid Toolbar when for interactive form state; combine with form, feedback, or data components instead.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "align",
          "type": "ResponsiveValue<\"start\" | \"center\" | \"end\" | \"stretch\">",
          "required": false,
          "description": "Configures align for this component."
        },
        {
          "name": "justify",
          "type": "ResponsiveValue<\"start\" | \"center\" | \"end\" | \"between\">",
          "required": false,
          "description": "Configures justify for this component."
        },
        {
          "name": "gap",
          "type": "ResponsiveValue<\"none\" | \"sm\" | \"md\" | \"lg\">",
          "required": false,
          "description": "Configures gap for this component."
        },
        {
          "name": "wrap",
          "type": "boolean",
          "required": false,
          "description": "Configures wrap for this component."
        }
      ],
      "examples": [
        {
          "title": "Toolbar example",
          "code": "<Toolbar><Inline>...</Inline><Button>Save</Button></Toolbar>",
          "requiredImports": [
            "@tavojs/ui/toolbar",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Icon",
          "ButtonGroup"
        ],
        "commonPairings": [
          "Button",
          "Icon",
          "ButtonGroup"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Layout primitives are semantic-neutral unless a component prop selects an element role.",
        "checklist": [
          "Choose semantic elements such as main, nav, aside, or section when the region has document meaning.",
          "Keep heading order and landmark labels app-owned."
        ]
      },
      "searchTerms": [
        "action toolbar",
        "control row",
        "button row"
      ],
      "capability": "layout",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/toolbar"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Toolbar when for interactive form state; combine with form, feedback, or data components instead."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "Tooltip",
      "slug": "tooltip",
      "category": "feedback",
      "importPath": "@tavojs/ui/tooltip",
      "cssImportPath": "@tavojs/ui/css/tooltip",
      "description": "Inline tooltip wrapper for supplemental labels.",
      "status": "stable",
      "summary": "Inline tooltip wrapper for supplemental labels.",
      "whenToUse": "Use `Tooltip` for short contextual hints",
      "avoidWhen": "Avoid Tooltip when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "content",
          "type": "Child",
          "required": true,
          "description": "Configures content for this component."
        },
        {
          "name": "side",
          "type": "\"top\" | \"right\" | \"bottom\" | \"left\"",
          "required": false,
          "description": "Configures side for this component."
        }
      ],
      "examples": [
        {
          "title": "Tooltip example",
          "code": "<Tooltip content=\"Export report\"><Button>Export</Button></Tooltip>",
          "requiredImports": [
            "@tavojs/ui/tooltip",
            "@tavojs/ui"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Icon",
          "Kbd"
        ],
        "commonPairings": [
          "Button",
          "Icon",
          "Kbd"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Feedback components should announce status changes and manage focus only when the component owns that behavior.",
        "checklist": [
          "Use Dialog, Sheet, or FocusTrap for modal workflows.",
          "Use Toast or native live-region semantics for dynamic announcements.",
          "Make dismiss and escape behavior clear for overlays."
        ]
      },
      "searchTerms": [
        "tooltip",
        "hover label",
        "supplemental label"
      ],
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/tooltip"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid Tooltip when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    },
    {
      "name": "VisuallyHidden",
      "slug": "visually-hidden",
      "category": "feedback",
      "importPath": "@tavojs/ui/visually-hidden",
      "cssImportPath": "@tavojs/ui/css/visually-hidden",
      "description": "Accessible visually hidden content helper.",
      "status": "stable",
      "summary": "Accessible visually hidden content helper.",
      "whenToUse": "Use `VisuallyHidden` for screen-reader-only content",
      "avoidWhen": "Avoid VisuallyHidden when using feedback components as primary page layout.",
      "props": [
        {
          "name": "className",
          "type": "string",
          "required": false,
          "description": "Optional class hook applied to the public root element owned by the component."
        },
        {
          "name": "as",
          "type": "string | Component<Record<string, unknown>>",
          "required": false,
          "description": "Changes the rendered root element or component while preserving Tavo.js UI styling and public props."
        },
        {
          "name": "focusable",
          "type": "boolean",
          "required": false,
          "description": "Configures focusable for this component."
        }
      ],
      "examples": [
        {
          "title": "VisuallyHidden example",
          "code": "<VisuallyHidden>Loading complete</VisuallyHidden>",
          "requiredImports": [
            "@tavojs/ui/visually-hidden"
          ]
        }
      ],
      "composition": {
        "related": [
          "Button",
          "Icon",
          "Tooltip"
        ],
        "commonPairings": [
          "Button",
          "Icon",
          "Tooltip"
        ]
      },
      "accessibilityGuidance": {
        "summary": "Keeps content available to assistive technology while hiding it visually.",
        "checklist": [
          "Keeps content available to assistive technology while hiding it visually."
        ]
      },
      "searchTerms": [
        "screen reader text",
        "hidden label",
        "accessible name"
      ],
      "accessibility": "Keeps content available to assistive technology while hiding it visually.",
      "capability": "feedback",
      "maturity": "stable",
      "requiredImports": [
        "@tavojs/ui/visually-hidden"
      ],
      "stateOwnership": "No component state contract is exposed; the application owns surrounding state and behavior.",
      "limitations": [
        "Avoid VisuallyHidden when using feedback components as primary page layout."
      ],
      "preview": {
        "available": true,
        "fixture": "Generic"
      }
    }
  ],
  "tokens": [
    {
      "name": "backdrop-filter",
      "cssVariable": "--tui-backdrop-filter",
      "group": "effects"
    },
    {
      "name": "blur-surface",
      "cssVariable": "--tui-blur-surface",
      "group": "effects"
    },
    {
      "name": "border-width",
      "cssVariable": "--tui-border-width",
      "group": "border"
    },
    {
      "name": "border-width-strong",
      "cssVariable": "--tui-border-width-strong",
      "group": "border"
    },
    {
      "name": "breakpoint-lg",
      "cssVariable": "--tui-breakpoint-lg",
      "group": "breakpoint"
    },
    {
      "name": "breakpoint-md",
      "cssVariable": "--tui-breakpoint-md",
      "group": "breakpoint"
    },
    {
      "name": "breakpoint-sm",
      "cssVariable": "--tui-breakpoint-sm",
      "group": "breakpoint"
    },
    {
      "name": "color-app-bg",
      "cssVariable": "--tui-color-app-bg",
      "group": "color"
    },
    {
      "name": "color-bg",
      "cssVariable": "--tui-color-bg",
      "group": "color"
    },
    {
      "name": "color-border",
      "cssVariable": "--tui-color-border",
      "group": "color"
    },
    {
      "name": "color-border-strong",
      "cssVariable": "--tui-color-border-strong",
      "group": "color"
    },
    {
      "name": "color-danger",
      "cssVariable": "--tui-color-danger",
      "group": "color"
    },
    {
      "name": "color-danger-surface",
      "cssVariable": "--tui-color-danger-surface",
      "group": "color"
    },
    {
      "name": "color-danger-surface-text",
      "cssVariable": "--tui-color-danger-surface-text",
      "group": "color"
    },
    {
      "name": "color-focus",
      "cssVariable": "--tui-color-focus",
      "group": "color"
    },
    {
      "name": "color-focus-ring",
      "cssVariable": "--tui-color-focus-ring",
      "group": "color"
    },
    {
      "name": "color-header-bg",
      "cssVariable": "--tui-color-header-bg",
      "group": "color"
    },
    {
      "name": "color-header-border",
      "cssVariable": "--tui-color-header-border",
      "group": "color"
    },
    {
      "name": "color-heading",
      "cssVariable": "--tui-color-heading",
      "group": "color"
    },
    {
      "name": "color-info",
      "cssVariable": "--tui-color-info",
      "group": "color"
    },
    {
      "name": "color-link",
      "cssVariable": "--tui-color-link",
      "group": "color"
    },
    {
      "name": "color-neutral-bg",
      "cssVariable": "--tui-color-neutral-bg",
      "group": "color"
    },
    {
      "name": "color-neutral-bg-hover",
      "cssVariable": "--tui-color-neutral-bg-hover",
      "group": "color"
    },
    {
      "name": "color-neutral-text",
      "cssVariable": "--tui-color-neutral-text",
      "group": "color"
    },
    {
      "name": "color-overlay-bg",
      "cssVariable": "--tui-color-overlay-bg",
      "group": "color"
    },
    {
      "name": "color-panel-bg",
      "cssVariable": "--tui-color-panel-bg",
      "group": "color"
    },
    {
      "name": "color-panel-border",
      "cssVariable": "--tui-color-panel-border",
      "group": "color"
    },
    {
      "name": "color-primary-bg",
      "cssVariable": "--tui-color-primary-bg",
      "group": "color"
    },
    {
      "name": "color-primary-bg-hover",
      "cssVariable": "--tui-color-primary-bg-hover",
      "group": "color"
    },
    {
      "name": "color-primary-soft-bg",
      "cssVariable": "--tui-color-primary-soft-bg",
      "group": "color"
    },
    {
      "name": "color-primary-soft-text",
      "cssVariable": "--tui-color-primary-soft-text",
      "group": "color"
    },
    {
      "name": "color-primary-text",
      "cssVariable": "--tui-color-primary-text",
      "group": "color"
    },
    {
      "name": "color-secondary-bg",
      "cssVariable": "--tui-color-secondary-bg",
      "group": "color"
    },
    {
      "name": "color-secondary-bg-hover",
      "cssVariable": "--tui-color-secondary-bg-hover",
      "group": "color"
    },
    {
      "name": "color-secondary-soft-bg",
      "cssVariable": "--tui-color-secondary-soft-bg",
      "group": "color"
    },
    {
      "name": "color-secondary-soft-text",
      "cssVariable": "--tui-color-secondary-soft-text",
      "group": "color"
    },
    {
      "name": "color-secondary-text",
      "cssVariable": "--tui-color-secondary-text",
      "group": "color"
    },
    {
      "name": "color-selection-bg",
      "cssVariable": "--tui-color-selection-bg",
      "group": "color"
    },
    {
      "name": "color-selection-text",
      "cssVariable": "--tui-color-selection-text",
      "group": "color"
    },
    {
      "name": "color-sidebar-bg",
      "cssVariable": "--tui-color-sidebar-bg",
      "group": "color"
    },
    {
      "name": "color-sidebar-border",
      "cssVariable": "--tui-color-sidebar-border",
      "group": "color"
    },
    {
      "name": "color-success",
      "cssVariable": "--tui-color-success",
      "group": "color"
    },
    {
      "name": "color-surface",
      "cssVariable": "--tui-color-surface",
      "group": "color"
    },
    {
      "name": "color-surface-raised",
      "cssVariable": "--tui-color-surface-raised",
      "group": "color"
    },
    {
      "name": "color-surface-subtle",
      "cssVariable": "--tui-color-surface-subtle",
      "group": "color"
    },
    {
      "name": "color-text",
      "cssVariable": "--tui-color-text",
      "group": "color"
    },
    {
      "name": "color-text-muted",
      "cssVariable": "--tui-color-text-muted",
      "group": "color"
    },
    {
      "name": "color-warning",
      "cssVariable": "--tui-color-warning",
      "group": "color"
    },
    {
      "name": "focus-offset",
      "cssVariable": "--tui-focus-offset",
      "group": "focus"
    },
    {
      "name": "focus-width",
      "cssVariable": "--tui-focus-width",
      "group": "focus"
    },
    {
      "name": "font-family",
      "cssVariable": "--tui-font-family",
      "group": "typography"
    },
    {
      "name": "font-family-heading",
      "cssVariable": "--tui-font-family-heading",
      "group": "typography"
    },
    {
      "name": "font-family-text",
      "cssVariable": "--tui-font-family-text",
      "group": "typography"
    },
    {
      "name": "font-size-body",
      "cssVariable": "--tui-font-size-body",
      "group": "typography"
    },
    {
      "name": "font-size-caption",
      "cssVariable": "--tui-font-size-caption",
      "group": "typography"
    },
    {
      "name": "font-size-h1",
      "cssVariable": "--tui-font-size-h1",
      "group": "typography"
    },
    {
      "name": "font-size-h2",
      "cssVariable": "--tui-font-size-h2",
      "group": "typography"
    },
    {
      "name": "font-size-h3",
      "cssVariable": "--tui-font-size-h3",
      "group": "typography"
    },
    {
      "name": "font-size-label",
      "cssVariable": "--tui-font-size-label",
      "group": "typography"
    },
    {
      "name": "glass-chrome-alpha",
      "cssVariable": "--tui-glass-chrome-alpha",
      "group": "effects"
    },
    {
      "name": "interaction-active-scale",
      "cssVariable": "--tui-interaction-active-scale",
      "group": "interaction"
    },
    {
      "name": "interaction-disabled-opacity",
      "cssVariable": "--tui-interaction-disabled-opacity",
      "group": "interaction"
    },
    {
      "name": "interaction-focus-alpha",
      "cssVariable": "--tui-interaction-focus-alpha",
      "group": "interaction"
    },
    {
      "name": "interaction-hover-lift",
      "cssVariable": "--tui-interaction-hover-lift",
      "group": "interaction"
    },
    {
      "name": "interaction-hover-shadow-opacity",
      "cssVariable": "--tui-interaction-hover-shadow-opacity",
      "group": "interaction"
    },
    {
      "name": "interaction-transition-base",
      "cssVariable": "--tui-interaction-transition-base",
      "group": "interaction"
    },
    {
      "name": "interaction-transition-fast",
      "cssVariable": "--tui-interaction-transition-fast",
      "group": "interaction"
    },
    {
      "name": "motion-base",
      "cssVariable": "--tui-motion-base",
      "group": "motion"
    },
    {
      "name": "motion-ease",
      "cssVariable": "--tui-motion-ease",
      "group": "motion"
    },
    {
      "name": "motion-fast",
      "cssVariable": "--tui-motion-fast",
      "group": "motion"
    },
    {
      "name": "motion-slow",
      "cssVariable": "--tui-motion-slow",
      "group": "motion"
    },
    {
      "name": "neutral-100",
      "cssVariable": "--tui-neutral-100",
      "group": "color"
    },
    {
      "name": "neutral-200",
      "cssVariable": "--tui-neutral-200",
      "group": "color"
    },
    {
      "name": "neutral-300",
      "cssVariable": "--tui-neutral-300",
      "group": "color"
    },
    {
      "name": "neutral-400",
      "cssVariable": "--tui-neutral-400",
      "group": "color"
    },
    {
      "name": "neutral-50",
      "cssVariable": "--tui-neutral-50",
      "group": "color"
    },
    {
      "name": "neutral-500",
      "cssVariable": "--tui-neutral-500",
      "group": "color"
    },
    {
      "name": "neutral-600",
      "cssVariable": "--tui-neutral-600",
      "group": "color"
    },
    {
      "name": "neutral-700",
      "cssVariable": "--tui-neutral-700",
      "group": "color"
    },
    {
      "name": "neutral-800",
      "cssVariable": "--tui-neutral-800",
      "group": "color"
    },
    {
      "name": "neutral-900",
      "cssVariable": "--tui-neutral-900",
      "group": "color"
    },
    {
      "name": "neutral-950",
      "cssVariable": "--tui-neutral-950",
      "group": "color"
    },
    {
      "name": "opacity-disabled",
      "cssVariable": "--tui-opacity-disabled",
      "group": "opacity"
    },
    {
      "name": "opacity-muted",
      "cssVariable": "--tui-opacity-muted",
      "group": "opacity"
    },
    {
      "name": "primary-100",
      "cssVariable": "--tui-primary-100",
      "group": "color"
    },
    {
      "name": "primary-200",
      "cssVariable": "--tui-primary-200",
      "group": "color"
    },
    {
      "name": "primary-300",
      "cssVariable": "--tui-primary-300",
      "group": "color"
    },
    {
      "name": "primary-400",
      "cssVariable": "--tui-primary-400",
      "group": "color"
    },
    {
      "name": "primary-50",
      "cssVariable": "--tui-primary-50",
      "group": "color"
    },
    {
      "name": "primary-500",
      "cssVariable": "--tui-primary-500",
      "group": "color"
    },
    {
      "name": "primary-600",
      "cssVariable": "--tui-primary-600",
      "group": "color"
    },
    {
      "name": "primary-700",
      "cssVariable": "--tui-primary-700",
      "group": "color"
    },
    {
      "name": "primary-800",
      "cssVariable": "--tui-primary-800",
      "group": "color"
    },
    {
      "name": "primary-900",
      "cssVariable": "--tui-primary-900",
      "group": "color"
    },
    {
      "name": "primary-950",
      "cssVariable": "--tui-primary-950",
      "group": "color"
    },
    {
      "name": "radius-control",
      "cssVariable": "--tui-radius-control",
      "group": "radius"
    },
    {
      "name": "radius-lg",
      "cssVariable": "--tui-radius-lg",
      "group": "radius"
    },
    {
      "name": "radius-md",
      "cssVariable": "--tui-radius-md",
      "group": "radius"
    },
    {
      "name": "radius-sm",
      "cssVariable": "--tui-radius-sm",
      "group": "radius"
    },
    {
      "name": "radius-surface",
      "cssVariable": "--tui-radius-surface",
      "group": "radius"
    },
    {
      "name": "secondary-100",
      "cssVariable": "--tui-secondary-100",
      "group": "color"
    },
    {
      "name": "secondary-200",
      "cssVariable": "--tui-secondary-200",
      "group": "color"
    },
    {
      "name": "secondary-300",
      "cssVariable": "--tui-secondary-300",
      "group": "color"
    },
    {
      "name": "secondary-400",
      "cssVariable": "--tui-secondary-400",
      "group": "color"
    },
    {
      "name": "secondary-50",
      "cssVariable": "--tui-secondary-50",
      "group": "color"
    },
    {
      "name": "secondary-500",
      "cssVariable": "--tui-secondary-500",
      "group": "color"
    },
    {
      "name": "secondary-600",
      "cssVariable": "--tui-secondary-600",
      "group": "color"
    },
    {
      "name": "secondary-700",
      "cssVariable": "--tui-secondary-700",
      "group": "color"
    },
    {
      "name": "secondary-800",
      "cssVariable": "--tui-secondary-800",
      "group": "color"
    },
    {
      "name": "secondary-900",
      "cssVariable": "--tui-secondary-900",
      "group": "color"
    },
    {
      "name": "secondary-950",
      "cssVariable": "--tui-secondary-950",
      "group": "color"
    },
    {
      "name": "shadow-lg",
      "cssVariable": "--tui-shadow-lg",
      "group": "effects"
    },
    {
      "name": "shadow-md",
      "cssVariable": "--tui-shadow-md",
      "group": "effects"
    },
    {
      "name": "shadow-sm",
      "cssVariable": "--tui-shadow-sm",
      "group": "effects"
    },
    {
      "name": "size-lg",
      "cssVariable": "--tui-size-lg",
      "group": "sizing"
    },
    {
      "name": "size-md",
      "cssVariable": "--tui-size-md",
      "group": "sizing"
    },
    {
      "name": "size-sm",
      "cssVariable": "--tui-size-sm",
      "group": "sizing"
    },
    {
      "name": "size-xl",
      "cssVariable": "--tui-size-xl",
      "group": "sizing"
    },
    {
      "name": "size-xs",
      "cssVariable": "--tui-size-xs",
      "group": "sizing"
    },
    {
      "name": "space-1",
      "cssVariable": "--tui-space-1",
      "group": "spacing"
    },
    {
      "name": "space-2",
      "cssVariable": "--tui-space-2",
      "group": "spacing"
    },
    {
      "name": "space-3",
      "cssVariable": "--tui-space-3",
      "group": "spacing"
    },
    {
      "name": "space-4",
      "cssVariable": "--tui-space-4",
      "group": "spacing"
    },
    {
      "name": "space-5",
      "cssVariable": "--tui-space-5",
      "group": "spacing"
    },
    {
      "name": "space-6",
      "cssVariable": "--tui-space-6",
      "group": "spacing"
    }
  ],
  "commands": {
    "tavo": "tavo CLI v1.0.1\n\nCommands:\n  tavo create app [dir]\n  tavo dev [--ssr] [--host 0.0.0.0|--network]\n  tavo build\n  tavo preview [--ssr] [--host 0.0.0.0|--network]\n  tavo monitor [--url http://127.0.0.1:4174]\n  tavo routes [--json]\n  tavo info [--json]\n  tavo inventory [--json]\n  tavo doctor [--json]\n  tavo doctor --fix-dry-run [--json]\n  tavo check [--json]\n  tavo agent-context --json [--task <task>] [--target <name>] [--detail summary|full]\n  tavo inspect <route|component|store|file|api> <target> --json\n  tavo inspect plugins [--json]\n  tavo change --from-json <file> [--dry-run]\n  tavo change --from-stdin [--dry-run]\n  tavo verify [--no-project-scripts] [--json]\n  tavo verify --smoke --json\n  tavo verify --spec <file> --json\n  tavo generate page <name> [--loader] [--seo] [--typed-route]\n  tavo generate component <name> [--props]\n  tavo generate store <name> [--shape key,count]\n  tavo generate layout <name>\n  tavo generate 404\n  tavo generate error\n  tavo generate action <name>\n  tavo generate --from-json <file>\n  tavo generate --from-stdin\n  tavo generate --validate-spec <file>\n\nFlags:\n  --force                 overwrite generated files when supported\n  --loader                include a typed page loader in page generator output\n  --seo                   include Seo metadata in page generator output\n  --typed-route           wrap a generated page with defineRoutePage(...)\n  --props                 include a typed props example in component generator output\n  --shape <keys>          comma-separated store keys for store generator output\n  --from-json <file>      generate from a JSON spec file\n  --from-stdin            generate from JSON read on stdin\n  --validate-spec <file>  validate a generator spec without writing files\n  --dry-run               print a transactional generation plan without writing files\n  --fix-dry-run           print suggested doctor fixes without editing files\n  --fix                   apply low-risk doctor fixes\n  --spec <file>           include a generator spec in verify output\n  --task <task>           select task-specific agent context\n  --detail <level>        select summary or full agent context\n  --files <list>          verify comma-separated changed files\n  --receipt <file>        verify files listed by a change receipt\n  --smoke                 include lightweight route smoke checks in verify output\n  --no-project-scripts    skip package scripts during restricted verification\n  --package-manager <pm>  scaffold app using npm, pnpm, yarn, or bun\n  --report-json           write .tavo/generated/build-report.json\n  --max-first-load-js <size>  fail build when initial JS exceeds size (for example 150kb)\n  --max-route-js <size>    fail build when route JS exceeds size (for example 40kb)\n  --prerender-styles <mode>  choose inline or external styles for static pages\n  --once                  print one monitor snapshot and exit\n  --json                  print supported command output as JSON\n  --interval <ms>         delay between monitor refreshes\n  --token <token>         send a monitor authorization bearer token\n  --host <ip>             bind dev/preview server to a host, e.g. 0.0.0.0 for LAN access\n  --network               shortcut for --host 0.0.0.0\n  --debug                 show error stack traces\n  --help                  show this message\n  --version               print CLI version",
    "tavoUi": "Usage:\n  tavo-ui web <command> [options]\n  tavo-ui generate [options]\n\nCommands:\n  web generate      Generate the web theme stylesheet.\n  web check         Validate the web theme config.\n  web validate-css  Report unknown Tavo.js UI variables in application CSS.\n  web tokens        Print generated web theme tokens.\n  web init          Create a default web theme config.\n  web preview       Generate a web theme preview.\n  web audit         Print web theme audit results.\n\nInstall:\n  npm install @tavojs/ui              (includes tavo-ui for web)"
  },
  "contentHash": "71f450c246210d6878a335e9ffb349f023bd8931bc88d870a3bbd2a0303de8f2"
}
