{
  "generated": "2026-11-01T21:15:42.657Z",
  "symbols": [
    {
      "package": "zerolith",
      "name": "Applicability",
      "kind": "typeAlias",
      "signature": "type Applicability = \"machine_applicable\" | \"maybe_incorrect\" | \"has_placeholders\" | \"unspecified\"",
      "doc": "How safely a suggestion can be applied without a human reading it,\nfollowing the grades rustc uses for its own suggestions.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 13
    },
    {
      "package": "zerolith",
      "name": "Diagnostic",
      "kind": "interface",
      "signature": "interface Diagnostic",
      "doc": "A diagnostic as emitted by any part of zerolith.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 50,
      "members": [
        {
          "name": "code",
          "signature": "code: string",
          "doc": "Stable snake_case identifier, for example `signal_written_inside_computed`. Codes are public API; message text is not."
        },
        {
          "name": "severity",
          "signature": "severity: DiagnosticSeverity",
          "doc": "The diagnostic's weight; the runtime throws an `error` as a `ZerolithError` and passes every other severity to the `onDiagnostic` listeners."
        },
        {
          "name": "cause",
          "signature": "cause: string",
          "doc": "One sentence naming what happened. Empty in production builds."
        },
        {
          "name": "fix",
          "signature": "fix: string",
          "doc": "One sentence naming what to do about it. Empty in production builds."
        },
        {
          "name": "url",
          "signature": "url: string",
          "doc": "Documentation page for the code, with the arguments encoded in the query string."
        },
        {
          "name": "location",
          "signature": "location?: DiagnosticLocation",
          "doc": "Where the diagnostic points, when the emitter knows: a position in the source or a node in the page."
        },
        {
          "name": "suggestion",
          "signature": "suggestion?: DiagnosticSuggestion",
          "doc": "A change that would resolve the diagnostic, when the emitter can name one."
        },
        {
          "name": "args",
          "signature": "args?: DiagnosticArgs",
          "doc": "The values the diagnostic is about, such as the name of a refused attribute, kept apart so a tool can word its own text; `url` carries them in its query string."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "DiagnosticArgs",
      "kind": "typeAlias",
      "signature": "type DiagnosticArgs = Readonly<Record<string, string | number | boolean>>",
      "doc": "Values interpolated into a diagnostic's text, kept separately so tools can render their own.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 47
    },
    {
      "package": "zerolith",
      "name": "DiagnosticCode",
      "kind": "typeAlias",
      "signature": "type DiagnosticCode = \"signal_written_inside_computed\" | \"computed_cycle\" | \"effect_cycle\" | \"effect_loop\" | \"on_dispose_outside_scope\" | \"binding_in_tag_position\" | \"binding_in_comment\" | \"binding_in_raw_text\" | \"binding_not_single\" | \"script_in_template\" | \"template_unclosed_tag\" | \"unsafe_property_binding\" | \"unsafe_attribute_binding\" | \"unsafe_url_blocked\" | \"unrenderable_value\" | \"each_items_function\" | \"event_handler_not_function\" | \"when_condition_function\" | \"mount_component_uncalled\" | \"each_key_undefined\" | \"each_key_duplicate\" | \"css_value_not_allowed\" | \"ref_not_assignable\" | \"hydration_mismatch\" | \"jsx_not_lowered\" | \"template_frozen_read\" | \"image_without_alt\" | \"button_without_name\" | \"frame_without_title\" | \"mount_target_missing\" | \"template_not_prepared\" | \"lazy_module_not_split\" | \"package_version_mismatch\"",
      "doc": "The codes the runtime can emit. Every code has exactly one catalog entry.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 83
    },
    {
      "package": "zerolith",
      "name": "DiagnosticListener",
      "kind": "typeAlias",
      "signature": "type DiagnosticListener = (diagnostic: Diagnostic) => void",
      "doc": "Receives every non-throwing diagnostic the runtime reports.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 169
    },
    {
      "package": "zerolith",
      "name": "DiagnosticLocation",
      "kind": "interface",
      "signature": "interface DiagnosticLocation",
      "doc": "Where a diagnostic points. Source positions are 1-based; `selector` locates a DOM node at runtime.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 23,
      "members": [
        {
          "name": "file",
          "signature": "file?: string",
          "doc": "The source file the diagnostic points into."
        },
        {
          "name": "line",
          "signature": "line?: number",
          "doc": "The 1-based line within `file`."
        },
        {
          "name": "column",
          "signature": "column?: number",
          "doc": "The 1-based column within `line`."
        },
        {
          "name": "selector",
          "signature": "selector?: string",
          "doc": "A CSS selector that finds the node in the page the diagnostic is about, for a diagnostic raised at runtime."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "DiagnosticSeverity",
      "kind": "typeAlias",
      "signature": "type DiagnosticSeverity = \"error\" | \"warning\" | \"deprecation\" | \"info\"",
      "doc": "The weight of a diagnostic. Deprecations are their own class so tooling can count them separately.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 20
    },
    {
      "package": "zerolith",
      "name": "DiagnosticSuggestion",
      "kind": "interface",
      "signature": "interface DiagnosticSuggestion",
      "doc": "A concrete change that would resolve the diagnostic.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 36,
      "members": [
        {
          "name": "description",
          "signature": "description: string",
          "doc": "One sentence describing the change."
        },
        {
          "name": "replacement",
          "signature": "replacement?: string",
          "doc": "The replacement source text, when the change is textual."
        },
        {
          "name": "applicability",
          "signature": "applicability: Applicability",
          "doc": "Whether a tool may make the change unreviewed: `machine_applicable` says it may, while `maybe_incorrect` and `has_placeholders` need a person to check or complete it."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "DiagnosticText",
      "kind": "interface",
      "signature": "interface DiagnosticText",
      "doc": "The text of one catalog entry.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 71,
      "members": [
        {
          "name": "cause",
          "signature": "cause: string",
          "doc": "One sentence naming what happened, used as the diagnostic's `cause` and on the code's documentation page."
        },
        {
          "name": "fix",
          "signature": "fix: string",
          "doc": "One sentence naming what to do about it, used as the diagnostic's `fix` and on the code's documentation page."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "DIAGNOSTIC_URL",
      "kind": "variable",
      "signature": "const DIAGNOSTIC_URL: string",
      "doc": "Base of every diagnostic URL; the code is appended as the path.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 80
    },
    {
      "package": "zerolith",
      "name": "ZerolithError",
      "kind": "class",
      "signature": "class ZerolithError extends Error",
      "doc": "An error thrown by zerolith. The diagnostic carries the machine-readable detail.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 145,
      "members": [
        {
          "name": "constructor",
          "signature": "constructor(record: Diagnostic)",
          "doc": "Builds the message from the record's code, cause, fix, and URL, leaving out a cause or fix that is empty, as both are in production builds."
        },
        {
          "name": "diagnostic",
          "signature": "readonly diagnostic: Diagnostic",
          "doc": "The record the error was built from, for tools that read its code and arguments as data instead of parsing the message."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "onDiagnostic",
      "kind": "function",
      "signature": "function onDiagnostic(listener: DiagnosticListener): () => void",
      "doc": "Subscribes to warnings, deprecations, and info diagnostics. Returns an unsubscribe function.",
      "file": "packages/zerolith/src/diagnostics.ts",
      "line": 174
    },
    {
      "package": "zerolith",
      "name": "diagnosticCatalog",
      "kind": "variable",
      "signature": "const diagnosticCatalog: Readonly<Partial<Record<DiagnosticCode, DiagnosticText>>>",
      "doc": "The message text for every diagnostic code. The documentation pages for\nthe codes are generated from this table, so an entry here is the single\nsource of truth for both the message and the docs. Production builds\nship an empty catalog, so look entries up with `?.`.",
      "file": "packages/zerolith/src/catalog.ts",
      "line": 10
    },
    {
      "package": "zerolith",
      "name": "EffectFunction",
      "kind": "typeAlias",
      "signature": "type EffectFunction = () => void | (() => void)",
      "doc": "The function run by `effect()`; it may return a cleanup function.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 54
    },
    {
      "package": "zerolith",
      "name": "Equals",
      "kind": "typeAlias",
      "signature": "type Equals<T> = (previous: T, next: T) => boolean",
      "doc": "Decides whether a new value counts as a change.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 28
    },
    {
      "package": "zerolith",
      "name": "ReadableSignal",
      "kind": "interface",
      "signature": "interface ReadableSignal<T>",
      "doc": "A value that can be read and tracked.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 40,
      "members": [
        {
          "name": "get",
          "signature": "get(): T",
          "doc": "Returns the current value and subscribes the running computed value or effect to it."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "Scope",
      "kind": "interface",
      "signature": "interface Scope<T>",
      "doc": "The result of `scope()`.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 57,
      "members": [
        {
          "name": "value",
          "signature": "readonly value: T",
          "doc": "The value the scope function returned."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Disposes every effect and nested scope created inside, in reverse order of creation."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "Signal",
      "kind": "interface",
      "signature": "interface Signal<T> extends ReadableSignal<T>",
      "doc": "A value that can be read, tracked, and written.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 47,
      "members": [
        {
          "name": "set",
          "signature": "set(value: T): void",
          "doc": "Stores a new value and queues the effects that depend on it. Writes are not allowed inside computed functions."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "SignalOptions",
      "kind": "interface",
      "signature": "interface SignalOptions<T>",
      "doc": "Options accepted by `signal()` and `computed()`.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 31,
      "members": [
        {
          "name": "equals",
          "signature": "equals?: Equals<T>",
          "doc": "Defaults to `Object.is`."
        },
        {
          "name": "name",
          "signature": "name?: string",
          "doc": "A label for the dev tools; `zerolith dev` and the Vite plugin also keep a named signal's value across an edit."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "batch",
      "kind": "function",
      "signature": "function batch<T>(fn: () => T): T",
      "doc": "Applies several writes and runs the affected effects once, after `fn` returns.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 850
    },
    {
      "package": "zerolith",
      "name": "computed",
      "kind": "function",
      "signature": "function computed<T>(fn: () => T, options?: SignalOptions<T>): ReadableSignal<T>",
      "doc": "Creates a lazily evaluated, memoized value derived from other signals. The function must not write signals.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 805
    },
    {
      "package": "zerolith",
      "name": "effect",
      "kind": "function",
      "signature": "function effect(fn: EffectFunction): () => void",
      "doc": "Runs `fn` now and again whenever a signal it read changes. A returned\nfunction is called before the next run and on dispose. Returns the\ndispose function; the effect is also disposed with its enclosing effect\nor scope.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 818
    },
    {
      "package": "zerolith",
      "name": "onDispose",
      "kind": "function",
      "signature": "function onDispose(fn: () => void): void",
      "doc": "Registers `fn` to run when the enclosing effect re-runs or is disposed, or when the enclosing scope is disposed.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 963
    },
    {
      "package": "zerolith",
      "name": "scope",
      "kind": "function",
      "signature": "function scope<T>(fn: () => T): Scope<T>",
      "doc": "Runs `fn` untracked as the owner of every effect and scope created inside\nit, so they can be disposed together.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 940
    },
    {
      "package": "zerolith",
      "name": "signal",
      "kind": "function",
      "signature": "function signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>",
      "doc": "Creates a writable signal.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 780
    },
    {
      "package": "zerolith",
      "name": "untracked",
      "kind": "function",
      "signature": "function untracked<T>(fn: () => T): T",
      "doc": "Runs `fn` without subscribing the running computed value or effect to the signals it reads.",
      "file": "packages/zerolith/src/signals.ts",
      "line": 868
    },
    {
      "package": "zerolith",
      "name": "LoaderContext",
      "kind": "interface",
      "signature": "interface LoaderContext<P>",
      "doc": "What the loader receives.",
      "file": "packages/zerolith/src/resource.ts",
      "line": 11,
      "members": [
        {
          "name": "params",
          "signature": "params: P",
          "doc": "The value `params` returned; never undefined, because undefined skips loading."
        },
        {
          "name": "abort",
          "signature": "abort: AbortSignal",
          "doc": "Aborted when the params change, on reload, and when the owning scope is disposed."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "Resource",
      "kind": "interface",
      "signature": "interface Resource<T> extends ReadableSignal<T | undefined>",
      "doc": "An async value and its request state.",
      "file": "packages/zerolith/src/resource.ts",
      "line": 29,
      "members": [
        {
          "name": "status",
          "signature": "readonly status: ReadableSignal<ResourceStatus>",
          "doc": "The latest request's state: `idle` while `params` returns `undefined`, `pending` while the loader runs, then `resolved` or `error`."
        },
        {
          "name": "pending",
          "signature": "readonly pending: ReadableSignal<boolean>",
          "doc": "True while a request is in flight."
        },
        {
          "name": "error",
          "signature": "readonly error: ReadableSignal<unknown>",
          "doc": "The rejection of the latest request, or undefined."
        },
        {
          "name": "get",
          "signature": "get(): T | undefined",
          "doc": "The last resolved value; kept while a newer request is pending."
        },
        {
          "name": "reload",
          "signature": "reload(): void",
          "doc": "Runs the loader again with the current params."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "ResourceOptions",
      "kind": "interface",
      "signature": "interface ResourceOptions<P, T>",
      "doc": "What `resource()` takes: a tracked params function and an untracked loader.",
      "file": "packages/zerolith/src/resource.ts",
      "line": 20,
      "members": [
        {
          "name": "params",
          "signature": "params: () => P | undefined",
          "doc": "Tracked: the signals it reads decide when the loader re-runs. Returning undefined puts the resource in the idle state."
        },
        {
          "name": "loader",
          "signature": "loader: (context: LoaderContext<P>) => Promise<T>",
          "doc": "Untracked: fetches the value for the given params."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "ResourceStatus",
      "kind": "typeAlias",
      "signature": "type ResourceStatus = \"idle\" | \"pending\" | \"resolved\" | \"error\"",
      "doc": "The lifecycle of a resource's current request.",
      "file": "packages/zerolith/src/resource.ts",
      "line": 8
    },
    {
      "package": "zerolith",
      "name": "resource",
      "kind": "function",
      "signature": "function resource<P, T>(options: ResourceOptions<P, T>): Resource<T>",
      "doc": "Creates a resource owned by the current effect or scope. The resource is\na read-only signal of its value, so it binds in a template and drives\n`when` and `each` like any other signal, with its request state beside it.",
      "file": "packages/zerolith/src/resource.ts",
      "line": 48
    },
    {
      "package": "zerolith",
      "name": "HydrateResult",
      "kind": "interface",
      "signature": "interface HydrateResult extends Root",
      "doc": "The handle returned by `hydrate()`.",
      "file": "packages/zerolith/src/render.ts",
      "line": 47,
      "members": [
        {
          "name": "mismatches",
          "signature": "readonly mismatches: readonly HydrationMismatch[]",
          "doc": "Every disagreement found; each one was repaired by rendering on the client."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "HydrationMismatch",
      "kind": "interface",
      "signature": "interface HydrationMismatch",
      "doc": "One place where the server-rendered markup and the view disagreed.",
      "file": "packages/zerolith/src/render.ts",
      "line": 36,
      "members": [
        {
          "name": "kind",
          "signature": "kind: \"text\" | \"missing\" | \"extra\" | \"structure\" | \"root\"",
          "doc": "`text`: a text node differed; `missing`: expected nodes were absent; `extra`: unexpected nodes were present; `structure`: a template's nodes did not line up; `root`: no server-rendered part was found."
        },
        {
          "name": "expected",
          "signature": "expected?: string",
          "doc": "What was expected, when known."
        },
        {
          "name": "found",
          "signature": "found?: string",
          "doc": "What was found, when known."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "KeyOf",
      "kind": "typeAlias",
      "signature": "type KeyOf<T> = (item: T, index: number) => string | number | bigint | boolean | symbol | object",
      "doc": "The key function for `each()`.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1173
    },
    {
      "package": "zerolith",
      "name": "MountTarget",
      "kind": "typeAlias",
      "signature": "type MountTarget = Element | DocumentFragment | string",
      "doc": "Where a view mounts: an element or fragment, or a CSS selector for one element in the document.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1013
    },
    {
      "package": "zerolith",
      "name": "Root",
      "kind": "interface",
      "signature": "interface Root",
      "doc": "The handle returned by `render()`.",
      "file": "packages/zerolith/src/render.ts",
      "line": 27,
      "members": [
        {
          "name": "container",
          "signature": "readonly container: Element | DocumentFragment",
          "doc": "The element or fragment the view was rendered into."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Removes everything rendered and disposes every effect it created."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "RowOf",
      "kind": "typeAlias",
      "signature": "type RowOf<T> = (item: ReadableSignal<T>, index: ReadableSignal<number>) => unknown",
      "doc": "The row renderer for `each()`. The item is a signal that updates in place; the index is a signal too, created only when the function declares a second parameter.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1176
    },
    {
      "package": "zerolith",
      "name": "View",
      "kind": "interface",
      "signature": "interface View",
      "doc": "A description of UI produced by `html`, `each`, or `when`, or by a component function.",
      "file": "packages/zerolith/src/render.ts",
      "line": 20,
      "members": [
        {
          "name": "VIEW",
          "signature": "readonly VIEW: true",
          "doc": "The brand, always `true`. The package does not export its symbol key, so a `View` comes only from `html`, `each`, `when`, or `unsafeHtml`, never from an object literal."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "each",
      "kind": "function",
      "signature": "function each<T>(items: ReadableSignal<readonly T[]> | readonly T[], key: KeyOf<T>, row: RowOf<T>): View",
      "doc": "Renders one row per item, keyed, updating rows in place when their key\nsurvives and moving the fewest nodes when the order changes. The row\nfunction receives the item as a signal and, when it declares a second\nparameter, the position as a signal.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1670
    },
    {
      "package": "zerolith",
      "name": "html",
      "kind": "function",
      "signature": "function html(strings: TemplateStringsArray, ...values: unknown[]): View",
      "doc": "Describes markup with live bindings. Values are bound as content or inside attribute values.",
      "file": "packages/zerolith/src/render.ts",
      "line": 157
    },
    {
      "package": "zerolith",
      "name": "hydrate",
      "kind": "function",
      "signature": "function hydrate(view: unknown, target: MountTarget): HydrateResult",
      "doc": "Attaches a view to markup the server rendered into `target`, an element\nor a selector for one, with `renderToString`, reusing the nodes and\nbinding signals, listeners, properties, and refs. Any disagreement is\nrepaired on the client and returned in `mismatches`. Without\nserver-rendered markup it falls back to `render`. As with `render`, a\nfunction that returns the view is called inside the root's owner.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1103
    },
    {
      "package": "zerolith",
      "name": "render",
      "kind": "function",
      "signature": "function render(view: unknown, target: MountTarget): Root",
      "doc": "Renders a view at the end of `target`, an element or a selector for one,\nand returns a handle to dispose it. Given a function that returns the\nview, as in `render(() => App(), \"#app\")`, it calls the function inside\nthe root's owner, so effects and `onDispose` cleanups the component\nregisters belong to the root and end with `dispose()`.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1059
    },
    {
      "package": "zerolith",
      "name": "unsafeHtml",
      "kind": "function",
      "signature": "function unsafeHtml(markup: string): View",
      "doc": "Marks a string as markup to insert without escaping. This is the one way\nto put HTML you already trust into a view, for example content rendered\nfrom Markdown you wrote. Never pass user input.",
      "file": "packages/zerolith/src/render.ts",
      "line": 121
    },
    {
      "package": "zerolith",
      "name": "when",
      "kind": "function",
      "signature": "function when(condition: unknown, then: () => unknown, otherwise?: () => unknown): View",
      "doc": "Renders `then()` while the condition is truthy and `otherwise()` while\nit is not. The condition is a signal, such as a computed value, or a\nplain value; a function fails with `when_condition_function`, since it\nwould always count as true. Branches are created lazily and disposed\nwhen hidden.",
      "file": "packages/zerolith/src/render.ts",
      "line": 1775
    },
    {
      "package": "zerolith",
      "name": "Styles",
      "kind": "interface",
      "signature": "interface Styles",
      "doc": "A stylesheet produced by `css`. Bind it to a root element's class attribute.",
      "file": "packages/zerolith/src/css.ts",
      "line": 15,
      "members": [
        {
          "name": "scope",
          "signature": "readonly scope: string",
          "doc": "The generated class that selects this component's roots."
        },
        {
          "name": "text",
          "signature": "readonly text: string",
          "doc": "The full stylesheet text including the @scope wrapper, for server rendering."
        },
        {
          "name": "toString",
          "signature": "toString(): string",
          "doc": "The class names to put on a root element: the shared marker plus `scope`."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "css",
      "kind": "function",
      "signature": "function css(strings: TemplateStringsArray, ...values: ReadonlyArray<number | Styles>): Styles",
      "doc": "Declares scoped component styles. Values may be numbers or other `css`\nresults; strings are rejected so untrusted text can never become CSS.",
      "file": "packages/zerolith/src/css.ts",
      "line": 100
    },
    {
      "package": "zerolith",
      "name": "FieldErrors",
      "kind": "typeAlias",
      "signature": "type FieldErrors = Readonly<Record<string, readonly string[]>>",
      "doc": "Messages per field name, the `fields` extension member of a problem.",
      "file": "packages/zerolith/src/problem.ts",
      "line": 9
    },
    {
      "package": "zerolith",
      "name": "Problem",
      "kind": "interface",
      "signature": "interface Problem",
      "doc": "An RFC 9457 problem details document with the `fields` extension.",
      "file": "packages/zerolith/src/problem.ts",
      "line": 12,
      "members": [
        {
          "name": "type",
          "signature": "type?: string",
          "doc": "A URI identifying the problem type; `about:blank` when the status says it all."
        },
        {
          "name": "title",
          "signature": "title?: string",
          "doc": "A short human-readable summary."
        },
        {
          "name": "status",
          "signature": "status?: number",
          "doc": "The HTTP status code."
        },
        {
          "name": "detail",
          "signature": "detail?: string",
          "doc": "A human-readable explanation specific to this occurrence."
        },
        {
          "name": "instance",
          "signature": "instance?: string",
          "doc": "A URI identifying this occurrence."
        },
        {
          "name": "fields",
          "signature": "fields?: FieldErrors",
          "doc": "Validation messages per field name."
        }
      ]
    },
    {
      "package": "zerolith",
      "name": "PROBLEM_MEDIA_TYPE",
      "kind": "variable",
      "signature": "const PROBLEM_MEDIA_TYPE: string",
      "doc": "The media type of a problem details document.",
      "file": "packages/zerolith/src/problem.ts",
      "line": 29
    },
    {
      "package": "zerolith",
      "name": "isProblem",
      "kind": "function",
      "signature": "function isProblem(value: unknown): value is Problem",
      "doc": "True for an object that carries at least one problem details member with the right type.",
      "file": "packages/zerolith/src/problem.ts",
      "line": 32
    },
    {
      "package": "zerolith/ssr",
      "name": "escapeText",
      "kind": "function",
      "signature": "function escapeText(text: string): string",
      "doc": "Escapes text content.",
      "file": "packages/zerolith/src/ssr.ts",
      "line": 20
    },
    {
      "package": "zerolith/ssr",
      "name": "escapeAttribute",
      "kind": "function",
      "signature": "function escapeAttribute(text: string): string",
      "doc": "Escapes an attribute value for double quotes.",
      "file": "packages/zerolith/src/ssr.ts",
      "line": 26
    },
    {
      "package": "zerolith/ssr",
      "name": "renderToString",
      "kind": "function",
      "signature": "function renderToString(view: unknown): string",
      "doc": "Renders a view to HTML, with the markers `hydrate()` needs. Effects\ncreated while rendering (inside `each` rows, `when` branches, and\ncomputed values) are disposed before it returns. A component called\nbefore `renderToString` runs outside that scope, exactly as in the\nbrowser, and owns its own effects; given a function that returns the\nview, as in `renderToString(() => App())`, the component runs inside\nthe scope, so its effects and cleanups end with the render.",
      "file": "packages/zerolith/src/ssr.ts",
      "line": 145
    },
    {
      "package": "zerolith/ssr",
      "name": "renderStyles",
      "kind": "function",
      "signature": "function renderStyles(): string",
      "doc": "A `<style>` element per `css` literal created so far, for the document head.",
      "file": "packages/zerolith/src/ssr.ts",
      "line": 153
    },
    {
      "package": "zerolith/element",
      "name": "ElementProps",
      "kind": "typeAlias",
      "signature": "type ElementProps<Props extends readonly string[]> = { readonly [K in Props[number]]: ReadableSignal<unknown> }",
      "doc": "The signals an element's view receives, one per declared prop.",
      "file": "packages/zerolith/src/element.ts",
      "line": 11
    },
    {
      "package": "zerolith/element",
      "name": "ElementOptions",
      "kind": "interface",
      "signature": "interface ElementOptions<Props extends readonly string[]>",
      "doc": "Options for `define`.",
      "file": "packages/zerolith/src/element.ts",
      "line": 14,
      "members": [
        {
          "name": "props",
          "signature": "props: Props",
          "doc": "The attribute and property names the element exposes. An attribute arrives as a string or undefined; a property keeps its value."
        },
        {
          "name": "view",
          "signature": "view: (props: ElementProps<Props>, host: HTMLElement) => unknown",
          "doc": "Renders the element's content from the prop signals; `host` is the element, for events and measurements."
        }
      ]
    },
    {
      "package": "zerolith/element",
      "name": "define",
      "kind": "function",
      "signature": "function define<Props extends readonly string[]>(name: string, options: ElementOptions<Props>): void",
      "doc": "Registers a custom element for the view. Declared props are observed as\nattributes and exposed as properties, both feeding the same signals, and\nvalues assigned before the element was upgraded are kept. The content is\nrendered when the element connects, hydrated when it already holds\nserver-rendered markup, and disposed when it disconnects. The view runs\ninside the root's owner, so the effects and `onDispose` cleanups it\nregisters end when the element disconnects. Without a\n`customElements` registry, as on the server, nothing is registered.\nDefining a name twice is a no-op, so modules can re-run under hot\nreplacement.",
      "file": "packages/zerolith/src/element.ts",
      "line": 51
    },
    {
      "package": "zerolith/internal",
      "name": "PartSpec",
      "kind": "interface",
      "signature": "interface PartSpec",
      "doc": "Where and how one or more expressions bind into the template.",
      "file": "packages/zerolith/src/parts.ts",
      "line": 18,
      "members": [
        {
          "name": "kind",
          "signature": "kind: number",
          "doc": "How the part binds: `CHILD` for content; for an attribute, `BOOLEAN`, `PROPERTY`, or `EVENT` after a `?`, `.`, or `@` prefix, `REF` for `ref`, and `ATTRIBUTE` otherwise."
        },
        {
          "name": "index",
          "signature": "index: number",
          "doc": "Position of the bound node in a tree walk of the template content."
        },
        {
          "name": "name",
          "signature": "name: string",
          "doc": "Attribute, property, or event name as written in the source."
        },
        {
          "name": "strings",
          "signature": "strings: readonly string[]",
          "doc": "Static text around the expressions of an attribute value; always one longer than `count`."
        },
        {
          "name": "count",
          "signature": "count: number",
          "doc": "Number of expressions the part consumes."
        }
      ]
    },
    {
      "package": "zerolith/internal",
      "name": "PreparedPart",
      "kind": "typeAlias",
      "signature": "type PreparedPart = readonly [number, string, readonly string[]]",
      "doc": "A part as a build tool emits it: the kind, the name, and the static strings; `count` and `index` follow from them.",
      "file": "packages/zerolith/src/parts.ts",
      "line": 42
    },
    {
      "package": "zerolith/internal",
      "name": "Scanned",
      "kind": "interface",
      "signature": "interface Scanned",
      "doc": "The scanner's output: markup with markers, and the parts in source order.",
      "file": "packages/zerolith/src/parts.ts",
      "line": 33,
      "members": [
        {
          "name": "markup",
          "signature": "markup: string",
          "doc": "The static strings as one markup string, with each bound attribute replaced by an attribute named `zl$N`, N being its index in `parts`, and each child expression by a `<!--zl$-->` comment."
        },
        {
          "name": "parts",
          "signature": "parts: PartSpec[]",
          "doc": "One part per child expression and per bound attribute, in source order; `index` is -1 here, and `prepare` sets it on its own copies."
        }
      ]
    },
    {
      "package": "zerolith/internal",
      "name": "prepared",
      "kind": "function",
      "signature": "function prepared(strings: readonly string[], markup: string, parts: readonly PreparedPart[]): TemplateStringsArray",
      "doc": "Registers the scan a build tool made of a template's strings, so the\nruntime binds the template without scanning it, and returns the strings\nfor use as the tag's first argument:\n`html(prepared(strings, markup, parts), ...values)`. The prepare pass in\n`@zerolith/vite` emits these calls from what `scan` produced.",
      "file": "packages/zerolith/src/template.ts",
      "line": 72
    },
    {
      "package": "zerolith/internal",
      "name": "scan",
      "kind": "function",
      "signature": "function scan(strings: readonly string[]): Scanned",
      "doc": "Scans the static strings of a template literal. Pure; usable without a DOM.",
      "file": "packages/zerolith/src/scan.ts",
      "line": 80
    },
    {
      "package": "zerolith/internal",
      "name": "SCOPE_MARKER",
      "kind": "variable",
      "signature": "const SCOPE_MARKER: string",
      "doc": "The class every scoped root carries, used as the lower bound of enclosing scopes.",
      "file": "packages/zerolith/src/css.ts",
      "line": 12
    },
    {
      "package": "zerolith/internal",
      "name": "styleFile",
      "kind": "function",
      "signature": "function styleFile(path: string, rules: string): Styles",
      "doc": "The styles of a stylesheet file imported with `?scoped`, as in\n`import card from \"./card.css?scoped\"`. The dev server, the build, and\nthe Vite plugin turn that import into a call to this function with the\nfile's path in the project and its rules, which are scoped as a `css`\nliteral's are. The scope class holds the file's name and a hash of its\npath rather than of its text, so the server and the browser agree on it\nhowever each processed the file, and a second call for the same path,\nmade when the file changed in development, replaces the rules of the\nstylesheet the document adopted while every element keeps its class.\nA constructable stylesheet resolves references against the page, so the\ntools hand over rules whose references are already URLs the page can use.",
      "file": "packages/zerolith/src/css.ts",
      "line": 143
    },
    {
      "package": "zerolith/internal",
      "name": "DevtoolsEvent",
      "kind": "typeAlias",
      "signature": "type DevtoolsEvent = { type: \"node\"; id: number } | { type: \"root\"; id: number; removed: boolean } | { type: \"diagnostic\"; diagnostic: Diagnostic } | { type: \"flush\"; effects: number }",
      "doc": "Something the hook announces to subscribers.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 35
    },
    {
      "package": "zerolith/internal",
      "name": "DevtoolsHook",
      "kind": "interface",
      "signature": "interface DevtoolsHook",
      "doc": "The object published as `globalThis.__ZEROLITH_DEVTOOLS__` in development builds.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 42,
      "members": [
        {
          "name": "version",
          "signature": "readonly version: number",
          "doc": "The version of the hook's shape, which a tool reading the hook can check before it relies on the other members."
        },
        {
          "name": "nodes",
          "signature": "nodes(): NodeSnapshot[]",
          "doc": "Live reactive nodes, oldest first."
        },
        {
          "name": "roots",
          "signature": "roots(): RootSnapshot[]",
          "doc": "Mounted roots."
        },
        {
          "name": "diagnostics",
          "signature": "diagnostics(): Diagnostic[]",
          "doc": "The most recent diagnostics, oldest first."
        },
        {
          "name": "subscribe",
          "signature": "subscribe(listener: (event: DevtoolsEvent) => void): () => void",
          "doc": "Subscribes to changes; returns an unsubscribe function."
        }
      ]
    },
    {
      "package": "zerolith/internal",
      "name": "NodeSnapshot",
      "kind": "interface",
      "signature": "interface NodeSnapshot",
      "doc": "What a reactive node looks like to an inspector.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 5,
      "members": [
        {
          "name": "id",
          "signature": "id: number",
          "doc": "Unique across nodes and roots, assigned when the node is created; a `node` event names the node by this number."
        },
        {
          "name": "kind",
          "signature": "kind: \"state\" | \"computed\" | \"effect\"",
          "doc": "`state` for a `signal`, `computed` for a `computed` value, and `effect` for an effect, including those the renderer starts for its bindings."
        },
        {
          "name": "name",
          "signature": "name: string | undefined",
          "doc": "The signal's or computed value's `name` option, or else the name of the computed's or effect's function; `undefined` when there is neither. A named state node keeps its value across an edit in development."
        },
        {
          "name": "value",
          "signature": "value?: unknown",
          "doc": "The current value for state and computed nodes; absent for effects and when reading threw."
        },
        {
          "name": "observers",
          "signature": "observers: number",
          "doc": "How many nodes currently depend on this one."
        },
        {
          "name": "internal",
          "signature": "internal: boolean",
          "doc": "Created while the inspector itself was rendering."
        }
      ]
    },
    {
      "package": "zerolith/internal",
      "name": "RootSnapshot",
      "kind": "interface",
      "signature": "interface RootSnapshot",
      "doc": "A mounted root as the inspector sees it.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 22,
      "members": [
        {
          "name": "id",
          "signature": "id: number",
          "doc": "Unique across roots and nodes, assigned at mount; a `root` event names the root by this number."
        },
        {
          "name": "kind",
          "signature": "kind: \"render\" | \"hydrate\"",
          "doc": "The call that mounted the root: `render` or `hydrate`, the latter also when hydration found no server markup and rendered instead."
        },
        {
          "name": "container",
          "signature": "container: Node",
          "doc": "The element or fragment the root was mounted into, with a selector target already resolved to its element."
        },
        {
          "name": "internal",
          "signature": "internal: boolean",
          "doc": "Mounted while the inspector itself was rendering, as its own dock is; no subscriber hears of such a root, and the Roots tab leaves it out."
        }
      ]
    },
    {
      "package": "zerolith/internal",
      "name": "devtoolsInternal",
      "kind": "function",
      "signature": "function devtoolsInternal<T>(fn: () => T): T",
      "doc": "Runs `fn` with everything it creates marked as belonging to the inspector, including what the effects and owners it creates make when they run later.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 292
    },
    {
      "package": "zerolith/internal",
      "name": "devtoolsSaveRestore",
      "kind": "function",
      "signature": "function devtoolsSaveRestore(state: Record<string, unknown>): void",
      "doc": "Queues values for named state signals created from now on, each taken\nonce. The dev server's client writes them to sessionStorage before a\nreload; the Vite plugin's runtime calls this between a module's disposal\nand the re-render that follows. An empty record drops what is left.",
      "file": "packages/zerolith/src/devtools.ts",
      "line": 217
    },
    {
      "package": "zerolith/internal",
      "name": "version",
      "kind": "variable",
      "signature": "const version: string",
      "doc": "The version of this zerolith, which the packages released with it compare with their own.",
      "file": "packages/zerolith/src/version.ts",
      "line": 1
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "ElementAttributes",
      "kind": "typeAlias",
      "signature": "type ElementAttributes = { readonly children?: unknown; readonly ref?: unknown; readonly [attribute: string]: unknown; readonly [property: `prop:${string}`]: unknown; readonly [event: `on:${string}`]: unknown; readonly [flag: `bool:${string}`]: unknown }",
      "doc": "Attribute names an element accepts: plain attributes, and the `prop:`, `on:`, `bool:`, and `attr:` namespaces that select the other binding forms.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 11
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "JSX",
      "kind": "namespace",
      "signature": "namespace JSX",
      "doc": "The JSX namespace TypeScript reads.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 21,
      "members": [
        {
          "name": "Element",
          "signature": "type Element = View",
          "doc": "The type TypeScript gives every JSX expression and checks a function component's return type against: a `View`, which the lowered `html` call returns."
        },
        {
          "name": "ElementChildrenAttribute",
          "signature": "interface ElementChildrenAttribute { children: unknown }",
          "doc": "Names the prop that carries children; TypeScript reads only the property's name, `children`, and checks the content between an element's tags against that prop."
        },
        {
          "name": "IntrinsicAttributes",
          "signature": "interface IntrinsicAttributes { ref?: unknown }",
          "doc": "Props TypeScript accepts on every component element on top of the component's own: `ref`, which the lowering passes to the component as an ordinary prop."
        },
        {
          "name": "IntrinsicElements",
          "signature": "type IntrinsicElements = { readonly [tag in keyof HTMLElementTagNameMap]: ElementAttributes } & { readonly [tag: string]: ElementAttributes }",
          "doc": "Maps each intrinsic tag, a name such as `div` or `my-card`, to the attributes TypeScript checks on it: `ElementAttributes` for every tag."
        }
      ]
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "Fragment",
      "kind": "variable",
      "signature": "const Fragment: unique symbol",
      "doc": "Fragments lower to a template with no root element; the marker exists only for the types.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 40
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "jsx",
      "kind": "function",
      "signature": "function jsx(): never",
      "doc": "Reached only when JSX was not lowered; throws a diagnostic.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 43
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "jsxs",
      "kind": "function",
      "signature": "function jsxs(): never",
      "doc": "The same as `jsx`.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 49
    },
    {
      "package": "zerolith/jsx-runtime",
      "name": "jsxDEV",
      "kind": "function",
      "signature": "function jsxDEV(): never",
      "doc": "The same as `jsx`.",
      "file": "packages/zerolith/src/jsx-runtime.ts",
      "line": 52
    },
    {
      "package": "@zerolith/router",
      "name": "ParamsOf",
      "kind": "typeAlias",
      "signature": "type ParamsOf<Path extends string> = Path extends `${infer Head}/${infer Rest}` ? ParamsOf<Head> & ParamsOf<Rest> : Path extends `:${infer Name}` ? { [K in Name]: string } : Path extends `*${infer Name}` ? { [K in Name]: string } : {}",
      "doc": "The parameter names in a path pattern, derived at the type level.",
      "file": "packages/router/src/match.ts",
      "line": 7
    },
    {
      "package": "@zerolith/router",
      "name": "AnyRoute",
      "kind": "interface",
      "signature": "interface AnyRoute",
      "doc": "The loose shape every route satisfies, used to constrain tables without losing each entry's own types.",
      "file": "packages/router/src/router.ts",
      "line": 69,
      "members": [
        {
          "name": "path",
          "signature": "readonly path: string",
          "doc": "The route's path pattern; `href()` takes the types of its parameters from it."
        },
        {
          "name": "view",
          "signature": "readonly view: unknown",
          "doc": "The route's view function or `lazy()` view."
        },
        {
          "name": "load",
          "signature": "readonly load?: unknown",
          "doc": "The route's loader, when it has one."
        },
        {
          "name": "head",
          "signature": "readonly head?: unknown",
          "doc": "The route's document metadata or the function that computes it, when it has one."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "Head",
      "kind": "interface",
      "signature": "interface Head",
      "doc": "Document metadata a route contributes.",
      "file": "packages/router/src/router.ts",
      "line": 9,
      "members": [
        {
          "name": "title",
          "signature": "title?: string",
          "doc": "The document title, set as `document.title` in the browser and rendered as `<title>` by `renderHead`; `undefined` leaves the title as it is."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "The page description, the content of `<meta name=\"description\">`; `undefined` leaves it as it is. In the browser the router adds that element when the document lacks one."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "HrefArgs",
      "kind": "typeAlias",
      "signature": "type HrefArgs<Path extends string> = Record<string, never> extends ParamsOf<Path> ? [] : [ParamsOf<Path>]",
      "doc": "The arguments `href()` takes for a path: none when it has no parameters.",
      "file": "packages/router/src/router.ts",
      "line": 110
    },
    {
      "package": "@zerolith/router",
      "name": "LazyView",
      "kind": "interface",
      "signature": "interface LazyView<Params, Data>",
      "doc": "A view resolved on first navigation, created with `lazy()`.",
      "file": "packages/router/src/router.ts",
      "line": 43,
      "members": [
        {
          "name": "lazy",
          "signature": "readonly lazy: () => Promise<RouteView<Params, Data>>",
          "doc": "Imports the view; the router calls it on the first navigation to the route and keeps the view it resolves."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "LoadContext",
      "kind": "interface",
      "signature": "interface LoadContext<Params>",
      "doc": "What a route's `load` receives.",
      "file": "packages/router/src/router.ts",
      "line": 18,
      "members": [
        {
          "name": "params",
          "signature": "params: Params",
          "doc": "The path parameters by name, decoded from the URL."
        },
        {
          "name": "url",
          "signature": "url: URL",
          "doc": "The URL being navigated to, query and hash included; the router's `url` changes to it only when the navigation commits."
        },
        {
          "name": "abort",
          "signature": "abort: AbortSignal",
          "doc": "Aborted when a newer navigation starts."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "Match",
      "kind": "interface",
      "signature": "interface Match",
      "doc": "The route the URL resolved to.",
      "file": "packages/router/src/router.ts",
      "line": 97,
      "members": [
        {
          "name": "name",
          "signature": "readonly name: string",
          "doc": "The matched route's name in the route table."
        },
        {
          "name": "params",
          "signature": "readonly params: Readonly<Record<string, string>>",
          "doc": "The path parameters by name, decoded from the URL; empty when the path has none."
        },
        {
          "name": "url",
          "signature": "readonly url: URL",
          "doc": "The URL the route matched, query and hash included."
        },
        {
          "name": "data",
          "signature": "readonly data: unknown",
          "doc": "What the route's `load` resolved to, or on the initial navigation the copy the server embedded; `undefined` when the route has no loader."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "NavigationEvent",
      "kind": "interface",
      "signature": "interface NavigationEvent",
      "doc": "What `observe` receives: a navigation starting, then committing, failing,\nor canceled because a newer navigation started before it committed or the\nrouter was disposed, with one id per navigation.",
      "file": "packages/router/src/router.ts",
      "line": 117,
      "members": [
        {
          "name": "type",
          "signature": "readonly type: \"start\" | \"commit\" | \"error\" | \"cancel\"",
          "doc": "The stage: `start` when the navigation begins, then one of `commit`, `error`, or `cancel` when it ends."
        },
        {
          "name": "id",
          "signature": "readonly id: number",
          "doc": "The same number for the start and the end of one navigation."
        },
        {
          "name": "url",
          "signature": "readonly url: URL",
          "doc": "The URL being navigated to."
        },
        {
          "name": "mode",
          "signature": "readonly mode: \"push\" | \"replace\" | \"pop\"",
          "doc": "How the navigation arrived: `push` adds a history entry, `replace` overwrites the current one, as the initial navigation does, and `pop` follows back or forward in the browser."
        },
        {
          "name": "name",
          "signature": "readonly name?: string | undefined",
          "doc": "The matched route's name on commit; undefined when the fallback rendered."
        },
        {
          "name": "error",
          "signature": "readonly error?: unknown",
          "doc": "The loader's error on failure."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "RouteContext",
      "kind": "interface",
      "signature": "interface RouteContext<Params, Data>",
      "doc": "What a route's `view` and `head` receive.",
      "file": "packages/router/src/router.ts",
      "line": 29,
      "members": [
        {
          "name": "params",
          "signature": "params: Params",
          "doc": "The path parameters by name, decoded from the URL."
        },
        {
          "name": "data",
          "signature": "data: Data",
          "doc": "What the route's `load` resolved to, or on the initial navigation the copy the server embedded; `undefined` when the route has no loader."
        },
        {
          "name": "url",
          "signature": "url: URL",
          "doc": "The URL the route matched, query and hash included."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "RouteDefinition",
      "kind": "interface",
      "signature": "interface RouteDefinition<Path extends string = string, Data = undefined>",
      "doc": "One entry of the route table. Write `load` before `view` so the data type flows into the view.",
      "file": "packages/router/src/router.ts",
      "line": 50,
      "members": [
        {
          "name": "path",
          "signature": "path: Path",
          "doc": "The path pattern, relative to the router's `base`: static segments, `:name` parameters, and an optional trailing `*rest` that captures the remainder."
        },
        {
          "name": "view",
          "signature": "view: RouteView<ParamsOf<Path>, Data> | LazyView<ParamsOf<Path>, Data>",
          "doc": "Renders the route: a view function, or a `lazy()` view imported on first navigation."
        },
        {
          "name": "load",
          "signature": "load?: (context: LoadContext<ParamsOf<Path>>) => Promise<Data>",
          "doc": "Resolves the data `view` and `head` receive, before the URL changes; the initial navigation skips it when the server embedded data for the same route, path, and query."
        },
        {
          "name": "head",
          "signature": "head?: Head | ((context: RouteContext<ParamsOf<Path>, Data>) => Head)",
          "doc": "The route's document metadata: an object, or a function that receives the route context once `load` resolves."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "RouteTable",
      "kind": "typeAlias",
      "signature": "type RouteTable = Readonly<Record<string, AnyRoute>>",
      "doc": "A route table: route names to `route()` definitions.",
      "file": "packages/router/src/router.ts",
      "line": 82
    },
    {
      "package": "@zerolith/router",
      "name": "RouteView",
      "kind": "typeAlias",
      "signature": "type RouteView<Params, Data> = (context: RouteContext<Params, Data>) => unknown",
      "doc": "Renders a route. Called once per navigation to that route.",
      "file": "packages/router/src/router.ts",
      "line": 40
    },
    {
      "package": "@zerolith/router",
      "name": "Router",
      "kind": "interface",
      "signature": "interface Router<T extends RouteTable>",
      "doc": "The router returned by `createRouter`, typed by its route table.",
      "file": "packages/router/src/router.ts",
      "line": 167,
      "members": [
        {
          "name": "current",
          "signature": "readonly current: ReadableSignal<Match | undefined>",
          "doc": "The current match, or undefined when nothing matched (the fallback renders)."
        },
        {
          "name": "url",
          "signature": "readonly url: ReadableSignal<URL>",
          "doc": "The current URL."
        },
        {
          "name": "pending",
          "signature": "readonly pending: ReadableSignal<boolean>",
          "doc": "True while a navigation is loading."
        },
        {
          "name": "head",
          "signature": "readonly head: ReadableSignal<Head>",
          "doc": "The head metadata of the current route, for the server to render and for the browser to apply."
        },
        {
          "name": "ready",
          "signature": "readonly ready: Promise<void>",
          "doc": "Settles when the initial navigation from the window's location has committed; already settled without a window. Rejects as `navigate` would."
        },
        {
          "name": "href",
          "signature": "href<N extends keyof T & string>(name: N, ...args: HrefArgs<T[N][\"path\"]>): string",
          "doc": "Builds a URL path for a named route."
        },
        {
          "name": "navigate",
          "signature": "navigate(to: string, options?: { replace?: boolean }): Promise<void>",
          "doc": "Navigates to a path or URL, running the route's loader first. A URL on another origin is left to the browser, through `location.assign`, or `location.replace` with `replace`."
        },
        {
          "name": "matches",
          "signature": "matches(path: string, options?: { exact?: boolean }): ReadableSignal<boolean>",
          "doc": "A signal that is true while the URL is at `path` or below it; `exact` requires equality."
        },
        {
          "name": "outlet",
          "signature": "outlet(): View",
          "doc": "Renders the current route, used as `${router.outlet()}`."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Detaches the router from the window."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "RouterOptions",
      "kind": "interface",
      "signature": "interface RouterOptions",
      "doc": "Options for `createRouter`.",
      "file": "packages/router/src/router.ts",
      "line": 134,
      "members": [
        {
          "name": "fallback",
          "signature": "fallback?: (url: URL) => unknown",
          "doc": "Renders when no route matches."
        },
        {
          "name": "onError",
          "signature": "onError?: (error: unknown, url: URL) => void",
          "doc": "Called when a loader, a lazy import, or a route's `head` throws, or when the new page throws as it renders. Without it the error propagates from `navigate()`."
        },
        {
          "name": "scroll",
          "signature": "scroll?: boolean",
          "doc": "Set false to leave scrolling to the application. Defaults to true."
        },
        {
          "name": "window",
          "signature": "window?: Window | null",
          "doc": "The window to attach to. Defaults to the global window; `null` attaches to none, as on the server, even where a window exists."
        },
        {
          "name": "observe",
          "signature": "observe?: (event: NavigationEvent) => void",
          "doc": "Receives one event when a navigation starts and one when it commits, fails, or is canceled by a newer navigation or by `dispose()`; the hook tracing and logging attach to."
        },
        {
          "name": "base",
          "signature": "base?: string",
          "doc": "The path the application is served under, such as `\"/app/\"`, or `import.meta.env.BASE_URL` to follow the build.\nRoute paths are relative to it, `href()` includes it, and links outside it are left to the browser.\nDefaults to `\"/\"`; a relative base such as `\"./\"` counts as `\"/\"`."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "EmbeddedRouteState",
      "kind": "interface",
      "signature": "interface EmbeddedRouteState",
      "doc": "What `renderRouteState` embeds: the route the server rendered, its URL, and the data its loader produced.",
      "file": "packages/router/src/router.ts",
      "line": 212,
      "members": [
        {
          "name": "name",
          "signature": "readonly name: string",
          "doc": "The name of the route the server rendered; the browser reuses `data` only when its initial navigation matches the same route."
        },
        {
          "name": "href",
          "signature": "readonly href: string",
          "doc": "The path and query of the URL the server rendered; the browser reuses `data` only when its initial URL has the same ones."
        },
        {
          "name": "data",
          "signature": "readonly data: unknown",
          "doc": "What the route's loader produced on the server, embedded as JSON."
        }
      ]
    },
    {
      "package": "@zerolith/router",
      "name": "ROUTE_STATE_SELECTOR",
      "kind": "variable",
      "signature": "const ROUTE_STATE_SELECTOR: string",
      "doc": "The selector of the script `renderRouteState` writes.",
      "file": "packages/router/src/router.ts",
      "line": 223
    },
    {
      "package": "@zerolith/router",
      "name": "createRouter",
      "kind": "function",
      "signature": "function createRouter<T extends RouteTable>(routes: T, options?: RouterOptions): Router<T>",
      "doc": "Creates a router over the given table and attaches it to the window when one exists.",
      "file": "packages/router/src/router.ts",
      "line": 273
    },
    {
      "package": "@zerolith/router",
      "name": "defineRoutes",
      "kind": "function",
      "signature": "function defineRoutes<T extends RouteTable>(routes: T): T",
      "doc": "Declares the route table, preserving every name and path for `href()`; it returns its argument.",
      "file": "packages/router/src/router.ts",
      "line": 85
    },
    {
      "package": "@zerolith/router",
      "name": "lazy",
      "kind": "function",
      "signature": "function lazy<Params, Data>(loader: () => Promise<RouteView<Params, Data>>): LazyView<Params, Data>",
      "doc": "Marks a view to be imported on first navigation.",
      "file": "packages/router/src/router.ts",
      "line": 91
    },
    {
      "package": "@zerolith/router",
      "name": "route",
      "kind": "function",
      "signature": "function route<Path extends string, Data = undefined>(definition: RouteDefinition<Path, Data>): RouteDefinition<Path, Data>",
      "doc": "Declares one route, inferring its parameters from the path and its data from the loader.",
      "file": "packages/router/src/router.ts",
      "line": 63
    },
    {
      "package": "@zerolith/router/server",
      "name": "renderHead",
      "kind": "function",
      "signature": "function renderHead(head: Head): string",
      "doc": "Renders head metadata as the `<title>` and `<meta name=\"description\">` elements of a server-rendered document.",
      "file": "packages/router/src/server.ts",
      "line": 8
    },
    {
      "package": "@zerolith/router/server",
      "name": "renderRouteState",
      "kind": "function",
      "signature": "function renderRouteState(router: Router<RouteTable>): string",
      "doc": "Renders the `<script>` that hands the current route's loaded data to the\nbrowser, where the router reuses it for the initial navigation instead of\nrunning the loader again, as long as the route and URL still match.\nEmpty when nothing matched or the route produced no data. The data goes\nthrough JSON, so the browser's first navigation receives the JSON form: a\n`Date` arrives as a string, a `Map` as an empty object, a field holding\n`undefined` is left out, and a `BigInt` throws here. Return plain JSON\nfrom a loader whose page is server-rendered.",
      "file": "packages/router/src/server.ts",
      "line": 32
    },
    {
      "package": "@zerolith/devtools",
      "name": "DevtoolsHandle",
      "kind": "interface",
      "signature": "interface DevtoolsHandle",
      "doc": "The handle returned by `mountDevtools`.",
      "file": "packages/devtools/src/noop.ts",
      "line": 13,
      "members": [
        {
          "name": "toggle",
          "signature": "toggle(open?: boolean): void",
          "doc": "Shows or hides the dock."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Removes the dock."
        }
      ]
    },
    {
      "package": "@zerolith/devtools",
      "name": "DevtoolsOptions",
      "kind": "interface",
      "signature": "interface DevtoolsOptions",
      "doc": "Options for `mountDevtools`.",
      "file": "packages/devtools/src/noop.ts",
      "line": 6,
      "members": [
        {
          "name": "open",
          "signature": "open?: boolean",
          "doc": "Start with the dock open. Defaults to false."
        }
      ]
    },
    {
      "package": "@zerolith/devtools",
      "name": "describeValue",
      "kind": "function",
      "signature": "function describeValue(value: unknown): string",
      "doc": "A short, safe textual form of a value for the table.",
      "file": "packages/devtools/src/index.ts",
      "line": 41
    },
    {
      "package": "@zerolith/devtools",
      "name": "mountDevtools",
      "kind": "function",
      "signature": "function mountDevtools(options?: DevtoolsOptions): DevtoolsHandle",
      "doc": "Mounts the inspector dock at the bottom of the page. Returns a handle to\ntoggle or remove it. Everything the inspector creates is marked internal\nso it does not appear in its own tables. Mounting fails with\n`package_version_mismatch` when the installed zerolith is not the version\nthe inspector was released with.",
      "file": "packages/devtools/src/index.ts",
      "line": 137
    },
    {
      "package": "@zerolith/vite",
      "name": "AstNode",
      "kind": "interface",
      "signature": "interface AstNode",
      "doc": "What every ESTree node carries.",
      "file": "packages/vite/src/ast.ts",
      "line": 7,
      "members": [
        {
          "name": "type",
          "signature": "type: string",
          "doc": "The ESTree node type, such as `CallExpression`; `walk` treats any object with a string `type` as a node."
        },
        {
          "name": "start",
          "signature": "start: number",
          "doc": "Offset of the node's first character, as an index into the parsed code."
        },
        {
          "name": "end",
          "signature": "end: number",
          "doc": "Offset just past the node's last character, so `code.slice(start, end)` is the node's source text."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "Edit",
      "kind": "interface",
      "signature": "interface Edit",
      "doc": "One replacement of a source range; a zero-length range inserts.",
      "file": "packages/vite/src/ast.ts",
      "line": 18,
      "members": [
        {
          "name": "start",
          "signature": "start: number",
          "doc": "Offset where the replaced range starts, as an index into the code the edit applies to."
        },
        {
          "name": "end",
          "signature": "end: number",
          "doc": "Offset just past the last character replaced; equal to `start` for an insertion."
        },
        {
          "name": "text",
          "signature": "text: string",
          "doc": "The text written in place of the range; empty to delete it."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "IdentityMap",
      "kind": "interface",
      "signature": "interface IdentityMap",
      "doc": "A line-preserving source map: every output line maps to the same input line.",
      "file": "packages/vite/src/ast.ts",
      "line": 29,
      "members": [
        {
          "name": "version",
          "signature": "version: 3",
          "doc": "The version of the source map format, always the integer 3."
        },
        {
          "name": "sources",
          "signature": "sources: string[]",
          "doc": "The original sources the mappings refer to by index; the identity map lists only the module's id."
        },
        {
          "name": "names",
          "signature": "names: string[]",
          "doc": "The symbol names the mappings refer to by index; empty, since no segment of an identity map names a symbol."
        },
        {
          "name": "mappings",
          "signature": "mappings: string",
          "doc": "The encoded mapping data: one group of Base64 VLQ segments per generated line, groups separated by `;` and segments by `,`; the identity map writes one segment per line."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "JsxOutput",
      "kind": "interface",
      "signature": "interface JsxOutput",
      "doc": "The result of lowering one module.",
      "file": "packages/vite/src/jsx.ts",
      "line": 12,
      "members": [
        {
          "name": "code",
          "signature": "code: string",
          "doc": "The module text with each JSX expression replaced, on the same lines, by the `html` call it stands for, and the `html` import added at the start of the first line."
        },
        {
          "name": "map",
          "signature": "map: IdentityMap",
          "doc": "The identity source map from each lowered line to the same line of the original file."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "JsxError",
      "kind": "class",
      "signature": "class JsxError extends Error",
      "doc": "Thrown for JSX the lowering refuses, with the offset in the module.",
      "file": "packages/vite/src/jsx.ts",
      "line": 98,
      "members": [
        {
          "name": "constructor",
          "signature": "constructor(message: string, offset: number)",
          "doc": "Creates the error with `message` after a `zerolith: ` prefix and the offset of the refused node."
        },
        {
          "name": "offset",
          "signature": "readonly offset: number",
          "doc": "Offset in the module of the JSX node the lowering refused, which `position` turns into a line and column."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "lowerJsx",
      "kind": "function",
      "signature": "function lowerJsx(code: string, id: string, parse: ModuleParser): JsxOutput | null",
      "doc": "Lowers every JSX expression in a module to `html` calls and imports\n`html` under a private name. Returns null when the module has no JSX.\nThe parser must be set up for JSX, `tsx` for a `.tsx` file.",
      "file": "packages/vite/src/jsx.ts",
      "line": 406
    },
    {
      "package": "@zerolith/vite",
      "name": "Finding",
      "kind": "interface",
      "signature": "interface Finding",
      "doc": "One finding.",
      "file": "packages/vite/src/lint.ts",
      "line": 13,
      "members": [
        {
          "name": "code",
          "signature": "readonly code: LintCode",
          "doc": "The check that produced the finding, also the diagnostic code whose documentation page the plugin's warning links."
        },
        {
          "name": "message",
          "signature": "readonly message: string",
          "doc": "What is wrong and how to fix it; the plugin's warning prints it between the code and the code's documentation URL."
        },
        {
          "name": "offset",
          "signature": "readonly offset: number",
          "doc": "Offset of the finding in the module."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "LintCode",
      "kind": "typeAlias",
      "signature": "type LintCode = \"template_frozen_read\" | \"image_without_alt\" | \"button_without_name\" | \"frame_without_title\"",
      "doc": "The checks `lintModule` runs.",
      "file": "packages/vite/src/lint.ts",
      "line": 10
    },
    {
      "package": "@zerolith/vite",
      "name": "lintModule",
      "kind": "function",
      "signature": "function lintModule(code: string, id: string, parse: ModuleParser): Finding[]",
      "doc": "Checks every `html` template in a module. Returns the findings in source\norder; a module without templates, or one that does not parse, yields\nnone, since the parser's own errors come first.",
      "file": "packages/vite/src/lint.ts",
      "line": 132
    },
    {
      "package": "@zerolith/vite",
      "name": "position",
      "kind": "function",
      "signature": "function position(code: string, offset: number): { line: number; column: number }",
      "doc": "The line and column, 1-based, of an offset in a module.",
      "file": "packages/vite/src/lint.ts",
      "line": 170
    },
    {
      "package": "@zerolith/vite",
      "name": "PrepareOutput",
      "kind": "interface",
      "signature": "interface PrepareOutput",
      "doc": "The result of preparing one module.",
      "file": "packages/vite/src/prepare.ts",
      "line": 11,
      "members": [
        {
          "name": "code",
          "signature": "code: string",
          "doc": "The module text, line for line: each `html` literal becomes a call of its tag on a template registered before the first statement that is not an import, and one without values becomes a view made once there."
        },
        {
          "name": "map",
          "signature": "map: IdentityMap",
          "doc": "The identity source map from each prepared line to the same line of the original module."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "ScannedPart",
      "kind": "interface",
      "signature": "interface ScannedPart",
      "doc": "One scanned part, as the core's `scan` reports it.",
      "file": "packages/vite/src/prepare.ts",
      "line": 20,
      "members": [
        {
          "name": "kind",
          "signature": "readonly kind: number",
          "doc": "How the part binds, numbered as the core's part constants are: `0` child, `1` attribute, `2` boolean, `3` property, `4` event, `5` ref."
        },
        {
          "name": "name",
          "signature": "readonly name: string",
          "doc": "The bound attribute, property, or event name without its `.`, `?`, or `@` prefix; empty for a child part."
        },
        {
          "name": "strings",
          "signature": "readonly strings: readonly string[]",
          "doc": "The static text around an attribute value's expressions, one entry longer than their count; empty for a child part."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "TemplateScanner",
      "kind": "typeAlias",
      "signature": "type TemplateScanner = (strings: readonly string[]) => { markup: string; parts: readonly ScannedPart[] }",
      "doc": "Scans a template's cooked strings: the core's `scan`, passed in so the pass has no import of its own.",
      "file": "packages/vite/src/prepare.ts",
      "line": 31
    },
    {
      "package": "@zerolith/vite",
      "name": "PREPARED_BINDING",
      "kind": "variable",
      "signature": "const PREPARED_BINDING: string",
      "doc": "The binding the lowered code imports `prepared` under, chosen not to clash with user code.",
      "file": "packages/vite/src/prepare.ts",
      "line": 34
    },
    {
      "package": "@zerolith/vite",
      "name": "PrepareError",
      "kind": "class",
      "signature": "class PrepareError extends Error",
      "doc": "Thrown for a module the pass refuses, with the offset in the module.",
      "file": "packages/vite/src/prepare.ts",
      "line": 85,
      "members": [
        {
          "name": "constructor",
          "signature": "constructor(message: string, offset: number)",
          "doc": "Creates the error with `message` after a `zerolith: ` prefix and the offset of the refused code."
        },
        {
          "name": "offset",
          "signature": "readonly offset: number",
          "doc": "Offset in the module of the statement, expression, or template the pass refused; the plugin turns it into the error's line and column."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "TEMPLATE_BINDING",
      "kind": "variable",
      "signature": "const TEMPLATE_BINDING: string",
      "doc": "The prefix of the hoisted template bindings, numbered per module.",
      "file": "packages/vite/src/prepare.ts",
      "line": 36
    },
    {
      "package": "@zerolith/vite",
      "name": "VIEW_BINDING",
      "kind": "variable",
      "signature": "const VIEW_BINDING: string",
      "doc": "The prefix of the module-scope views of templates with no bindings, numbered like their templates.",
      "file": "packages/vite/src/prepare.ts",
      "line": 38
    },
    {
      "package": "@zerolith/vite",
      "name": "prepareModule",
      "kind": "function",
      "signature": "function prepareModule(code: string, id: string, parse: ModuleParser, scan: TemplateScanner): PrepareOutput | null",
      "doc": "Prepares one module. Returns null when the module imports no `html` from\nzerolith, and throws a `PrepareError` when `html` is declared or used\nother than as a template tag, since the bundle will carry no scanner.",
      "file": "packages/vite/src/prepare.ts",
      "line": 147
    },
    {
      "package": "@zerolith/vite",
      "name": "SplitImport",
      "kind": "interface",
      "signature": "interface SplitImport",
      "doc": "A dynamic import that is meant to stay a chunk of its own.",
      "file": "packages/vite/src/split.ts",
      "line": 16,
      "members": [
        {
          "name": "specifier",
          "signature": "readonly specifier: string",
          "doc": "The specifier as written in the `import()`."
        },
        {
          "name": "kind",
          "signature": "readonly kind: \"route\" | \"locale\"",
          "doc": "`route` for a view declared with `lazy()`, `locale` for a module of a compiled message index."
        },
        {
          "name": "offset",
          "signature": "readonly offset: number",
          "doc": "Offset of the `import()` in the module."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "MESSAGES_HEADER",
      "kind": "variable",
      "signature": "const MESSAGES_HEADER: string",
      "doc": "The start of every module `zerolith-i18n` writes.",
      "file": "packages/vite/src/split.ts",
      "line": 11
    },
    {
      "package": "@zerolith/vite",
      "name": "splitImports",
      "kind": "function",
      "signature": "function splitImports(code: string, id: string, parse: ModuleParser): SplitImport[]",
      "doc": "The dynamic imports of a module that are meant to stay chunks of their\nown, in source order: every `import()` with a string specifier inside the\nloader passed to the router's `lazy()`, and every one in a compiled\nmessage index. Any other module yields none.",
      "file": "packages/vite/src/split.ts",
      "line": 101
    },
    {
      "package": "@zerolith/vite",
      "name": "ModuleParser",
      "kind": "typeAlias",
      "signature": "type ModuleParser = (filename: string, code: string) => ParsedModule",
      "doc": "Parses JavaScript module text; the plugin passes Vite's `parseSync`.",
      "file": "packages/vite/src/transform.ts",
      "line": 28
    },
    {
      "package": "@zerolith/vite",
      "name": "ParsedModule",
      "kind": "interface",
      "signature": "interface ParsedModule",
      "doc": "A parsed module: the program body and any syntax errors the parser reported.",
      "file": "packages/vite/src/transform.ts",
      "line": 19,
      "members": [
        {
          "name": "program",
          "signature": "program: { body: readonly AstNode[] }",
          "doc": "The module's ESTree `Program` node; the passes read its top-level statements from `body` and walk the nodes beneath them."
        },
        {
          "name": "errors",
          "signature": "errors: readonly unknown[]",
          "doc": "The syntax errors the parser reported; each pass leaves a module with errors untouched, so the parser's own errors come first."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "TransformOutput",
      "kind": "interface",
      "signature": "interface TransformOutput",
      "doc": "The rewritten module and its line-preserving source map.",
      "file": "packages/vite/src/transform.ts",
      "line": 31,
      "members": [
        {
          "name": "code",
          "signature": "code: string",
          "doc": "The rewritten module: its own lines, rewritten in place, followed by any re-exports of renamed components and the footer that accepts hot updates."
        },
        {
          "name": "map",
          "signature": "map: IdentityMap",
          "doc": "The identity source map; each line appended after the module's own lines maps to its last line."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "transformModule",
      "kind": "function",
      "signature": "function transformModule(code: string, id: string, parse: ModuleParser): TransformOutput | null",
      "doc": "Rewrites one module for hot replacement. Exported functions whose names\nstart with a capital letter become proxies registered under the module's\n`import.meta.hot.data`; calls to `render` and `hydrate` imported from\n`zerolith` are routed through the runtime with the rendered expression\nwrapped in a factory; and a module that needed either change accepts its\nown updates. A module that needs neither comes back as `null`, untouched.",
      "file": "packages/vite/src/transform.ts",
      "line": 174
    },
    {
      "package": "@zerolith/vite",
      "name": "ZerolithPluginOptions",
      "kind": "interface",
      "signature": "interface ZerolithPluginOptions",
      "doc": "Options for `zerolith()`.",
      "file": "packages/vite/src/index.ts",
      "line": 31,
      "members": [
        {
          "name": "include",
          "signature": "include?: RegExp",
          "doc": "Module ids to rewrite, tested with path separators normalized to `/`. Defaults to JavaScript and TypeScript modules."
        },
        {
          "name": "exclude",
          "signature": "exclude?: RegExp",
          "doc": "Module ids to leave alone even when `include` matches. Defaults to anything under `node_modules`."
        },
        {
          "name": "jsx",
          "signature": "jsx?: boolean",
          "doc": "Lowers JSX in `.jsx` and `.tsx` files to `html` calls. Defaults to true."
        },
        {
          "name": "hot",
          "signature": "hot?: boolean",
          "doc": "Rewrites modules in development so an edited component is replaced in place. Defaults to true, and to false under Vitest, where nothing is edited in place."
        },
        {
          "name": "lint",
          "signature": "lint?: boolean",
          "doc": "Warns in the terminal about a `.get()` read bound in a template and about static accessibility defects. Defaults to true."
        },
        {
          "name": "prepare",
          "signature": "prepare?: boolean",
          "doc": "In `vite build`, scans every `html` literal ahead of time and drops the scanner from the bundle. Defaults to true."
        }
      ]
    },
    {
      "package": "@zerolith/vite",
      "name": "zerolith",
      "kind": "function",
      "signature": "function zerolith(options?: ZerolithPluginOptions): Plugin[]",
      "doc": "Creates the plugins. Ahead of every other transform, JSX in `.jsx` and\n`.tsx` files is lowered to the `html` calls it stands for. A stylesheet\nimported with `?scoped` becomes a module that hands its rules, as Vite's\n`?inline` import processes them, to zerolith's `styleFile`, which scopes\nthem as it scopes a `css` literal's; the module accepts its own update,\nso an edited stylesheet replaces its rules in place. In\ndevelopment each module is rewritten so exported functions with\ncapitalized names become stable proxies, `render` and `hydrate` calls\nare recorded with the expression they rendered, and a changed module\naccepts its own update: named signals are saved before the module is\nreplaced, every root renders again, and the saved values flow back into\nsignals created with the same names. The zerolith packages are kept out\nof dependency pre-bundling. In `vite build` every `html` literal is\nscanned ahead of time and the scanner leaves the bundle. A client build\nfails when a view loaded with the router's `lazy()`, or a locale module\nof a compiled message index, is also imported statically, which would\nput it in the importing chunk, and a build in production mode fails if\na module of the development build of the core reached the output, which\nmeans the `production` export condition did not apply. Creating the\nplugin fails with `package_version_mismatch` when the installed zerolith\nis not the version the plugin was released with.",
      "file": "packages/vite/src/index.ts",
      "line": 153
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "HotContext",
      "kind": "interface",
      "signature": "interface HotContext",
      "doc": "The part of `import.meta.hot` the runtime relies on: the object that survives a module's replacement.",
      "file": "packages/vite/src/runtime.ts",
      "line": 11,
      "members": [
        {
          "name": "data",
          "signature": "readonly data: Record<string, unknown>",
          "doc": "Survives each new version of the module; the runtime stores the module's component proxies here under the `zerolith` key, so a new version updates the proxies its importers already hold."
        }
      ]
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "component",
      "kind": "function",
      "signature": "function component<T extends AnyFunction>(hot: HotContext | undefined, name: string, impl: T): T",
      "doc": "Registers a component under its module's hot context and returns the\nproxy that stands in for it. The proxy is created once per module and\nname and kept in `hot.data`, so importers that are not re-executed keep\ncalling the latest version. Without a hot context the function itself\nis returned.",
      "file": "packages/vite/src/runtime.ts",
      "line": 46
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "render",
      "kind": "function",
      "signature": "function render(factory: () => unknown, target: core.MountTarget, site?: string): core.Root",
      "doc": "Renders what `factory` returns into `container` and remembers the factory,\nso the root can be rendered again after an update. The core calls the\nfactory inside the root's owner, so components own their effects and\ncleanups as they do without the plugin, and calls once more a factory\nwhose expression was itself a function, as in `render(() => App(), \"#app\")`.\nA root that the same call, `site`, mounted into the same container before\nis replaced, which is what happens when the entry module itself is\nre-executed; roots from other calls stay, as they do in production.",
      "file": "packages/vite/src/runtime.ts",
      "line": 108
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "hydrate",
      "kind": "function",
      "signature": "function hydrate(factory: () => unknown, target: core.MountTarget, site?: string): core.HydrateResult",
      "doc": "The `hydrate` counterpart of `render`: hydrates once, then re-renders on updates.",
      "file": "packages/vite/src/runtime.ts",
      "line": 119
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "save",
      "kind": "function",
      "signature": "function save(): void",
      "doc": "Saves the value of every named state signal so the signals created by the\nnext render take them over. The plugin wires this to `import.meta.hot.dispose`,\nwhich runs just before a module's new version is evaluated.",
      "file": "packages/vite/src/runtime.ts",
      "line": 140
    },
    {
      "package": "@zerolith/vite/runtime",
      "name": "accept",
      "kind": "function",
      "signature": "function accept(): void",
      "doc": "Renders every recorded root again with its factory and then drops any\nsaved values no signal claimed. The plugin wires this to\n`import.meta.hot.accept`, which runs after the module's new version has\nbeen evaluated and its components re-registered. A root mounted since the\nlast `save()` was rendered by that evaluation itself, when the entry\nmodule is the one that changed, and is left as it is. Each root's new\nview is rendered before its old one is disposed, so an edit that throws\nleaves the old view on the page and reports the error.",
      "file": "packages/vite/src/runtime.ts",
      "line": 172
    },
    {
      "package": "@zerolith/forms",
      "name": "problemResponse",
      "kind": "function",
      "signature": "function problemResponse(problem: Problem, init?: ResponseInit): Response",
      "doc": "Writes a problem as a `Response` with the problem details media type.\nThe status comes from `init`, or the problem, or defaults to 400.",
      "file": "packages/forms/src/problem.ts",
      "line": 10
    },
    {
      "package": "@zerolith/forms",
      "name": "FormValues",
      "kind": "typeAlias",
      "signature": "type FormValues = Record<string, FormDataEntryValue | FormDataEntryValue[]>",
      "doc": "A form's values as a plain object: repeated names become arrays.",
      "file": "packages/forms/src/schema.ts",
      "line": 45
    },
    {
      "package": "@zerolith/forms",
      "name": "InferOutput",
      "kind": "typeAlias",
      "signature": "type InferOutput<S extends StandardSchema> = S extends StandardSchema<unknown, infer Output> ? Output : never",
      "doc": "The output type of a schema.",
      "file": "packages/forms/src/schema.ts",
      "line": 42
    },
    {
      "package": "@zerolith/forms",
      "name": "StandardIssue",
      "kind": "interface",
      "signature": "interface StandardIssue",
      "doc": "One validation failure.",
      "file": "packages/forms/src/schema.ts",
      "line": 16,
      "members": [
        {
          "name": "message",
          "signature": "readonly message: string",
          "doc": "The error message of the issue; `problemFromIssues` lists it under the field its path names, or in `detail` when the path is absent or empty."
        },
        {
          "name": "path",
          "signature": "readonly path?: ReadonlyArray<PropertyKey | StandardPathSegment> | undefined",
          "doc": "The path to the failing value; absent for an issue about the whole input."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "StandardPathSegment",
      "kind": "interface",
      "signature": "interface StandardPathSegment",
      "doc": "One segment of an issue path in object form.",
      "file": "packages/forms/src/schema.ts",
      "line": 9,
      "members": [
        {
          "name": "key",
          "signature": "readonly key: PropertyKey",
          "doc": "The key representing the path segment; `problemFromIssues` converts it to a string and joins the path's keys with dots to name the field."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "StandardResult",
      "kind": "typeAlias",
      "signature": "type StandardResult<Output> = { readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<StandardIssue> }",
      "doc": "What `validate` resolves to: a value, or issues.",
      "file": "packages/forms/src/schema.ts",
      "line": 25
    },
    {
      "package": "@zerolith/forms",
      "name": "StandardSchema",
      "kind": "interface",
      "signature": "interface StandardSchema<Input = unknown, Output = Input>",
      "doc": "The Standard Schema V1 interface, as published at standardschema.dev.",
      "file": "packages/forms/src/schema.ts",
      "line": 30,
      "members": [
        {
          "name": "~standard",
          "signature": "readonly \"~standard\": { readonly version: 1; readonly vendor: string; readonly validate: (value: unknown) => StandardResult<Output> | Promise<StandardResult<Output>>; readonly types?: { readonly input: Input; readonly output: Output } | undefined }",
          "doc": "The Standard properties: the `version` of the specification, the `vendor` name of the schema library, the optional inferred `types`, and the `validate` function that `validateForm` calls and awaits."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "Validation",
      "kind": "typeAlias",
      "signature": "type Validation<Output> = { readonly value: Output; readonly problem?: undefined } | { readonly value?: undefined; readonly problem: Problem }",
      "doc": "What `validateForm` resolves to: the parsed value, or the problem to show.",
      "file": "packages/forms/src/schema.ts",
      "line": 48
    },
    {
      "package": "@zerolith/forms",
      "name": "formValues",
      "kind": "function",
      "signature": "function formValues(data: FormData): FormValues",
      "doc": "Turns `FormData` into a plain object with no prototype, so a field named `constructor` or `__proto__` is a field like any other. A name that appears once maps to its value; a name that appears more than once maps to an array of its values, in order.",
      "file": "packages/forms/src/schema.ts",
      "line": 53
    },
    {
      "package": "@zerolith/forms",
      "name": "problemFromIssues",
      "kind": "function",
      "signature": "function problemFromIssues(issues: ReadonlyArray<StandardIssue>): Problem",
      "doc": "Groups issues into a problem: path-bearing issues under `fields`, the rest in `detail`.",
      "file": "packages/forms/src/schema.ts",
      "line": 85
    },
    {
      "package": "@zerolith/forms",
      "name": "validateForm",
      "kind": "function",
      "signature": "async function validateForm<S extends StandardSchema>(schema: S, data: FormData | Record<string, unknown>): Promise<Validation<InferOutput<S>>>",
      "doc": "Validates a submission with a Standard Schema. `FormData` is converted\nwith `formValues` first; any other value is validated as it is. Issues\nbecome a problem whose `fields` carry the messages per path.",
      "file": "packages/forms/src/schema.ts",
      "line": 112
    },
    {
      "package": "@zerolith/forms",
      "name": "Field",
      "kind": "interface",
      "signature": "interface Field",
      "doc": "One input's slice of the current problem.",
      "file": "packages/forms/src/form.ts",
      "line": 65,
      "members": [
        {
          "name": "errors",
          "signature": "readonly errors: ReadableSignal<readonly string[]>",
          "doc": "Every message for the field, oldest first."
        },
        {
          "name": "error",
          "signature": "readonly error: ReadableSignal<string | undefined>",
          "doc": "The first message, or undefined."
        },
        {
          "name": "invalid",
          "signature": "readonly invalid: ReadableSignal<boolean>",
          "doc": "True while the field has a message; bind it to `aria-invalid`."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "Form",
      "kind": "interface",
      "signature": "interface Form",
      "doc": "The enhanced form.",
      "file": "packages/forms/src/form.ts",
      "line": 76,
      "members": [
        {
          "name": "status",
          "signature": "readonly status: ReadableSignal<FormStatus>",
          "doc": "The current submission's stage: `pending` while in flight, then `success`, `failure` with a problem, or `error` when it did not complete; `idle` before the first submission and after `reset()`."
        },
        {
          "name": "pending",
          "signature": "readonly pending: ReadableSignal<boolean>",
          "doc": "True while a submission is in flight."
        },
        {
          "name": "problem",
          "signature": "readonly problem: ReadableSignal<Problem | undefined>",
          "doc": "The problem from the last failed submission, or undefined."
        },
        {
          "name": "result",
          "signature": "readonly result: ReadableSignal<unknown>",
          "doc": "The parsed body of the last successful submission."
        },
        {
          "name": "error",
          "signature": "readonly error: ReadableSignal<unknown>",
          "doc": "The error of the last submission that did not complete."
        },
        {
          "name": "field",
          "signature": "field(name: string): Field",
          "doc": "A field's view of the problem; the same object for the same name."
        },
        {
          "name": "submit",
          "signature": "submit(event: SubmitEvent): void",
          "doc": "The submit handler; bind it with `@submit`."
        },
        {
          "name": "reset",
          "signature": "reset(): void",
          "doc": "Aborts any submission in flight and returns the form to idle."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "FormOptions",
      "kind": "interface",
      "signature": "interface FormOptions",
      "doc": "Options for `createForm`.",
      "file": "packages/forms/src/form.ts",
      "line": 42,
      "members": [
        {
          "name": "schema",
          "signature": "schema?: StandardSchema",
          "doc": "Validated on the client before anything is sent; failing issues become the problem's `fields`."
        },
        {
          "name": "send",
          "signature": "send?: (submission: Submission) => Promise<Response>",
          "doc": "Sends the submission. Defaults to a `fetch` of the form's method, action, and encoding that asks for JSON."
        },
        {
          "name": "headers",
          "signature": "headers?: HeadersInit",
          "doc": "Headers added to the default request."
        },
        {
          "name": "fetch",
          "signature": "fetch?: typeof fetch",
          "doc": "The `fetch` the default sender uses; defaults to the global one."
        },
        {
          "name": "navigate",
          "signature": "navigate?: (url: string) => void",
          "doc": "Where a redirected response takes the page. Defaults to `location.assign`; pass the router's `navigate` to stay in the application."
        },
        {
          "name": "reset",
          "signature": "reset?: boolean",
          "doc": "Resets the form element after a successful response."
        },
        {
          "name": "onSuccess",
          "signature": "onSuccess?: (outcome: SubmissionOutcome) => void",
          "doc": "Called after a successful response."
        },
        {
          "name": "onFailure",
          "signature": "onFailure?: (problem: Problem, element: HTMLFormElement) => void",
          "doc": "Called with the problem from client-side validation or from the server."
        },
        {
          "name": "onError",
          "signature": "onError?: (error: unknown, element: HTMLFormElement) => void",
          "doc": "Called when the request itself fails."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "FormStatus",
      "kind": "typeAlias",
      "signature": "type FormStatus = \"idle\" | \"pending\" | \"success\" | \"failure\" | \"error\"",
      "doc": "Where a form is in its current submission.",
      "file": "packages/forms/src/form.ts",
      "line": 11
    },
    {
      "package": "@zerolith/forms",
      "name": "Submission",
      "kind": "interface",
      "signature": "interface Submission",
      "doc": "What the default sender, or a custom `send`, receives.",
      "file": "packages/forms/src/form.ts",
      "line": 14,
      "members": [
        {
          "name": "element",
          "signature": "readonly element: HTMLFormElement",
          "doc": "The form that was submitted."
        },
        {
          "name": "submitter",
          "signature": "readonly submitter: HTMLElement | null",
          "doc": "The button or input that submitted it, when there was one."
        },
        {
          "name": "data",
          "signature": "readonly data: FormData",
          "doc": "The form's data, including the submitter's name and value."
        },
        {
          "name": "method",
          "signature": "readonly method: string",
          "doc": "The lowercase method, after the submitter's `formmethod` override."
        },
        {
          "name": "action",
          "signature": "readonly action: URL",
          "doc": "The resolved action URL, after the submitter's `formaction` override."
        },
        {
          "name": "signal",
          "signature": "readonly signal: AbortSignal",
          "doc": "Aborted when the form is submitted again or reset."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "SubmissionOutcome",
      "kind": "interface",
      "signature": "interface SubmissionOutcome",
      "doc": "The outcome of one submission.",
      "file": "packages/forms/src/form.ts",
      "line": 31,
      "members": [
        {
          "name": "result",
          "signature": "readonly result: unknown",
          "doc": "The parsed body: JSON when the response says so, text otherwise, undefined for an empty body."
        },
        {
          "name": "response",
          "signature": "readonly response: Response",
          "doc": "The successful response, as `fetch` or a custom `send` returned it; its body has already been read into `result` unless it was redirected."
        },
        {
          "name": "element",
          "signature": "readonly element: HTMLFormElement",
          "doc": "The form that was submitted, already reset when the `reset` option is set."
        }
      ]
    },
    {
      "package": "@zerolith/forms",
      "name": "createForm",
      "kind": "function",
      "signature": "function createForm(options?: FormOptions): Form",
      "doc": "Creates the enhancer for one form. Bind `submit` to the form's `@submit`;\nthe method, action, and encoding stay on the form element, so the same\nmarkup submits natively when the script has not run.",
      "file": "packages/forms/src/form.ts",
      "line": 250
    },
    {
      "package": "@zerolith/client",
      "name": "Method",
      "kind": "typeAlias",
      "signature": "type Method = \"get\" | \"put\" | \"post\" | \"delete\" | \"options\" | \"head\" | \"patch\" | \"query\" | (string & {})",
      "doc": "The HTTP method of an operation, in lowercase: one OpenAPI names, `query`\nbeing the HTTP QUERY method, or any other method token, as an OpenAPI 3.2\n`additionalOperations` entry such as `copy` gives.",
      "file": "packages/client/src/index.ts",
      "line": 13
    },
    {
      "package": "@zerolith/client",
      "name": "Operation",
      "kind": "interface",
      "signature": "interface Operation",
      "doc": "One operation as the generated `Api` interface describes it.",
      "file": "packages/client/src/index.ts",
      "line": 16,
      "members": [
        {
          "name": "method",
          "signature": "readonly method: Method",
          "doc": "The HTTP method in lowercase, such as `get`; the request sends it uppercased."
        },
        {
          "name": "path",
          "signature": "readonly path: string",
          "doc": "The path template, such as `/notes/{id}`, whose placeholders the client fills from `params` with URI-encoded values."
        },
        {
          "name": "params",
          "signature": "readonly params?: Record<string, string | number | boolean>",
          "doc": "Path parameters, by the name inside the braces."
        },
        {
          "name": "query",
          "signature": "readonly query?: Record<string, unknown>",
          "doc": "Query parameters; arrays repeat the key, objects are JSON."
        },
        {
          "name": "body",
          "signature": "readonly body?: unknown",
          "doc": "The request body; JSON unless it is a `FormData`, `URLSearchParams`, `Blob`, `ArrayBuffer`, `ReadableStream`, or string, which are sent as they are."
        },
        {
          "name": "output",
          "signature": "readonly output: unknown",
          "doc": "What a successful call resolves to."
        }
      ]
    },
    {
      "package": "@zerolith/client",
      "name": "Contract",
      "kind": "typeAlias",
      "signature": "type Contract<A> = { readonly [K in keyof A]: Operation }",
      "doc": "What a generated `Api` interface satisfies: every member is an operation.",
      "file": "packages/client/src/index.ts",
      "line": 33
    },
    {
      "package": "@zerolith/client",
      "name": "RouteTable",
      "kind": "typeAlias",
      "signature": "type RouteTable<A extends Contract<A>> = { readonly [K in keyof A]: { readonly method: A[K][\"method\"]; readonly path: A[K][\"path\"] } }",
      "doc": "The runtime half of a contract: the method and path of every operation.",
      "file": "packages/client/src/index.ts",
      "line": 36
    },
    {
      "package": "@zerolith/client",
      "name": "Input",
      "kind": "typeAlias",
      "signature": "type Input<Op extends Operation> = Omit<Op, \"method\" | \"path\" | \"output\">",
      "doc": "What a call takes: the operation's `params`, `query`, and `body`, as optional as the contract makes them.",
      "file": "packages/client/src/index.ts",
      "line": 39
    },
    {
      "package": "@zerolith/client",
      "name": "Output",
      "kind": "typeAlias",
      "signature": "type Output<Op extends Operation> = Op[\"output\"]",
      "doc": "What a call resolves to.",
      "file": "packages/client/src/index.ts",
      "line": 42
    },
    {
      "package": "@zerolith/client",
      "name": "CallOptions",
      "kind": "interface",
      "signature": "interface CallOptions",
      "doc": "Per-call options.",
      "file": "packages/client/src/index.ts",
      "line": 45,
      "members": [
        {
          "name": "signal",
          "signature": "signal?: AbortSignal",
          "doc": "Becomes the request's `signal`, so aborting it rejects the call under `fetch` or `portTransport`; `query` replaces it with the resource's own signal."
        },
        {
          "name": "headers",
          "signature": "headers?: HeadersInit",
          "doc": "Headers for this call, set over the client's `headers` so that a name in both takes this value."
        }
      ]
    },
    {
      "package": "@zerolith/client",
      "name": "Transport",
      "kind": "typeAlias",
      "signature": "type Transport = (request: Request) => Promise<Response>",
      "doc": "Sends a request. The default is `fetch`; a test or an Electron bridge can answer in process.",
      "file": "packages/client/src/index.ts",
      "line": 56
    },
    {
      "package": "@zerolith/client",
      "name": "ClientOptions",
      "kind": "interface",
      "signature": "interface ClientOptions",
      "doc": "Options for `createClient`.",
      "file": "packages/client/src/index.ts",
      "line": 59,
      "members": [
        {
          "name": "baseUrl",
          "signature": "baseUrl?: string",
          "doc": "Prepended to every path. Defaults to \"\", the page's origin in a browser; pass an absolute URL elsewhere."
        },
        {
          "name": "transport",
          "signature": "transport?: Transport",
          "doc": "Sends every request the client builds and resolves with the response. Defaults to the global `fetch`, looked up on each call."
        },
        {
          "name": "headers",
          "signature": "headers?: HeadersInit | (() => HeadersInit)",
          "doc": "Headers sent with every request, or a function returning them, for values such as a bearer token."
        }
      ]
    },
    {
      "package": "@zerolith/client",
      "name": "ProblemError",
      "kind": "class",
      "signature": "class ProblemError extends Error",
      "doc": "Thrown for a response outside 2xx, carrying the problem the server sent or one built from the status line.",
      "file": "packages/client/src/index.ts",
      "line": 70,
      "members": [
        {
          "name": "constructor",
          "signature": "constructor(problem: Problem, response: Response)",
          "doc": "Wraps `problem` and the `response` it came from; the message is the problem's `title`, or `HTTP <status>` when it has none."
        },
        {
          "name": "problem",
          "signature": "readonly problem: Problem",
          "doc": "The problem the server sent, with `status` filled from the response when the body omits it; a body that is not a JSON problem yields `status` and a `title` from the status line."
        },
        {
          "name": "response",
          "signature": "readonly response: Response",
          "doc": "The response outside 2xx, for its status and headers; its body has already been read when the content type is JSON."
        }
      ]
    },
    {
      "package": "@zerolith/client",
      "name": "Client",
      "kind": "interface",
      "signature": "interface Client<A extends Contract<A>>",
      "doc": "The client for one contract.",
      "file": "packages/client/src/index.ts",
      "line": 88,
      "members": [
        {
          "name": "call",
          "signature": "call<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Promise<Output<A[K]>>",
          "doc": "Calls an operation and resolves with its output, or rejects with a `ProblemError` for a response outside 2xx."
        },
        {
          "name": "query",
          "signature": "query<K extends keyof A>(name: K, input: () => Input<A[K]> | undefined, options?: CallOptions): Resource<Output<A[K]>>",
          "doc": "A resource over an operation: it calls again when the signals read by `input` change, and is idle while `input` returns undefined."
        },
        {
          "name": "request",
          "signature": "request<K extends keyof A>(name: K, ...args: InputArgs<A[K]>): Request",
          "doc": "The `Request` a call would send, for tests and custom transports."
        }
      ]
    },
    {
      "package": "@zerolith/client",
      "name": "createClient",
      "kind": "function",
      "signature": "function createClient<A extends Contract<A>>(routes: RouteTable<A>, options?: ClientOptions): Client<A>",
      "doc": "Creates a client for a generated route table. `routes` and the `Api`\ntype parameter come from the same generated module, so an operation\nname, its parameters, its body, and its output are checked together.",
      "file": "packages/client/src/index.ts",
      "line": 246
    },
    {
      "package": "@zerolith/client/generate",
      "name": "SchemaObject",
      "kind": "interface",
      "signature": "interface SchemaObject",
      "doc": "A JSON Schema object as OpenAPI 3.1 and later carry it (draft 2020-12 plus the OAS vocabulary).",
      "file": "packages/client/src/generate.ts",
      "line": 8,
      "members": [
        {
          "name": "$ref",
          "signature": "$ref?: string",
          "doc": "A reference to `#/components/schemas/<name>`, rendered as that component's generated type, intersected with the keywords beside it that shape a type, such as `properties`, as OpenAPI 3.1 allows; any other target fails generation."
        },
        {
          "name": "type",
          "signature": "type?: string | string[]",
          "doc": "The JSON type, or since OpenAPI 3.1 an array of types rendered as a union; `integer` renders as `number`, and when it is absent the object or array keywords imply one, else the type is `unknown`."
        },
        {
          "name": "nullable",
          "signature": "nullable?: boolean",
          "doc": "The OpenAPI 3.0 flag that also allows `null`; when `true`, `null` joins the type."
        },
        {
          "name": "enum",
          "signature": "enum?: unknown[]",
          "doc": "The allowed values, rendered as a union of their literal types; it takes precedence over `type`, and intersects with a composition keyword or `$ref` beside it."
        },
        {
          "name": "const",
          "signature": "const?: unknown",
          "doc": "The single allowed value (OpenAPI 3.1 and later), rendered as its literal type; it takes precedence over `enum` and `type`, and intersects with a composition keyword or `$ref` beside it."
        },
        {
          "name": "properties",
          "signature": "properties?: Record<string, SchemaObject>",
          "doc": "The object's properties, each generated as a member that is optional unless `required` lists it, with the property's `description` as its doc comment."
        },
        {
          "name": "required",
          "signature": "required?: string[]",
          "doc": "The names in `properties` that must be present; every other property is generated as optional."
        },
        {
          "name": "additionalProperties",
          "signature": "additionalProperties?: boolean | SchemaObject",
          "doc": "The schema of keys beyond `properties`, rendered as a `Record<string, ...>` joined to them with `&`; `true` allows `unknown` values, and `false` makes an object without properties `Record<string, never>`."
        },
        {
          "name": "items",
          "signature": "items?: SchemaObject",
          "doc": "The schema of each array element, rendered as `T[]`, or `unknown[]` without it; beside `prefixItems` it types the elements after the tuple."
        },
        {
          "name": "prefixItems",
          "signature": "prefixItems?: SchemaObject[]",
          "doc": "The schemas of the leading array elements by position (OpenAPI 3.1 and later), rendered as a tuple; without `items` the tuple has no rest element."
        },
        {
          "name": "oneOf",
          "signature": "oneOf?: SchemaObject[]",
          "doc": "Alternatives of which exactly one matches, rendered as a union; it takes precedence over `anyOf` and `allOf`, and the keywords beside it that shape a type, such as `properties`, intersect with it."
        },
        {
          "name": "anyOf",
          "signature": "anyOf?: SchemaObject[]",
          "doc": "Alternatives of which at least one matches, rendered as a union unless `oneOf` is present; the keywords beside it that shape a type, such as `properties`, intersect with it."
        },
        {
          "name": "allOf",
          "signature": "allOf?: SchemaObject[]",
          "doc": "Schemas that all match, rendered as an intersection unless `oneOf` or `anyOf` is present; the keywords beside it that shape a type, such as `properties`, join the intersection."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "Becomes the doc comment on a component schema's generated type, ahead of `title`, and on an object property's member."
        },
        {
          "name": "title",
          "signature": "title?: string",
          "doc": "The doc comment on a component schema's generated type when `description` is absent; the type's name comes from the component's key, not from `title`."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "ParameterObject",
      "kind": "interface",
      "signature": "interface ParameterObject",
      "doc": "A Parameter Object or a reference to one.",
      "file": "packages/client/src/generate.ts",
      "line": 43,
      "members": [
        {
          "name": "$ref",
          "signature": "$ref?: string",
          "doc": "A reference to `#/components/parameters/<name>`, which replaces this object; any other target, or a missing one, fails generation."
        },
        {
          "name": "name",
          "signature": "name?: string",
          "doc": "The member's key in the generated `params` or `query`, matching the `{name}` placeholder for a path parameter; a parameter without `name` or `in` fails generation."
        },
        {
          "name": "in",
          "signature": "in?: \"query\" | \"querystring\" | \"header\" | \"path\" | \"cookie\"",
          "doc": "Where the parameter travels: `path` fills `params`, `query` adds a member to `query`, `querystring` (OpenAPI 3.2) lets `query` take any key, and `header` and `cookie` are left out."
        },
        {
          "name": "required",
          "signature": "required?: boolean",
          "doc": "Makes a query parameter's member, and the whole `query` input, required; path parameters are generated as required either way, since OpenAPI demands `true` for them."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "The doc comment on the parameter's generated member."
        },
        {
          "name": "schema",
          "signature": "schema?: SchemaObject",
          "doc": "The schema of the value, rendered as the member's type; without it or `content`, the type is `unknown`."
        },
        {
          "name": "content",
          "signature": "content?: Record<string, MediaTypeObject>",
          "doc": "The single media type entry OpenAPI allows in place of `schema`; when `schema` is absent, the entry's `schema` gives the member's type."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "MediaTypeObject",
      "kind": "interface",
      "signature": "interface MediaTypeObject",
      "doc": "A Media Type Object.",
      "file": "packages/client/src/generate.ts",
      "line": 62,
      "members": [
        {
          "name": "schema",
          "signature": "schema?: SchemaObject",
          "doc": "The content's schema, read for a JSON media type in a body and for any media type in a parameter's `content`; when absent, the type is `unknown`."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "RequestBodyObject",
      "kind": "interface",
      "signature": "interface RequestBodyObject",
      "doc": "A Request Body Object or a reference to one.",
      "file": "packages/client/src/generate.ts",
      "line": 69,
      "members": [
        {
          "name": "$ref",
          "signature": "$ref?: string",
          "doc": "A reference to `#/components/requestBodies/<name>`, which replaces this object; any other target, or a missing one, fails generation."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "A brief description of the body; the generator does not carry it into the output."
        },
        {
          "name": "required",
          "signature": "required?: boolean",
          "doc": "Makes the generated `body` input required; OpenAPI's default is `false`, which generates it as optional."
        },
        {
          "name": "content",
          "signature": "content?: Record<string, MediaTypeObject>",
          "doc": "The body by media type, where a JSON type takes precedence and gives its schema's type; otherwise `multipart/form-data` gives `FormData`, `application/x-www-form-urlencoded` gives `URLSearchParams`, `text/*` gives `string`, and any other type gives `BodyInit`."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "ResponseObject",
      "kind": "interface",
      "signature": "interface ResponseObject",
      "doc": "A Response Object or a reference to one.",
      "file": "packages/client/src/generate.ts",
      "line": 82,
      "members": [
        {
          "name": "$ref",
          "signature": "$ref?: string",
          "doc": "A reference to `#/components/responses/<name>`, which replaces this object; any other target, or a missing one, fails generation."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "A description of the response; the generator does not carry it into the output."
        },
        {
          "name": "content",
          "signature": "content?: Record<string, MediaTypeObject>",
          "doc": "The response body by media type: a JSON type, when present, gives its schema's type, `text/*` gives `string`, any other type gives `Blob`, as the client reads it, and no content gives `undefined`."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "OperationObject",
      "kind": "interface",
      "signature": "interface OperationObject",
      "doc": "An Operation Object.",
      "file": "packages/client/src/generate.ts",
      "line": 93,
      "members": [
        {
          "name": "operationId",
          "signature": "operationId?: string",
          "doc": "Names the operation's entry in `Api` and `routes`, in camelCase; without it the name comes from the method and path, such as `putNotesById` for `PUT /notes/{id}`, and two entries with one name fail generation."
        },
        {
          "name": "summary",
          "signature": "summary?: string",
          "doc": "The first paragraph of the doc comment on the operation's entry in `Api`."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "Follows `summary` in the doc comment on the operation's entry in `Api`."
        },
        {
          "name": "deprecated",
          "signature": "deprecated?: boolean",
          "doc": "When `true`, the doc comment on the operation's entry ends with `@deprecated`."
        },
        {
          "name": "parameters",
          "signature": "parameters?: ParameterObject[]",
          "doc": "The operation's parameters, merged with the path item's; one with the same `name` and `in` as a path item parameter replaces it."
        },
        {
          "name": "requestBody",
          "signature": "requestBody?: RequestBodyObject",
          "doc": "The request body, generated as the entry's `body` input; without it the entry has no `body`."
        },
        {
          "name": "responses",
          "signature": "responses?: Record<string, ResponseObject>",
          "doc": "The responses by status code; `output` is the union of every 2xx response, including `2XX`, or of `default` when there is none, and `unknown` without either."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "PathItemObject",
      "kind": "interface",
      "signature": "interface PathItemObject",
      "doc": "A Path Item Object.",
      "file": "packages/client/src/generate.ts",
      "line": 112,
      "members": [
        {
          "name": "$ref",
          "signature": "$ref?: string",
          "doc": "A reference to `#/components/pathItems/<name>`, which replaces this item; any other target, or a missing one, fails generation."
        },
        {
          "name": "summary",
          "signature": "summary?: string",
          "doc": "A summary meant for every operation on the path; the generator does not carry it into the output."
        },
        {
          "name": "description",
          "signature": "description?: string",
          "doc": "A description meant for every operation on the path; the generator does not carry it into the output."
        },
        {
          "name": "parameters",
          "signature": "parameters?: ParameterObject[]",
          "doc": "Parameters shared by every operation on the path; an operation's own parameter with the same `name` and `in` replaces one."
        },
        {
          "name": "get",
          "signature": "get?: OperationObject",
          "doc": "The `GET` operation on this path."
        },
        {
          "name": "put",
          "signature": "put?: OperationObject",
          "doc": "The `PUT` operation on this path."
        },
        {
          "name": "post",
          "signature": "post?: OperationObject",
          "doc": "The `POST` operation on this path."
        },
        {
          "name": "delete",
          "signature": "delete?: OperationObject",
          "doc": "The `DELETE` operation on this path."
        },
        {
          "name": "options",
          "signature": "options?: OperationObject",
          "doc": "The `OPTIONS` operation on this path."
        },
        {
          "name": "head",
          "signature": "head?: OperationObject",
          "doc": "The `HEAD` operation on this path."
        },
        {
          "name": "patch",
          "signature": "patch?: OperationObject",
          "doc": "The `PATCH` operation on this path."
        },
        {
          "name": "trace",
          "signature": "trace?: OperationObject",
          "doc": "The `TRACE` operation on this path."
        },
        {
          "name": "query",
          "signature": "query?: OperationObject",
          "doc": "The `QUERY` operation on this path (OpenAPI 3.2): a safe, idempotent request that carries a body."
        },
        {
          "name": "additionalOperations",
          "signature": "additionalOperations?: Record<string, OperationObject>",
          "doc": "Operations for other HTTP methods (OpenAPI 3.2), keyed by method name such as `COPY`; each key is lowercased, and one that is not a valid method token fails generation."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "OpenApiDocument",
      "kind": "interface",
      "signature": "interface OpenApiDocument",
      "doc": "The parts of an OpenAPI document the generator reads.",
      "file": "packages/client/src/generate.ts",
      "line": 145,
      "members": [
        {
          "name": "openapi",
          "signature": "openapi: string",
          "doc": "The OpenAPI version, such as `3.1.0`; a value that does not start with `3.` fails generation."
        },
        {
          "name": "info",
          "signature": "info?: { title?: string; version?: string }",
          "doc": "The API's title and version, which the generated file's header comment names as its source."
        },
        {
          "name": "paths",
          "signature": "paths?: Record<string, PathItemObject>",
          "doc": "Path templates mapped to their items; every operation under them becomes an entry of `Api` and `routes`, sorted by path."
        },
        {
          "name": "components",
          "signature": "components?: { schemas?: Record<string, SchemaObject>; parameters?: Record<string, ParameterObject>; requestBodies?: Record<string, RequestBodyObject>; responses?: Record<string, ResponseObject>; pathItems?: Record<string, PathItemObject> }",
          "doc": "Reusable objects: each entry of `schemas` becomes an exported type named after its key, and `$ref` values resolve into the other sections."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "GenerateOptions",
      "kind": "interface",
      "signature": "interface GenerateOptions",
      "doc": "Options for `generateClient`.",
      "file": "packages/client/src/generate.ts",
      "line": 164,
      "members": [
        {
          "name": "clientSpecifier",
          "signature": "clientSpecifier?: string",
          "doc": "The module the generated file imports `RouteTable` from. Defaults to `@zerolith/client`."
        },
        {
          "name": "apiName",
          "signature": "apiName?: string",
          "doc": "The name of the generated contract interface. Defaults to `Api`."
        }
      ]
    },
    {
      "package": "@zerolith/client/generate",
      "name": "generateClient",
      "kind": "function",
      "signature": "function generateClient(document: OpenApiDocument, options?: GenerateOptions): string",
      "doc": "Generates the contract module for an OpenAPI 3.x document given as a\nparsed object (JSON; convert YAML first). Schemas under\n`components.schemas` become exported types, every operation becomes an\nentry of the `Api` interface named by its `operationId` (or by its\nmethod and path), and `routes` carries the method and path of each.\nHeader and cookie parameters, security, and non-local references are\nleft out; the client sends headers through its options. A schema whose\ntype name would clash is written under the first free name with a\nnumber added, as `Record2`, with a comment that says why, and every\n`$ref` to it uses that name: one that another schema takes first, as\n`note-item` and `note_item` both give `NoteItem`, one named like the\ninterface of the operations or the `RouteTable` the module imports, and\none named like a built-in type the module writes, such as `Record` for\nan object of free keys or `Blob` for a binary response. A schema named\nlike a built-in the module does not write keeps its name.",
      "file": "packages/client/src/generate.ts",
      "line": 669
    },
    {
      "package": "@zerolith/client/port",
      "name": "PortLike",
      "kind": "interface",
      "signature": "interface PortLike",
      "doc": "The port shapes supported: a DOM `MessagePort`, Node's, or Electron's `MessagePortMain`.",
      "file": "packages/client/src/port.ts",
      "line": 9,
      "members": [
        {
          "name": "postMessage",
          "signature": "postMessage(message: unknown): void",
          "doc": "Sends a message to the other end; `portTransport` posts each `PortRequest` through it and `servePort` each `PortResponse`."
        },
        {
          "name": "start",
          "signature": "start?(): void",
          "doc": "Starts delivering messages; called, when present, right after the listener is attached, since a DOM `MessagePort` and Electron's `MessagePortMain` queue messages until it runs."
        },
        {
          "name": "addEventListener",
          "signature": "addEventListener?(type: \"message\", listener: (event: { data: unknown }) => void): void",
          "doc": "Receives messages the `EventTarget` way, as a DOM `MessagePort` does; used in preference to `on` when both exist."
        },
        {
          "name": "on",
          "signature": "on?(type: \"message\", listener: (event: { data: unknown }) => void): void",
          "doc": "Receives messages the `EventEmitter` way, as Electron's `MessagePortMain` does; used when `addEventListener` is absent, and a port with neither throws a `TypeError`."
        }
      ]
    },
    {
      "package": "@zerolith/client/port",
      "name": "PortRequest",
      "kind": "interface",
      "signature": "interface PortRequest",
      "doc": "What crosses the port for a request.",
      "file": "packages/client/src/port.ts",
      "line": 22,
      "members": [
        {
          "name": "kind",
          "signature": "kind: \"zerolith:request\"",
          "doc": "Tags the message as a request, so `servePort` ignores other traffic on the port."
        },
        {
          "name": "id",
          "signature": "id: number",
          "doc": "Pairs the request with its response; each `portTransport` numbers its requests from 1."
        },
        {
          "name": "url",
          "signature": "url: string",
          "doc": "The request's absolute URL, from which `servePort` builds the `Request` its handler receives."
        },
        {
          "name": "method",
          "signature": "method: string",
          "doc": "The request method as `Request.method` reports it, such as `POST`."
        },
        {
          "name": "headers",
          "signature": "headers: [string, string][]",
          "doc": "The request headers as `[name, value]` pairs with lowercase names, as iterating a `Headers` yields them."
        },
        {
          "name": "body",
          "signature": "body: string | null",
          "doc": "The body as UTF-8 text, or `null` for a `GET` or `HEAD` request or an empty body."
        }
      ]
    },
    {
      "package": "@zerolith/client/port",
      "name": "PortResponse",
      "kind": "interface",
      "signature": "interface PortResponse",
      "doc": "What crosses the port for a response.",
      "file": "packages/client/src/port.ts",
      "line": 39,
      "members": [
        {
          "name": "kind",
          "signature": "kind: \"zerolith:response\"",
          "doc": "Tags the message as a response, so `portTransport` ignores other traffic on the port."
        },
        {
          "name": "id",
          "signature": "id: number",
          "doc": "The `id` of the request this answers; an answer with no pending request, such as one whose call was aborted, is dropped."
        },
        {
          "name": "status",
          "signature": "status: number",
          "doc": "The status code of the handler's response, or 500 when the handler threw."
        },
        {
          "name": "statusText",
          "signature": "statusText: string",
          "doc": "The status text of the handler's response, empty when none was set."
        },
        {
          "name": "headers",
          "signature": "headers: [string, string][]",
          "doc": "The response headers as `[name, value]` pairs with lowercase names, as iterating a `Headers` yields them."
        },
        {
          "name": "body",
          "signature": "body: string | null",
          "doc": "The body as UTF-8 text, or `null` when it is empty, as for a 204."
        }
      ]
    },
    {
      "package": "@zerolith/client/port",
      "name": "portTransport",
      "kind": "function",
      "signature": "function portTransport(port: PortLike): Transport",
      "doc": "A `Transport` that sends each request over the port as a message and\nresolves with the response that comes back under the same id. Aborting\nthe request's signal rejects the call; the message already sent is\nanswered and ignored.",
      "file": "packages/client/src/port.ts",
      "line": 78
    },
    {
      "package": "@zerolith/client/port",
      "name": "servePort",
      "kind": "function",
      "signature": "function servePort(port: PortLike, handler: (request: Request) => Response | Promise<Response>): void",
      "doc": "Answers the requests `portTransport` sends by building a `Request`,\ncalling `handler`, and posting the response back. A handler that throws\nanswers with a 500 problem so the client sees a `ProblemError`.",
      "file": "packages/client/src/port.ts",
      "line": 127
    },
    {
      "package": "@zerolith/test",
      "name": "Mounted",
      "kind": "interface",
      "signature": "interface Mounted",
      "doc": "What `mount` returns.",
      "file": "packages/test/src/index.ts",
      "line": 10,
      "members": [
        {
          "name": "container",
          "signature": "readonly container: HTMLElement",
          "doc": "The element the view was rendered into."
        },
        {
          "name": "root",
          "signature": "readonly root: Root",
          "doc": "The root `render` returned for the view; `unmount` disposes it."
        },
        {
          "name": "unmount",
          "signature": "unmount(): void",
          "doc": "Disposes the view and removes the container; `cleanup` does the same for every mount."
        }
      ]
    },
    {
      "package": "@zerolith/test",
      "name": "MountOptions",
      "kind": "interface",
      "signature": "interface MountOptions",
      "doc": "Options for `mount`.",
      "file": "packages/test/src/index.ts",
      "line": 21,
      "members": [
        {
          "name": "container",
          "signature": "container?: HTMLElement",
          "doc": "Renders into this element instead of a new `div`."
        },
        {
          "name": "attach",
          "signature": "attach?: boolean",
          "doc": "Appends a new container to `document.body`. Defaults to true; layout and focus need it. Ignored with `container`."
        }
      ]
    },
    {
      "package": "@zerolith/test",
      "name": "mount",
      "kind": "function",
      "signature": "function mount(view: unknown, options?: MountOptions): Mounted",
      "doc": "Renders a view into a container and remembers it for `cleanup`. Given a\nfunction that returns the view, as `mount(() => Page())`, it hands the\nfunction to `render`, which calls it inside the root's owner, so a\ncomponent that registers cleanups with `onDispose` mounts as it is, and\nits cleanups run when the view is unmounted. A component that takes\nprops, passed uncalled, fails with `mount_component_uncalled`, as\n`render` does. A container `mount` created is removed even when\nrendering throws.",
      "file": "packages/test/src/index.ts",
      "line": 41
    },
    {
      "package": "@zerolith/test",
      "name": "cleanup",
      "kind": "function",
      "signature": "function cleanup(): void",
      "doc": "Unmounts everything `mount` created, newest first, each even when another's cleanup throws, and then throws the first error. Register it as the runner's after-each hook.",
      "file": "packages/test/src/index.ts",
      "line": 89
    },
    {
      "package": "@zerolith/test",
      "name": "settle",
      "kind": "function",
      "signature": "function settle(rounds?: number): Promise<void>",
      "doc": "Waits `rounds` turns of the timer queue, two by default: enough for\npromise chains, a resource whose loader resolves at once, and zero-delay\ntimers. Effects run synchronously when a signal changes, so they need no\nsettling. For a module import or a request, wait on its result with the\nrunner's `waitFor` instead.",
      "file": "packages/test/src/index.ts",
      "line": 116
    },
    {
      "package": "@zerolith/test",
      "name": "hydrationMismatches",
      "kind": "function",
      "signature": "function hydrationMismatches(view: () => unknown): HydrationMismatch[]",
      "doc": "Renders `view` with the server renderer, hydrates it over that markup,\nand returns every disagreement. Each pass calls `view` inside its own\nowner, so the effects and `onDispose` cleanups a component registers end\nbefore the helper returns. An empty array means the component hydrates\ncleanly; the container is discarded afterwards.",
      "file": "packages/test/src/index.ts",
      "line": 133
    },
    {
      "package": "@zerolith/test",
      "name": "AccessibilityCode",
      "kind": "typeAlias",
      "signature": "type AccessibilityCode = \"image_without_alt\" | \"control_without_label\" | \"button_without_name\" | \"link_without_name\" | \"frame_without_title\"",
      "doc": "The accessibility checks `accessibilityIssues` runs.",
      "file": "packages/test/src/index.ts",
      "line": 144
    },
    {
      "package": "@zerolith/test",
      "name": "AccessibilityIssue",
      "kind": "interface",
      "signature": "interface AccessibilityIssue",
      "doc": "One defect found by `accessibilityIssues`.",
      "file": "packages/test/src/index.ts",
      "line": 147,
      "members": [
        {
          "name": "code",
          "signature": "readonly code: AccessibilityCode",
          "doc": "Which check the element failed, such as `image_without_alt`."
        },
        {
          "name": "element",
          "signature": "readonly element: Element",
          "doc": "The element that failed the check, found inside the container passed to `accessibilityIssues`."
        }
      ]
    },
    {
      "package": "@zerolith/test",
      "name": "accessibilityIssues",
      "kind": "function",
      "signature": "function accessibilityIssues(container: ParentNode): AccessibilityIssue[]",
      "doc": "Finds the defects that need no accessibility tree to detect, the ones the\nWebAIM Million finds on most home pages: images without `alt`, form\ncontrols without a label, buttons and links without an accessible name,\nand frames without a title. It is a floor, not a conformance check.",
      "file": "packages/test/src/index.ts",
      "line": 205
    },
    {
      "package": "@zerolith/a11y",
      "name": "FocusOrigin",
      "kind": "typeAlias",
      "signature": "type FocusOrigin = \"keyboard\" | \"pointer\" | \"touch\" | \"program\"",
      "doc": "How the element that has focus got it.",
      "file": "packages/a11y/src/focus.ts",
      "line": 266
    },
    {
      "package": "@zerolith/a11y",
      "name": "FocusOriginMonitor",
      "kind": "interface",
      "signature": "interface FocusOriginMonitor",
      "doc": "What `focusOrigin` returns.",
      "file": "packages/a11y/src/focus.ts",
      "line": 269,
      "members": [
        {
          "name": "origin",
          "signature": "readonly origin: ReadableSignal<FocusOrigin | null>",
          "doc": "The origin of the current focus, or null while nothing in the document has focus."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Removes the listeners and the attribute."
        }
      ]
    },
    {
      "package": "@zerolith/a11y",
      "name": "FocusTrapOptions",
      "kind": "interface",
      "signature": "interface FocusTrapOptions",
      "doc": "Options for `focusTrap`.",
      "file": "packages/a11y/src/focus.ts",
      "line": 40,
      "members": [
        {
          "name": "initial",
          "signature": "initial?: string | HTMLElement | false",
          "doc": "What receives focus on attach: a selector inside the element, an element, or false to leave focus alone. Defaults to the first focusable, or the element itself."
        },
        {
          "name": "restore",
          "signature": "restore?: boolean",
          "doc": "Returns focus to the element that had it before the trap attached. Defaults to true."
        }
      ]
    },
    {
      "package": "@zerolith/a11y",
      "name": "RovingOptions",
      "kind": "interface",
      "signature": "interface RovingOptions",
      "doc": "Options for `rovingTabindex`.",
      "file": "packages/a11y/src/focus.ts",
      "line": 152,
      "members": [
        {
          "name": "items",
          "signature": "items?: string",
          "doc": "The selector of the items. Defaults to the ARIA roles of composite widgets plus `[data-roving]`."
        },
        {
          "name": "orientation",
          "signature": "orientation?: \"horizontal\" | \"vertical\" | \"both\"",
          "doc": "Which arrow keys move: `horizontal` (left and right), `vertical` (up and down), or `both`. Defaults to both."
        },
        {
          "name": "loop",
          "signature": "loop?: boolean",
          "doc": "Wraps from the last item to the first and back. Defaults to true."
        }
      ]
    },
    {
      "package": "@zerolith/a11y",
      "name": "focusOrigin",
      "kind": "function",
      "signature": "function focusOrigin(doc?: Document): FocusOriginMonitor",
      "doc": "Watches how focus arrives, the way Angular CDK's focus monitor does: a key\npressed before focus moves means keyboard, a pointer pressed means pointer\nor touch, anything else means program. The origin is a signal and a\n`data-focus-origin` attribute on the root element, so a stylesheet can\nshow focus rings for keyboard users only: `[data-focus-origin=\"keyboard\"] :focus { outline: ... }`.",
      "file": "packages/a11y/src/focus.ts",
      "line": 284
    },
    {
      "package": "@zerolith/a11y",
      "name": "focusTrap",
      "kind": "function",
      "signature": "function focusTrap(options?: FocusTrapOptions): (element: Element) => void",
      "doc": "A `ref` that keeps Tab and Shift+Tab inside the element, pulls focus back\nwhen it lands outside, moves focus in once the element is in the document,\nand returns it where it came from when the element's template is removed.\nWith traps on several elements, as when a dialog opens a confirmation,\nonly the newest acts until its template is removed.",
      "file": "packages/a11y/src/focus.ts",
      "line": 55
    },
    {
      "package": "@zerolith/a11y",
      "name": "focusables",
      "kind": "function",
      "signature": "function focusables(root: Element): HTMLElement[]",
      "doc": "The elements inside `root` that take Tab focus, in document order, skipping anything hidden.",
      "file": "packages/a11y/src/focus.ts",
      "line": 31
    },
    {
      "package": "@zerolith/a11y",
      "name": "rovingTabindex",
      "kind": "function",
      "signature": "function rovingTabindex(options?: RovingOptions): (element: Element) => void",
      "doc": "A `ref` for a composite widget: exactly one item is in the Tab order, the\narrow keys, Home, and End move between items, and the item that was\nselected or checked starts as the current one. Disabled, hidden, and\ninert items are skipped, as the children of a collapsed tree item are.",
      "file": "packages/a11y/src/focus.ts",
      "line": 170
    },
    {
      "package": "@zerolith/a11y",
      "name": "Announcer",
      "kind": "interface",
      "signature": "interface Announcer",
      "doc": "What `createAnnouncer` returns.",
      "file": "packages/a11y/src/announce.ts",
      "line": 15,
      "members": [
        {
          "name": "announce",
          "signature": "announce(message: string, politeness?: Politeness): void",
          "doc": "Queues a message for the live region; `assertive` interrupts what is being read."
        },
        {
          "name": "dispose",
          "signature": "dispose(): void",
          "doc": "Removes the live regions."
        }
      ]
    },
    {
      "package": "@zerolith/a11y",
      "name": "Politeness",
      "kind": "typeAlias",
      "signature": "type Politeness = \"polite\" | \"assertive\"",
      "doc": "How urgently a message is read.",
      "file": "packages/a11y/src/announce.ts",
      "line": 12
    },
    {
      "package": "@zerolith/a11y",
      "name": "createAnnouncer",
      "kind": "function",
      "signature": "function createAnnouncer(doc?: Document): Announcer",
      "doc": "Creates a pair of live regions, one polite and one assertive, appended to\nthe document body at once, so assistive technology knows them before the\nfirst message, and hidden visually by inline styles, which hold in any\ndocument `doc` names. Each announcement clears the\nregion and writes the message on the next task, so repeating a message\nis read again.",
      "file": "packages/a11y/src/announce.ts",
      "line": 31
    },
    {
      "package": "@zerolith/a11y",
      "name": "visuallyHidden",
      "kind": "variable",
      "signature": "const visuallyHidden: Styles",
      "doc": "The clip pattern that hides an element visually while assistive technology still reads it.",
      "file": "packages/a11y/src/announce.ts",
      "line": 7
    },
    {
      "package": "@zerolith/a11y",
      "name": "forcedColors",
      "kind": "function",
      "signature": "function forcedColors(): ReadableSignal<boolean>",
      "doc": "True while the user agent is in forced colors mode, such as Windows high contrast, where author colors are replaced by system ones.",
      "file": "packages/a11y/src/media.ts",
      "line": 31
    },
    {
      "package": "@zerolith/a11y",
      "name": "mediaQuery",
      "kind": "function",
      "signature": "function mediaQuery(query: string): ReadableSignal<boolean>",
      "doc": "A media query as a signal that follows the query's matches; false wherever `matchMedia` does not exist, such as on the server.",
      "file": "packages/a11y/src/media.ts",
      "line": 9
    },
    {
      "package": "@zerolith/a11y",
      "name": "reducedMotion",
      "kind": "function",
      "signature": "function reducedMotion(): ReadableSignal<boolean>",
      "doc": "True while the user has asked for reduced motion.",
      "file": "packages/a11y/src/media.ts",
      "line": 37
    },
    {
      "package": "@zerolith/i18n",
      "name": "LanguageRange",
      "kind": "interface",
      "signature": "interface LanguageRange",
      "doc": "One entry of an `Accept-Language` header or of `navigator.languages`.",
      "file": "packages/i18n/src/index.ts",
      "line": 12,
      "members": [
        {
          "name": "range",
          "signature": "readonly range: string",
          "doc": "The language tag, or `*` for any language, as written before any `;` parameters."
        },
        {
          "name": "quality",
          "signature": "readonly quality: number",
          "doc": "The entry's `q` weight between 0 and 1, rounded to three decimals; 1 when the entry gives none."
        }
      ]
    },
    {
      "package": "@zerolith/i18n",
      "name": "parseAcceptLanguage",
      "kind": "function",
      "signature": "function parseAcceptLanguage(header: string | null | undefined): LanguageRange[]",
      "doc": "Parses an `Accept-Language` header into ranges ordered by quality, dropping those with quality zero.",
      "file": "packages/i18n/src/index.ts",
      "line": 21
    },
    {
      "package": "@zerolith/i18n",
      "name": "negotiateLocale",
      "kind": "function",
      "signature": "function negotiateLocale(requested: string | readonly string[] | null | undefined, supported: readonly string[], fallback: string): string",
      "doc": "Picks the supported locale that best matches what was requested: an\n`Accept-Language` header, `navigator.languages`, or one tag. Each range\nis tried in order of quality, first as an exact match, then by dropping\nsubtags from the end as RFC 4647 lookup does, then as the language of a\nmore specific supported locale, preferring one written in the same\nscript, so `zh-HK` finds `zh-TW` before `zh-CN`. `*` and no match at all\ngive `fallback`.",
      "file": "packages/i18n/src/index.ts",
      "line": 75
    },
    {
      "package": "@zerolith/i18n",
      "name": "localeDirection",
      "kind": "function",
      "signature": "function localeDirection(locale: string): \"ltr\" | \"rtl\"",
      "doc": "The writing direction of a locale, from `Intl.Locale` where the engine provides it and otherwise from its script, the likely one when the tag names none, as engines decide.",
      "file": "packages/i18n/src/index.ts",
      "line": 122
    },
    {
      "package": "@zerolith/i18n",
      "name": "LocaleOptions",
      "kind": "interface",
      "signature": "interface LocaleOptions",
      "doc": "Options for `createLocale`.",
      "file": "packages/i18n/src/index.ts",
      "line": 142,
      "members": [
        {
          "name": "supported",
          "signature": "supported: readonly string[]",
          "doc": "The locales the application ships, most preferred first."
        },
        {
          "name": "fallback",
          "signature": "fallback?: string",
          "doc": "The locale used when nothing matches, one of `supported`. Defaults to the first supported one."
        },
        {
          "name": "initial",
          "signature": "initial?: string | readonly string[] | null",
          "doc": "What to negotiate from at first: an `Accept-Language` header, `navigator.languages`, or a tag. Defaults to the fallback."
        }
      ]
    },
    {
      "package": "@zerolith/i18n",
      "name": "LocaleState",
      "kind": "interface",
      "signature": "interface LocaleState",
      "doc": "The current locale as state.",
      "file": "packages/i18n/src/index.ts",
      "line": 153,
      "members": [
        {
          "name": "locale",
          "signature": "readonly locale: ReadableSignal<string>",
          "doc": "The current locale, always one of `supported`."
        },
        {
          "name": "direction",
          "signature": "readonly direction: ReadableSignal<\"ltr\" | \"rtl\">",
          "doc": "The writing direction of the current locale."
        },
        {
          "name": "supported",
          "signature": "readonly supported: readonly string[]",
          "doc": "A copy of the `supported` option, in the same order; `set` negotiates against it."
        },
        {
          "name": "set",
          "signature": "set(requested: string | readonly string[]): void",
          "doc": "Switches locales after negotiating the request against `supported`."
        }
      ]
    },
    {
      "package": "@zerolith/i18n",
      "name": "createLocale",
      "kind": "function",
      "signature": "function createLocale(options: LocaleOptions): LocaleState",
      "doc": "Creates the locale state for an application. Throws a `TypeError` when `supported` is empty or `fallback` is not one of its locales, since the locale must always be one of them.",
      "file": "packages/i18n/src/index.ts",
      "line": 166
    },
    {
      "package": "@zerolith/i18n",
      "name": "applyLocale",
      "kind": "function",
      "signature": "function applyLocale(state: LocaleState, doc?: Document): () => void",
      "doc": "Keeps the document's `lang` and `dir` attributes in step with the locale; returns the effect's disposer.",
      "file": "packages/i18n/src/index.ts",
      "line": 191
    },
    {
      "package": "@zerolith/i18n",
      "name": "Formatters",
      "kind": "interface",
      "signature": "interface Formatters",
      "doc": "Formatters for the current locale; each reads the locale signal when called, so a computed value or template re-renders on a locale change.",
      "file": "packages/i18n/src/index.ts",
      "line": 201,
      "members": [
        {
          "name": "number",
          "signature": "number(value: number, options?: Intl.NumberFormatOptions): string",
          "doc": "Formats a number with `Intl.NumberFormat`."
        },
        {
          "name": "date",
          "signature": "date(value: Date | number, options?: Intl.DateTimeFormatOptions): string",
          "doc": "Formats a `Date`, or a timestamp in milliseconds since the epoch, with `Intl.DateTimeFormat`."
        },
        {
          "name": "relative",
          "signature": "relative(value: number, unit: Intl.RelativeTimeFormatUnit, options?: Intl.RelativeTimeFormatOptions): string",
          "doc": "Formats a time `value` units of `unit` away from now with `Intl.RelativeTimeFormat`, such as `in 2 hours`; a negative value lies in the past."
        },
        {
          "name": "list",
          "signature": "list(values: Iterable<string>, options?: Intl.ListFormatOptions): string",
          "doc": "Joins strings into a list with `Intl.ListFormat`, such as `a, b, and c` in English."
        },
        {
          "name": "plural",
          "signature": "plural(value: number, options?: Intl.PluralRulesOptions): Intl.LDMLPluralRule",
          "doc": "Selects the plural category of a number with `Intl.PluralRules`, such as `one` or `other`, for choosing a message variant."
        }
      ]
    },
    {
      "package": "@zerolith/i18n",
      "name": "formatters",
      "kind": "function",
      "signature": "function formatters(locale: ReadableSignal<string> | string): Formatters",
      "doc": "Creates formatters over a locale, given as a signal or as a fixed tag. Instances are cached per locale and options.",
      "file": "packages/i18n/src/index.ts",
      "line": 230
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "Catalog",
      "kind": "typeAlias",
      "signature": "type Catalog = Readonly<Record<string, string>>",
      "doc": "A catalog: message key to MessageFormat 2 source.",
      "file": "packages/i18n/src/compile.ts",
      "line": 13
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "CompileOptions",
      "kind": "interface",
      "signature": "interface CompileOptions",
      "doc": "Options for `compileMessages`.",
      "file": "packages/i18n/src/compile.ts",
      "line": 16,
      "members": [
        {
          "name": "language",
          "signature": "language?: \"ts\" | \"js\"",
          "doc": "`ts` emits TypeScript (the default); `js` emits JavaScript with JSDoc types for buildless projects."
        },
        {
          "name": "source",
          "signature": "source?: string",
          "doc": "Named in the generated header."
        }
      ]
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "CompiledCatalog",
      "kind": "interface",
      "signature": "interface CompiledCatalog",
      "doc": "The result of compiling one catalog.",
      "file": "packages/i18n/src/compile.ts",
      "line": 25,
      "members": [
        {
          "name": "code",
          "signature": "code: string",
          "doc": "The generated module's source, TypeScript or JavaScript as the `language` option chose; the `zerolith-i18n` CLI writes it to `<locale>.ts` or `<locale>.js`."
        },
        {
          "name": "names",
          "signature": "names: string[]",
          "doc": "The message keys as function names, in source order."
        }
      ]
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "compileMessages",
      "kind": "function",
      "signature": "function compileMessages(locale: string, catalog: Catalog, options?: CompileOptions): CompiledCatalog",
      "doc": "Compiles one locale's catalog into a module: `locale`, one exported\nfunction per message named from its key, and the `Intl` helpers they\nshare. Each function takes an `args` object typed from the message's\nplaceholders, or nothing when the message has none. A formatter whose\noptions are all literals is a module-level binding created on first use\nand shared by every message that formats the same way; options that read\nan argument find their formatter in a cache keyed by the options. Only\nthe helpers the messages use are written.",
      "file": "packages/i18n/src/compile.ts",
      "line": 946
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "messageNames",
      "kind": "function",
      "signature": "function messageNames(catalog: Catalog): string[]",
      "doc": "The keys of a catalog as function names, for comparing locales.",
      "file": "packages/i18n/src/compile.ts",
      "line": 1012
    },
    {
      "package": "@zerolith/i18n/compile",
      "name": "compileIndex",
      "kind": "function",
      "signature": "function compileIndex(locales: readonly string[], options?: CompileOptions): string",
      "doc": "The index module for a set of locales: the list of locales and one lazy\nloader per locale, so each locale is its own chunk.",
      "file": "packages/i18n/src/compile.ts",
      "line": 1021
    },
    {
      "package": "@zerolith/otel",
      "name": "navigationObserver",
      "kind": "function",
      "signature": "function navigationObserver(tracer?: Tracer): (event: NavigationEvent) => void",
      "doc": "The `observe` function for `createRouter`: a span named `navigate`\nopens when a navigation starts and ends when it commits, fails, or is\ncanceled by a newer navigation, with `zerolith.route`, `url.path`,\n`url.query` when the URL has a query, and `zerolith.navigation.mode` as\nattributes, the loader's error recorded on failure, and\n`zerolith.navigation.canceled` set on a canceled one, whose status stays\nunset. The values of the query keys the URL conventions redact, such as\n`sig`, are recorded as `REDACTED`.",
      "file": "packages/otel/src/index.ts",
      "line": 41
    },
    {
      "package": "@zerolith/otel",
      "name": "tracedHydrate",
      "kind": "function",
      "signature": "function tracedHydrate(view: unknown, container: MountTarget, tracer?: Tracer): HydrateResult",
      "doc": "`hydrate` inside a span named `hydrate`, with the number of mismatches as `zerolith.hydration.mismatches`.",
      "file": "packages/otel/src/index.ts",
      "line": 82
    },
    {
      "package": "@zerolith/otel",
      "name": "traceparent",
      "kind": "function",
      "signature": "function traceparent(active?: Context): string | undefined",
      "doc": "The W3C `traceparent` header for a context, or undefined when no span is active in it.",
      "file": "packages/otel/src/index.ts",
      "line": 107
    },
    {
      "package": "@zerolith/otel",
      "name": "tracedTransport",
      "kind": "function",
      "signature": "function tracedTransport(transport: Transport | undefined, tracer?: Tracer): Transport",
      "doc": "Wraps a transport, or `fetch` when none is given, so every request runs\nin a client span named by its method, as `GET`, with\n`http.request.method`, `url.full`, and `http.response.status_code`,\ncarries a `traceparent` header from that span, and records a failed\nrequest as an error. The span is not named by the request's path, which\nwould give every note its own span name; the HTTP conventions name a\nclient span by its method when no route template is known. `url.full`\nrecords the values of the query keys the conventions redact, such as\n`sig`, as `REDACTED`.",
      "file": "packages/otel/src/index.ts",
      "line": 128
    }
  ]
}
