---
title: "@adonia/ui API"
image: "https://adonia.pages.dev/og.png"
version: "next"
---

> Documentation Index
> Fetch the complete documentation index at: https://adonia.pages.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# @adonia/ui API

<!-- Generated by docs/site/scripts/generate_api.ts. Do not edit. -->

Canonical inventory of every public subpath and TypeScript export in `@adonia/ui`.

## `@adonia/ui`

| Export | Kind | Source | Summary |
| --- | --- | --- | --- |
| `Ability` | type-only type | `packages/ui/src/types.ts:44` | Authorization ability vocabulary (TECH_SPEC §12; frozen in protocol v1 §10). Per-record `can` projections carry a subset of these. |
| `AbilityMap` | type-only type | `packages/ui/src/types.ts:62` | Ability → boolean projection. Keys are optional: fixtures and real payloads carry only the abilities relevant to the projection context (resource-level `abilities` vs per-record `can`). The `JsonObject` intersection keeps the mapped type assignable to inertia's `Record<string, JSONDataTypes>` render constraint (the JSON page-props constraint). |
| `ACCENT_STEPS` | constant | `packages/ui/src/theme/accent_ramp.ts:21` | The eleven ramp steps, light → dark (Tailwind-compatible naming). |
| `AccentRamp` | type-only type | `packages/ui/src/theme/accent_ramp.ts:27` | Step → CSS `oklch()` colour, the shape written into `--adonia-accent-*`. |
| `accentRampVariables` | function | `packages/ui/src/theme/accent_ramp.ts:120` | Map a ramp onto its CSS custom properties, ready to spread into a `style` attribute or a `:root` block. |
| `AccentStep` | type-only type | `packages/ui/src/theme/accent_ramp.ts:24` | One ramp step key, e.g. `'600'`. |
| `ActionBatchStatus` | type-only type | `packages/ui/src/types.ts:238` | Monotonic progress payload returned by the action status route (TECH_SPEC §15.1). |
| `ActionButtons` | function | `packages/ui/src/components/actions.tsx:201` | Action surfaces shared by row menus, bulk selection bars, and page headers. |
| `ActionButtonsProps` | type-only type | `packages/ui/src/components/actions.tsx:61` | Props for row, bulk, and page action buttons. |
| `ActionDescriptor` | type-only type | `packages/ui/src/types.ts:189` | Authorized action descriptor (§10.3). |
| `ActionFailure` | type-only type | `packages/ui/src/types.ts:213` | One target rejected or failed during an action run (TECH_SPEC §15.1). |
| `ActionFetcher` | type-only type | `packages/ui/src/components/actions.tsx:49` | JSON transport used by action run/status calls. |
| `ActionModal` | function | `packages/ui/src/components/actions.tsx:348` | Modal form, queued progress, and safe partial-failure presentation. |
| `ActionModalProps` | type-only type | `packages/ui/src/components/actions.tsx:335` | Props for the action confirmation/schema/progress modal. |
| `ActionRequest` | type-only type | `packages/ui/src/types.ts:207` | Exact action request and result wire contracts. |
| `ActionResult` | type-only type | `packages/ui/src/types.ts:227` | Result union returned by inline and queued actions (TECH_SPEC §15.1). |
| `ActionTargets` | type-only type | `packages/ui/src/hooks/use_table_state.ts:58` | Action target payload (§10.3). `ids` is an explicit row selection; `query` is the "all N matching" escalation — the SERIALIZED QUERY STATE, so the server re-runs the exact same filtered query rather than trusting a client-supplied id list it would have to authorize row by row anyway. |
| `adonia` | function | `packages/ui/src/adonia.tsx:57` | Build the Adonia client config: create a registry pre-populated with the built-ins, apply the user's `registry` customizer, and bind a provider. |
| `AdoniaCommand` | type-only type | `packages/ui/src/registry/index.ts:191` | A command contribution that either navigates or executes a callback. |
| `AdoniaCommandContext` | type-only type | `packages/ui/src/registry/index.ts:166` | Runtime capabilities handed to an `AdoniaCommand` runner. |
| `AdoniaCommandItem` | type-only type | `packages/ui/src/registry/index.ts:201` | One item accepted by `ComponentRegistry.commands`. |
| `AdoniaConfig` | type-only type | `packages/ui/src/adonia.tsx:24` | User-facing client config (TECH_SPEC §13.1), as authored in the scaffolded `inertia/adonia.ts`: |
| `AdoniaContextValue` | type-only type | `packages/ui/src/context.tsx:40` | Value provided by `AdoniaProvider`. |
| `AdoniaDensityToggle` | function | `packages/ui/src/theme/density_toggle.tsx:33` | Switch the panel between comfortable and compact rows, or hand the choice back to the panel's own default. |
| `AdoniaEnvelope` | type-only type | `packages/ui/src/types.ts:355` | Shared `adonia` page prop injected by `AdoniaInertiaMiddleware.share()`, identical across all pages of a panel (protocol v1 §1). Clients MUST hard-fail when `protocolVersion` differs from `1`. |
| `AdoniaI18nContextValue` | type-only interface | `packages/ui/src/i18n.tsx:24` | Browser translation state supplied by `AdoniaI18nProvider`. |
| `AdoniaI18nProvider` | function | `packages/ui/src/i18n.tsx:125` | Installs locale, direction, and the framework-owned catalog for panel descendants. It is SSR-safe: server rendering never reads the DOM. In a browser it keeps the document root direction synchronized for portals and host chrome. |
| `AdoniaI18nProviderProps` | type-only interface | `packages/ui/src/i18n.tsx:36` | Props accepted by `AdoniaI18nProvider`. |
| `AdoniaProvider` | function | `packages/ui/src/context.tsx:79` | Root provider exposing the ComponentRegistry, the theme tokens and the field transports to the renderer tree. SSR-safe; rendering without a provider falls back to the shared default registry and the built-in transports, so packaged pages and tests work standalone. |
| `AdoniaProviderProps` | type-only type | `packages/ui/src/context.tsx:60` | Props of `AdoniaProvider`. |
| `AdoniaTheme` | type-only type | `packages/ui/src/context.tsx:20` | Theme configuration carried by the Adonia context (TECH_SPEC §13.5). |
| `AdoniaThemeToggle` | function | `packages/ui/src/theme/theme_toggle.tsx:20` | Flip the panel between light and dark. Renders nothing unless the panel opted into the `'class'` dark-mode strategy — under `'system'` the OS preference owns the scheme and a toggle would lie, and under `'off'` there is nothing to toggle to. |
| `AdoniaTokenName` | type-only type | `packages/ui/src/theme/tokens.ts:20` | Any Adonia custom property name. |
| `AdoniaTransports` | type-only type | `packages/ui/src/transports.ts:172` | The transports a panel can override (TECH_SPEC §13.2 extension surface). Both are optional; each falls back to its default independently. |
| `AdoniaUiPlugin` | type-only type | `packages/ui/src/registry/index.ts:274` | A callback plugin or a duplicate-safe named plugin object. |
| `AdoniaUiPluginCallback` | type-only type | `packages/ui/src/registry/index.ts:252` | Callback-form UI plugin. Callbacks are intentionally unnamed and may be composed repeatedly; use a named plugin when duplicate detection matters. |
| `Alert` | function | `packages/ui/src/components/ui/alert.tsx:26` | Styled status alert container with semantic alert behavior. |
| `AlertAction` | function | `packages/ui/src/components/ui/alert.tsx:73` | Layout region for actions associated with an alert. |
| `AlertDescription` | function | `packages/ui/src/components/ui/alert.tsx:56` | Styled description region for alert details. |
| `AlertDialog` | constant | `packages/ui/src/components/ui/alert-dialog.tsx:10` | Base UI alert-dialog root re-exported for ejected pages. |
| `AlertDialogClose` | function | `packages/ui/src/components/ui/alert-dialog.tsx:172` | Styled Base UI control that closes an alert dialog. |
| `AlertDialogDescription` | function | `packages/ui/src/components/ui/alert-dialog.tsx:158` | Styled Base UI description for an alert dialog. |
| `AlertDialogFooter` | function | `packages/ui/src/components/ui/alert-dialog.tsx:119` | Layout container for alert-dialog actions. |
| `AlertDialogHeader` | function | `packages/ui/src/components/ui/alert-dialog.tsx:102` | Layout container for an alert-dialog heading. |
| `AlertDialogPopup` | function | `packages/ui/src/components/ui/alert-dialog.tsx:68` | Styled Base UI popup containing alert-dialog content. |
| `AlertDialogTitle` | function | `packages/ui/src/components/ui/alert-dialog.tsx:141` | Styled Base UI title for an alert dialog. |
| `AlertDialogTrigger` | function | `packages/ui/src/components/ui/alert-dialog.tsx:27` | Styled Base UI trigger that opens an alert dialog. |
| `appendStateQuery` | function | `packages/ui/src/form/refetch.ts:51` | Append a `withState` slice to a capability URL as query parameters, one per declared key under its own name. |
| `applyDerived` | function | `packages/ui/src/form/derive.ts:89` | Merge derived values into a state map, restricted to keys the descriptor actually declares. |
| `assertProtocolVersion` | function | `packages/ui/src/components/chrome/protocol_version.ts:20` | Throw unless the envelope's `protocolVersion` is the one this build understands. |
| `BADGE_TONES` | constant | `packages/ui/src/components/badge_tones.ts:19` | Palette token → semantic Badge variant. |
| `BadgeCell` | function | `packages/ui/src/components/cells/badge_cell.tsx:14` | Built-in `badge` cell (TECH_SPEC §8.1 `C.badge().colors(map).icons(map)`). A null value is not a badge — it renders the same em dash every other cell uses for "no value", so an empty column reads as empty rather than as a grey pill labelled "—". |
| `BadgeEntry` | function | `packages/ui/src/components/display/badge_entry.tsx:30` | Built-in `badge-entry` display projection (protocol v1 §8): the detail counterpart of a `select`/`radio`/`checkbox-list` whose options carry colours, and of a hand-written `s.badgeEntry(attr).colors(map)`. |
| `badgeToneClass` | function | `packages/ui/src/components/badge_tones.ts:94` | Compatibility classes for non-Badge callers; prefer badgeToneVariant. |
| `badgeToneVariant` | function | `packages/ui/src/components/badge_tones.ts:89` | Semantic Badge variant for a palette token; unknown tokens read neutral. |
| `BelongsToInput` | function | `packages/ui/src/components/fields/relation_input.tsx:264` | To-one relation picker with remote search and inline create. |
| `BelongsToManyInput` | function | `packages/ui/src/components/fields/relation_input.tsx:357` | To-many relation picker with an optional pivot form per selection. |
| `BooleanCell` | function | `packages/ui/src/components/cells/boolean_cell.tsx:15` | Built-in `boolean` cell (TECH_SPEC §8.1 `C.boolean().trueIcon().falseIcon()`). |
| `booleanValue` | function | `packages/ui/src/components/fields/checkbox_input.tsx:17` | Read a boolean field's state tolerantly. |
| `BreadcrumbItem` | type-only type | `packages/ui/src/components/chrome/breadcrumbs.tsx:24` | One crumb. `url` is absent on the trailing crumb (the current page) and on any purely structural ancestor that has no page of its own. |
| `Breadcrumbs` | function | `packages/ui/src/components/chrome/breadcrumbs.tsx:50` | Render the trail, or nothing when there is none — an empty `nav` landmark is noise for screen-reader users. |
| `BreadcrumbsProps` | type-only type | `packages/ui/src/components/chrome/breadcrumbs.tsx:30` | Props of `Breadcrumbs`. |
| `buildAccentRamp` | function | `packages/ui/src/theme/accent_ramp.ts:104` | Build the eleven `--adonia-accent-*` values from one accent colour. |
| `buildFormState` | function | `packages/ui/src/form/nodes.ts:63` | Project incoming state onto the descriptor's key set — the client half of the state-hygiene invariant (protocol v1 §7). |
| `buildSubmitPayload` | function | `packages/ui/src/form/reactivity.ts:88` | The payload a submit sends: the current value of every VISIBLE key, with `sets` derivations overlaid (mirroring R3 + R6). |
| `BUILTIN_TRANSFORMS` | constant | `packages/ui/src/transforms.ts:33` | Built-in transforms pre-registered by `createAdoniaRegistry`. |
| `Button` | function | `packages/ui/src/components/ui/button.tsx:57` | Styled Base UI-compatible button with loading-state support. |
| `buttonVariants` | constant | `packages/ui/src/components/ui/button.tsx:9` | Variant styles shared by the Adonia button component. |
| `cellHref` | function | `packages/ui/src/components/cells/cell_link.tsx:42` | Resolve a column's `link` prop to an href (TECH_SPEC §8.1 `.link('detail' \| 'edit' \| UrlFn)`). |
| `CellLink` | function | `packages/ui/src/components/cells/cell_link.tsx:66` | Wrap cell content in an Inertia link when the column declares one, and render it bare otherwise. SSR-safe: prefers the enclosing table's base path, otherwise the current page URL from `usePage()`. |
| `CellLinkProps` | type-only type | `packages/ui/src/components/cells/cell_link.tsx:55` | Props of `CellLink`. |
| `CellProps` | type-only type | `packages/ui/src/registry/index.ts:137` | Props of a registered cell component (table column position). |
| `Checkbox` | function | `packages/ui/src/components/ui/checkbox.tsx:6` | Styled Base UI checkbox with checked and indeterminate indicators. |
| `CheckboxInput` | function | `packages/ui/src/components/fields/checkbox_input.tsx:32` | Built-in `checkbox` field (TECH_SPEC §7.3: `inline()`). |
| `CheckboxListInput` | function | `packages/ui/src/components/fields/checkbox_list.tsx:29` | Built-in `checkbox-list` field (TECH_SPEC §7.3, "array state": `options()`, `columns(n)`, `minSelected`/`maxSelected`). |
| `civilFromInstant` | function | `packages/ui/src/components/fields/temporal.ts:102` | Render a UTC ISO instant as the civil string `<input type="datetime-local">` expects, in `timeZone`. Seconds are included only when they are non-zero, because a control showing `:00` invites the user to edit a precision the record never had. |
| `clearColumnPreference` | function | `packages/ui/src/hooks/column_preferences.ts:160` | Remove a local layout so descriptor defaults apply again. |
| `ClientOnly` | function | `packages/ui/src/components/client_only.tsx:42` | Render `children` in the browser only, `fallback` on the server. |
| `ClientOnlyProps` | type-only type | `packages/ui/src/components/client_only.tsx:19` | Props of `ClientOnly`. |
| `cn` | function | `packages/ui/src/lib/utils.ts:5` | Compose conditional class names and dedupe Tailwind conflicts. |
| `CodeEntry` | function | `packages/ui/src/components/display/code_entry.tsx:22` | Built-in `code-entry` display projection (TECH_SPEC §7.1): the detail counterpart of `code` and `json`. |
| `CodeInput` | function | `packages/ui/src/components/fields/code_input.tsx:36` | Source editor with a lazily loaded highlighter. |
| `collectFieldNodes` | function | `packages/ui/src/form/nodes.ts:37` | Every state-bearing node of a descriptor tree, in DOCUMENT ORDER. |
| `collectStateKeys` | function | `packages/ui/src/utils.ts:53` | Collect every state-bearing node key in a descriptor tree. Used to enforce the state-hygiene invariant on submit (protocol v1 §7): keys without a node are dropped and never submitted. |
| `COLOR_SCHEME_STORAGE_KEY` | constant | `packages/ui/src/theme/color_scheme.ts:31` | `localStorage` key holding the user's manual choice. |
| `ColorInput` | function | `packages/ui/src/components/fields/color_input.tsx:30` | Built-in `color` field (TECH_SPEC §7.3; `hex()`, `oklch()`, `alpha()`, `swatches()`). |
| `ColorScheme` | type-only type | `packages/ui/src/theme/color_scheme.ts:28` | A resolved colour scheme. |
| `ColorSchemeControls` | type-only type | `packages/ui/src/theme/color_scheme.ts:34` | What `useColorScheme` hands a toggle component. |
| `ColumnDescriptor` | type-only type | `packages/ui/src/types.ts:136` | Table column (protocol v1 §3). `key` addresses the row map VERBATIM — dotted keys like `author.fullName` read `row["author.fullName"]` and MUST NOT be split into a nested lookup. |
| `columnPreferenceKey` | function | `packages/ui/src/hooks/column_preferences.ts:42` | `localStorage` key for one resource and viewer. |
| `ColumnPreferences` | type-only type | `packages/ui/src/hooks/column_preferences.ts:17` | Persistent layout for one resource table. Pinned columns are pinned left. |
| `ColumnPreferenceViewer` | type-only type | `packages/ui/src/hooks/column_preferences.ts:29` | Optional identity supplied by the additive protocol envelope. |
| `CommandPalette` | function | `packages/ui/src/components/chrome/command_palette.tsx:219` | Panel-wide ⌘K / Ctrl+K search palette. |
| `CommandPaletteGroup` | type-only type | `packages/ui/src/components/chrome/command_palette.tsx:56` | One grouped resource result. |
| `CommandPaletteHit` | type-only type | `packages/ui/src/components/chrome/command_palette.tsx:42` | One global-search hit. |
| `CommandPaletteProps` | type-only type | `packages/ui/src/components/chrome/command_palette.tsx:66` | Props of `CommandPalette`. |
| `ComponentRegistry` | class | `packages/ui/src/registry/index.ts:284` | ComponentRegistry — the ABI-stable contribution surface for descriptor components and panel commands (TECH_SPEC §13.2). Registration is last-write-wins; overriding a built-in component logs a dev-build warning. |
| `ControlledDataTable` | function | `packages/ui/src/components/table/table.tsx:167` | Table renderer for pages that share one URL-state controller with adjacent controls. |
| `copyTransform` | constant | `packages/ui/src/transforms.ts:30` | `copy` built-in: pass the source value through unchanged. |
| `CountCell` | function | `packages/ui/src/components/cells/count_cell.tsx:16` | Built-in `count` cell (TECH_SPEC §8.1 `C.count(relation)` and its `sum`/`exists` siblings). |
| `createAdoniaRegistry` | function | `packages/ui/src/registry/index.ts:709` | Create a registry pre-populated with every core schema renderer, table renderer, widget, and built-in transform. |
| `CreateModal` | function | `packages/ui/src/components/fields/create_modal.tsx:113` | Modal dialog rendering the target resource's create form. |
| `CreateModalProps` | type-only type | `packages/ui/src/components/fields/create_modal.tsx:94` | Props of `CreateModal`. |
| `DANGER_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:41` | Destructive button: outlined until confirmed, never filled by default. |
| `DarkModeStrategy` | type-only type | `packages/ui/src/theme/color_scheme.ts:25` | Dark-mode strategy declared by a panel's `theme.darkMode`. |
| `DashboardPageProps` | type-only type | `packages/ui/src/types.ts:460` | Props of the packaged `adonia/dashboard` page (§10.1 `dashboard`). |
| `DataTable` | function | `packages/ui/src/components/table/table.tsx:156` | The descriptor-driven index table (TECH_SPEC §8, §13.3). |
| `DataTableProps` | type-only type | `packages/ui/src/components/table/table.tsx:59` | Props of `DataTable`. |
| `DateCell` | function | `packages/ui/src/components/cells/date_cell.tsx:94` | Built-in `date` cell (TECH_SPEC §8.1 `C.date().format(fmt).since()`). |
| `DateInput` | function | `packages/ui/src/components/fields/date_input.tsx:25` | Built-in `date` field (TECH_SPEC §7.3; `timezone`, `displayTimezone`, `after`, `before`). |
| `DateRangeFilter` | function | `packages/ui/src/components/filters/date_range_filter.tsx:32` | Built-in date-range filter: separate From/To coss day pickers. |
| `DateTimeInput` | function | `packages/ui/src/components/fields/datetime_input.tsx:30` | Built-in `datetime` field (TECH_SPEC §7.3; `timezone`, `displayTimezone`, `after`, `before`). |
| `DEFAULT_ACCENT` | constant | `packages/ui/src/theme/accent_ramp.ts:40` | Accent used when a panel declares none, and the fallback for an accent string this module cannot parse. |
| `defaultJsonFetcher` | constant | `packages/ui/src/transports.ts:150` | Default JSON transport: the global `fetch`, with the same credential, `Accept` and CSRF posture every Adonia capability request uses. |
| `Density` | type-only type | `packages/ui/src/theme/tokens.ts:497` | Density preset name accepted by `AdoniaTheme.density`. |
| `DENSITY_STORAGE_KEY` | constant | `packages/ui/src/theme/density.ts:30` | `localStorage` key holding the operator's density override. |
| `DENSITY_UNITS` | constant | `packages/ui/src/theme/tokens.ts:491` | Density presets (TECH_SPEC §13.5 "density spacing"). A panel picks one and the whole spacing scale follows, because every step is a multiple of `--adonia-density`. |
| `DensityControls` | type-only type | `packages/ui/src/theme/density.ts:38` | What `useDensity` hands a density control. |
| `DensityPreference` | type-only type | `packages/ui/src/theme/density.ts:35` | The operator's choice, or `null` to defer to the panel's own default. |
| `densityUnit` | function | `packages/ui/src/theme/density.ts:155` | The CSS value `--adonia-density` takes for a resolved density. |
| `DerivationResult` | type-only type | `packages/ui/src/form/derive.ts:25` | Outcome of one derivation pass: the derived values plus dev-mode warnings. |
| `deriveSets` | function | `packages/ui/src/form/derive.ts:53` | Run every `sets` entry declared by `nodes`, in document order, against one state snapshot. |
| `DescriptorNode` | type-only type | `packages/ui/src/types.ts:103` | One node of the descriptor tree (protocol v1 §2). The skeleton is frozen: new top-level keys require a protocol bump; `props` contents are the open, additive-only escape hatch. |
| `DIRTY_GUARD_MESSAGE` | constant | `packages/ui/src/form/guard.ts:30` | Bundled-English default for direct callers outside React; form hooks pass the active catalog value. |
| `DirtyGuardDialog` | function | `packages/ui/src/components/chrome/dirty_guard_dialog.tsx:39` | Render the discard confirmation. |
| `DirtyGuardPrompt` | type-only type | `packages/ui/src/form/guard.ts:36` | Asks the user whether to discard unsaved changes: `true` leaves the page, `false` stays on it. |
| `EditorLoader` | type-only type | `packages/ui/src/components/fields/lazy.tsx:33` | A dynamic-import thunk resolving to a default-exported component. |
| `Empty` | function | `packages/ui/src/components/ui/empty.tsx:21` | Styled container for an empty-state presentation. |
| `EMPTY_VALUE` | constant | `packages/ui/src/components/display/entry_shell.tsx:27` | Rendered for an entry whose value is absent — one dash, everywhere. |
| `EmptyContent` | function | `packages/ui/src/components/ui/empty.tsx:125` | Layout container for empty-state actions or supporting content. |
| `EmptyDescription` | function | `packages/ui/src/components/ui/empty.tsx:108` | Styled description for an empty-state message. |
| `EmptyHeader` | function | `packages/ui/src/components/ui/empty.tsx:38` | Layout container for an empty-state heading. |
| `EmptyTitle` | function | `packages/ui/src/components/ui/empty.tsx:94` | Styled title for an empty-state message. |
| `EntryShell` | function | `packages/ui/src/components/display/entry_shell.tsx:46` | Label + value block shared by every entry. The label is a real `<dt>`, and its id is exposed on the `<dd>` through `aria-labelledby` so a value read on its own still announces what it is. |
| `EntryShellProps` | type-only type | `packages/ui/src/components/display/entry_shell.tsx:30` | Props of `EntryShell`. |
| `ErrorPageProps` | type-only type | `packages/ui/src/types.ts:472` | Props of the packaged `adonia/error` page (TECH_SPEC §17), built server-side by `errorPageProps` in `@adonia/core`. Every member is always present: the production/development split is a server decision, so the page never has to ask which environment it runs in. |
| `EvalResult` | type-only type | `packages/ui/src/json_logic.ts:50` | Result of evaluating one rule: the raw value plus dev-mode warnings. |
| `evaluate` | function | `packages/ui/src/json_logic.ts:112` | Evaluates one rule against the root form `state`. `./`-prefixed `var` paths resolve against `scope` (a repeater row sub-state, the repeater-scoping contract); every other path is absolute against the root state. |
| `evaluateCondition` | function | `packages/ui/src/json_logic.ts:244` | Evaluates a reactive rule for a visibility/requiredness/disabledness decision: `Boolean()` applied to the raw rule value, per the reactivity contract's pinned truthiness. Warnings are dropped — decisions never throw and never block a render. |
| `evaluateReactivity` | function | `packages/ui/src/form/reactivity.ts:44` | Evaluate `visibleWhen` / `disabledWhen` / `requiredWhen` for every node against one flat state (mirroring R1: a single pass, no fixpoint, hidden fields' values still visible to rules). |
| `extractInputErrors` | function | `packages/ui/src/utils.ts:92` | Extract field-keyed validation errors from the Inertia `errors` page prop. |
| `FALLBACK_DENSITY` | constant | `packages/ui/src/theme/density.ts:50` | Density the panel falls back to when neither operator nor panel chose. |
| `Field` | function | `packages/ui/src/components/ui/field.tsx:6` | Styled Base UI field root for grouping form controls and messages. |
| `FIELD_CONTROL_CLASS` | constant | `packages/ui/src/components/fields/field_shell.tsx:122` | Token-only input styling retained for consumers outside the field registry. Built-in fields use the coss control primitives directly. |
| `FieldChrome` | type-only type | `packages/ui/src/components/fields/field_shell.tsx:38` | Resolved chrome for one field instance: the ids its markup needs and the effective flags, with the node's static props and the controller's reactive verdicts already reconciled. |
| `FieldControl` | constant | `packages/ui/src/components/ui/field.tsx:78` | Base UI field control re-exported for ejected pages. |
| `FieldController` | type-only type | `packages/ui/src/registry/index.ts:104` | Control surface handed to field components (TECH_SPEC §13.2: `FieldController`). `useFormEngine` builds one per state-bearing node, with `reactive` rules already evaluated and dependent options already fetched; `SchemaRenderer` synthesizes a bare one when it renders without an engine (a detail projection, a preview), in which case `FieldController.refetchOptions` delegates to the optional `onRefetchOptions` render prop and otherwise dev-warns. |
| `FieldError` | function | `packages/ui/src/components/ui/field.tsx:64` | Styled Base UI validation error for a form field. |
| `FieldLabel` | function | `packages/ui/src/components/ui/field.tsx:24` | Styled Base UI label for a form field. |
| `FieldNode` | type-only type | `packages/ui/src/form/nodes.ts:21` | A state-bearing descriptor node: a `DescriptorNode` narrowed to a non-null `key`. Layout and display chrome (`key: null`) never appears. |
| `FieldOption` | type-only type | `packages/ui/src/components/fields/options.ts:20` | One selectable option, as carried by `props.options` (protocol v1 §10). |
| `fieldOptions` | function | `packages/ui/src/components/fields/options.ts:54` | Normalize a `props.options` payload. Accepts the protocol shape (`[{ value, label, color?, icon?, disabled? }]`) and the bare scalar list an enum-backed field serializes to. Malformed entries are skipped rather than rendered as blanks — a broken option is invisible, never a crash (protocol v1 §8). |
| `FieldProps` | type-only type | `packages/ui/src/registry/index.ts:124` | Props of a registered field component (schema child position). |
| `FieldShell` | function | `packages/ui/src/components/fields/field_shell.tsx:164` | The labelled block every field renders. Grouped fields get a `<fieldset>`/`<legend>`; everything else a `<label htmlFor>` pointing at `FieldChrome.controlId`. |
| `FieldShellProps` | type-only type | `packages/ui/src/components/fields/field_shell.tsx:126` | Props of `FieldShell`. |
| `FileInput` | function | `packages/ui/src/components/fields/file_input.tsx:85` | Drag-and-drop upload widget bound to `urls.upload`. The drop target contains a coss button that activates the real file input: keyboard and pointer users get the same named control, while drag handlers remain pure enhancement on top of a standard picker. |
| `FilterField` | function | `packages/ui/src/components/filters/filter_field.tsx:105` | Labelled wrapper shared by every built-in single-control filter. |
| `FilterFieldProps` | type-only type | `packages/ui/src/components/filters/filter_field.tsx:97` | Props of `FilterField`. |
| `filterLabel` | function | `packages/ui/src/components/filters/filter_field.tsx:48` | A filter's display label, falling back to its query-string key (§8.2). |
| `FilterOption` | type-only type | `packages/ui/src/components/filters/filter_field.tsx:17` | One selectable option, as carried by `props.options` or `urls.options`. |
| `filterOptions` | function | `packages/ui/src/components/filters/filter_field.tsx:27` | Normalize an options prop. Accepts the protocol shape (`[{ value, label }]`) and a bare string list, which is what a filter built from an enum column serializes to. |
| `FilterProps` | type-only type | `packages/ui/src/registry/index.ts:152` | Props of a registered filter component (table filter position). |
| `FlashEnvelope` | type-only type | `packages/ui/src/types.ts:393` | The `adonia.flash` block (protocol v1 §1), rendered by the toaster. |
| `formatCellValue` | function | `packages/ui/src/utils.ts:114` | Human-readable fallback rendering for a raw table-cell value. |
| `FormConflict` | type-only type | `packages/ui/src/hooks/use_form_engine.ts:96` | One field changed differently in the local draft and the latest server state. |
| `FormEngine` | type-only type | `packages/ui/src/hooks/use_form_engine.ts:117` | Everything a form page (packaged or ejected) needs. The three verdict maps carry an entry for every state-bearing key of the descriptor, so a missing key means "no such node", never "false". |
| `FormEngineOptions` | type-only type | `packages/ui/src/hooks/use_form_engine.ts:76` | Options of `useFormEngine`; every one has a working default. |
| `FormState` | type-only type | `packages/ui/src/types.ts:343` | Flat form state keyed by node `key` (protocol v1 §7). Invariant: `state` MUST NOT contain a key for which no node exists in `descriptor.schema` (state hygiene); the client drops unknown keys and never submits them. |
| `getColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:59` | The client's current scheme, reading `localStorage` on first access. Storage can throw (opaque origins, Safari private mode, disabled cookies); a panel that cannot remember the choice is still a working panel, so the failure degrades to `'light'`. |
| `getDefaultRegistry` | function | `packages/ui/src/registry/index.ts:743` | Lazily created shared registry used when no `AdoniaProvider` supplies one. Module-eval free (SSR-friendly) and pre-populated with the built-ins. |
| `getDensityPreference` | function | `packages/ui/src/theme/density.ts:75` | The operator's stored override, reading `localStorage` on first access. Storage can throw (opaque origins, private mode, disabled cookies); a panel that cannot remember the choice is still a working panel, so the failure degrades to "no override" rather than propagating. |
| `getServerColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:73` | Scheme assumed while server-rendering: the `:root` defaults are light. |
| `getServerDensityPreference` | function | `packages/ui/src/theme/density.ts:93` | Preference assumed while server-rendering: none. The server cannot know the operator's choice, and guessing produces a first paint at one density that snaps to another on hydration. |
| `HiddenInput` | function | `packages/ui/src/components/fields/hidden_input.tsx:25` | Built-in `hidden` field (TECH_SPEC §7.3: "value participates in validation/fill but not UI"). |
| `HtmlEntry` | function | `packages/ui/src/components/display/html_entry.tsx:32` | Built-in `html` display projection (protocol v1 §8): the detail counterpart of `rich-text` and `markdown`. |
| `ImageCell` | function | `packages/ui/src/components/cells/image_cell.tsx:26` | Built-in `image` cell (TECH_SPEC §8.1 `C.image().rounded().stacked(rel)`). |
| `ImageEntry` | function | `packages/ui/src/components/display/image_entry.tsx:25` | Built-in `image-entry` display projection (protocol v1 §8): the detail counterpart of `image`. |
| `Input` | function | `packages/ui/src/components/ui/input.tsx:15` | Styled text input supporting Base UI and native input rendering. |
| `installDirtyGuard` | function | `packages/ui/src/form/guard.ts:93` | Install the guard. Returns the teardown function (safe to call twice). |
| `instantFromCivil` | function | `packages/ui/src/components/fields/temporal.ts:121` | Inverse of `civilFromInstant`: resolve a civil `YYYY-MM-DDTHH:mm[:ss]` reading in `timeZone` to a UTC ISO instant. |
| `isAdoniaPage` | function | `packages/ui/src/adonia.tsx:108` | Is `name` (the Inertia page name given to `createInertiaApp`'s `resolve`) one of Adonia's packaged pages? |
| `isEmptyFilterValue` | function | `packages/ui/src/hooks/table_query.ts:222` | True when a filter value carries nothing worth sending (§8.2). |
| `JsonInput` | function | `packages/ui/src/components/fields/json_input.tsx:48` | Structured editor over a JSON column, with parse feedback. |
| `JsonLogicRule` | type-only type | `packages/ui/src/types.ts:38` | A JsonLogic rule. The protocol owns only the *placement* of rules (protocol v1 §5); the closed grammar (strict `===`/`!==`, null-safe relational operators) is owned by the reactivity contract and evaluated by the form engine with server mirroring. |
| `JsonObject` | type-only type | `packages/ui/src/types.ts:30` | JSON object whose values are all `JsonValue`. |
| `JsonValue` | type-only type | `packages/ui/src/types.ts:27` | JSON-serializable value. Descriptors MUST survive `JSON.stringify` unchanged (protocol v1 §2 rule 1: no functions, no secrets). |
| `KeyValueEntry` | function | `packages/ui/src/components/display/key_value_entry.tsx:37` | Built-in `key-value-entry` display projection (TECH_SPEC §7.1): the detail counterpart of `key-value`. |
| `KeyValueInput` | function | `packages/ui/src/components/fields/key_value_input.tsx:91` | Add/remove/edit rows over an object value. |
| `LayoutProps` | type-only type | `packages/ui/src/registry/index.ts:130` | Props of a registered layout component (`grid`, `section`, `aside`, …). |
| `lazyEditor` | function | `packages/ui/src/components/fields/lazy.tsx:43` | Wrap a dynamic import into a component that renders `fallback` on the server and until the chunk resolves. |
| `lensLocation` | function | `packages/ui/src/components/table/lens_switcher.tsx:35` | Splits a lens route into its resource index path and active lens slug. |
| `LensOption` | type-only type | `packages/ui/src/components/table/lens_switcher.tsx:19` | Wire lens identity. |
| `LensSwitcher` | function | `packages/ui/src/components/table/lens_switcher.tsx:52` | Compact lens strip rendered above the table toolbar. |
| `LensSwitcherProps` | type-only type | `packages/ui/src/components/table/lens_switcher.tsx:27` | Props of `LensSwitcher`. |
| `localTimeZone` | function | `packages/ui/src/components/fields/temporal.ts:38` | The browser's own zone. Read through `Intl` rather than a `Date` offset, so it is an IANA name and matches what the server would call it — and so nothing touches `window` (§13.4 SSR safety). |
| `LoginPageProps` | type-only type | `packages/ui/src/types.ts:445` | Props of the packaged `adonia/login` page (§10.1 `login`), built by `AuthController.showLogin`. Brand and theme arrive through the shared `adonia` envelope; these are the three things the page cannot derive. |
| `lookup` | function | `packages/ui/src/json_logic.ts:84` | Dotted-path lookup into form state. Numeric segments index into arrays (`items.0.price`). Missing segments yield `null` (never `undefined`, never throw). |
| `lowercaseTransform` | constant | `packages/ui/src/transforms.ts:26` | `lowercase` built-in (the reactivity contract). |
| `MarkdownInput` | function | `packages/ui/src/components/fields/markdown_input.tsx:41` | Markdown editor with a live preview. |
| `MorphToInput` | function | `packages/ui/src/components/fields/morph_to_input.tsx:45` | Two-stage morph picker: stable resource slug first, then scoped row id. |
| `MultiSelectFilter` | function | `packages/ui/src/components/filters/multi_select_filter.tsx:23` | Built-in `multi-select-filter` (TECH_SPEC §8.2 `Filter.multiSelect`). |
| `NamedAdoniaUiPlugin` | type-only type | `packages/ui/src/registry/index.ts:262` | Named client half of an Adonia plugin. |
| `NavNode` | type-only type | `packages/ui/src/types.ts:346` | Navigation tree node for panel chrome (protocol v1 §1). |
| `NavTree` | function | `packages/ui/src/components/chrome/nav_tree.tsx:55` | Render `NavNode[]` as a nested list of links. |
| `NavTreeProps` | type-only type | `packages/ui/src/components/chrome/nav_tree.tsx:15` | Props of `NavTree`. |
| `NestedParentContext` | type-only type | `packages/ui/src/types.ts:270` | Context of the authorized parent row for a nested resource page. |
| `nextRowId` | function | `packages/ui/src/components/fields/rows.ts:29` | Allocate the next row id. |
| `normalizeTime` | function | `packages/ui/src/components/fields/temporal.ts:143` | Normalize a `<input type="time">` reading to the `HH:mm:ss` wire form. The control yields `HH:mm` whenever its step is a whole minute, and the §11.1 base accepts both — but state must be ONE shape, or an untouched field and an edited one serialize differently. |
| `NumberCell` | function | `packages/ui/src/components/cells/number_cell.tsx:16` | Built-in `number` cell (TECH_SPEC §8.1 `C.number().decimal(n).money(cur)`). |
| `NumberInput` | function | `packages/ui/src/components/fields/number_input.tsx:35` | Built-in `number` field (TECH_SPEC §7.3: `min`/`max`/`step`, `decimal(places)`). |
| `NumberRangeFilter` | function | `packages/ui/src/components/filters/number_range_filter.tsx:27` | Built-in `number-range-filter` (TECH_SPEC §8.2 `Filter.numberRange`). |
| `NUMERIC_CELL_CLASS` | constant | `packages/ui/src/components/surfaces.ts:85` | Numeric cell treatment. Tabular figures are not a nicety in a table of records: proportional digits make columns of IDs, counts, money and dates fail to align vertically, which is the single fastest way to make dense data look untrustworthy. |
| `Operator` | type-only type | `packages/ui/src/json_logic.ts:47` | An operator of the closed subset. |
| `OPERATOR_SET` | constant | `packages/ui/src/json_logic.ts:31` | The closed operator set of the Adonia JsonLogic subset (the reactivity contract). |
| `OptionsFetcher` | type-only type | `packages/ui/src/form/refetch.ts:23` | Injectable transport, defaulting to the global `fetch`. Exists so the engine can be driven deterministically in tests and so hosts can add auth headers or a custom base without patching globals. |
| `optionToken` | function | `packages/ui/src/components/fields/options.ts:42` | The DOM-safe string form of a state value. |
| `PAGE_KEYS` | constant | `packages/ui/src/pages/page_keys.ts:30` | The six page keys `registry.page()` accepts for packaged pages — one per page `@adonia/core` can render (§10.1: dashboard, login, the three resource screens, and the §17 error page). |
| `PAGE_STACK_CLASS` | constant | `packages/ui/src/components/surfaces.ts:119` | Vertical rhythm between the major regions of a page. |
| `PageHeader` | function | `packages/ui/src/pages/page_chrome.tsx:67` | Heading strip: one `<h1>` per page, with the page's actions opposite it. |
| `PageHeaderProps` | type-only type | `packages/ui/src/pages/page_chrome.tsx:47` | Props of `PageHeader`. |
| `PageKey` | type-only type | `packages/ui/src/pages/page_keys.ts:40` | One of the six packaged `PAGE_KEYS` values. |
| `pagePath` | function | `packages/ui/src/pages/breadcrumbs.ts:33` | The current path with query string and any trailing slash removed. |
| `PaginationMeta` | type-only type | `packages/ui/src/types.ts:323` | Frozen subset of the Lucid-style paginator `meta` (protocol v1 §6). |
| `PanelEnvelope` | type-only type | `packages/ui/src/types.ts:390` | The `adonia.panel` block (protocol v1 §1) — everything the panel chrome needs and nothing page-specific. Derived from `AdoniaEnvelope` so the two can never drift. |
| `PanelShell` | function | `packages/ui/src/components/chrome/panel_shell.tsx:51` | Wrap a page in the panel chrome: theme tokens, sidebar, topbar, toaster. |
| `PanelShellProps` | type-only type | `packages/ui/src/components/chrome/panel_shell.tsx:21` | Props of `PanelShell`. |
| `parseColumnPreference` | function | `packages/ui/src/hooks/column_preferences.ts:82` | Parse the current object model, including the visibility-array v1 format. |
| `parseTableQuery` | function | `packages/ui/src/hooks/table_query.ts:267` | Parse a URL (or bare query string) into `TableQueryState`. Never throws and never passes anything through: everything outside the allowlists is dropped, matching the server's §8.3 behaviour exactly. |
| `PartitionMetricWidget` | function | `packages/ui/src/components/widgets.tsx:441` | Built-in partition tile. |
| `PRIMARY_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:29` | Filled accent button/link: the one primary action of a page. |
| `pruneUnknownStateKeys` | function | `packages/ui/src/utils.ts:68` | Drop state keys that have no corresponding node (protocol v1 §7). |
| `RadioInput` | function | `packages/ui/src/components/fields/radio_input.tsx:24` | Built-in `radio` field (TECH_SPEC §7.3: `options()`, `inline()`). |
| `rangeBound` | function | `packages/ui/src/components/filters/filter_field.tsx:57` | Read one half of a `{ from, to }` range value as an input-ready string. Anything else (a scalar left over from an older URL, a nested object) reads as empty rather than crashing the panel. |
| `rangeValue` | function | `packages/ui/src/components/filters/filter_field.tsx:67` | Build the next `{ from, to }` value, or `null` when both halves are empty — an empty range is an absent filter, not a filter matching nothing. |
| `ReactiveSpec` | type-only type | `packages/ui/src/types.ts:69` | Reactive behavior block (protocol v1 §5 + the reactivity contract). ALWAYS a top-level sibling of `props` on a `DescriptorNode` — never nested inside `props`. |
| `ReactiveVerdicts` | type-only type | `packages/ui/src/form/reactivity.ts:25` | Per-key verdicts for one evaluation state. Every state-bearing key of the descriptor has an entry in all three maps, so a missing key means "no such node" rather than "false by omission". |
| `readColumnPreference` | function | `packages/ui/src/hooks/column_preferences.ts:119` | Read the cached layout, consulting `localStorage` once per key. |
| `readOptionsPayload` | function | `packages/ui/src/form/refetch.ts:73` | Narrow an options-endpoint response body to the option list. |
| `readUploadResult` | function | `packages/ui/src/transports.ts:65` | Read a `{ key, url }` upload response, tolerating the `{ data: … }` wrapper a proxying host may add. A body with no usable `key` is an error: the form state IS the key, so a "successful" upload without one would commit `undefined` and lose the file silently. |
| `RecordsEnvelope` | type-only type | `packages/ui/src/types.ts:333` | Paginated records envelope shipped to index pages (protocol v1 §6). |
| `recordTitle` | function | `packages/ui/src/pages/breadcrumbs.ts:48` | A human title for one record: a conventional title attribute, else the first string-valued field of the descriptor in document order, else the singular label with the id. |
| `registerDirtyGuardPrompt` | function | `packages/ui/src/form/guard.ts:48` | Register the UI that confirms leaving a dirty form. Returns the teardown, which never unregisters a prompt that has already replaced this one. |
| `RegistryMapName` | type-only type | `packages/ui/src/registry/index.ts:215` | Registry-map names, one per syntactic position (TECH_SPEC §13.2, ABI stable): schema children resolve against `field` + `layout`, table columns against `cell`, table filters against `filter`, dashboard tiles against `widget`, generic-page overrides against `page`, `reactive.sets` `fn:*` transforms against `transform`, and render-hook slots against `slot`. |
| `RelationCell` | function | `packages/ui/src/components/cells/relation_cell.tsx:19` | Built-in `relation` cell (TECH_SPEC §8.1 `C.relation('author.fullName')`). |
| `RelationEntry` | function | `packages/ui/src/components/display/relation_entry.tsx:52` | Built-in `relation-entry` display projection (protocol v1 §8): the detail counterpart of `belongs-to`, `belongs-to-many` and `morph-to`. |
| `RelationFilter` | function | `packages/ui/src/components/filters/relation_filter.tsx:59` | Built-in `relation-filter` (TECH_SPEC §8.2 `Filter.relation`): filter by a related record, with options fetched from the node's `options` capability URL (protocol v1 §4, `GET …/field/:key/options?q=&values=`). |
| `RelationManager` | function | `packages/ui/src/components/relation_manager.tsx:86` | Parent-scoped child table/cards with descriptor-reused create, attach, and edit dialogs. |
| `RelationManagerDescriptor` | type-only type | `packages/ui/src/types.ts:248` | Parent-scoped child manager embedded in detail/edit descriptors. |
| `relationRoutes` | function | `packages/ui/src/components/fields/relation_routes.ts:47` | Derive the target's routes, or `undefined` when they cannot be known. |
| `RelationRoutes` | type-only type | `packages/ui/src/components/fields/relation_routes.ts:30` | The two routes the inline-create modal drives. |
| `RepeaterEntry` | function | `packages/ui/src/components/display/repeater_entry.tsx:31` | Read-only list of the repeater's items. |
| `RepeaterInput` | function | `packages/ui/src/components/fields/repeater_input.tsx:112` | Array-of-objects editor with add/remove/reorder and two layouts. |
| `resetColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:138` | Drop the cached snapshot so the next read re-consults `localStorage`. Exported for tests and for host apps that clear storage on logout. |
| `resetColumnPreferences` | function | `packages/ui/src/hooks/column_preferences.ts:195` | Drop cached snapshots so the next read re-consults `localStorage`. |
| `resetDensity` | function | `packages/ui/src/theme/density.ts:163` | Drop the cached snapshot so the next read re-consults `localStorage`. Exported for tests and for host apps that clear storage on logout. |
| `resetFormEngineWarnings` | function | `packages/ui/src/hooks/use_form_engine.ts:71` | Test seam: reset the warn-once dedupe set. |
| `resolveCapabilityUrl` | function | `packages/ui/src/form/refetch.ts:29` | Resolve a node's `refetch.url` reference against its `urls` map. Returns `undefined` (with the reason) when the capability is missing. |
| `ResolvedAdoniaConfig` | type-only type | `packages/ui/src/adonia.tsx:43` | Resolved client config: a ready registry plus a bound provider component that installs registry + theme context around the app. |
| `ResolvedTransports` | type-only type | `packages/ui/src/transports.ts:180` | The transports with every hole filled by its default. |
| `resolveTransports` | function | `packages/ui/src/transports.ts:186` | Fill a partial `AdoniaTransports` with the built-in defaults. |
| `ResourceDescriptor` | type-only type | `packages/ui/src/types.ts:282` | Resource descriptor (protocol v1 §3). `descriptor.schema` is always a single layout node (`type: 'grid'`, `key: null`) — never a bare array (§2 rule 4). |
| `ResourceDetailPageProps` | type-only type | `packages/ui/src/types.ts:433` | Props of the packaged `adonia/resource_detail` page (protocol v1 §3 `detail` mode). The descriptor's schema is the display projection — every field already mapped to its `displayType` — and `record` is the flat map its entries read values from (§6). |
| `ResourceFormPageProps` | type-only type | `packages/ui/src/types.ts:416` | Props of the packaged `adonia/resource_form` page (create and edit modes). `record` is present in edit mode; `state` is the initial `FormState`. |
| `ResourceIndexPageProps` | type-only type | `packages/ui/src/types.ts:400` | Props of the packaged `adonia/resource_index` page: the page-specific keys sit BESIDE the `adonia` envelope (protocol v1 §1). `records` is partial-reloadable (`only: ['records']`, §10.2). |
| `ResourceMode` | type-only type | `packages/ui/src/types.ts:122` | Descriptor compilation/rendering mode (protocol v1 §3). |
| `resourceTrail` | function | `packages/ui/src/pages/breadcrumbs.ts:81` | The trail for a resource page, derived from the descriptor's mode and labels plus the current path (§10.1 route shapes). |
| `RichTextInput` | function | `packages/ui/src/components/fields/rich_text_input.tsx:59` | WYSIWYG editor over sanitized HTML. |
| `sameState` | function | `packages/ui/src/form/nodes.ts:84` | Deep value equality over two flat state maps, used for dirty tracking and for suppressing no-op re-renders. Reuses the evaluator's `structEq` so "changed" means exactly what `===`/`!==` mean inside a JsonLogic rule. |
| `SchemaRenderer` | function | `packages/ui/src/components/schema_renderer.tsx:95` | Walk a descriptor tree and render it through the ComponentRegistry. |
| `SchemaRendererProps` | type-only type | `packages/ui/src/components/schema_renderer.tsx:13` | Props of `SchemaRenderer`. |
| `SEARCH_DEBOUNCE_MS` | constant | `packages/ui/src/hooks/use_table_state.ts:50` | Search debounce window (TECH_SPEC §13.3: "mutations debounce (300 ms search)"). |
| `selectedTokens` | function | `packages/ui/src/components/fields/options.ts:93` | The tokens a field's current value selects. Handles both state shapes of the choice family: a scalar for `select`/`radio`, an array for `select().multiple()` and `checkbox-list`. `null` selects nothing — it is "no choice", never the option whose value happens to be empty. |
| `SelectFilter` | function | `packages/ui/src/components/filters/select_filter.tsx:28` | Built-in `select-filter` (TECH_SPEC §8.2 `Filter.select`): one value out of a closed option list. The empty option clears the filter rather than filtering on the empty string — `filters[status]=` is an absent filter on both sides of the wire (§10.2). |
| `SelectInput` | function | `packages/ui/src/components/fields/select_input.tsx:37` | Built-in choice field backed by coss Select or searchable Combobox. |
| `SerializedRow` | type-only type | `packages/ui/src/types.ts:314` | Serialized record/row (protocol v1 §6). A flat map keyed VERBATIM by column key (dotted keys included), plus `id` and the per-record `can` authorization projection. Intersection form keeps both the named members and the open index signature JSON-compatible. |
| `serializeTableQuery` | function | `packages/ui/src/hooks/table_query.ts:333` | Render `TableQueryState` back into the §10.2 query string (no leading `?`). Defaults are omitted so a pristine table has a clean URL, and key order is fixed so two equal states always produce byte-identical URLs — otherwise Inertia would treat a no-op as a navigation. |
| `setColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:78` | Persist a scheme and notify every subscriber (including other tabs' UI). |
| `setDensityPreference` | function | `packages/ui/src/theme/density.ts:98` | Persist an override (or clear it) and notify every subscriber. |
| `Sidebar` | function | `packages/ui/src/components/chrome/sidebar.tsx:129` | The panel's primary navigation column. |
| `SidebarProps` | type-only type | `packages/ui/src/components/chrome/sidebar.tsx:20` | Props of `Sidebar`. |
| `SimpleShell` | function | `packages/ui/src/components/chrome/simple_shell.tsx:37` | Panel theme, brand and toaster around a centred card — no sidebar, no topbar, no account menu. |
| `SimpleShellProps` | type-only type | `packages/ui/src/components/chrome/simple_shell.tsx:18` | Props of `SimpleShell`. |
| `Skeleton` | function | `packages/ui/src/components/ui/skeleton.tsx:5` | Animated placeholder representing content while it loads. |
| `SliderInput` | function | `packages/ui/src/components/fields/slider_input.tsx:29` | Built-in `slider` field (TECH_SPEC §7.3, "single or range"). |
| `Slot` | function | `packages/ui/src/components/chrome/slot.tsx:41` | Render the component an app registered for a slot, or nothing. |
| `SLOT_KEYS` | constant | `packages/ui/src/components/chrome/slot.tsx:17` | The closed v1 slot set (TECH_SPEC §13.2), in render order through a resource page. `ComponentRegistry.slot()` accepts these keys directly; plugins adding a namespaced slot opt in through `{ custom: true }`. |
| `SlotKey` | type-only type | `packages/ui/src/components/chrome/slot.tsx:26` | One of the five v1 `SLOT_KEYS`. |
| `SlotProps` | type-only type | `packages/ui/src/components/chrome/slot.tsx:29` | Props of `Slot`. |
| `slugifyTransform` | constant | `packages/ui/src/transforms.ts:11` | `slugify` built-in: lowercase, ASCII-folded, hyphen-separated. |
| `SOLID_TONES` | constant | `packages/ui/src/components/badge_tones.ts:60` | Solid fill classes retained for the field slice's toggle compatibility. |
| `solidToneClass` | function | `packages/ui/src/components/badge_tones.ts:99` | Solid fill classes for a palette token; unknown tokens read as the accent. |
| `stableJson` | function | `packages/ui/src/components/fields/rows.ts:44` | Order-independent JSON of a value, for "did this change UNDERNEATH me?" comparisons. |
| `stateSlice` | function | `packages/ui/src/form/nodes.ts:95` | The `withState` slice a `reactive.refetch` declares (protocol v1 §5): exactly the named keys, in declaration order, and nothing else. Keys absent from state are omitted rather than sent as `null`. |
| `stepForDecimal` | function | `packages/ui/src/components/fields/number_input.tsx:20` | The `step` an input gets when the resource declared none but did declare `decimal(places)`: one unit in the last accepted place. Without it the browser's default step of `1` rejects the very precision the field asked for, and the spinner walks past every fractional value. |
| `stringValue` | function | `packages/ui/src/components/fields/field_shell.tsx:298` | Read a field's value as the string a text-shaped control needs. `null` and `undefined` are the empty string — a controlled input must never receive `undefined`, which is what silently turns it uncontrolled. |
| `structEq` | function | `packages/ui/src/json_logic.ts:60` | Structural strict equality: primitives by `===`, arrays element-wise (order matters), objects key-by-key (order-insensitive). No type coercion, ever (the reactivity contract). |
| `subscribeColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:105` | Subscribe to scheme changes, including cross-tab `storage` events so a panel opened twice does not disagree with itself. |
| `subscribeDensity` | function | `packages/ui/src/theme/density.ts:123` | Subscribe to density changes, including cross-tab `storage` events. |
| `SUBTLE_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:35` | Outlined neutral button/link: secondary navigation and cancels. |
| `SUPPORTED_PROTOCOL_VERSION` | constant | `packages/ui/src/components/chrome/protocol_version.ts:8` | The single protocol version this build of `@adonia/ui` speaks. |
| `tableAllowlists` | function | `packages/ui/src/hooks/table_query.ts:95` | Build the allowlists a table descriptor implies. Filter keys come from the filter NODES (`node.key`), which is the same key the server registered — `trashed` included, even though it rides its own top-level query parameter. |
| `TableAllowlists` | type-only type | `packages/ui/src/hooks/table_query.ts:66` | Allowlists derived from the table descriptor. The client validates against the same sets the server will, so a hand-edited URL degrades identically on both sides instead of rendering phantom sort arrows. |
| `TableBasePathProvider` | function | `packages/ui/src/components/cells/cell_link.tsx:23` | Supplies the resource index path used by `CellLink`. |
| `TableBasePathProviderProps` | type-only type | `packages/ui/src/components/cells/cell_link.tsx:17` | Props of `TableBasePathProvider`. |
| `TableColumnToggle` | function | `packages/ui/src/components/table/column_toggle.tsx:42` | Column visibility menu (TECH_SPEC §8.1). Coss Menu supplies the roving focus, escape dismissal and checked-state semantics. |
| `TableColumnToggleProps` | type-only type | `packages/ui/src/components/table/column_toggle.tsx:23` | Props of `TableColumnToggle`. |
| `TableDescriptor` | type-only type | `packages/ui/src/types.ts:146` | Index-table descriptor (protocol v1 §3). |
| `TableEmptyState` | function | `packages/ui/src/components/table/empty_state.tsx:32` | Index empty state. Distinguishes "this resource has no records" from "your filters matched nothing" — the second is a dead end unless the user is offered the way out, so the reset button only appears when there is something to reset. |
| `TableEmptyStateProps` | type-only type | `packages/ui/src/components/table/empty_state.tsx:15` | Props of `TableEmptyState`. |
| `TableFilterPanel` | function | `packages/ui/src/components/table/filter_panel.tsx:30` | Filter panel (TECH_SPEC §8.2): renders `descriptor.table.filters` through the registry `filter` map. Unknown filter types degrade to `<UnknownComponent position="filter">` and never throw (protocol v1 §8) — a plugin whose client half is not installed must not take the index page down with it. |
| `TableFilterPanelProps` | type-only type | `packages/ui/src/components/table/filter_panel.tsx:10` | Props of `TableFilterPanel`. |
| `TableLoadingState` | function | `packages/ui/src/components/table/loading_state.tsx:26` | Loading affordance for a partial reload (§10.2 `only: ['records']`). |
| `TableLoadingStateProps` | type-only type | `packages/ui/src/components/table/loading_state.tsx:11` | Props of `TableLoadingState`. |
| `TablePagination` | function | `packages/ui/src/components/table/pagination.tsx:49` | Pagination footer: result summary, page-size selector and prev/next. |
| `TablePaginationProps` | type-only type | `packages/ui/src/components/table/pagination.tsx:30` | Props of `TablePagination`. |
| `TableQueryState` | type-only type | `packages/ui/src/hooks/table_query.ts:42` | The parsed §10.2 query string — the client mirror of the server's `IndexQueryState`, and the payload of `targets.query` when an action runs against "all N matching" rows (§10.3). |
| `tableQueryUrl` | function | `packages/ui/src/hooks/table_query.ts:358` | Join a path with a serialized `TableQueryState`. |
| `TableSelection` | type-only type | `packages/ui/src/hooks/use_table_state.ts:61` | Row selection surface handed to the selection bar and to actions (§10.3). |
| `TableSelectionBar` | function | `packages/ui/src/components/table/selection_bar.tsx:36` | Bulk-selection bar (TECH_SPEC §10.3). |
| `TableSelectionBarProps` | type-only type | `packages/ui/src/components/table/selection_bar.tsx:15` | Props of `TableSelectionBar`. |
| `TableSortDirection` | type-only type | `packages/ui/src/hooks/table_query.ts:21` | Sort direction; `-` prefixed in the query string means `desc` (§10.2). |
| `TableSortInstruction` | type-only type | `packages/ui/src/hooks/table_query.ts:24` | One resolved sort instruction (§10.2 `sort=-publishedAt`). |
| `TableStateController` | type-only type | `packages/ui/src/hooks/use_table_state.ts:76` | Everything `useTableState` hands the table (TECH_SPEC §13.3). |
| `TableToolbar` | function | `packages/ui/src/components/table/toolbar.tsx:51` | Index toolbar: search, the filter-panel disclosure and the column menu. |
| `TableToolbarProps` | type-only type | `packages/ui/src/components/table/toolbar.tsx:31` | Props of `TableToolbar`. |
| `TableWidgetComponent` | function | `packages/ui/src/components/widgets.tsx:524` | Built-in resource table widget, rendered by the existing index DataTable. |
| `temporalDisplay` | function | `packages/ui/src/components/display/format_value.ts:39` | Render a value under one of the temporal `format` names, or `null` when the format is not temporal or the value does not match its wire shape — in which case the caller falls back to the raw value, never to "Invalid Date". |
| `TemporalDisplay` | type-only type | `packages/ui/src/components/display/format_value.ts:20` | A formatted temporal value and the machine-readable original. |
| `TernaryFilter` | function | `packages/ui/src/components/filters/ternary_filter.tsx:33` | Built-in `ternary-filter` (TECH_SPEC §8.2 `Filter.ternary`): yes / no / any, where "any" is the absence of the filter. |
| `Textarea` | function | `packages/ui/src/components/fields/textarea.tsx:27` | Built-in `textarea` field (TECH_SPEC §7.3: `rows`, `autosize`). |
| `TextCell` | function | `packages/ui/src/components/cells/text_cell.tsx:18` | Built-in `text` cell (TECH_SPEC §8.1 `C.text`). |
| `TextDirection` | type-only type | `packages/core/dist/i18n.d.ts:354` | Text direction carried in the panel envelope. |
| `TextEntry` | function | `packages/ui/src/components/display/text_entry.tsx:27` | Built-in `text-entry` display projection (protocol v1 §8). The detail counterpart of `text-input`, `textarea`, `number`, `slider`, `color`, the boolean pair and the whole date family — which is why it is the one entry that has to understand `format`. |
| `TextInput` | function | `packages/ui/src/components/fields/text_input.tsx:19` | Built-in `text-input` field (TECH_SPEC §7.3: `maxLength`, `mask`, `datalist`). |
| `ThemeProvider` | function | `packages/ui/src/theme/theme_provider.tsx:101` | Apply the resolved panel theme to the wrapper and its owned portal root. |
| `ThemeProviderProps` | type-only type | `packages/ui/src/theme/theme_provider.tsx:32` | Props of `ThemeProvider`. |
| `TimeInput` | function | `packages/ui/src/components/fields/time_input.tsx:27` | Built-in `time` field (TECH_SPEC §7.3; `timezone`, `after`, `before`). |
| `Toaster` | function | `packages/ui/src/components/chrome/toaster.tsx:37` | Render `adonia.flash.success` / `adonia.flash.error`. |
| `ToasterProps` | type-only type | `packages/ui/src/components/chrome/toaster.tsx:17` | Props of `Toaster`. |
| `ToggleInput` | function | `packages/ui/src/components/fields/toggle_input.tsx:24` | Built-in `toggle` field (TECH_SPEC §7.3: `onLabel`/`offLabel`/`onColor`). |
| `TOKEN_LIST` | constant | `packages/ui/src/theme/tokens.ts:484` | The manifest as a flat list. `TOKENS` keeps each entry's literal type so an IDE shows the real default on hover; iterating code wants the widened `TokenSpec` instead, where `dark` is simply optional. |
| `TOKEN_NAMES` | constant | `packages/ui/src/theme/tokens.ts:477` | Every token name in declaration order. |
| `TokenGroup` | type-only type | `packages/ui/src/theme/tokens.ts:26` | Token families, used by the docs generator for grouping and by the Tailwind preset to decide which theme key a token belongs under. |
| `TokenName` | type-only type | `packages/ui/src/theme/tokens.ts:474` | A token name the manifest actually declares. |
| `TOKENS` | constant | `packages/ui/src/theme/tokens.ts:54` | The complete token manifest. Ordered by family so the generated docs table and `styles.css` read the same way top to bottom. |
| `TokenSpec` | type-only type | `packages/ui/src/theme/tokens.ts:29` | One documented token: its default in each colour scheme, plus prose. |
| `toneLookup` | function | `packages/ui/src/components/badge_tones.ts:111` | Read `value`'s entry from a `Record<value, string>` prop (`colors`, `icons`, `labels` — every value→presentation map a choice field's detail projection emits). Absent maps, non-object maps and non-string entries all read as `undefined` — a malformed prop degrades to the default tone rather than to a crash (protocol v1 §8: unknown props are ignored, never fatal). |
| `Topbar` | function | `packages/ui/src/components/chrome/topbar.tsx:48` | The location strip: where you are on the left, what you can reach from anywhere on the right. |
| `TopbarProps` | type-only type | `packages/ui/src/components/chrome/topbar.tsx:24` | Props of `Topbar`. |
| `TransformFn` | type-only type | `packages/ui/src/transforms.ts:8` | A named state derivation referenced by `reactive.sets[].transform` (protocol v1 §5). `fn:<name>` transforms resolve from the registry's `transform` map; the four literals below are the built-ins. |
| `TransformResolver` | type-only type | `packages/ui/src/form/derive.ts:22` | Resolves a transform name against a `ComponentRegistry`'s `transform` map. |
| `translateMessage` | function | `packages/ui/src/i18n.tsx:170` | Translates against an envelope catalog, retaining English fallback for missing keys. |
| `TranslationCatalog` | type-only type | `packages/core/dist/i18n.d.ts:348` | A complete, type-checked translation catalog. |
| `TranslationFunction` | type-only type | `packages/ui/src/i18n.tsx:18` | Function signature used by non-component helpers that need catalog copy. |
| `TranslationKey` | type-only type | `packages/core/dist/i18n.d.ts:346` | A framework-owned translation key. |
| `TranslationMessages` | type-only type | `packages/core/dist/i18n.d.ts:352` | An additive host override. Missing entries deterministically fall back to bundled English. |
| `TranslationParameters` | type-only type | `packages/core/dist/i18n.d.ts:356` | Values accepted by translation template interpolation. |
| `TrashedScope` | type-only type | `packages/ui/src/hooks/table_query.ts:30` | Soft-delete scope selected by the `trashed` ternary filter (§8.2). |
| `TrendMetricWidget` | function | `packages/ui/src/components/widgets.tsx:308` | Built-in trend tile with a lazy bklit chart and readable point-list fallback. |
| `UnknownComponent` | function | `packages/ui/src/components/unknown_component.tsx:32` | Frozen unknown-type behavior (protocol v1 §8): a node whose `type` resolves to no registered component renders a visible placeholder in development (showing `type` and `key`), renders nothing in production, logs a console warning in both — and NEVER throws. On the client it also reports one privacy-safe telemetry event per mounted occurrence through the active registry. This keeps plugin client-halves optional at runtime (TECH_SPEC §16.3). |
| `UnknownComponentEvent` | type-only type | `packages/ui/src/registry/index.ts:236` | Privacy-safe telemetry emitted when a renderer encounters an unregistered descriptor component. |
| `UnknownComponentPosition` | type-only type | `packages/ui/src/registry/index.ts:226` | Syntactic position at which a descriptor component could not be resolved. |
| `UnknownComponentProps` | type-only type | `packages/ui/src/components/unknown_component.tsx:14` | Props of `UnknownComponent`. |
| `UnknownComponentSubscriber` | type-only type | `packages/ui/src/registry/index.ts:246` | Subscriber invoked for each unknown-component occurrence. |
| `UPLOAD_PART_NAME` | constant | `packages/ui/src/transports.ts:57` | Multipart part name the `field.upload` endpoint reads (`FieldCallbackController.uploadedPart`). Pinned here because the transport is replaceable and a custom one still has to send this name. |
| `UploadRequest` | type-only type | `packages/ui/src/transports.ts:26` | One upload in flight, as handed to an `UploadTransport`. |
| `UploadResult` | type-only type | `packages/ui/src/transports.ts:44` | The `field.upload` response (protocol v1 §4): a temp Drive key plus a URL to preview it with. The KEY is what the form submits; the URL is chrome. |
| `UploadRow` | type-only type | `packages/ui/src/components/fields/use_uploads.ts:23` | One file in the widget: uploading, uploaded, or failed. |
| `UploadsController` | type-only type | `packages/ui/src/components/fields/use_uploads.ts:55` | The surface `useUploads` hands the file/image components. |
| `UploadTransport` | type-only type | `packages/ui/src/transports.ts:50` | Transport for `UploadRequest`s; rejects on a non-2xx or a network error. |
| `uppercaseTransform` | constant | `packages/ui/src/transforms.ts:22` | `uppercase` built-in. |
| `useAdonia` | function | `packages/ui/src/context.tsx:117` | Read the full Adonia context, falling back to defaults outside a provider. |
| `useAdoniaCommands` | function | `packages/ui/src/context.tsx:142` | Read the active registry's command contributions. |
| `useAdoniaI18n` | function | `packages/ui/src/i18n.tsx:179` | Reads the SSR-safe framework translation state. |
| `useAdoniaRegistry` | function | `packages/ui/src/context.tsx:131` | Read the active `ComponentRegistry`. |
| `useAdoniaTransports` | function | `packages/ui/src/context.tsx:147` | Read the resolved field transports (§7.3 relation and upload fields). |
| `useColorScheme` | function | `packages/ui/src/theme/color_scheme.ts:126` | Read and change the manual colour scheme — the hook behind a light/dark toggle in `topbar.right` or `sidebar.footer`. |
| `useDensity` | function | `packages/ui/src/theme/density.ts:142` | Read and change the density in force. |
| `useDirection` | function | `packages/ui/src/i18n.tsx:189` | Returns the active writing direction. |
| `useFieldChrome` | function | `packages/ui/src/components/fields/field_shell.tsx:77` | Reconcile a node's props with its controller into `FieldChrome`. |
| `useFormEngine` | function | `packages/ui/src/hooks/use_form_engine.ts:171` | Build the form engine for a descriptor. |
| `useLocale` | function | `packages/ui/src/i18n.tsx:184` | Returns the active locale. |
| `usePageOverride` | function | `packages/ui/src/pages/page_keys.ts:50` | The component an app registered for a page key, or `undefined`. |
| `usePortalContainer` | function | `packages/ui/src/context.tsx:157` | Read the body-level container owned by the nearest `AdoniaProvider`. |
| `useTableState` | function | `packages/ui/src/hooks/use_table_state.ts:310` | Drive an index table from the URL (TECH_SPEC §13.3). |
| `UseTableStateOptions` | type-only type | `packages/ui/src/hooks/use_table_state.ts:146` | Options of `useTableState`. |
| `useTranslation` | function | `packages/ui/src/i18n.tsx:194` | Returns the stable catalog translator for framework-owned copy. |
| `useUploads` | function | `packages/ui/src/components/fields/use_uploads.ts:96` | Drive the upload widget's rows. |
| `UseUploadsOptions` | type-only type | `packages/ui/src/components/fields/use_uploads.ts:41` | Everything `useUploads` needs from the field. |
| `ValueMetricWidget` | function | `packages/ui/src/components/widgets.tsx:255` | Built-in scalar metric tile. |
| `WELL_CLASS` | constant | `packages/ui/src/components/surfaces.ts:33` | A recessed grouped region on the page canvas: widget tiles, form sections, detail panels, the data-table frame. |
| `WELL_CONTENT_CLASS` | constant | `packages/ui/src/components/surfaces.ts:47` | Content raised back to the canvas colour inside a well: table bodies, inputs, chart plots. Keeps data the brightest plane on the page. |
| `WidgetProps` | type-only type | `packages/ui/src/registry/index.ts:161` | Props of a registered widget component. |
| `withAdonia` | function | `packages/ui/src/adonia.tsx:82` | Merge an Adonia client config into the app's `createInertiaApp` config (TECH_SPEC §13.1). The installer wires the resolved provider around Adonia pages, imports `@adonia/ui/styles.css`, and installs the toaster/command palette while leaving non-Adonia pages untouched. |
| `withAdoniaLayout` | function | `packages/ui/src/adonia.tsx:140` | Guard an app-wide Inertia layout so it never wraps a packaged Adonia page (TECH_SPEC §13.4). |
| `writeColumnPreference` | function | `packages/ui/src/hooks/column_preferences.ts:141` | Persist a complete layout locally and notify every subscriber. |
| `xhrUploadTransport` | function | `packages/ui/src/transports.ts:88` | Default `UploadTransport`: one `XMLHttpRequest` per file, with real `upload.onprogress` events. |

## `@adonia/ui/pages`

| Export | Kind | Source | Summary |
| --- | --- | --- | --- |
| `DANGER_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:41` | Destructive button: outlined until confirmed, never filled by default. |
| `DashboardPage` | function | `packages/ui/src/pages/dashboard.tsx:47` | The panel's landing page inside the panel chrome. |
| `DashboardPageBody` | function | `packages/ui/src/pages/dashboard.tsx:58` | The default body: responsive grid, deferred state, and registered tiles. |
| `DashboardPageProps` | type-only type | `packages/ui/src/types.ts:460` | Props of the packaged `adonia/dashboard` page (§10.1 `dashboard`). |
| `ERROR_PAGE_KEY` | constant | `packages/ui/src/pages/error_page.tsx:36` | Registry key of the error page body (TECH_SPEC §17: "overridable via the registry"). `r.page('error', MyErrorBody)` replaces `ErrorPageBody` while keeping the chrome — an app that wants a branded 404 wants it inside its own sidebar, not on a bare white page. Same mechanism, same reasoning, as the other five packaged pages (`PAGE_KEYS`). |
| `ErrorPage` | function | `packages/ui/src/pages/error_page.tsx:49` | The error page inside the panel chrome. |
| `ErrorPageBody` | function | `packages/ui/src/pages/error_page.tsx:68` | The default body: status, heading, safe description, then the two developer-facing extras. |
| `ErrorPageProps` | type-only type | `packages/ui/src/types.ts:472` | Props of the packaged `adonia/error` page (TECH_SPEC §17), built server-side by `errorPageProps` in `@adonia/core`. Every member is always present: the production/development split is a server decision, so the page never has to ask which environment it runs in. |
| `LoginPage` | function | `packages/ui/src/pages/login.tsx:30` | The panel's sign-in screen, rendered by `AuthController.showLogin`. |
| `LoginPageBody` | function | `packages/ui/src/pages/login.tsx:60` | The default body: identifier, password, submit. |
| `LoginPageProps` | type-only type | `packages/ui/src/types.ts:445` | Props of the packaged `adonia/login` page (§10.1 `login`), built by `AuthController.showLogin`. Brand and theme arrive through the shared `adonia` envelope; these are the three things the page cannot derive. |
| `PAGE_KEYS` | constant | `packages/ui/src/pages/page_keys.ts:30` | The six page keys `registry.page()` accepts for packaged pages — one per page `@adonia/core` can render (§10.1: dashboard, login, the three resource screens, and the §17 error page). |
| `PageHeader` | function | `packages/ui/src/pages/page_chrome.tsx:67` | Heading strip: one `<h1>` per page, with the page's actions opposite it. |
| `PageHeaderProps` | type-only type | `packages/ui/src/pages/page_chrome.tsx:47` | Props of `PageHeader`. |
| `PageKey` | type-only type | `packages/ui/src/pages/page_keys.ts:40` | One of the six packaged `PAGE_KEYS` values. |
| `pagePath` | function | `packages/ui/src/pages/breadcrumbs.ts:33` | The current path with query string and any trailing slash removed. |
| `PRIMARY_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:29` | Filled accent button/link: the one primary action of a page. |
| `recordTitle` | function | `packages/ui/src/pages/breadcrumbs.ts:48` | A human title for one record: a conventional title attribute, else the first string-valued field of the descriptor in document order, else the singular label with the id. |
| `ResourceDetailPage` | function | `packages/ui/src/pages/resource_detail.tsx:42` | The record detail screen inside the panel chrome. |
| `ResourceDetailPageBody` | function | `packages/ui/src/pages/resource_detail.tsx:77` | The default body: the display projection, the record's own affordances, and the `detail.aside` slot. |
| `ResourceDetailPageProps` | type-only type | `packages/ui/src/types.ts:433` | Props of the packaged `adonia/resource_detail` page (protocol v1 §3 `detail` mode). The descriptor's schema is the display projection — every field already mapped to its `displayType` — and `record` is the flat map its entries read values from (§6). |
| `ResourceFormPage` | function | `packages/ui/src/pages/resource_form.tsx:36` | The create/edit form inside the panel chrome. |
| `ResourceFormPageBody` | function | `packages/ui/src/pages/resource_form.tsx:76` | The default body. Deliberately thin: `useFormEngine` (§13.3) owns the flat state tree, JsonLogic reactivity, `sets` derivations, dependent-option refetching, `inputErrorsBag` mapping, dirty tracking and the unsaved-changes guard. What is left here is chrome and the submit target. |
| `ResourceFormPageProps` | type-only type | `packages/ui/src/types.ts:416` | Props of the packaged `adonia/resource_form` page (create and edit modes). `record` is present in edit mode; `state` is the initial `FormState`. |
| `ResourceIndexPage` | function | `packages/ui/src/pages/resource_index.tsx:43` | The resource index inside the panel chrome. |
| `ResourceIndexPageBody` | function | `packages/ui/src/pages/resource_index.tsx:71` | The default body: heading, create affordance, the `index.header` slot, then the descriptor-driven table. |
| `ResourceIndexPageProps` | type-only type | `packages/ui/src/types.ts:400` | Props of the packaged `adonia/resource_index` page: the page-specific keys sit BESIDE the `adonia` envelope (protocol v1 §1). `records` is partial-reloadable (`only: ['records']`, §10.2). |
| `resourceTrail` | function | `packages/ui/src/pages/breadcrumbs.ts:81` | The trail for a resource page, derived from the descriptor's mode and labels plus the current path (§10.1 route shapes). |
| `SUBTLE_ACTION_CLASS` | constant | `packages/ui/src/pages/page_chrome.tsx:35` | Outlined neutral button/link: secondary navigation and cancels. |
| `usePageOverride` | function | `packages/ui/src/pages/page_keys.ts:50` | The component an app registered for a page key, or `undefined`. |

## `@adonia/ui/registry`

| Export | Kind | Source | Summary |
| --- | --- | --- | --- |
| `AdoniaCommand` | type-only type | `packages/ui/src/registry/index.ts:191` | A command contribution that either navigates or executes a callback. |
| `AdoniaCommandContext` | type-only type | `packages/ui/src/registry/index.ts:166` | Runtime capabilities handed to an `AdoniaCommand` runner. |
| `AdoniaCommandItem` | type-only type | `packages/ui/src/registry/index.ts:201` | One item accepted by `ComponentRegistry.commands`. |
| `AdoniaUiPlugin` | type-only type | `packages/ui/src/registry/index.ts:274` | A callback plugin or a duplicate-safe named plugin object. |
| `AdoniaUiPluginCallback` | type-only type | `packages/ui/src/registry/index.ts:252` | Callback-form UI plugin. Callbacks are intentionally unnamed and may be composed repeatedly; use a named plugin when duplicate detection matters. |
| `CellProps` | type-only type | `packages/ui/src/registry/index.ts:137` | Props of a registered cell component (table column position). |
| `ComponentRegistry` | class | `packages/ui/src/registry/index.ts:284` | ComponentRegistry — the ABI-stable contribution surface for descriptor components and panel commands (TECH_SPEC §13.2). Registration is last-write-wins; overriding a built-in component logs a dev-build warning. |
| `createAdoniaRegistry` | function | `packages/ui/src/registry/index.ts:709` | Create a registry pre-populated with every core schema renderer, table renderer, widget, and built-in transform. |
| `FieldController` | type-only type | `packages/ui/src/registry/index.ts:104` | Control surface handed to field components (TECH_SPEC §13.2: `FieldController`). `useFormEngine` builds one per state-bearing node, with `reactive` rules already evaluated and dependent options already fetched; `SchemaRenderer` synthesizes a bare one when it renders without an engine (a detail projection, a preview), in which case `FieldController.refetchOptions` delegates to the optional `onRefetchOptions` render prop and otherwise dev-warns. |
| `FieldProps` | type-only type | `packages/ui/src/registry/index.ts:124` | Props of a registered field component (schema child position). |
| `FilterProps` | type-only type | `packages/ui/src/registry/index.ts:152` | Props of a registered filter component (table filter position). |
| `getDefaultRegistry` | function | `packages/ui/src/registry/index.ts:743` | Lazily created shared registry used when no `AdoniaProvider` supplies one. Module-eval free (SSR-friendly) and pre-populated with the built-ins. |
| `LayoutProps` | type-only type | `packages/ui/src/registry/index.ts:130` | Props of a registered layout component (`grid`, `section`, `aside`, …). |
| `NamedAdoniaUiPlugin` | type-only type | `packages/ui/src/registry/index.ts:262` | Named client half of an Adonia plugin. |
| `RegistryMapName` | type-only type | `packages/ui/src/registry/index.ts:215` | Registry-map names, one per syntactic position (TECH_SPEC §13.2, ABI stable): schema children resolve against `field` + `layout`, table columns against `cell`, table filters against `filter`, dashboard tiles against `widget`, generic-page overrides against `page`, `reactive.sets` `fn:*` transforms against `transform`, and render-hook slots against `slot`. |
| `UnknownComponentEvent` | type-only type | `packages/ui/src/registry/index.ts:236` | Privacy-safe telemetry emitted when a renderer encounters an unregistered descriptor component. |
| `UnknownComponentPosition` | type-only type | `packages/ui/src/registry/index.ts:226` | Syntactic position at which a descriptor component could not be resolved. |
| `UnknownComponentSubscriber` | type-only type | `packages/ui/src/registry/index.ts:246` | Subscriber invoked for each unknown-component occurrence. |
| `WidgetProps` | type-only type | `packages/ui/src/registry/index.ts:161` | Props of a registered widget component. |

## `@adonia/ui/styles.css`

Public asset: `./styles.css`.

## `@adonia/ui/tailwind`

| Export | Kind | Source | Summary |
| --- | --- | --- | --- |
| `adoniaPreset` | constant | `packages/ui/src/tailwind/preset.ts:58` | The preset object. Utilities land under an `adonia-` prefix for colours (`bg-adonia-surface`, `text-adonia-text-muted`, `bg-adonia-accent-600`) and under plain names for the scales (`rounded-adonia`, `p-adonia-4`, `text-adonia-sm`, `font-adonia`). |
| `AdoniaTailwindPreset` | type-only type | `packages/ui/src/tailwind/preset.ts:32` | The subset of Tailwind's config shape this preset fills. Declared locally because `tailwindcss` is not a dependency of `@adonia/ui` — the preset must be importable by an app whose Tailwind version we do not control. |
| `default` | constant | `packages/ui/src/tailwind/preset.ts:58` | The preset object. Utilities land under an `adonia-` prefix for colours (`bg-adonia-surface`, `text-adonia-text-muted`, `bg-adonia-accent-600`) and under plain names for the scales (`rounded-adonia`, `p-adonia-4`, `text-adonia-sm`, `font-adonia`). |

Source: https://adonia.pages.dev/reference/api/ui/index.mdx
