@uni-design-system/uni-mcp 10.4.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/{chunk-QZ5TESCY.js → chunk-RAD6CBGV.js} +1023 -287
- package/dist/chunk-RAD6CBGV.js.map +1 -0
- package/dist/http.js +1 -1
- package/dist/server.js +1 -1
- package/dist/stdio.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-QZ5TESCY.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/core.ts","../src/data/uni-index.json","../src/server/store.ts","../../core/src/concepts/animation/duration.helpers.ts","../../core/src/concepts/animation/keyframes.constants.ts","../../core/src/concepts/color/color.helper.ts","../../core/src/concepts/color/color.utils.ts","../../core/src/concepts/generation/oklch.helper.ts","../../core/src/concepts/generation/palette.factory.ts","../../core/src/concepts/color/color.factory.ts","../../core/src/concepts/elevation/zIndex.ts","../../core/src/concepts/generation/dtcg.emitter.ts","../../core/src/concepts/generation/shadow.generator.ts","../../core/src/concepts/iconography/icon.records.ts","../../core/src/concepts/style/selectors.constants.ts","../../core/src/concepts/theme/themes/base.theme.ts","../../core/src/concepts/generation/theme.generator.ts","../../core/src/concepts/generation/theme-file.emitter.ts","../../core/src/concepts/gradient/gradient.helper.ts","../../core/src/concepts/iconography/icon.helper.ts","../../core/src/concepts/layout/layout.helper.ts","../../core/src/concepts/shadow/shadow.utils.ts","../../core/src/concepts/shadow/shadow.records.ts","../../core/src/concepts/style/inputs.constants.ts","../../core/src/concepts/theme/themes/dark.theme.ts","../../core/src/concepts/theme/themes/light.theme.ts","../../core/src/concepts/theme/theme.records.ts","../../core/src/concepts/theme/theme.validation.ts","../../core/src/concepts/typography/typography.records.ts","../../core/src/concepts/typography/typeface.helpers.ts","../../core/src/utils/getValue.ts","../../core/src/utils/debounce.ts","../src/server/generate.ts","../src/server/icons.ts","../src/server/theme-json.ts"],"sourcesContent":["/**\n * Server core — builds a fully-wired `McpServer` (tools + resources) over the\n * in-memory Uni index. Transport-agnostic: `stdio.ts` and `http.ts` both call\n * `createUniServer()`, so local and remote share exactly one implementation.\n */\nimport { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport * as store from './store.js';\nimport { formatGeneratedTheme } from './generate.js';\nimport { formatIconTokens } from './icons.js';\nimport {\n buildDtcgTokens,\n buildGeneratedTheme,\n buildStoredTheme,\n summarizeEnvelope,\n type BuildResult,\n} from './theme-json.js';\n\nconst FrameworkArg = z.enum(['angular', 'react']);\n\n/** `{ content: [text] }` — the shape every tool returns. */\nfunction text(body: string) {\n return { content: [{ type: 'text' as const, text: body }] };\n}\n\n/** Brand-seed inputs, shared by the file and runtime theme generators. */\nconst ThemeGenerationInput = {\n brand: z\n .union([z.string(), z.array(z.string()).min(1).max(3)])\n .describe('Brand hex color(s), e.g. \"#0052FF\". 2–3 colors map to primary/secondary/tertiary.'),\n vibe: z\n .enum(['jewel', 'pastel', 'earth', 'neutral', 'florescent'])\n .optional()\n .describe('Tonal character; defaults to a category inferred from the seed chroma.'),\n scheme: z\n .enum(['monochromatic', 'analogous', 'complimentary', 'splitComplimentary', 'triadic'])\n .optional()\n .describe('Hue-wheel relationship for generated roles; auto-classified for multi-color input.'),\n name: z.string().optional().describe('Theme display name, defaults to \"Brand\".'),\n};\n\n/**\n * Output contract for the runtime theme tools. The theme itself is typed as an\n * opaque object on purpose: uni-core's `parseTheme` is the single source of\n * truth for theme shape, and a zod mirror here would drift from it.\n */\nconst RuntimeThemeOutput = {\n themes: z\n .array(\n z.object({\n id: z.string(),\n name: z.string(),\n mode: z.enum(['light', 'dark']),\n theme: z\n .record(z.string(), z.unknown())\n .describe('A validated UniTheme with the built-in icon set elided.'),\n })\n )\n .describe('Registration-ready themes.'),\n contrast: z\n .object({\n summary: z.string(),\n pass: z.boolean(),\n worstRatio: z.number(),\n failing: z.array(\n z.object({\n mode: z.string(),\n foreground: z.string(),\n background: z.string(),\n ratio: z.number(),\n required: z.number(),\n })\n ),\n })\n .optional()\n .describe('WCAG audit of the generated colors; absent for themes that ship with Uni.'),\n apply: z\n .object({ snippet: z.string(), note: z.string() })\n .describe('How to register the theme, including the icon-hydration rule.'),\n iconsElided: z.literal(true),\n};\n\n/**\n * Structured results carry the payload; the text block is a short summary\n * rather than a duplicate serialization (the spec's SHOULD), because repeating\n * ~14 KB of theme JSON would double the cost of every call.\n */\nfunction runtimeTheme(result: BuildResult) {\n if (!result.ok) return { content: [{ type: 'text' as const, text: result.error }], isError: true };\n return {\n content: [{ type: 'text' as const, text: summarizeEnvelope(result.envelope) }],\n structuredContent: result.envelope as unknown as Record<string, unknown>,\n };\n}\n\nfunction notFound(kind: string, id: string) {\n return text(\n `No ${kind} found with id \\`${id}\\`. Use the matching list/search tool to discover valid ids.`\n );\n}\n\nexport function createUniServer(): McpServer {\n const server = new McpServer(\n { name: 'uni-design-system', version: store.meta.version },\n {\n instructions:\n 'Authoritative interface to the Uni Design System. Prefer these tools over ' +\n 'recalling component APIs or token values from memory: names, props, and tokens ' +\n 'here match the exact Uni release the developer installed. Start with ' +\n '`list-components` or `search`, then `get-component` / `get-component-examples`. ' +\n 'Use real token ids (via `list-tokens`) instead of raw hex. Theming has four tools, ' +\n 'split by what you need: to brand an app permanently, call `generate-uni-theme` once ' +\n 'and write the returned static `uni-theme.ts` — then change look and feel by editing ' +\n \"that file's tokens directly, since shared tokens propagate everywhere; to apply a \" +\n 'theme immediately with no build step (previews, per-tenant theming, generated UI), ' +\n 'call `generate-runtime-theme` or `get-runtime-theme` and register the JSON they ' +\n 'return; to read a theme\\'s token values without applying one, use `get-theme-template`. ' +\n 'Never inline `<svg>` in a component: when you meet inline SVG, or a brand icon set ' +\n 'to import, call `create-icon-tokens` to convert it into theme icon tokens, add them ' +\n 'to `uni-theme.ts`, and render with `<uni-icon name=\"…\" />`. For release questions ' +\n '(\"what changed in 8.1?\", \"what does upgrading get me?\"), call `get-changelog`.',\n }\n );\n\n // -- list-components -------------------------------------------------------\n server.registerTool(\n 'list-components',\n {\n title: 'List Uni components',\n description:\n 'Compact inventory of Uni components: id, name, summary, category, and which ' +\n 'frameworks each supports. Filter by framework, category, or status.',\n inputSchema: {\n framework: FrameworkArg.optional(),\n category: z.string().optional().describe('e.g. forms, layout, feedback, data, primitives'),\n status: z.enum(['stable', 'beta', 'deprecated']).optional(),\n },\n },\n async ({ framework, category, status }) =>\n text(store.formatComponentList(store.listComponents({ framework, category, status })))\n );\n\n // -- get-component ---------------------------------------------------------\n server.registerTool(\n 'get-component',\n {\n title: 'Get a Uni component',\n description:\n 'Full reference for one component: description, per-framework import + selector/tag, ' +\n 'complete API (inputs/outputs or props/events), related tokens, and a sample. ' +\n 'Pass `framework` to scope to Angular or React.',\n inputSchema: {\n id: z.string().describe('component id, e.g. \"button\"'),\n framework: FrameworkArg.optional(),\n },\n },\n async ({ id, framework }) => {\n const c = store.getComponent(id);\n return c ? text(store.formatComponent(c, framework)) : notFound('component', id);\n }\n );\n\n // -- get-component-examples ------------------------------------------------\n server.registerTool(\n 'get-component-examples',\n {\n title: 'Get component examples',\n description:\n 'Working, copy-pasteable code snippets for a component (from Storybook stories), with deep links.',\n inputSchema: { id: z.string(), framework: FrameworkArg.optional() },\n },\n async ({ id, framework }) => {\n const c = store.getComponent(id);\n return c ? text(store.formatExamples(c, framework)) : notFound('component', id);\n }\n );\n\n // -- list-tokens -----------------------------------------------------------\n server.registerTool(\n 'list-tokens',\n {\n title: 'List design tokens',\n description:\n 'Inventory of Uni design tokens. Filter by `type` (color, spacing, radius, shadow, ' +\n 'border, backdrop, thickness, typography, ...), `kind` (style|behavioral), or `theme`.',\n inputSchema: {\n type: z.string().optional(),\n kind: z.enum(['style', 'behavioral']).optional(),\n theme: z.string().optional(),\n },\n },\n async ({ type, kind, theme }) =>\n text(store.formatTokenList(store.listTokens({ type, kind, theme })))\n );\n\n // -- get-token -------------------------------------------------------------\n server.registerTool(\n 'get-token',\n {\n title: 'Get a design token',\n description:\n 'Resolved value, type, style/behavioral classification, alias chain, and per-theme values for one token.',\n inputSchema: {\n id: z.string().describe('token id, e.g. \"color.primary\" or \"input.behavior.height\"'),\n },\n },\n async ({ id }) => {\n const t = store.getToken(id);\n return t ? text(store.formatToken(t)) : notFound('token', id);\n }\n );\n\n // -- get-guidelines --------------------------------------------------------\n server.registerTool(\n 'get-guidelines',\n {\n title: 'Get component guidelines',\n description: \"Authored when-to-use, do/don't, and accessibility guidance for a component.\",\n inputSchema: { id: z.string() },\n },\n async ({ id }) => {\n const c = store.getComponent(id);\n return c ? text(store.formatGuidelines(c)) : notFound('component', id);\n }\n );\n\n // -- list-themes -----------------------------------------------------------\n server.registerTool(\n 'list-themes',\n {\n title: 'List theme templates',\n description: 'Available Uni theme templates.',\n inputSchema: {},\n },\n async () => text(store.formatThemeList(store.listThemes()))\n );\n\n // -- get-theme-template ----------------------------------------------------\n server.registerTool(\n 'get-theme-template',\n {\n title: 'Get a theme template',\n description:\n 'A theme in two distinct buckets: style overrides (apply via the Emotion theme provider) ' +\n 'and component options (pass as component inputs/props). Kept separate so each is applied correctly.',\n inputSchema: { id: z.string().describe('theme id, e.g. \"LightTheme\"') },\n },\n async ({ id }) => {\n const t = store.getTheme(id);\n return t ? text(store.formatTheme(t)) : notFound('theme', id);\n }\n );\n\n // -- generate-uni-theme ----------------------------------------------------\n server.registerTool(\n 'generate-uni-theme',\n {\n title: 'Generate a Uni brand theme file',\n description:\n 'Generate a complete, WCAG-AA light+dark Uni theme from brand hex color(s) and return ' +\n 'the static `uni-theme.ts` file content (write it to `src/app/uni-theme.ts`), the ' +\n '`UNI_THEMES` provider registration snippet, and a contrast report. The file is plain ' +\n 'editable data and becomes the source of truth: later restyling means editing its ' +\n 'tokens (colors, named border primitives, sparse component overrides) — not calling ' +\n 'this tool again. Never hardcode hex in components; reference theme tokens.',\n inputSchema: {\n ...ThemeGenerationInput,\n shape: z\n .enum(['sharp', 'modern', 'playful'])\n .optional()\n .describe('Shape language — emits a radii override into the file.'),\n darkMode: z.boolean().optional().describe('Emit the dark theme too. Defaults to true.'),\n },\n },\n async (args) => text(formatGeneratedTheme(args))\n );\n\n // -- generate-runtime-theme ------------------------------------------------\n server.registerTool(\n 'generate-runtime-theme',\n {\n title: 'Generate a Uni brand theme as runtime JSON',\n description:\n 'Generate a WCAG-AA light+dark Uni theme from brand hex color(s) and return it as ' +\n 'validated JSON data, ready to register live via `ThemeService.registerTheme(theme, ' +\n '{ select: true })` — no file to write, no rebuild. Use this when a theme should apply ' +\n 'immediately (previewing a brand, per-tenant theming, generated UI). To brand an app ' +\n 'permanently, use `generate-uni-theme` instead: it returns an editable `uni-theme.ts` ' +\n 'that becomes the source of truth. The built-in icon set is elided from the payload and ' +\n 'restored on registration.',\n inputSchema: {\n ...ThemeGenerationInput,\n shape: z\n .enum(['sharp', 'modern', 'playful'])\n .optional()\n .describe('Shape language — sets the radii scale on the returned themes.'),\n darkMode: z\n .boolean()\n .optional()\n .describe('Include the dark theme too. Defaults to true.'),\n },\n outputSchema: RuntimeThemeOutput,\n },\n async (args) => runtimeTheme(buildGeneratedTheme(args))\n );\n\n // -- get-runtime-theme -----------------------------------------------------\n server.registerTool(\n 'get-runtime-theme',\n {\n title: 'Get a built-in Uni theme as runtime JSON',\n description:\n 'A theme that ships with Uni, as a complete validated `UniTheme` ready to register at ' +\n 'runtime. Differs from `get-theme-template`, which returns a flat read-only projection ' +\n 'of token values for inspection — this returns the real theme object. The built-in icon ' +\n 'set is elided from the payload and restored on registration.',\n inputSchema: {\n id: z.string().describe('Theme id, e.g. \"LightTheme\" or \"DarkTheme\".'),\n },\n outputSchema: RuntimeThemeOutput,\n },\n async ({ id }) => runtimeTheme(buildStoredTheme(id))\n );\n\n // -- export-dtcg-tokens ----------------------------------------------------\n server.registerTool(\n 'export-dtcg-tokens',\n {\n title: 'Export DTCG design tokens',\n description:\n 'W3C DTCG JSON (Style Dictionary compatible) for a built-in Uni theme — the color, ' +\n 'radius, and spacing scales, named with Uni token ids. Use this to feed external ' +\n 'token pipelines; the `UniTheme` JSON from the theme tools remains the lossless ' +\n 'primary format.',\n inputSchema: {\n theme: z.string().describe('Theme id, e.g. \"LightTheme\" or \"DarkTheme\".'),\n },\n },\n async ({ theme }) => {\n const result = buildDtcgTokens(theme);\n if (!result.ok) return { content: [{ type: 'text' as const, text: result.error }], isError: true };\n return text('```json\\n' + result.json + '\\n```');\n }\n );\n\n // -- create-icon-tokens ----------------------------------------------------\n server.registerTool(\n 'create-icon-tokens',\n {\n title: 'Convert SVGs into Uni icon tokens',\n description:\n 'Convert raw SVG source into theme icon tokens and return a paste-ready `icons` map for ' +\n '`uni-theme.ts`. Use this whenever an app has inline `<svg>` in a component, or a brand ' +\n 'icon set to import: move the artwork into the theme once, then render it anywhere with ' +\n '`<uni-icon name=\"…\" />`. Encodes to a `currentColor`-masked data URI (identical to the ' +\n 'built-in set), reports which names override built-ins, flags artwork that cannot be ' +\n 'masked (multi-color, gradients, no viewBox, raster or external references), and warns ' +\n 'when a set mixes viewBox grids. Icons are monochrome — a multi-color logo flattens to a ' +\n 'silhouette. Safe to re-run: already-encoded data URIs pass through unchanged.',\n inputSchema: {\n icons: z\n .array(\n z.object({\n name: z\n .string()\n .describe('Token name, e.g. \"acmeLogo\". Converted to flat camelCase if needed.'),\n svg: z\n .string()\n .describe('Raw SVG source, or an already-encoded data:image/svg+xml URI.'),\n allowMultiColor: z\n .boolean()\n .optional()\n .describe(\n 'Accept multi-color artwork, knowing the mask flattens it to a silhouette.'\n ),\n })\n )\n .min(1)\n .describe('The icons to convert. Pass the whole set at once so grids can be compared.'),\n },\n },\n async ({ icons }) => text(formatIconTokens(icons))\n );\n\n // -- get-changelog ---------------------------------------------------------\n server.registerTool(\n 'get-changelog',\n {\n title: 'Get release notes',\n description:\n 'Release notes for the Uni packages, from their changesets changelogs. Answers ' +\n '\"what changed in X?\" and \"what do I get by upgrading?\". Pass `version` for one ' +\n \"release's full notes (\\\"8.1\\\" matches every 8.1.x), `since` for the full notes of \" +\n 'every release after an installed version (an upgrade diff), or neither for a ' +\n 'compact release list.',\n inputSchema: {\n package: z\n .string()\n .optional()\n .describe('npm name or short name, e.g. \"uni-angular\" (default), \"uni-core\", \"uni-react\", \"uni-mcp\".'),\n version: z.string().optional().describe('One release, e.g. \"8.1.0\" or \"8.1\".'),\n since: z.string().optional().describe('Every release newer than this version, e.g. the installed \"8.0.0\".'),\n },\n },\n async ({ package: pkg, version, since }) => {\n const cl = store.getChangelog(pkg);\n if (!cl) {\n const known = store.listChangelogs().map((c) => `\\`${c.package}\\``).join(', ');\n return text(`No changelog for \\`${pkg}\\`. Known packages: ${known}.`);\n }\n return text(store.formatChangelog(cl, { version, since }));\n }\n );\n\n // -- search ----------------------------------------------------------------\n server.registerTool(\n 'search',\n {\n title: 'Search the design system',\n description:\n 'Keyword search across components, tokens, themes, and guidelines. Narrow with `kind`.',\n inputSchema: {\n query: z.string(),\n kind: z.enum(['component', 'token', 'theme', 'guideline']).optional(),\n },\n },\n async ({ query, kind }) => text(store.formatSearch(query, store.search(query, kind)))\n );\n\n registerResources(server);\n return server;\n}\n\n/** Read-only, addressable content the host can browse or pin. */\nfunction registerResources(server: McpServer): void {\n server.registerResource(\n 'meta',\n 'uni://meta',\n {\n title: 'Uni index metadata',\n description: 'Index version, Uni release, framework coverage, counts, build time.',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [\n { uri: uri.href, mimeType: 'application/json', text: JSON.stringify(store.meta, null, 2) },\n ],\n })\n );\n\n server.registerResource(\n 'component',\n new ResourceTemplate('uni://components/{id}', {\n list: async () => ({\n resources: store\n .listComponents()\n .map((c) => ({ uri: `uni://components/${c.id}`, name: c.name, description: c.summary })),\n }),\n }),\n {\n title: 'Uni component',\n description: 'A component reference card.',\n mimeType: 'text/markdown',\n },\n async (uri, { id }) => {\n const c = store.getComponent(String(id));\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: c ? store.formatComponent(c) : `Unknown component: ${id}`,\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'token',\n new ResourceTemplate('uni://tokens/{id}', {\n list: async () => ({\n resources: store.listTokens().map((t) => ({\n uri: `uni://tokens/${t.id}`,\n name: t.id,\n description: `${t.type} = ${t.value}`,\n })),\n }),\n }),\n { title: 'Uni token', description: 'A design token.', mimeType: 'text/markdown' },\n async (uri, { id }) => {\n const t = store.getToken(String(id));\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: t ? store.formatToken(t) : `Unknown token: ${id}`,\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'theme',\n new ResourceTemplate('uni://themes/{id}', {\n list: async () => ({\n resources: store\n .listThemes()\n .map((t) => ({ uri: `uni://themes/${t.id}`, name: t.name, description: t.description })),\n }),\n }),\n {\n title: 'Uni theme template',\n description: 'A theme template (style + component options).',\n mimeType: 'text/markdown',\n },\n async (uri, { id }) => {\n const t = store.getTheme(String(id));\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: t ? store.formatTheme(t) : `Unknown theme: ${id}`,\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'changelog',\n new ResourceTemplate('uni://changelog/{package}', {\n list: async () => ({\n resources: store.listChangelogs().map((c) => ({\n uri: `uni://changelog/${c.package.split('/').pop()}`,\n name: `${c.package} changelog`,\n description: `Release notes, latest ${c.releases[0]?.version ?? 'none'}.`,\n })),\n }),\n }),\n {\n title: 'Uni changelog',\n description: \"A package's release notes (compact digest).\",\n mimeType: 'text/markdown',\n },\n async (uri, { package: pkg }) => {\n const cl = store.getChangelog(String(pkg));\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: cl ? store.formatChangelog(cl) : `Unknown package: ${pkg}`,\n },\n ],\n };\n }\n );\n\n server.registerResource(\n 'guidelines',\n new ResourceTemplate('uni://guidelines/{id}', {\n list: async () => ({\n resources: store.listComponents().map((c) => ({\n uri: `uni://guidelines/${c.id}`,\n name: `${c.name} guidelines`,\n description: c.summary,\n })),\n }),\n }),\n {\n title: 'Uni guidelines',\n description: 'Authored usage guidance for a component.',\n mimeType: 'text/markdown',\n },\n async (uri, { id }) => {\n const c = store.getComponent(String(id));\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: c ? store.formatGuidelines(c) : `Unknown component: ${id}`,\n },\n ],\n };\n }\n );\n}\n","{\n \"meta\": {\n \"version\": \"10.4.0\",\n \"builtAt\": \"2026-09-04T18:00:08.990Z\",\n \"frameworks\": [\n \"angular\"\n ],\n \"counts\": {\n \"components\": 84,\n \"tokens\": 458,\n \"themes\": 2,\n \"examples\": 229\n }\n },\n \"components\": [\n {\n \"id\": \"alert\",\n \"name\": \"Alert\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-alert\",\n \"api\": [\n {\n \"name\": \"show\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"iconName\",\n \"kind\": \"input\",\n \"type\": \"IconName | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"symbolName\",\n \"kind\": \"input\",\n \"type\": \"string | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"useVariant\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"showing\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<button text-button (click)=\\\"alert.open()\\\">Show Alert</button>\\n<uni-alert #alert ${argsToTemplate(props)}>\\n ${ngContent}\\n</uni-alert>\\n<!-- args:\\n{\\n ngContent: 'This is an alert!',\\n variant: 'tertiary',\\n symbolName: 'privacy_tip',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Alert is used to communicate a state that affects a system, feature or page.\\nFor instance, alerts can be used to display errors or any unexpected results from a user's action.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": [\n \"alert.behavior.topPosition\",\n \"alert.behavior.borderRadius\",\n \"alert.behavior.motion\",\n \"alert.behavior.elevation\"\n ]\n },\n {\n \"id\": \"app-bar\",\n \"name\": \"AppBar\",\n \"status\": \"stable\",\n \"summary\": \"Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content.\",\n \"description\": \"Horizontal application bar: project leading controls (menu button, logo) with the `leading` attribute, actions with `trailing` (pushed to the far edge), and either pass `title` or project custom center content. Surface, divider, height, typography and spacing all resolve from `appBar` tokens. Place it inside your page's `<header>` landmark.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-app-bar\",\n \"api\": [\n {\n \"name\": \"title\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Bar title; alternatively project your own center content.\"\n },\n {\n \"name\": \"sticky\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Stick the bar to the top of its scroll container.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-app-bar [title]=\\\"title\\\" [sticky]=\\\"sticky\\\">\\n<button leading icon-button symbolName=\\\"menu\\\">Open navigation</button>\\n<button trailing icon-button symbolName=\\\"notifications\\\">Notifications</button>\\n<uni-avatar trailing name=\\\"Grace Hopper\\\" size=\\\"sm\\\" />\\n</uni-app-bar>\\n<!-- args:\\n{ title: 'Console' }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Horizontal application bar for the top of a page or section. Project controls with the\\n`leading` attribute (menu button, logo) and actions with `trailing` (pushed to the far\\nedge); pass `title` or project your own center content. Surface color, height, the\\ndivider rule, title typography and spacing all resolve from the theme's `appBar`\\noptions, and `sticky` pins the bar to the top of its scroll container.\\nPlace it inside your page's `<header>` landmark. It pairs with the Drawer — see the\\nDrawer docs for the full dashboard-shell recipe.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"The bar is a styled container, not a landmark — place it inside your page's `<header>` element.\",\n \"Give leading/trailing icon buttons text content or `ariaLabel` so they announce.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"avatar\",\n \"name\": \"Avatar\",\n \"status\": \"stable\",\n \"summary\": \"Identity avatar with a graceful fallback chain: image → initials from `name` → themed symbol.\",\n \"description\": \"Identity avatar with a graceful fallback chain: image → initials from `name` → themed symbol. Coloring, radius, typeface and sizes all resolve from `avatar` theme tokens; `variant` picks the container palette.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-avatar\",\n \"api\": [\n {\n \"name\": \"src\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Image URL; on load error the avatar falls back to initials/symbol.\"\n },\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Person's name: drives the initials and the accessible label.\"\n },\n {\n \"name\": \"text\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Verbatim text instead of derived initials (e.g. a group's “+3”).\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Initials\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Initials -->\\n<div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n<uni-avatar name=\\\"Ada Lovelace\\\" size=\\\"sm\\\" />\\n<uni-avatar name=\\\"Grace Hopper\\\" size=\\\"md\\\" variant=\\\"secondary\\\" />\\n<uni-avatar name=\\\"Katherine Johnson\\\" size=\\\"lg\\\" variant=\\\"tertiary\\\" />\\n<uni-avatar name=\\\"Annie Easley\\\" size=\\\"xl\\\" variant=\\\"success\\\" />\\n<uni-avatar size=\\\"lg\\\" variant=\\\"quaternary\\\" />\\n</div>\\n<!-- args:\\n{ name: 'Grace Hopper', variant: 'primary', size: 'lg' }\\n-->\"\n },\n {\n \"title\": \"Sizes And Variants\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Sizes And Variants -->\\n<div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n<uni-avatar name=\\\"Ada Lovelace\\\" size=\\\"sm\\\" />\\n<uni-avatar name=\\\"Grace Hopper\\\" size=\\\"md\\\" variant=\\\"secondary\\\" />\\n<uni-avatar name=\\\"Katherine Johnson\\\" size=\\\"lg\\\" variant=\\\"tertiary\\\" />\\n<uni-avatar name=\\\"Annie Easley\\\" size=\\\"xl\\\" variant=\\\"success\\\" />\\n<uni-avatar size=\\\"lg\\\" variant=\\\"quaternary\\\" />\\n</div>\"\n },\n {\n \"title\": \"Group\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Group -->\\n<uni-avatar-group [max]=\\\"3\\\" size=\\\"md\\\">\\n<uni-avatar name=\\\"Ada Lovelace\\\" />\\n<uni-avatar name=\\\"Grace Hopper\\\" variant=\\\"secondary\\\" />\\n<uni-avatar name=\\\"Katherine Johnson\\\" variant=\\\"tertiary\\\" />\\n<uni-avatar name=\\\"Annie Easley\\\" variant=\\\"success\\\" />\\n<uni-avatar name=\\\"Mary Jackson\\\" variant=\\\"warn\\\" />\\n</uni-avatar-group>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Identity avatar with a graceful fallback chain: the image when it loads, initials\\nderived from `name` when it doesn't (or was never given), and a themed symbol as the\\nlast resort. The name doubles as the accessible label; avatars with no name are marked\\ndecorative automatically.\\nVariants color initials from the role's container tokens, so avatars follow the brand\\npalette in light and dark. The corner radius is the theme's `avatar.options.borderRadius`\\ntoken — circles by default, squares under a `sharp` shape language.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"With a `name`, the avatar is `role=\\\"img\\\"` labelled by that name; purely decorative avatars are `aria-hidden`.\",\n \"The group is a `role=\\\"group\\\"`; the \\\"+N\\\" chip reads as text.\"\n ]\n },\n \"relatedTokens\": [\n \"avatar.behavior.borderRadius\",\n \"avatar.behavior.typeface\",\n \"avatar.behavior.fallbackSymbol\"\n ]\n },\n {\n \"id\": \"avatar-group\",\n \"name\": \"AvatarGroup\",\n \"status\": \"stable\",\n \"summary\": \"Overlapping stack of avatars.\",\n \"description\": \"Overlapping stack of avatars. `max` collapses the overflow into a themed “+N” chip (itself a `uni-avatar`). Overlap and separator ring resolve from `avatarGroup` theme tokens.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-avatar-group\",\n \"api\": [\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Show at most this many avatars; the rest collapse into a “+N” chip.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"background\",\n \"name\": \"Background\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-background\",\n \"api\": [\n {\n \"name\": \"image\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"imagePosition\",\n \"kind\": \"input\",\n \"type\": \"ImagePosition\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"imageSize\",\n \"kind\": \"input\",\n \"type\": \"'cover' | 'contain' | number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"default\": \"'100%'\",\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{\\n image: 'images/phone-zone-illustration.svg',\\n imagePosition: 'center',\\n imageSize: '400px',\\n height: '400px',\\n width: '100%',\\n }\\n-->\"\n },\n {\n \"title\": \"Contain Size\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Contain Size -->\\n<!-- args:\\n{\\n ...Primary.args,\\n imageSize: 'contain',\\n }\\n-->\"\n },\n {\n \"title\": \"Custom Position\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Custom Position -->\\n<!-- args:\\n{\\n ...Primary.args,\\n imagePosition: 'top',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Background component is a flexible container that allows you to add and control background images in your application.\\nIt provides various options for positioning and sizing the background image while maintaining a clean and responsive layout.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Ensure any text overlaid on the background has sufficient contrast\",\n \"Don't rely on background images to convey important information\",\n \"Consider providing alternative visual styles for users who prefer reduced motion\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"badge\",\n \"name\": \"Badge\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-badge]\",\n \"api\": [\n {\n \"name\": \"color\",\n \"kind\": \"input\",\n \"type\": \"Variant | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"useVariant\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Pass\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Pass -->\\n<div uni-badge color=\\\"${color}\\\" [width]=\\\"${width}\\\">\\n ${ngContent}\\n</div>\\n<!-- args:\\n{\\n color: 'secondary',\\n ngContent: 'Pass',\\n width: 76,\\n }\\n-->\"\n },\n {\n \"title\": \"Fail\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Fail -->\\n<div uni-badge color=\\\"${color}\\\" [width]=\\\"${width}\\\">\\n ${ngContent}\\n</div>\\n<!-- args:\\n{\\n color: 'warn',\\n ngContent: 'Fail',\\n width: 76,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Badges are used to highlight an item's status for quick recognition.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": [\n \"badge.behavior.borderRadius\"\n ]\n },\n {\n \"id\": \"body-render\",\n \"name\": \"BodyRender\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"directives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uniBodyRender]\",\n \"api\": []\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"box\",\n \"name\": \"Box\",\n \"status\": \"stable\",\n \"summary\": \"The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]=\\\"1\\\" padding=\\\"md\\\">`.\",\n \"description\": \"The base layout primitive, applied as an attribute to any element so semantics stay yours: `<main box-layout [grow]=\\\"1\\\" padding=\\\"md\\\">`. It is a directive, so it composes freely — with another layout attribute (`<div stack-layout uni-text=\\\"body-1-long\\\">`) and with a component's own host element (`<uni-card box-layout padding=\\\"lg\\\">`); Angular merges the host `class` bindings rather than letting one win. Sizing convention (height/width/min/max/inset): a **number is px and needs a binding** — `[height]=\\\"420\\\"`; a **plain attribute is a CSS length string** — `height=\\\"420px\\\"`. Spacing/radius/color inputs take theme tokens.\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-box-layout], [box-layout]\",\n \"api\": [\n {\n \"name\": \"containerColor\",\n \"kind\": \"input\",\n \"type\": \"ContainerColorToken\",\n \"required\": false,\n \"description\": \"A container color *pair*: the named surface plus its paired on-color, so a box and its contents stay legible together. Named `containerColor`, not `color`, because it is not the CSS `color` property — `uni-text` owns that name, and it maps to it directly. The two directives share elements routinely (`<div row-layout uni-text>`), and one `color` binding would feed both: the box would paint the surface and the text would take the same token, rendering ink on identical ink.\"\n },\n {\n \"name\": \"backgroundColor\",\n \"kind\": \"input\",\n \"type\": \"OptionalColor\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadius\",\n \"kind\": \"input\",\n \"type\": \"OptionalRadius\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadiusLeft\",\n \"kind\": \"input\",\n \"type\": \"OptionalRadius\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadiusRight\",\n \"kind\": \"input\",\n \"type\": \"OptionalRadius\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadiusTop\",\n \"kind\": \"input\",\n \"type\": \"OptionalRadius\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadiusBottom\",\n \"kind\": \"input\",\n \"type\": \"OptionalRadius\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingHorizontal\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingVertical\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingLeft\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingRight\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingTop\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingBottom\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"border\",\n \"kind\": \"input\",\n \"type\": \"OptionalBorder\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderTop\",\n \"kind\": \"input\",\n \"type\": \"OptionalBorder\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderBottom\",\n \"kind\": \"input\",\n \"type\": \"OptionalBorder\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderLeft\",\n \"kind\": \"input\",\n \"type\": \"OptionalBorder\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRight\",\n \"kind\": \"input\",\n \"type\": \"OptionalBorder\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"dashBorder\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"alignSelf\",\n \"kind\": \"input\",\n \"type\": \"OptionalAlignSelf\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"alignItems\",\n \"kind\": \"input\",\n \"type\": \"OptionalAlignItems\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"alignContent\",\n \"kind\": \"input\",\n \"type\": \"OptionalAlignContent\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"justifyContent\",\n \"kind\": \"input\",\n \"type\": \"OptionalJustifyContent\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"grow\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"flex\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"The `flex` shorthand. `[flex]=\\\"1\\\"` is `flex: 1` — grow, shrink and a zero basis — which `grow` alone cannot express, since it leaves `flex-basis: auto`. Wins over `grow` when both are set.\"\n },\n {\n \"name\": \"shrink\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"basis\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"marginInline\",\n \"kind\": \"input\",\n \"type\": \"'auto' | NullableSize\",\n \"required\": false,\n \"description\": \"Inline-axis margin. `marginInline=\\\"auto\\\"` centers a `maxWidth` container — the one thing flex centering cannot do without an extra wrapper. Only the inline axis is exposed: block margins collapse and fight `gap`, which is why the primitives carry no margin otherwise.\"\n },\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"position\",\n \"kind\": \"input\",\n \"type\": \"OptionalPosition\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"inset\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"Number = px via binding (`[height]=\\\"420\\\"`); string = CSS length (`height=\\\"420px\\\"`).\"\n },\n {\n \"name\": \"minHeight\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"maxHeight\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"Number = px via binding (`[width]=\\\"420\\\"`); string = CSS length (`width=\\\"50%\\\"`).\"\n },\n {\n \"name\": \"minWidth\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"maxWidth\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"ignoreDir\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"gridArea\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"gridColumn\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"gridRow\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"overflow\",\n \"kind\": \"input\",\n \"type\": \"OptionalOverflow\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"shadow\",\n \"kind\": \"input\",\n \"type\": \"Shadow\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"gap\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"fullHeight\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"flexDirection\",\n \"kind\": \"input\",\n \"type\": \"OptionalFlexDirection\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"textAlign\",\n \"kind\": \"input\",\n \"type\": \"OptionalTextAlign\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"wrapItems\",\n \"kind\": \"input\",\n \"type\": \"OptionalWrap\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"zIndex\",\n \"kind\": \"input\",\n \"type\": \"ZIndexableElements\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div box-layout ${argsToTemplate(props)}>\\n<span uni-text>${ngContent}</span>\\n</div>\\n<!-- args:\\n{\\n containerColor: 'secondary-container',\\n borderRadius: 'md',\\n padding: 'lg',\\n ngContent: 'Box Content.',\\n }\\n-->\"\n },\n {\n \"title\": \"Flex children\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Flex children -->\\n<div row-layout gap=\\\"md\\\" uni-text=\\\"body-2-short\\\">\\n<div box-layout [flex]=\\\"1\\\" containerColor=\\\"primary-container\\\" padding=\\\"md\\\" borderRadius=\\\"xs\\\">\\n flex 1 — a much longer label than its sibling\\n</div>\\n<div box-layout [flex]=\\\"1\\\" containerColor=\\\"primary-container\\\" padding=\\\"md\\\" borderRadius=\\\"xs\\\">\\n flex 1\\n</div>\\n<div box-layout [shrink]=\\\"0\\\" [basis]=\\\"120\\\" containerColor=\\\"secondary-container\\\" padding=\\\"md\\\" borderRadius=\\\"xs\\\">\\n fixed 120\\n</div>\\n</div>\"\n },\n {\n \"title\": \"Centered page shell\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Centered page shell -->\\n<div box-layout containerColor=\\\"surface\\\" padding=\\\"md\\\">\\n<main box-layout maxWidth=\\\"480px\\\" marginInline=\\\"auto\\\" padding=\\\"lg\\\"\\n containerColor=\\\"primary-container\\\" borderRadius=\\\"sm\\\" textAlign=\\\"center\\\" uni-text=\\\"body-1-long\\\">\\n maxWidth + marginInline=\\\"auto\\\"\\n</main>\\n</div>\"\n },\n {\n \"title\": \"Composition\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Composition -->\\n<div stack-layout gap=\\\"md\\\">\\n<div row-layout uni-text=\\\"title-large\\\" gap=\\\"sm\\\" padding=\\\"md\\\"\\n containerColor=\\\"primary-container\\\" borderRadius=\\\"xs\\\">\\n row-layout + uni-text on one element\\n</div>\\n<uni-card box-layout padding=\\\"lg\\\">uni-card + box-layout on one element</uni-card>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Box is the base layout primitive — an attribute directive you put on any element, so\\nyour HTML semantics stay yours. It is highly configurable; every other layout\\ndirective extends it and adds presets.\\nBecause it is a directive rather than a component, it composes freely: with another\\nlayout attribute, with `uni-text`, and with a component's own host element. Angular\\nmerges the host `class` bindings, so each contributor's styles survive.\\n```html\\n```\\nColors stay unambiguous across that composition. The box's surface is\\n`containerColor` — a **pair**: the named surface plus its paired on-color — while\\nplain `color` belongs to `uni-text` and maps to the CSS property. So an element\\nwearing both can set each independently:\\n```html\\n```\\nLayout attributes only apply when the directive is in your component's `imports`.\\nAn unimported attribute compiles cleanly and silently does nothing — import\\n`UNI_LAYOUT` to bring the whole family in at once.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"breadcrumb\",\n \"name\": \"Breadcrumb\",\n \"status\": \"stable\",\n \"summary\": \"WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current=\\\"page\\\"`), separators are decorative.\",\n \"description\": \"WAI-ARIA breadcrumb: a `nav` landmark wrapping an ordered list; the last item is the current page (`aria-current=\\\"page\\\"`), separators are decorative. Items with `href` render as real links; without one they render as link-styled buttons emitting `itemClicked` — wire that to your router.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-breadcrumb\",\n \"api\": [\n {\n \"name\": \"items\",\n \"kind\": \"input\",\n \"type\": \"BreadcrumbItem[]\",\n \"required\": true,\n \"description\": \"The trail, root first; the last item is the current page.\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Breadcrumb'\",\n \"description\": \"Landmark label distinguishing this nav from others on the page.\"\n },\n {\n \"name\": \"itemClicked\",\n \"kind\": \"output\",\n \"type\": \"BreadcrumbItem\",\n \"required\": false,\n \"description\": \"Emits the clicked ancestor item (also fires for `href` links).\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<!-- args:\\n{\\n items: [\\n { label: 'Home', href: '#' },\\n { label: 'Reports', href: '#' },\\n { label: 'Q3 Revenue' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Router-driven (no hrefs)\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Router-driven (no hrefs) -->\\n<!-- args:\\n{\\n items: [{ label: 'Home' }, { label: 'Settings' }, { label: 'Notifications' }],\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Breadcrumbs show where the current page sits in the hierarchy and give one-click\\npassage back up the trail. The component renders the WAI-ARIA pattern: a labelled\\n`nav` landmark wrapping an ordered list, with the last item marked as the current page\\nand separators hidden from assistive tech.\\nItems with `href` render as real links. For SPA routing, omit `href` and handle\\n`itemClicked` — items render as link-styled buttons instead. Typography, link and\\ncurrent-page colors, the separator symbol, and spacing all resolve from the theme's\\n`breadcrumb` options.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Renders the WAI-ARIA pattern: a labelled `nav` landmark wrapping an ordered list.\",\n \"The last item is `aria-current=\\\"page\\\"` and not a link.\",\n \"Separators are `aria-hidden` — screen readers hear the trail, not the chevrons.\",\n \"Set `ariaLabel` when a page has more than one breadcrumb nav.\"\n ]\n },\n \"relatedTokens\": [\n \"breadcrumb.behavior.typeface\",\n \"breadcrumb.behavior.color\",\n \"breadcrumb.behavior.currentColor\",\n \"breadcrumb.behavior.separatorSymbol\",\n \"breadcrumb.behavior.gap\"\n ]\n },\n {\n \"id\": \"button\",\n \"name\": \"Button\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"button[uni-text-button], button[text-button]\",\n \"api\": [\n {\n \"name\": \"disable\",\n \"kind\": \"input\",\n \"type\": \"boolean | undefined\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"loading\",\n \"kind\": \"input\",\n \"type\": \"boolean | undefined\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"symbolLeft\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"symbolRight\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<button text-button [variant]=\\\"variant\\\" [size]=\\\"size\\\" ${argsToTemplate(props)}>\\n {{ngContent}}\\n</button>\\n<!-- args:\\n{\\n variant: 'primary',\\n size: 'lg',\\n ngContent: 'Button',\\n }\\n-->\"\n },\n {\n \"title\": \"Secondary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Secondary -->\\n<button text-button [variant]=\\\"variant\\\" [size]=\\\"size\\\" ${argsToTemplate(props)}>\\n {{ngContent}}\\n</button>\\n<!-- args:\\n{\\n size: 'lg',\\n variant: 'secondary',\\n ngContent: 'Secondary Button',\\n }\\n-->\"\n },\n {\n \"title\": \"Tertiary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Tertiary -->\\n<button text-button [variant]=\\\"variant\\\" [size]=\\\"size\\\" ${argsToTemplate(props)}>\\n {{ngContent}}\\n</button>\\n<!-- args:\\n{\\n size: 'lg',\\n variant: 'tertiary',\\n ngContent: 'Tertiary Button',\\n }\\n-->\"\n },\n {\n \"title\": \"Medium\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Medium -->\\n<button text-button [variant]=\\\"variant\\\" [size]=\\\"size\\\" ${argsToTemplate(props)}>\\n {{ngContent}}\\n</button>\\n<!-- args:\\n{\\n size: 'md',\\n ngContent: 'Medium Button',\\n }\\n-->\"\n },\n {\n \"title\": \"Small\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Small -->\\n<button text-button [variant]=\\\"variant\\\" [size]=\\\"size\\\" ${argsToTemplate(props)}>\\n {{ngContent}}\\n</button>\\n<!-- args:\\n{\\n size: 'sm',\\n ngContent: 'Small Button',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Button is a clickable interactive element that triggers a response.\\nYou can place text and icons inside of a button.\\nButtons are often used for form submissions and to toggle elements into view.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"A real `<button>` element — native focus, Enter/Space activation, and `disabled` semantics.\",\n \"`aria-busy` is set while `loading`; the spinner and symbols are decorative.\"\n ]\n },\n \"relatedTokens\": [\n \"button.behavior.borderRadius\",\n \"button.behavior.typeface\"\n ]\n },\n {\n \"id\": \"button-group\",\n \"name\": \"ButtonGroup\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-button-group\",\n \"api\": []\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-button-group ${argsToTemplate(props)}>\\n <button icon-button symbolName=\\\"align_horizontal_left\\\" size=\\\"sm\\\"></button>\\n <button icon-button symbolName=\\\"align_horizontal_center\\\" size=\\\"sm\\\"></button>\\n <button icon-button symbolName=\\\"align_horizontal_right\\\" size=\\\"sm\\\"></button>\\n</uni-button-group>\\n<!-- args:\\n{}\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The `ButtonGroup` component is used to group related buttons. It applies some base styling to the nested buttons.\\nIf this is not desirable, consider using the `Row` component.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Group the related actions; each button keeps its own accessible name.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"calendar\",\n \"name\": \"Calendar\",\n \"status\": \"stable\",\n \"summary\": \"Inline month calendar: single-date or start–end range selection, day markers (availability dots), min/max fences and disabled dates.\",\n \"description\": \"Inline month calendar: single-date or start–end range selection, day markers (availability dots), min/max fences and disabled dates. One tab stop with a roving-tabindex `role=\\\"grid\\\"`; every day is a real button named with its full date. Values are plain ISO strings (`'YYYY-MM-DD'`), never `Date` objects, so bindings are timezone-free and serializable. Selection and today colours come from the theme's `primary` role pair; geometry and glyphs come from the `calendar` theme entry.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-calendar, Calendar\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniCalendarValue\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"mode\",\n \"kind\": \"input\",\n \"type\": \"UniCalendarMode\",\n \"required\": false,\n \"default\": \"'single'\",\n \"description\": \"`'single'` reads/writes a `UniDate`; `'range'` a `UniDateRange`.\"\n },\n {\n \"name\": \"month\",\n \"kind\": \"model\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Shown month, `'YYYY-MM'` — two-way, so an app can drive \\\"jump to June\\\".\"\n },\n {\n \"name\": \"minDate\",\n \"kind\": \"input\",\n \"type\": \"UniDate\",\n \"required\": false,\n \"description\": \"Earliest selectable date (inclusive).\"\n },\n {\n \"name\": \"maxDate\",\n \"kind\": \"input\",\n \"type\": \"UniDate\",\n \"required\": false,\n \"description\": \"Latest selectable date (inclusive).\"\n },\n {\n \"name\": \"markers\",\n \"kind\": \"input\",\n \"type\": \"UniCalendarMarker[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"Availability dots; `label` extends the day's accessible name.\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"BCP 47 tag; defaults to the document language, then the browser's.\"\n },\n {\n \"name\": \"weekStart\",\n \"kind\": \"input\",\n \"type\": \"0 | 1 | 2 | 3 | 4 | 5 | 6\",\n \"required\": false,\n \"description\": \"First day of week, 0 = Sunday; defaults from the locale's week info.\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Names the grid when it stands alone (otherwise the heading names it).\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'md'\",\n \"description\": \"Day geometry token; `sm`/`md`/`lg` map to the theme's `calendar` sizes.\"\n },\n {\n \"name\": \"selected\",\n \"kind\": \"output\",\n \"type\": \"UniDate\",\n \"required\": false,\n \"description\": \"Each committed day, including both ends of a range.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{ value: dayIn(12), month: MONTH }\\n-->\"\n },\n {\n \"title\": \"Range\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Range -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{ mode: 'range', value: { start: dayIn(3), end: dayIn(7) }, month: MONTH }\\n-->\"\n },\n {\n \"title\": \"Markers\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Markers -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{\\n month: MONTH,\\n markers: [\\n { date: dayIn(4), variant: 'success', label: '3 slots open' },\\n { date: dayIn(4), variant: 'primary' },\\n { date: dayIn(16), variant: 'warn', label: '1 slot open' },\\n { date: dayIn(24), variant: 'secondary' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Fenced And Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Fenced And Disabled -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{\\n month: MONTH,\\n minDate: dayIn(5),\\n maxDate: dayIn(25),\\n disabledDates: (date: string) => [0, 6].includes(new Date(`${date}T00:00:00Z`).getUTCDay()),\\n }\\n-->\"\n },\n {\n \"title\": \"Sizes\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Sizes -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{ locale: 'de-DE', weekStart: 1, month: MONTH, value: dayIn(12) }\\n-->\"\n },\n {\n \"title\": \"Locale And Week Start\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Locale And Week Start -->\\n<uni-calendar size=\\\"sm\\\" ariaLabel=\\\"Small\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"md\\\" ariaLabel=\\\"Medium\\\" month=\\\"${MONTH}\\\" />\\n<uni-calendar size=\\\"lg\\\" ariaLabel=\\\"Large\\\" month=\\\"${MONTH}\\\" />\\n<!-- args:\\n{ locale: 'de-DE', weekStart: 1, month: MONTH, value: dayIn(12) }\\n-->\"\n },\n {\n \"title\": \"Scheduling\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Scheduling -->\\n<uni-calendar\\n ariaLabel=\\\"Appointment date\\\"\\n [minDate]=\\\"minDate\\\"\\n [maxDate]=\\\"maxDate\\\"\\n [disabledDates]=\\\"isFullyBooked\\\"\\n [markers]=\\\"markers\\\"\\n/>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"An inline month calendar — a form control in its own right, not just the\\ninside of a date picker. It selects a single date or a start–end range, marks\\ndays with app-driven availability dots, and fences selection with\\n`minDate`/`maxDate`/`disabledDates`. Values are plain ISO strings\\n(`'2026-08-20'`, `{ start, end }`), never `Date` objects, so bindings are\\ntimezone-free, serializable and sortable with `<`.\\nReach for it directly when the calendar should stay on screen — scheduling\\npages, availability dashboards, booking flows. For a text field with this\\ngrid in a popup, use `uni-date-input`; both render the same component, so it\\nis one grid to learn, test and theme.\",\n \"dos\": [\n \"Bind ISO strings: `[value]=\\\"'2026-08-20'\\\"` is a complete, correct binding.\",\n \"Drive availability through `markers` and `disabledDates` from app data.\",\n \"Give a standalone calendar an `ariaLabel` naming the question it answers.\"\n ],\n \"donts\": [\n \"Don't convert to `Date` objects at the edge of the component — midnight-UTC\",\n \"Don't restyle selection colours per instance; retheme the `primary` pair.\",\n \"Don't build a popup date field from this yourself — `uni-date-input`\"\n ],\n \"accessibility\": [\n \"The month grid is `role=\\\"grid\\\"` labelled by the month heading (or\",\n \"Every day is a real `<button>` in a `role=\\\"gridcell\\\"`, named with its full\",\n \"One tab stop: roving `tabindex` inside the grid; ←/→ move a day, ↑/↓ a\",\n \"Today is `aria-current=\\\"date\\\"` with an outline; selection is a fill;\",\n \"Selections and range progress announce through one `role=\\\"status\\\"` region;\",\n \"`aria-invalid` is gated on `invalid && (touched || dirty)`, per the\"\n ]\n },\n \"relatedTokens\": [\n \"calendar.behavior.dayBorderRadius\",\n \"calendar.behavior.typeface\",\n \"calendar.behavior.gap\",\n \"calendar.behavior.navPrevSymbol\",\n \"calendar.behavior.navNextSymbol\",\n \"calendar.behavior.weekdayFormat\",\n \"calendar.behavior.showOutsideDays\",\n \"calendar.behavior.todayStyle\"\n ]\n },\n {\n \"id\": \"callout\",\n \"name\": \"Callout\",\n \"status\": \"stable\",\n \"summary\": \"Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target.\",\n \"description\": \"Anchored coach-mark panel that dims the page and cuts a spotlight hole around its target. Both the scrim and the panel are `popover=\\\"manual\\\"` elements shown in order, so they stack deterministically in the top layer above every app z-index, and every scrim piece is CSS-anchor-positioned to the target — the hole tracks scroll/resize/layout with zero listeners. The panel is a non-modal `role=\\\"dialog\\\"` (deliberately no `aria-modal`): focus moves into it on open, Tab runs a \\\"duet loop\\\" over the panel's focusables plus the spotlit target while it stays interactive, and on close focus returns to the pre-open element — unless the user moved into the target, where it stays. Storage-free by rule: `key` and the `dismissed` output are the \\\"don't show again\\\" hooks; persistence is the app's business (e.g. cdk local-storage).\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-callout\",\n \"api\": [\n {\n \"name\": \"open\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"key\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Identifies this callout in `dismissed` payloads. Empty string = unset.\"\n },\n {\n \"name\": \"target\",\n \"kind\": \"input\",\n \"type\": \"HTMLElement | string\",\n \"required\": false,\n \"description\": \"Element (or id, resolved at open time) to spotlight. '' = unset.\"\n },\n {\n \"name\": \"placement\",\n \"kind\": \"input\",\n \"type\": \"Placement\",\n \"required\": false,\n \"default\": \"'bottom'\",\n \"description\": \"\"\n },\n {\n \"name\": \"backdrop\",\n \"kind\": \"input\",\n \"type\": \"'spotlight' | 'dim' | 'none'\",\n \"required\": false,\n \"description\": \"Defaults to `spotlight` when a target resolves, else `dim`.\"\n },\n {\n \"name\": \"targetInteractive\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"When false, a transparent cover blocks the spotlit target.\"\n },\n {\n \"name\": \"dismissible\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Gates Escape and the close button.\"\n },\n {\n \"name\": \"dismissOnBackdrop\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"When true, scrim clicks close (reason `backdrop`); else the panel pulses.\"\n },\n {\n \"name\": \"header\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"arrow\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Wins over the header/body labelling; the tour sets \\\"{title}, step n of N\\\".\"\n },\n {\n \"name\": \"closeLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Close'\",\n \"description\": \"Accessible name of the dismiss button (the tour passes its skip label).\"\n },\n {\n \"name\": \"opened\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"closed\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"dismissed\",\n \"kind\": \"output\",\n \"type\": \"UniCalloutDismissal\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"panelKeydown\",\n \"kind\": \"output\",\n \"type\": \"KeyboardEvent\",\n \"required\": false,\n \"description\": \"Keys pressed while focus is inside the panel (the tour's arrow-key hook).\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Spotlight\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Spotlight -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"open = true\\\">Show me around</button>\\n<uni-input label=\\\"Search projects\\\" id=\\\"callout-demo-search\\\"></uni-input>\\n<uni-callout\\n [(open)]=\\\"open\\\"\\n key=\\\"search-intro\\\"\\n target=\\\"callout-demo-search\\\"\\n header=\\\"Find anything\\\"\\n placement=\\\"bottom\\\"\\n>\\n Type to filter projects, people, and documents — try it right here.\\n <button text-button callout-actions size=\\\"sm\\\" variant=\\\"secondary\\\" (click)=\\\"open = false\\\">Got it</button>\\n</uni-callout>\\n</div>\"\n },\n {\n \"title\": \"Locked Spotlight\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Locked Spotlight -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"open = true\\\">Explain the report</button>\\n<uni-input label=\\\"Weekly report\\\" id=\\\"callout-demo-report\\\"></uni-input>\\n<uni-callout\\n [(open)]=\\\"open\\\"\\n target=\\\"callout-demo-report\\\"\\n [targetInteractive]=\\\"false\\\"\\n header=\\\"Read-only for now\\\"\\n variant=\\\"secondary\\\"\\n>\\n Reports unlock after your first project ships.\\n <button text-button callout-actions size=\\\"sm\\\" variant=\\\"secondary\\\" (click)=\\\"open = false\\\">OK</button>\\n</uni-callout>\\n</div>\"\n },\n {\n \"title\": \"Dim\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Dim -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"open = true\\\">What's new</button>\\n<uni-callout [(open)]=\\\"open\\\" header=\\\"March release\\\">\\n Calendar inputs, themable focus rings, and release notes in the MCP server.\\n <button text-button callout-actions size=\\\"sm\\\" variant=\\\"secondary\\\" (click)=\\\"open = false\\\">Nice</button>\\n</uni-callout>\\n</div>\"\n },\n {\n \"title\": \"No Backdrop\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: No Backdrop -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"open = true\\\">Hint</button>\\n<uni-input label=\\\"Amount\\\" id=\\\"callout-demo-amount\\\"></uni-input>\\n<uni-callout [(open)]=\\\"open\\\" target=\\\"callout-demo-amount\\\" backdrop=\\\"none\\\" header=\\\"Pro tip\\\">\\n Press ↑/↓ to step the amount.\\n</uni-callout>\\n</div>\"\n },\n {\n \"title\": \"Dismissal Tracking\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Dismissal Tracking -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"open = true\\\">Show the callout</button>\\n<uni-input label=\\\"Owner\\\" id=\\\"callout-demo-owner\\\"></uni-input>\\n<uni-callout\\n [(open)]=\\\"open\\\"\\n key=\\\"owner-intro\\\"\\n target=\\\"callout-demo-owner\\\"\\n header=\\\"Assign an owner\\\"\\n [dismissOnBackdrop]=\\\"true\\\"\\n (dismissed)=\\\"record($event)\\\"\\n>\\n Every project needs one accountable owner.\\n</uni-callout>\\n<div>\\n @for (entry of log; track $index) {\\n <div>{{ entry }}</div>\\n }\\n</div>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Callout is an anchored coach-mark panel that dims the page and cuts a\\nspotlight hole around its target — the feature-introduction surface. The\\nscrim and hole are CSS-anchor-positioned to the target, so the spotlight\\ntracks scroll, resize, and layout with zero listeners, and the spotlit\\nelement stays genuinely clickable through the hole (or covered, with\\n`targetInteractive` false). Both surfaces ride the native popover top layer,\\nabove every app z-index.\\nThe panel is a non-modal `role=\\\"dialog\\\"`: focus moves in on open, Tab runs a\\nduet loop over the panel's controls plus the interactive target, and close\\nrestores focus — unless the user moved into the target, where it stays.\\nCallouts are storage-free by rule: `key` and the `dismissed` output (with a\\n`reason`) are the \\\"don't show again\\\" hooks, and persistence belongs to the\\napp.\",\n \"dos\": [\n \"Point one callout at one action, and let `key` + `dismissed` drive \\\"don't show again\\\"\",\n \"Keep the target interactive when the callout invites trying it\"\n ],\n \"donts\": [\n \"Stack multiple callouts at once — sequence them with `uni-tour`\",\n \"Use a callout for blocking confirmation; that is a dialog\"\n ],\n \"accessibility\": [\n \"Non-modal `role=\\\"dialog\\\"`, labelled by `header` (or `ariaLabel`); `aria-modal` is deliberately absent — the page is dimmed, not removed.\",\n \"Initial focus: `[autofocus]` → first action → first focusable → the panel itself.\",\n \"Focus restore on close skips users who deliberately moved into the target.\",\n \"The spotlight ring is the `variant` color role and pairs with a shape (the ring), not color alone.\"\n ]\n },\n \"relatedTokens\": [\n \"callout.behavior.color\",\n \"callout.behavior.borderRadius\",\n \"callout.behavior.shadow\",\n \"callout.behavior.width\",\n \"callout.behavior.padding\",\n \"callout.behavior.headerTypeface\",\n \"callout.behavior.typeface\",\n \"callout.behavior.closeSymbol\",\n \"callout.behavior.arrowSize\",\n \"callout.behavior.offset\",\n \"callout.behavior.scrimColor\",\n \"callout.behavior.spotlightPadding\",\n \"callout.behavior.spotlightRadius\",\n \"callout.behavior.ringWidth\",\n \"callout.behavior.motion\"\n ]\n },\n {\n \"id\": \"card\",\n \"name\": \"Card\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-card\",\n \"api\": [\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-card variant=\\\"${variant}\\\">\\n <uni-card-header title=\\\"Card Header\\\"></uni-card-header>\\n <uni-card-content>\\n <span uni-text>${ngContent}</span>\\n </uni-card-content>\\n</uni-card>\\n<!-- args:\\n{\\n variant: 'primary',\\n size: 'lg',\\n ngContent: 'Card content.',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Content container with a themed frame: the border resolves from the **border\\nprimitive named by its variant** (`borders.primary` … `borders.success`), the corner\\nradius from the `card` theme options, and an optional elevation shadow. Compose with\\nCard Header and Card Content for the standard anatomy — or point `options.border` at\\na custom primitive to restyle every card in the theme at once.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": [\n \"card.behavior.borderRadius\"\n ]\n },\n {\n \"id\": \"card-content\",\n \"name\": \"CardContent\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-card-content\",\n \"api\": [\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"card-header\",\n \"name\": \"CardHeader\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-card-header\",\n \"api\": [\n {\n \"name\": \"title\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"titleTextRole\",\n \"kind\": \"input\",\n \"type\": \"Typeface\",\n \"required\": false,\n \"default\": \"'title-large'\",\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"center\",\n \"name\": \"Center\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-center-layout], [center-layout]\",\n \"api\": [\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"default\": \"'flex'\",\n \"description\": \"\"\n },\n {\n \"name\": \"justifyContent\",\n \"kind\": \"input\",\n \"type\": \"OptionalJustifyContent\",\n \"required\": false,\n \"default\": \"'center'\",\n \"description\": \"\"\n },\n {\n \"name\": \"alignItems\",\n \"kind\": \"input\",\n \"type\": \"OptionalAlignItems\",\n \"required\": false,\n \"default\": \"'center'\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div center-layout ${argsToTemplate(props)}>\\n <span uni-text=\\\"headline-large\\\">${ngContent}</span>\\n</div>\\n<!-- args:\\n{\\n ngContent: 'Centered Content',\\n height: 180,\\n width: '100%',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"`Center` is a layout component that centers its child within itself.\\n`Center` is an extension to the `Box` component and has all the `Box` attributes available to it.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"checkbox\",\n \"name\": \"Checkbox\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-checkbox\",\n \"api\": [\n {\n \"name\": \"checked\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"checkedColor\",\n \"kind\": \"input\",\n \"type\": \"ColorKey\",\n \"required\": false,\n \"description\": \"Accent colour token, overriding the variant's themed accent for one instance. Mirrors `uni-toggle`'s input of the same name — it exists because `variant` defaults to `'primary'`, so the component cannot tell \\\"set to primary\\\" from \\\"not set\\\".\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"indeterminate\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Mixed state for \\\"select all\\\"-style parent checkboxes. Cleared automatically on the next user interaction, matching native behavior.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-checkbox ${argsToTemplate(args)}></uni-checkbox>\\n<!-- args:\\n{\\n label: 'Accept terms and conditions',\\n variant: 'primary',\\n disabled: false,\\n checked: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Without Label\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Without Label -->\\n<uni-checkbox ${argsToTemplate(args)}></uni-checkbox>\\n<!-- args:\\n{\\n label: '',\\n variant: 'primary',\\n disabled: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-checkbox ${argsToTemplate(args)}></uni-checkbox>\\n<!-- args:\\n{\\n label: 'Disabled checkbox',\\n variant: 'primary',\\n disabled: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Variants\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variants -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-checkbox label=\\\"Primary\\\" variant=\\\"primary\\\"></uni-checkbox>\\n<uni-checkbox label=\\\"Secondary\\\" variant=\\\"secondary\\\"></uni-checkbox>\\n<uni-checkbox label=\\\"Success\\\" variant=\\\"success\\\"></uni-checkbox>\\n<uni-checkbox label=\\\"Warning\\\" variant=\\\"warn\\\"></uni-checkbox>\\n<uni-checkbox label=\\\"Tertiary\\\" variant=\\\"tertiary\\\"></uni-checkbox>\\n</div>\"\n },\n {\n \"title\": \"With Change Event\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Change Event -->\\n<div>\\n<uni-checkbox\\n label=\\\"Check me\\\"\\n [checked]=\\\"isChecked\\\"\\n (checkedChange)=\\\"onCheckboxChange($event)\\\"\\n variant=\\\"primary\\\">\\n</uni-checkbox>\\n<div box-layout paddingTop=\\\"md\\\">\\n Current state: {{ isChecked ? 'Checked' : 'Unchecked' }}\\n</div>\\n<div box-layout paddingTop=\\\"sm\\\">\\n Last change: {{ lastChangeValue }}\\n</div>\\n</div>\"\n },\n {\n \"title\": \"Form Signals\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Form Signals -->\\n<div>\\n<uni-checkbox\\n label=\\\"Subscribe to newsletter\\\"\\n variant=\\\"primary\\\"\\n [checked]=\\\"isChecked\\\"\\n [disabled]=\\\"isDisabled\\\"\\n [invalid]=\\\"isInvalid\\\"\\n [touched]=\\\"isTouched\\\">\\n</uni-checkbox>\\n<div box-layout paddingTop=\\\"md\\\">\\n <p>Checked: {{ isChecked }}</p>\\n <p>Touched: {{ isTouched }}</p>\\n <p>Invalid: {{ isInvalid }}</p>\\n <p>Disabled: {{ isDisabled }}</p>\\n</div>\\n<div row-layout gap=\\\"sm\\\" paddingTop=\\\"sm\\\">\\n<button\\n (click)=\\\"isTouched = true\\\">\\n Mark as Touched\\n</button>\\n<button\\n (click)=\\\"isDisabled = !isDisabled\\\">\\n Toggle Disabled\\n</button>\\n<button\\n (click)=\\\"isInvalid = !isInvalid\\\">\\n Toggle Invalid\\n</button>\\n</div>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Binary choice control for forms: check to opt in, submit to apply. It implements\\n`FormCheckboxControl` for the Signal Forms `[formField]` directive (or bind\\n`[(checked)]` directly), exposes `aria-invalid` once touched, and supports an\\n`indeterminate` model for \\\"select all\\\" parents — cleared automatically on the next\\nuser interaction, matching native behavior.\\nThe box color, check stroke (the variant's paired on-color), and size resolve from\\nthe `checkbox` theme options.\",\n \"dos\": [\n \"Use for choices that apply when the form is submitted\"\n ],\n \"donts\": [\n \"Use for instant on/off effects — that is a toggle\"\n ],\n \"accessibility\": [\n \"Semantic `<input type=\\\"checkbox\\\">` + `<label>`; Space toggles.\",\n \"`aria-invalid` reflects the error state once the field was touched or is dirty.\",\n \"The indeterminate visual state is carried by the native `indeterminate` property, announced as \\\"mixed\\\".\"\n ]\n },\n \"relatedTokens\": [\n \"checkbox.behavior.size\",\n \"checkbox.behavior.boxColor\",\n \"checkbox.behavior.borderRadius\",\n \"checkbox.behavior.focusRingGap\"\n ]\n },\n {\n \"id\": \"combobox\",\n \"name\": \"Combobox\",\n \"status\": \"stable\",\n \"summary\": \"Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select.\",\n \"description\": \"Form-bound, closed-set, single-select autocomplete: `FormValueControl<T | null>` over object `Options<T>`, type-to-filter, commit-on-select. Typing produces a draft — a filter, never a value; the value changes only when an option commits, `clear()` runs, or the model is written from outside. Select semantics, not search: a real label, a chevron, no magnifier, nothing submits. For short lists with no need to type, prefer `uni-select` — the value contract is identical, so swapping is a template-only change.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-combobox, Combobox\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"T | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name for the field, e.g. \\\"State\\\"; echoed on the listbox.\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"options\",\n \"kind\": \"input\",\n \"type\": \"Options<T>\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"default\": \"'100%'\",\n \"description\": \"\"\n },\n {\n \"name\": \"clearable\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Show a ✕ while a value is set; an emptied field on blur also clears.\"\n },\n {\n \"name\": \"commitOnBlur\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Blur commits an exact-match draft; a non-matching draft reverts.\"\n },\n {\n \"name\": \"emptyText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'No matches'\",\n \"description\": \"i18n-able empty row, also announced when a filter matches nothing.\"\n },\n {\n \"name\": \"filterLocally\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"`false` renders `options` verbatim; narrow them app-side from `query`.\"\n },\n {\n \"name\": \"debounceTime\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"250\",\n \"description\": \"\"\n },\n {\n \"name\": \"query\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Debounced draft text, for async option lists.\"\n },\n {\n \"name\": \"selected\",\n \"kind\": \"output\",\n \"type\": \"Option<T>\",\n \"required\": false,\n \"description\": \"An option committed.\"\n },\n {\n \"name\": \"cleared\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniComboboxRejection\",\n \"required\": false,\n \"description\": \"A commit was refused (no match); the field reverted.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-combobox\\nlabel=\\\"Country\\\"\\nplaceholder=\\\"Type to search countries\\\"\\nemptyText=\\\"No countries found\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ value: 'Arizona' }\\n-->\"\n },\n {\n \"title\": \"Disabled Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled Options -->\\n<uni-combobox\\nlabel=\\\"Country\\\"\\nplaceholder=\\\"Type to search countries\\\"\\nemptyText=\\\"No countries found\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ label: 'Assignee', placeholder: 'Choose a person', options: ASSIGNEES }\\n-->\"\n },\n {\n \"title\": \"Async\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Async -->\\n<uni-combobox\\nlabel=\\\"Country\\\"\\nplaceholder=\\\"Type to search countries\\\"\\nemptyText=\\\"No countries found\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ required: true, invalid: true, touched: true }\\n-->\"\n },\n {\n \"title\": \"Create New Values\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Create New Values -->\\n<uni-combobox\\nlabel=\\\"Team\\\"\\nplaceholder=\\\"Choose or create a team\\\"\\nemptyText=\\\"No teams\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n[(value)]=\\\"value\\\"\\n(query)=\\\"onQuery($event)\\\"\\n(selected)=\\\"onSelected($event)\\\"\\n/>\\n<!-- args:\\n{ required: true, invalid: true, touched: true }\\n-->\"\n },\n {\n \"title\": \"Invalid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid -->\\n<uni-combobox\\nlabel=\\\"Country\\\"\\nplaceholder=\\\"Type to search countries\\\"\\nemptyText=\\\"No countries found\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ required: true, invalid: true, touched: true }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-combobox\\nlabel=\\\"Country\\\"\\nplaceholder=\\\"Type to search countries\\\"\\nemptyText=\\\"No countries found\\\"\\n[filterLocally]=\\\"false\\\"\\n[options]=\\\"options\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ value: 'Colorado', disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The form-bound, **closed-set, single-select** autocomplete: object\\n`Options<T>`, `FormValueControl<T | null>`, type-to-filter, commit-on-select.\\nTyping produces a *draft* — a filter, never a value; the value changes only\\nwhen an option commits, the field clears, or the model is written from\\noutside. Select semantics, not search: a real label, a chevron, no magnifier,\\nnothing submits.\\nUnder ~10 options and no need to type → `uni-select`, the native, zero-JS,\\nmobile-friendly answer. More options, or users know what they're looking for →\\n`uni-combobox`. The value contract is identical (`T | null`, `compareWith`),\\nso swapping one for the other as a list grows is a template-only change — that\\nis deliberate. For open sets, where typing *creates* values, use\\n`uni-tag-input` (multi) or `uni-search-input` (queries); for closed multi\\nsets, `uni-multi-select-dropdown`.\",\n \"dos\": [],\n \"donts\": [\n \"Don't expect free text to commit implicitly — it never does. Offer creation\",\n \"Don't wire `(query)` → filter → `[options]` when the list is already in\",\n \"Don't use `Escape` to clear: it closes, then reverts. The ✕ and an emptied\"\n ],\n \"accessibility\": [\n \"The input is `role=\\\"combobox\\\"` with `aria-expanded`, `aria-controls` and\",\n \"Home and End move the caret, never the list, per APG's editable-combobox\",\n \"`aria-selected` marks the **committed** option; the active one is carried by\",\n \"Disabled options are rendered, announced (`aria-disabled`), and skipped by\",\n \"Commits (*\\\"Alabama selected.\\\"*), clears, refusals and debounced result\",\n \"`aria-invalid` is gated on `invalid && (touched || dirty)`, per the\"\n ]\n },\n \"relatedTokens\": [\n \"combobox.behavior.toggleIcon\",\n \"combobox.behavior.clearIcon\",\n \"combobox.behavior.selectedIcon\",\n \"combobox.behavior.listColor\",\n \"combobox.behavior.listShadow\",\n \"combobox.behavior.listBorderRadius\",\n \"combobox.behavior.activeColor\",\n \"combobox.behavior.maxVisibleOptions\",\n \"combobox.behavior.descriptionColor\"\n ]\n },\n {\n \"id\": \"confirmation-dialog\",\n \"name\": \"ConfirmationDialog\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-confirmation-dialog\",\n \"api\": [\n {\n \"name\": \"show\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"confirmation\",\n \"kind\": \"input\",\n \"type\": \"Confirmation\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"showing\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"data-search\",\n \"name\": \"DataSearch\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-data-search\",\n \"api\": [\n {\n \"name\": \"datasource\",\n \"kind\": \"input\",\n \"type\": \"UniDatasource<T>\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Search'\",\n \"description\": \"\"\n },\n {\n \"name\": \"fields\",\n \"kind\": \"input\",\n \"type\": \"string[]\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-data-search ${argsToTemplate(props)} />\\n<div box-layout paddingTop=\\\"md\\\">\\n @for (record of datasource.records(); track record.id) {\\n <div>{{ record.name }} — {{ record.homeworld }}</div>\\n }\\n</div>\\n<!-- args:\\n{\\n datasource: new UniRecordDatasource<any>(starWarsCharacters.slice(0, 10)),\\n placeholder: 'Search characters',\\n }\\n-->\"\n },\n {\n \"title\": \"Field Scoped\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Field Scoped -->\\n<uni-data-search ${argsToTemplate(props)} />\\n<div box-layout paddingTop=\\\"md\\\">\\n @for (record of datasource.records(); track record.id) {\\n <div>{{ record.name }} — {{ record.homeworld }}</div>\\n }\\n</div>\\n<!-- args:\\n{\\n datasource: new UniRecordDatasource<any>(starWarsCharacters.slice(0, 10)),\\n placeholder: 'Search by name only',\\n fields: ['name'],\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Data Search input filters a `UniDatasource` as the user types. With a client-side\\n`UniRecordDatasource` it applies a predicate over the record's fields; with a\\n`UniServerSideDatasource` it sends a filter object to the data loader. Pass `fields` to\\nrestrict the search to specific columns. A clear button resets the filter.\\nIt pairs with the [Data Table](?path=/docs/components-data-display-data-table--data-table) — see its\\n\\\"With Search\\\" story.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"data-table\",\n \"name\": \"DataTable\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"data\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-data-table\",\n \"api\": [\n {\n \"name\": \"datasource\",\n \"kind\": \"input\",\n \"type\": \"UniDatasource<T>\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"columns\",\n \"kind\": \"input\",\n \"type\": \"ColumnDefinition<T>[]\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"useMultiSelect\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"useRowClick\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rowSelect\",\n \"kind\": \"output\",\n \"type\": \"T\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rowClick\",\n \"kind\": \"output\",\n \"type\": \"T\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-data-table ${argsToTemplate(props)} #dataTable>\\n<div row-layout ngProjectAs=\\\"data-table-header\\\" justifyContent=\\\"space-between\\\">\\n <span uni-text>Data Table</span>\\n <uni-paginator [datasource]=\\\"dataTable.datasource()\\\" [initPageSize]=\\\"10\\\" [showPageSize]=\\\"true\\\" [showPageJumper]=\\\"true\\\" [showPageNumbers]=\\\"false\\\" />\\n</div>\\n<div row-layout ngProjectAs=\\\"data-table-footer\\\" justifyContent=\\\"center\\\">\\n <uni-paginator [datasource]=\\\"dataTable.datasource()\\\" [showPageSize]=\\\"false\\\" [showPageJumper]=\\\"false\\\" [showPageNumbers]=\\\"true\\\" />\\n</div>\\n</uni-data-table>\\n<!-- args:\\n{\\n columns: [\\n {\\n columnDef: 'id',\\n header: 'ID',\\n isSticky: true,\\n },\\n {\\n columnDef: 'name',\\n header: 'Name',\\n textAlign: 'left',\\n },\\n {\\n columnDef: 'species',\\n header: 'Species',\\n },\\n {\\n columnDef: 'height',\\n header: 'Height',\\n cell: (element: any) => (element.height ? `${element.height} m` : ''),\\n },\\n {\\n columnDef: 'homeworld',\\n header: 'Home World',\\n },\\n ],\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n }\\n-->\"\n },\n {\n \"title\": \"With Header\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Header -->\\n<uni-data-table ${argsToTemplate(props)}>\\n<div box-layout ngProjectAs=\\\"data-table-header\\\">Data Table Header</div>\\n</uni-data-table>\\n<!-- args:\\n{\\n height: '300px',\\n columns: [\\n {\\n columnDef: 'id',\\n header: 'ID',\\n },\\n {\\n columnDef: 'name',\\n header: 'Name',\\n textAlign: 'left',\\n },\\n {\\n columnDef: 'homeworld',\\n header: 'Home World',\\n },\\n ],\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n }\\n-->\"\n },\n {\n \"title\": \"With Search\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Search -->\\n<uni-data-table ${argsToTemplate(props)} #dataTable>\\n<div row-layout ngProjectAs=\\\"data-table-header\\\" justifyContent=\\\"space-between\\\">\\n <div box-layout ngProjectAs=\\\"data-table-header\\\">Data Table Header</div>\\n <uni-data-search [datasource]=\\\"dataTable.datasource()\\\" [fields]=\\\"['name', 'homeworld']\\\"></uni-data-search>\\n</div>\\n</uni-data-table>\\n<!-- args:\\n{\\n height: '300px',\\n columns: [\\n {\\n columnDef: 'id',\\n header: 'ID',\\n },\\n {\\n columnDef: 'name',\\n header: 'Name',\\n textAlign: 'left',\\n },\\n {\\n columnDef: 'homeworld',\\n header: 'Home World',\\n },\\n ],\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n }\\n-->\"\n },\n {\n \"title\": \"With Detail Row\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Detail Row -->\\n<button (click)=\\\"dataTable.toggleRow(1)\\\">Expand</button>\\n<uni-data-table ${argsToTemplate(props)} #dataTable [detailRowTemplate]=\\\"detailRowTemplate\\\">\\n<div row-layout ngProjectAs=\\\"data-table-header\\\" justifyContent=\\\"space-between\\\">\\n <div box-layout ngProjectAs=\\\"data-table-header\\\">Data Table Header</div>\\n <uni-data-search [datasource]=\\\"dataTable.datasource()\\\" [fields]=\\\"['name', 'homeworld']\\\"></uni-data-search>\\n</div>\\n</uni-data-table>\\n<ng-template #detailRowTemplate let-record>\\n<div>\\n <p>Detail for {{ record.name }}</p>\\n</div>\\n</ng-template>\\n<!-- args:\\n{\\n height: '300px',\\n columns: [\\n {\\n columnDef: 'id',\\n header: 'ID',\\n },\\n {\\n columnDef: 'name',\\n header: 'Name',\\n textAlign: 'left',\\n },\\n {\\n columnDef: 'homeworld',\\n header: 'Home World',\\n },\\n ],\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Data grid for structured records: sortable column headers (Sort Header), paging\\n(Paginator), field-scoped search (Data Search), row interaction, sticky columns,\\nand expandable detail rows — all themed through the `dataTable` options, which\\npoint at shared tokens for surfaces, borders, and typography.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Column headers use `scope=\\\"col\\\"`; sortable headers are real buttons with `aria-sort` on the `<th>`.\",\n \"The loading overlay is a `role=\\\"status\\\"` region and the table is `aria-busy` while loading.\",\n \"Collapsed detail rows are `inert`, out of the accessibility tree until expanded.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"date-input\",\n \"name\": \"DateInput\",\n \"status\": \"stable\",\n \"summary\": \"Date field with free-typed parsing and a popup calendar.\",\n \"description\": \"Date field with free-typed parsing and a popup calendar. Type `aug 20`, `8/20/2026` or `2026-08-20`, or pick from the grid — the form gets the same canonical `'YYYY-MM-DD'` string either way. Parsing is `Intl`-driven (locale digit order and month names, never hardcoded); unreadable text stays in the field, flagged, with a `rejected` event. The popup is a native popover hosting the same `uni-calendar` an app could render inline.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-date-input, DateInput\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniDate | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name for the field, e.g. \\\"Appointment date\\\".\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Defaults to the locale's digit pattern, e.g. `MM/DD/YYYY`.\"\n },\n {\n \"name\": \"displayFormat\",\n \"kind\": \"input\",\n \"type\": \"Intl.DateTimeFormatOptions\",\n \"required\": false,\n \"default\": \"{ dateStyle: 'medium' }\",\n \"description\": \"How the committed value renders, e.g. `{ dateStyle: 'long' }`.\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"BCP 47 tag; defaults to the document language, then the browser's.\"\n },\n {\n \"name\": \"commitOnBlur\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"embedded\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Renders without its own input-box chrome, for composers like uni-date-time-input.\"\n },\n {\n \"name\": \"minDate\",\n \"kind\": \"input\",\n \"type\": \"UniDate\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"maxDate\",\n \"kind\": \"input\",\n \"type\": \"UniDate\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"markers\",\n \"kind\": \"input\",\n \"type\": \"UniCalendarMarker[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"weekStart\",\n \"kind\": \"input\",\n \"type\": \"0 | 1 | 2 | 3 | 4 | 5 | 6\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"opened\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"Popup shown.\"\n },\n {\n \"name\": \"closed\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"Popup hidden.\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniDateInputRejection\",\n \"required\": false,\n \"description\": \"A typed commit was refused; the raw text stays in the field.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{ value: dayIn(12) }\\n-->\"\n },\n {\n \"title\": \"With Calendar Constraints\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Calendar Constraints -->\\n<!-- args:\\n{\\n label: 'Appointment date',\\n minDate: TODAY,\\n maxDate: addDays(TODAY, 45),\\n disabledDates: (date: string) => [0, 6].includes(new Date(`${date}T00:00:00Z`).getUTCDay()),\\n markers: [\\n { date: addDays(TODAY, 1), variant: 'success', label: '3 slots open' },\\n { date: addDays(TODAY, 3), variant: 'primary', label: '1 slot open' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Display Format\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Display Format -->\\n<!-- args:\\n{ value: dayIn(12), displayFormat: { dateStyle: 'full' } }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<!-- args:\\n{ value: dayIn(12), disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A date field with free-typed parsing and a popup calendar. Type `aug 20`,\\n`8/20/2026` or `2026-08-20`, or pick from the grid — the form gets the same\\ncanonical `'YYYY-MM-DD'` string either way. There is no input mask: masks\\nfight paste, IMEs and screen-reader echo, and hard-code one digit order in a\\nlocale-aware library. Text parses on Enter or blur, then re-renders in\\n`displayFormat`.\\nThe popup is a native popover hosting the same `uni-calendar` an app could\\nrender inline, so fences, disabled days and markers forward untouched. Field\\nchrome comes from `uni-input-box` — error, disabled and focus states stay\\nconsistent with every other field.\",\n \"dos\": [\n \"Feed fences and availability (`minDate`, `disabledDates`, `markers`)\",\n \"Listen to `(rejected)` when the app should explain a refusal in its own UI.\"\n ],\n \"donts\": [\n \"Don't add an input mask on top; the field is free text by design.\",\n \"Don't parse dates yourself before binding — pass what the user typed and\",\n \"Don't use it for a time — that is `uni-time-input`; for one combined value\"\n ],\n \"accessibility\": [\n \"The text input is a **plain input, not a combobox** — there is no\",\n \"The toggle is a real icon-button named from the value — *\\\"Choose date\\\"* /\",\n \"The popup is a native popover with `role=\\\"dialog\\\"`; light-dismiss is the\",\n \"Commits, steps and rejections announce through `role=\\\"status\\\"` — the\",\n \"A refused draft shows invalid styling and `aria-invalid` immediately (it\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"date-time-input\",\n \"name\": \"DateTimeInput\",\n \"status\": \"stable\",\n \"summary\": \"One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value.\",\n \"description\": \"One field for a date and a time: a thin composer seating a uni-date-input and a uni-time-input in one input-box chrome under one label, yielding one combined `'YYYY-MM-DDTHH:mm'` value. The value emits only when both parts are set — a time without a day is not an answer — and clearing the date clears it. With `slotsFor`, the time part stays disabled until a day is chosen and offers exactly that day's slots: the scheduling flow in one attribute. Two honest tab stops (it is two questions); apps needing a different arrangement compose the primitives directly.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-date-time-input, DateTimeInput\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniDateTime | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Names the group; the parts are announced as \\\"Date\\\" and \\\"Time\\\" under it.\"\n },\n {\n \"name\": \"minDateTime\",\n \"kind\": \"input\",\n \"type\": \"UniDateTime\",\n \"required\": false,\n \"description\": \"Earliest allowed moment; the date and time fences are split from it.\"\n },\n {\n \"name\": \"maxDateTime\",\n \"kind\": \"input\",\n \"type\": \"UniDateTime\",\n \"required\": false,\n \"description\": \"Latest allowed moment; the date and time fences are split from it.\"\n },\n {\n \"name\": \"markers\",\n \"kind\": \"input\",\n \"type\": \"UniCalendarMarker[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"slots\",\n \"kind\": \"input\",\n \"type\": \"UniTime[]\",\n \"required\": false,\n \"description\": \"Fixed time choices; superseded per-day by `slotsFor` when that is set.\"\n },\n {\n \"name\": \"minuteStep\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"30\",\n \"description\": \"\"\n },\n {\n \"name\": \"hour12\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"weekStart\",\n \"kind\": \"input\",\n \"type\": \"0 | 1 | 2 | 3 | 4 | 5 | 6\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-date-time-input\\n label=\\\"Appointment\\\"\\n [disabledDates]=\\\"isFullyBooked\\\"\\n [markers]=\\\"markers\\\"\\n [slotsFor]=\\\"slotsFor\\\"\\n/>\\n<!-- args:\\n{ value: `${addDays(TODAY, 1)}T15:00` }\\n-->\"\n },\n {\n \"title\": \"Scheduling\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Scheduling -->\\n<uni-date-time-input\\n label=\\\"Appointment\\\"\\n [disabledDates]=\\\"isFullyBooked\\\"\\n [markers]=\\\"markers\\\"\\n [slotsFor]=\\\"slotsFor\\\"\\n/>\\n<!-- args:\\n{ value: `${addDays(TODAY, 1)}T15:00`, disabled: true }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-date-time-input\\n label=\\\"Appointment\\\"\\n [disabledDates]=\\\"isFullyBooked\\\"\\n [markers]=\\\"markers\\\"\\n [slotsFor]=\\\"slotsFor\\\"\\n/>\\n<!-- args:\\n{ value: `${addDays(TODAY, 1)}T15:00`, disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"One field for a date and a time: a thin composer seating a `uni-date-input`\\nand a `uni-time-input` in one `uni-input-box` chrome under one label, and\\nmapping the two part-values to one combined `'YYYY-MM-DDTHH:mm'` value. The\\nvalue emits only when **both** parts are set — a time without a day is not an\\nanswer — and clearing the date clears it.\\nIt is a convenience, not the only door: apps that need a different\\narrangement (calendar always inline, slot buttons instead of a time field)\\ncompose the primitives directly.\",\n \"dos\": [\n \"Use `slotsFor` for availability-driven scheduling; it gates and supplies\",\n \"Treat the combined value as the only form value; the parts are internal.\"\n ],\n \"donts\": [\n \"Don't wire separate date and time form fields through this component —\",\n \"Don't expect a value while either part is empty; partial states are\"\n ],\n \"accessibility\": [\n \"One `role=\\\"group\\\"` named by `label`; the parts are named *\\\"Date\\\"* and\",\n \"Tab order: date field → time field. Two tab stops, honestly — it *is* two\",\n \"Each part keeps its own contract: the date part's popup dialog and status\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"debounce-input\",\n \"name\": \"DebounceInput\",\n \"status\": \"stable\",\n \"summary\": \"Text input that emits `change` only after the user pauses typing.\",\n \"description\": \"Text input that emits `change` only after the user pauses typing. Wears the shared input chrome (themed color, border, typeface, focus ring) via `uni-input-box`; project adornments with the `pre-input` / `post-input` slots, matching `uni-input`'s convention. The ARIA passthrough inputs let a wrapping composite (e.g. SearchInput's combobox) annotate the real input element.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-debounce-input\",\n \"api\": [\n {\n \"name\": \"inputName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"inputId\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"debounceTime\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"400\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name for the input.\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"type\",\n \"kind\": \"input\",\n \"type\": \"UniInputType\",\n \"required\": false,\n \"default\": \"'text'\",\n \"description\": \"Native input type; text-like only, matching `uni-input`.\"\n },\n {\n \"name\": \"autocomplete\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"inputMode\",\n \"kind\": \"input\",\n \"type\": \"UniInputMode\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"role\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"ariaExpanded\",\n \"kind\": \"input\",\n \"type\": \"boolean | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaControls\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"ariaActivedescendant\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"valueChange\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The debounced value, emitted once the user pauses typing.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-debounce-input ${argsToTemplate(props)} (valueChange)=\\\"lastEmitted = $event\\\" #debounce />\\n<div box-layout paddingTop=\\\"md\\\">\\n <div>Live value: {{ debounce.value() }}</div>\\n <div>Debounced value: {{ lastEmitted }}</div>\\n</div>\\n<!-- args:\\n{\\n inputName: 'search',\\n debounceTime: 400,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A themed text input that emits its `valueChange` output only after the user pauses typing\\n(400 ms by default) and only when the value actually changed — a signal-based\\ndebounce with no rxjs involved. The live value is exposed as the `value` signal, and\\n`clear()` empties the field immediately (cancelling any pending emit).\\nIt wears the shared input chrome (color, border, typeface, focus ring) via the input\\nbox, and offers `pre-input` / `post-input` attribute slots for adornments plus ARIA\\npassthrough inputs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\\nso composite widgets can annotate the real input element.\\nUsed by the [Search Input](?path=/docs/components-forms-search-input--search-input), which\\nprojects its magnifier and clear button through the slots and drives the combobox\\nARIA through the passthroughs.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Set `label` — it becomes the accessible name (`aria-label`) of the inner input.\",\n \"The ARIA passthrough inputs (`role`, `ariaExpanded`, `ariaControls`,\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"dialog\",\n \"name\": \"Dialog\",\n \"status\": \"stable\",\n \"summary\": \"Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`.\",\n \"description\": \"Modal dialog on the native `<dialog>` element, laid out as three rows: an optional `[dialog-header]`, the projected body, an optional `[dialog-buttons]`. **The surface is never the scroll container.** It is a flex column that is `overflow: clip` on both axes; the header and buttons pin while only the body row scrolls. Unlike the drawer, which is deliberately viewport-tall, the dialog stays content-sized: it has no `height`, and grows until it hits `calc(100dvh - 2 x inset)` — the point at which the body starts to scroll. The theme's `padding` insets all three rows (which is what makes the default header read as a pill floating inside the surface); `bodyPadding` pads the scrolling row alone.\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"dialog[uni-dialog]\",\n \"api\": [\n {\n \"name\": \"show\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Two-way bindable open state: [(show)].\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name for dialogs without a DialogHeader. When a DialogHeader is present it labels the dialog automatically via aria-labelledby.\"\n },\n {\n \"name\": \"initialFocus\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"CSS selector for the element to focus when the dialog opens. Defaults to the browser's native behavior (first focusable element).\"\n },\n {\n \"name\": \"defaultCloseButton\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"showing\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"Emits true once opened and false once the closing animation finishes.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<button text-button (click)=\\\"dialog.open()\\\">Open Dialog</button>\\n<dialog uni-dialog #dialog>\\n <header dialog-header color=\\\"primary\\\">Sample Dialog</header>\\n <div center-layout [width]=\\\"300\\\" [height]=\\\"200\\\">\\n <span uni-text>Dialog</span>\\n </div>\\n <footer dialog-buttons></footer>\\n</dialog>\\n<!-- args:\\n{}\\n-->\"\n },\n {\n \"title\": \"Long Content\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Long Content -->\\n<div box-layout padding=\\\"md\\\">\\n<span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n The dialog opens over this. Close it and reopen from the button.\\n</span>\\n<button text-button variant=\\\"primary\\\" size=\\\"md\\\" (click)=\\\"show = true\\\">Open dialog</button>\\n</div>\\n<dialog uni-dialog [(show)]=\\\"show\\\">\\n<header dialog-header>Edit line item</header>\\n<div stack-layout gap=\\\"md\\\" padding=\\\"md\\\">\\n <uni-input label=\\\"SKU\\\" placeholder=\\\"WS-00000\\\" />\\n <!-- Long enough to overflow at any plausible viewport: the point of\\n the story is that this scrolls while the rows above and below it\\n do not. -->\\n @for (n of attributes; track n) {\\n <uni-input [label]=\\\"'Attribute ' + n\\\" placeholder=\\\"Value\\\" />\\n }\\n</div>\\n<footer dialog-buttons confirmButtonText=\\\"Save\\\" cancelButtonText=\\\"Cancel\\\"></footer>\\n</dialog>\"\n },\n {\n \"title\": \"Shrink To Content\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Shrink To Content -->\\n<div box-layout padding=\\\"md\\\">\\n<button text-button variant=\\\"primary\\\" size=\\\"md\\\" (click)=\\\"show = true\\\">Open dialog</button>\\n</div>\\n<dialog uni-dialog [(show)]=\\\"show\\\">\\n<header dialog-header>Discard changes?</header>\\n<div box-layout padding=\\\"md\\\">\\n <span uni-text=\\\"body-1-long\\\">Your edits to this line item will be lost.</span>\\n</div>\\n<footer dialog-buttons confirmButtonText=\\\"Discard\\\" cancelButtonText=\\\"Keep editing\\\"></footer>\\n</dialog>\"\n },\n {\n \"title\": \"Without Header\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Without Header -->\\n<button text-button variant=\\\"primary\\\" (click)=\\\"show = true\\\">Open dialog</button>\\n<dialog uni-dialog [(show)]=\\\"show\\\" ariaLabel=\\\"Keyboard shortcuts\\\" [defaultCloseButton]=\\\"true\\\">\\n<div box-layout padding=\\\"lg\\\" [width]=\\\"320\\\">\\n <span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n Press <strong>Escape</strong> to close, or use the button in the corner.\\n With no header to be labelled by, the dialog announces its\\n <code>ariaLabel</code> instead.\\n </span>\\n</div>\\n</dialog>\"\n },\n {\n \"title\": \"Controlled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Controlled -->\\n<div stack-layout gap=\\\"md\\\" padding=\\\"md\\\" alignItems=\\\"flex-start\\\">\\n<button text-button variant=\\\"primary\\\" (click)=\\\"show = true\\\">Open dialog</button>\\n<span uni-text=\\\"body-2\\\">Dialog reports: {{ lastEvent }}</span>\\n</div>\\n<dialog\\nuni-dialog\\n[(show)]=\\\"show\\\"\\n(showing)=\\\"lastEvent = $event ? 'open' : 'closed'\\\"\\n>\\n<header dialog-header>Controlled dialog</header>\\n<div box-layout padding=\\\"md\\\" [width]=\\\"320\\\">\\n <span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n Confirm and Cancel both close it, and so do Escape and a backdrop\\n click — every route keeps <code>show</code> in sync.\\n </span>\\n</div>\\n<footer dialog-buttons confirmButtonText=\\\"Save\\\" cancelButtonText=\\\"Cancel\\\"></footer>\\n</dialog>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Enhanced modal dialog that extends the native HTML `<dialog>` element with built-in animations, composition components, and accessibility features.\\n### Features\\n- **Native HTML Dialog**: Built on the standard dialog element with full semantic support\\n- **Three-row layout**: Pinned header and action row with a scrolling body, on a surface that stays content-sized\\n- **Smooth Animations**: Automatic fade transitions for open/close states\\n- **Composition Components**: Optional `DialogHeader` and `DialogButtons` for consistent layouts\\n- **Programmatic Control**: Open/close methods plus show property binding\\n- **Backdrop Handling**: Click-outside-to-close with customizable behavior\\n- **Accessibility**: Full keyboard navigation, focus trapping, and screen reader support\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Focus trapping and keyboard navigation (Tab, Escape, Enter)\",\n \"Screen reader announcements\",\n \"Semantic dialog roles\"\n ]\n },\n \"relatedTokens\": [\n \"dialog.behavior.borderRadius\",\n \"dialog.behavior.color\",\n \"dialog.behavior.border\",\n \"dialog.behavior.padding\",\n \"dialog.behavior.inset\",\n \"dialog.behavior.elevation\",\n \"dialog.behavior.backdrop\",\n \"dialog.behavior.motion\"\n ]\n },\n {\n \"id\": \"dialog-buttons\",\n \"name\": \"DialogButtons\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-dialog-buttons], [dialog-buttons]\",\n \"api\": [\n {\n \"name\": \"confirmButtonText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"confirmButtonVariant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"cancelButtonText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"cancelButtonVariant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disableConfirm\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingBottom\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"justifyContent\",\n \"kind\": \"input\",\n \"type\": \"JustifyContent\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"confirmed\",\n \"kind\": \"output\",\n \"type\": \"unknown\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"dialog-header\",\n \"name\": \"DialogHeader\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-dialog-header], [dialog-header]\",\n \"api\": [\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"divider\",\n \"name\": \"Divider\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-divider\",\n \"api\": [\n {\n \"name\": \"orientation\",\n \"kind\": \"input\",\n \"type\": \"Orientation\",\n \"required\": false,\n \"default\": \"'horizontal'\",\n \"description\": \"\"\n },\n {\n \"name\": \"border\",\n \"kind\": \"input\",\n \"type\": \"Border\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div center-layout height=\\\"200px\\\">\\n <uni-divider border=\\\"${border}\\\" orientation=\\\"${orientation}\\\" />\\n</div>\\n<!-- args:\\n{\\n orientation: 'horizontal',\\n border: 'primary',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Dividers are used to visually separate content in a list or group.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"drag-and-drop\",\n \"name\": \"DragAndDrop\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"directives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-drag-n-drop], [dragAndDrop]\",\n \"api\": [\n {\n \"name\": \"fileDropped\",\n \"kind\": \"output\",\n \"type\": \"FileList\",\n \"required\": false,\n \"description\": \"The dropped files.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"drawer\",\n \"name\": \"Drawer\",\n \"status\": \"stable\",\n \"summary\": \"Drawer with two modes sharing one three-row layout: - `side` — an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page.\",\n \"description\": \"Drawer with two modes sharing one three-row layout: - `side` — an in-flow `<aside>` that pushes content (dashboard sidenav); opening/closing animates its width, and the divider border primitive separates it from the page. - `over` — a native `<dialog>` in the top layer: focus trap, Escape and scrim backdrop come from the platform (same machinery as `uni-dialog`), sliding in from its edge. **The panel is never the scroll container.** It is a flex column of three rows — an optional `[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]` — and only the body scrolls. The panel itself is `overflow: clip` on both axes. That is what lets a header and a save bar pin while a long form scrolls between them, and it is why the theme's `padding` option lands on the body row rather than the panel: padding on a scrolling box scrolls away with its content. Surface, width, divider, elevation, padding, backdrop, scrim and background all resolve from `drawer` theme tokens.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-drawer\",\n \"api\": [\n {\n \"name\": \"open\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Two-way bindable open state: [(open)].\"\n },\n {\n \"name\": \"mode\",\n \"kind\": \"input\",\n \"type\": \"DrawerMode\",\n \"required\": false,\n \"default\": \"'side'\",\n \"description\": \"\"\n },\n {\n \"name\": \"position\",\n \"kind\": \"input\",\n \"type\": \"DrawerPosition\",\n \"required\": false,\n \"default\": \"'start'\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name for the overlay mode. Only consulted when the drawer has no header to be labelled by. There is deliberately no default. A drawer used as an editor panel that inherited the literal \\\"Navigation\\\" would announce itself as something it is not, and a wrong accessible name is worse than a missing one — the missing one is at least caught by any audit.\"\n },\n {\n \"name\": \"headline\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Title for the drawer's header row. Shorthand for projecting a `[uni-drawer-header]`; project one instead when the header needs more than a title (a record counter, prev/next navigation).\"\n },\n {\n \"name\": \"defaultCloseButton\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Whether the header row renders a close button.\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Panel width in px, overriding the theme's `drawer.behavior.width`.\"\n },\n {\n \"name\": \"scrim\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"Whether the overlay dims the page behind it, overriding the theme's `drawer.behavior.scrim`. False leaves the backdrop transparent so the page stays legible while the panel is open — an editor panel beside a board the user is still reading. This does not make the drawer non-modal: focus is still trapped and the page behind is still inert. It is a visibility choice, not a modality one.\"\n },\n {\n \"name\": \"initialFocus\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"CSS selector for the element to focus when the overlay opens. The native default is the first focusable element, which in an editor panel is usually the close button rather than the first field.\"\n },\n {\n \"name\": \"closeRequest\",\n \"kind\": \"output\",\n \"type\": \"UniDrawerCloseRequest\",\n \"required\": false,\n \"description\": \"The drawer is *asking* to close — Escape, the backdrop, or a close/cancel button. Pair with `disableAutoClose` to hold the panel open while an async confirmation runs.\"\n },\n {\n \"name\": \"disableAutoClose\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"When true the drawer never closes itself; it only emits `closeRequest` and waits for the consumer to set `open`. Off by default, so a drawer that ignores `closeRequest` behaves exactly as it always has.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Dashboard Shell\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Dashboard Shell -->\\n<section stack-layout height=\\\"420px\\\" overflow=\\\"hidden\\\">\\n<uni-app-bar title=\\\"Console\\\">\\n <button leading icon-button symbolName=\\\"menu\\\" (click)=\\\"open = !open\\\">Toggle navigation</button>\\n <button trailing icon-button symbolName=\\\"account_circle\\\">Account</button>\\n</uni-app-bar>\\n<div row-layout [grow]=\\\"1\\\" [minHeight]=\\\"0\\\">\\n <uni-drawer mode=\\\"side\\\" [(open)]=\\\"open\\\">\\n <nav stack-layout gap=\\\"sm\\\" aria-label=\\\"Main\\\">\\n <span uni-text=\\\"title-small\\\" display=\\\"block\\\">Dashboard</span>\\n <span uni-text=\\\"title-small\\\" display=\\\"block\\\">Reports</span>\\n <span uni-text=\\\"title-small\\\" display=\\\"block\\\">Settings</span>\\n </nav>\\n </uni-drawer>\\n <main box-layout [grow]=\\\"1\\\" padding=\\\"md\\\" [minWidth]=\\\"0\\\">\\n <h2 uni-text=\\\"headline-small\\\">Content</h2>\\n <span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n The side drawer pushes this content; toggle it from the app bar.\\n </span>\\n </main>\\n</div>\\n</section>\"\n },\n {\n \"title\": \"Editor Panel\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Editor Panel -->\\n<div box-layout padding=\\\"md\\\">\\n<h2 uni-text=\\\"headline-small\\\">Product board</h2>\\n<span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n The panel opens over this. Close it and reopen from the button.\\n</span>\\n<button text-button variant=\\\"primary\\\" size=\\\"md\\\" (click)=\\\"open = true\\\">Edit line item</button>\\n</div>\\n<uni-drawer\\nmode=\\\"over\\\"\\nposition=\\\"end\\\"\\n[width]=\\\"480\\\"\\nheadline=\\\"Edit line item\\\"\\ninitialFocus=\\\"input\\\"\\n[disableAutoClose]=\\\"dirty\\\"\\n[(open)]=\\\"open\\\"\\n(closeRequest)=\\\"onCloseRequest()\\\"\\n>\\n<div stack-layout gap=\\\"md\\\">\\n <uni-input label=\\\"SKU\\\" placeholder=\\\"WS-00000\\\" />\\n <uni-input label=\\\"Description\\\" placeholder=\\\"Describe the line\\\" />\\n <!-- Long enough that the body overflows at any plausible viewport:\\n the point of the story is that this scrolls while the rows above\\n and below it do not. -->\\n @for (n of attributes; track n) {\\n <uni-input [label]=\\\"'Attribute ' + n\\\" placeholder=\\\"Value\\\" />\\n }\\n <uni-number-input label=\\\"Unit price\\\" [value]=\\\"24.5\\\" />\\n <uni-quantity-stepper label=\\\"Quantity\\\" [(value)]=\\\"quantity\\\" />\\n</div>\\n<div drawer-buttons confirmButtonText=\\\"Save\\\" cancelButtonText=\\\"Cancel\\\"></div>\\n</uni-drawer>\"\n },\n {\n \"title\": \"Without Scrim\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Without Scrim -->\\n<div box-layout padding=\\\"md\\\">\\n<h2 uni-text=\\\"headline-small\\\">Product board</h2>\\n@for (row of rows; track row) {\\n <span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">Line item {{ row }} — still readable.</span>\\n}\\n<button text-button variant=\\\"primary\\\" size=\\\"md\\\" (click)=\\\"open = true\\\">Edit line item</button>\\n</div>\\n<uni-drawer\\nmode=\\\"over\\\"\\nposition=\\\"end\\\"\\n[width]=\\\"480\\\"\\n[scrim]=\\\"false\\\"\\nheadline=\\\"Edit line item\\\"\\n[(open)]=\\\"open\\\"\\n>\\n<div stack-layout gap=\\\"md\\\">\\n <uni-input label=\\\"SKU\\\" placeholder=\\\"WS-00000\\\" />\\n <uni-input label=\\\"Description\\\" placeholder=\\\"Describe the line\\\" />\\n</div>\\n<div drawer-buttons confirmButtonText=\\\"Save\\\"></div>\\n</uni-drawer>\"\n },\n {\n \"title\": \"Overlay\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Overlay -->\\n<button text-button variant=\\\"primary\\\" size=\\\"md\\\" (click)=\\\"open = true\\\">Open drawer</button>\\n<uni-drawer mode=\\\"over\\\" position=\\\"start\\\" [(open)]=\\\"open\\\" ariaLabel=\\\"Main navigation\\\">\\n<span uni-text=\\\"title-small\\\" display=\\\"block\\\">Dashboard</span>\\n<span uni-text=\\\"title-small\\\" display=\\\"block\\\">Reports</span>\\n<span uni-text=\\\"title-small\\\" display=\\\"block\\\">Settings</span>\\n<button text-button variant=\\\"secondary\\\" size=\\\"sm\\\" (click)=\\\"open = false\\\">Close</button>\\n</uni-drawer>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A panel attached to an edge of the page, in one of two modes:\\n- **`side`** renders an in-flow `<aside>` that pushes page content — the classic\\n dashboard sidenav. Opening and closing animates its width; a divider border primitive\\n separates it from the content, and it is hidden from assistive tech while closed.\\n- **`over`** renders a native `<dialog>` in the top layer: focus trapping, Escape, and\\n the scrim backdrop come from the platform, and the panel slides in from its edge\\n (`position`: `start` or `end`).\\n`[(open)]` is two-way; Escape and backdrop clicks keep it in sync.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Overlay mode is a native `<dialog>`: focus is trapped by `showModal()`, Escape closes, and the backdrop click closes — all kept in sync with `[(open)]`.\",\n \"A drawer with a header is labelled by that header's title via `aria-labelledby`. Without one, give it an `ariaLabel`. There is deliberately no default: a panel that inherited the name \\\"Navigation\\\" would announce itself as something it is not, and a wrong accessible name is worse than a missing one.\",\n \"`initialFocus` matters more here than in a dialog. The platform focuses the first focusable element, which in a panel with a header is the close button; point it at the first field instead.\",\n \"`scrim: false` keeps the drawer modal — focus is still trapped, the page behind is still inert — while leaving the backdrop transparent. Do not read a missing scrim as a non-modal drawer.\",\n \"A closed side drawer is `aria-hidden`, so its links leave the accessibility tree.\"\n ]\n },\n \"relatedTokens\": [\n \"drawer.behavior.color\",\n \"drawer.behavior.width\",\n \"drawer.behavior.divider\",\n \"drawer.behavior.elevation\",\n \"drawer.behavior.padding\",\n \"drawer.behavior.backdrop\",\n \"drawer.behavior.scrim\",\n \"drawer.behavior.background\",\n \"drawer.behavior.motion\"\n ]\n },\n {\n \"id\": \"drawer-buttons\",\n \"name\": \"DrawerButtons\",\n \"status\": \"stable\",\n \"summary\": \"The drawer's pinned footer action row — the save bar of an editor panel.\",\n \"description\": \"The drawer's pinned footer action row — the save bar of an editor panel. Sits outside the scrolling body, so the actions stay reachable however long the form is. Mirrors `[dialog-buttons]`; the difference is posture, which lives in the `drawerButtons` theme options rather than here.\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-drawer-buttons], [drawer-buttons]\",\n \"api\": [\n {\n \"name\": \"confirmButtonText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"confirmButtonVariant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"cancelButtonText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"cancelButtonVariant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disableConfirm\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"justifyContent\",\n \"kind\": \"input\",\n \"type\": \"JustifyContent\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"confirmed\",\n \"kind\": \"output\",\n \"type\": \"unknown\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"drawer-header\",\n \"name\": \"DrawerHeader\",\n \"status\": \"stable\",\n \"summary\": \"The drawer's pinned header row: a title, and optionally a close button.\",\n \"description\": \"The drawer's pinned header row: a title, and optionally a close button. Sits outside the scrolling body, so it stays put while the form beneath it moves. Reached either by projecting it — `<div uni-drawer-header>` — or implicitly, by giving `uni-drawer` a `headline`, in which case the drawer renders one of these itself.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-drawer-header]\",\n \"api\": [\n {\n \"name\": \"headline\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Title text. Falls back to the drawer's `headline`; projected content wins over both.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"dropdown\",\n \"name\": \"Dropdown\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-dropdown\",\n \"api\": [\n {\n \"name\": \"trigger\",\n \"kind\": \"input\",\n \"type\": \"HTMLElement\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"placement\",\n \"kind\": \"input\",\n \"type\": \"Placement\",\n \"required\": false,\n \"default\": \"'bottom-start'\",\n \"description\": \"\"\n },\n {\n \"name\": \"offset\",\n \"kind\": \"input\",\n \"type\": \"AnchorOffset\",\n \"required\": false,\n \"default\": \"{ mainAxis: 4, alignmentAxis: 12 }\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaHasPopup\",\n \"kind\": \"input\",\n \"type\": \"AriaHasPopup | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"Value for aria-haspopup on the trigger, describing what the popover contains (e.g. 'menu' for Menu, 'dialog' for rich content). When unset, only aria-expanded/aria-controls are managed.\"\n },\n {\n \"name\": \"paddingVertical\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingHorizontal\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"border\",\n \"kind\": \"input\",\n \"type\": \"Border | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadius\",\n \"kind\": \"input\",\n \"type\": \"Radius | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"shadow\",\n \"kind\": \"input\",\n \"type\": \"Shadow | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"containerColor\",\n \"kind\": \"input\",\n \"type\": \"ContainerColorToken | undefined\",\n \"required\": false,\n \"description\": \"A container color pair; `color` belongs to `uni-text` across the library.\"\n },\n {\n \"name\": \"dropdownShowing\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"dropdownHiding\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": [\n \"dropdown.behavior.border\",\n \"dropdown.behavior.borderRadius\",\n \"dropdown.behavior.color\",\n \"dropdown.behavior.shadow\",\n \"dropdown.behavior.motion\"\n ]\n },\n {\n \"id\": \"expand\",\n \"name\": \"Expand\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-expand\",\n \"api\": [\n {\n \"name\": \"collapsed\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"transitionSpeed\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Exact per-instance duration in seconds. Bypasses size-aware scaling — an explicit number means the consumer wants that number. Omitted, the duration derives from the `expand` theme options' `transitionSpeed` scaled by content height (see `duration`).\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-card>\\n<uni-card-header title=\\\"Expandable Card\\\"><uni-expand-toggle #toggle [transitionSpeed]=\\\"expand.duration()\\\" /></uni-card-header>\\n<uni-expand #expand [collapsed]=\\\"toggle.collapsed()\\\" [transitionSpeed]=\\\"transitionSpeed\\\">\\n <uni-card-content>\\n <span uni-text>${ngContent}</span>\\n </uni-card-content>\\n</uni-expand>\\n</uni-card>\\n<!-- args:\\n{\\n ngContent: 'Expandable Content',\\n }\\n-->\"\n },\n {\n \"title\": \"Snappy\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Snappy -->\\n<uni-card>\\n<uni-card-header title=\\\"Expandable Card\\\"><uni-expand-toggle #toggle [transitionSpeed]=\\\"expand.duration()\\\" /></uni-card-header>\\n<uni-expand #expand [collapsed]=\\\"toggle.collapsed()\\\" [transitionSpeed]=\\\"transitionSpeed\\\">\\n <uni-card-content>\\n <span uni-text>${ngContent}</span>\\n </uni-card-content>\\n</uni-expand>\\n</uni-card>\\n<!-- args:\\n{\\n ngContent: 'Reveals in exactly 150ms, regardless of content height.',\\n transitionSpeed: 0.15,\\n }\\n-->\"\n },\n {\n \"title\": \"Tall\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Tall -->\\n<uni-card>\\n<uni-card-header title=\\\"Expandable Card\\\"><uni-expand-toggle #toggle [transitionSpeed]=\\\"expand.duration()\\\" /></uni-card-header>\\n<uni-expand #expand [collapsed]=\\\"toggle.collapsed()\\\" [transitionSpeed]=\\\"transitionSpeed\\\">\\n <uni-card-content>\\n <span uni-text>${ngContent}</span>\\n </uni-card-content>\\n</uni-expand>\\n</uni-card>\\n<!-- args:\\n{\\n ngContent: Array.from(\\n { length: 12 },\\n (_, i) => `Row ${i + 1} of a tall reveal, timed to its height.`,\\n ).join('<br>'),\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Expand is a group of components that can be used in concert to expand/collapse sections of information.\\nThe Expand component is transparent in nature and can nest any element to collapse it out of view.\\nThe Expand Toggle is an optional convenience element that can be used to trigger the expand/collapse animation.\\nIt has been designed to work with the Card Header.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"The toggle carries `aria-expanded` and `aria-controls` for its region (wired automatically inside Expand Area).\",\n \"The reveal is motion-safe (WCAG 2.3.3): under `prefers-reduced-motion` the\"\n ]\n },\n \"relatedTokens\": [\n \"expand.behavior.motion\"\n ]\n },\n {\n \"id\": \"expand-area\",\n \"name\": \"ExpandArea\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-expand-area\",\n \"api\": [\n {\n \"name\": \"title\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"initCollapsed\",\n \"kind\": \"input\",\n \"type\": \"unknown\",\n \"required\": false,\n \"default\": \"false, { transform: booleanAttribute }\",\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"default\": \"'md'\",\n \"description\": \"\"\n },\n {\n \"name\": \"collapsed\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-expand-area title=\\\"${title}\\\" padding=\\\"${padding}\\\" [initCollapsed]=\\\"initCollapsed\\\" #expandArea>\\n <button text-button (click)=\\\"expandArea.toggleExpand()\\\" size=\\\"md\\\" variant=\\\"ghost\\\" symbolLeft=\\\"collapse_all\\\">Collapse area</button>\\n</uni-expand-area>\\n<!-- args:\\n{\\n title: 'Expand Area Title',\\n padding: 'sm',\\n initCollapsed: true,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The batteries-included collapsible: a themed surface with a header row, an Expand\\nToggle, and a content region wired together — `aria-expanded`/`aria-controls`\\nhandled automatically. For custom collapse layouts, compose the lower-level Expand\\nand Expand Toggle directly.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"expand-toggle\",\n \"name\": \"ExpandToggle\",\n \"status\": \"stable\",\n \"summary\": \"Trigger for a {@link UniExpandComponent} region.\",\n \"description\": \"Trigger for a {@link UniExpandComponent} region. Two shapes, chosen by whether `label` is set: - **Icon only** (default) — the bare chevron, sized for a Card Header. - **Labelled** — chevron plus a label and optional muted sublabel, as a single full-width button. Most real disclosures need a name for the section, and building that row by hand is the thing this saves; it also makes the label the button's accessible name rather than adjacent text.\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-expand-toggle\",\n \"api\": [\n {\n \"name\": \"collapsed\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaControls\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id of the Expand region this toggle controls (see UniExpandComponent.regionId).\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Names the region. Setting it switches the toggle to its labelled shape.\"\n },\n {\n \"name\": \"sublabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Muted qualifier beside the label (\\\"for POs & custom orders\\\"). Needs `label`.\"\n },\n {\n \"name\": \"transitionSpeed\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Rotation duration in seconds. Expand Area binds the region's resolved `duration` here so chevron and reveal share one clock even when the region is size-scaled or overridden per instance.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-expand-toggle [collapsed]=\\\"collapsed\\\" #toggle />\\n<div>Collapsed: {{ toggle.collapsed() }}</div>\\n<!-- args:\\n{\\n collapsed: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Labelled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Labelled -->\\n<uni-expand-toggle [collapsed]=\\\"collapsed\\\" #toggle />\\n<div>Collapsed: {{ toggle.collapsed() }}</div>\\n<!-- args:\\n{\\n collapsed: true,\\n label: 'Dimensions & Materials',\\n sublabel: 'for POs & custom orders',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Expand Toggle is a chevron icon button that controls collapsed/expanded state. It pairs\\nwith the [Expand](?path=/docs/components-surfaces-expand--expand) component: bind the toggle's\\n`collapsed` model to the Expand's `collapsed` input to build collapsible sections.\\nThe icon rotates 180° between states and shows an \\\"Expand\\\"/\\\"Collapse\\\" tooltip.\\nThe transform is applied to the glyph, not to the component host — the host is\\nthe tooltip's anchor, so rotating it would carry the bubble around with it.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`aria-expanded` is set for you from `collapsed`.\",\n \"Pass `ariaControls` the Expand's `regionId` so the trigger points at its\",\n \"Rotation is motion-safe — it does not animate under `prefers-reduced-motion`.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"file-drop-zone\",\n \"name\": \"FileDropZone\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-file-drop-zone\",\n \"api\": [\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"borderRadius\",\n \"kind\": \"input\",\n \"type\": \"Radius\",\n \"required\": false,\n \"default\": \"'md'\",\n \"description\": \"\"\n },\n {\n \"name\": \"border\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'light'\",\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"NullableSize\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"\"\n },\n {\n \"name\": \"useBrowseButton\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"browseButtonText\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Browse for file'\",\n \"description\": \"\"\n },\n {\n \"name\": \"allowedFileExtensions\",\n \"kind\": \"input\",\n \"type\": \"string[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"helpTemplate\",\n \"kind\": \"input\",\n \"type\": \"TemplateRef<unknown> | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"helpTemplateContext\",\n \"kind\": \"input\",\n \"type\": \"unknown | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"fileAttached\",\n \"kind\": \"output\",\n \"type\": \"File | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"fileRemoved\",\n \"kind\": \"output\",\n \"type\": \"unknown\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-file-drop-zone ${argsToTemplate(props)} [helpTemplate]=\\\"myTemplate\\\" />\\n<ng-template #myTemplate>\\n<div stack-layout alignItems=\\\"center\\\">\\n <span uni-text=\\\"title-medium\\\">Title Text</span>\\n <span uni-text=\\\"subtitle-1\\\">Subtitle Text</span>\\n</div>\\n</ng-template>\\n<!-- args:\\n{\\n label: 'Image',\\n browseButtonText: 'Browse for image',\\n allowedFileExtensions: ['png', 'jpg'],\\n }\\n-->\"\n },\n {\n \"title\": \"With Help Template\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Help Template -->\\n<uni-file-drop-zone ${argsToTemplate(props)} [helpTemplate]=\\\"myTemplate\\\" />\\n<ng-template #myTemplate>\\n<div stack-layout alignItems=\\\"center\\\">\\n <span uni-text=\\\"title-medium\\\">Title Text</span>\\n <span uni-text=\\\"subtitle-1\\\">Subtitle Text</span>\\n</div>\\n</ng-template>\\n<!-- args:\\n{\\n label: 'Image',\\n browseButtonText: 'Browse for image',\\n allowedFileExtensions: ['png', 'jpg'],\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The File Drop Zone component is used in uploading files.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Without a browse button, the zone itself is `role=\\\"button\\\"` with `tabindex=\\\"0\\\"` and Enter/Space activation.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"grid\",\n \"name\": \"Grid\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-grid-layout], [grid-layout]\",\n \"api\": [\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"default\": \"'grid'\",\n \"description\": \"\"\n },\n {\n \"name\": \"templateAreas\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"templateColumns\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"templateRows\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"outline\",\n \"kind\": \"input\",\n \"type\": \"Thickness\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"outlineColor\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Simple Grid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Simple Grid -->\\n<div grid-layout ${argsToTemplate(props)}>\\n <div box-layout gridArea=\\\"nav\\\" containerColor=\\\"quaternary\\\" padding=\\\"md\\\" borderRadius=\\\"sm\\\">\\n <span uni-text>nav</span>\\n </div>\\n <div box-layout gridArea=\\\"a1\\\" containerColor=\\\"primary\\\" padding=\\\"md\\\" borderRadius=\\\"sm\\\">\\n <span uni-text>a1</span>\\n </div>\\n <div box-layout gridArea=\\\"a2\\\" containerColor=\\\"secondary\\\" padding=\\\"md\\\" borderRadius=\\\"sm\\\">\\n <span uni-text>a2</span>\\n </div>\\n <div box-layout gridArea=\\\"b1\\\" containerColor=\\\"tertiary\\\" padding=\\\"md\\\" borderRadius=\\\"sm\\\">\\n <span uni-text>b1</span>\\n </div>\\n <div box-layout gridArea=\\\"b2\\\" containerColor=\\\"warn\\\" padding=\\\"md\\\" borderRadius=\\\"sm\\\">\\n <span uni-text>b2</span>\\n </div>\\n</div>\\n<!-- args:\\n{\\n templateAreas: `'nav a1 a2' 'nav b1 b2'`,\\n gap: 'sm',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Grid is a layout component used for composing elements in a grid-like pattern.\\nLike tables, grid layouts align elements into columns and rows.\\nHowever, grids allow for more control when spanning elements across columns and rows.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"grid-area\",\n \"name\": \"GridArea\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-grid-area-layout], [grid-area-layout]\",\n \"api\": [\n {\n \"name\": \"area\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"icon\",\n \"name\": \"Icon\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-icon\",\n \"api\": [\n {\n \"name\": \"color\",\n \"kind\": \"input\",\n \"type\": \"ColorToken\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"IconName\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"CssLength\",\n \"required\": false,\n \"description\": \"Explicit square size. Bare numbers are px; strings pass through, so any CSS length works (`'1.25rem'`, `'1em'`, `'clamp(…)'`). Leave it unset to keep the default behaviour — the icon fills its container, which is what lets a themed control size its own glyph through padding. Set it at call sites that would otherwise need a width/height rule just to size one icon.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div box-layout height=\\\"${containerSize}px\\\">\\n <uni-icon name=\\\"${name}\\\" color=\\\"${color}\\\" ${size ?\\n<!-- args:\\n{\\n name: 'checkCircle',\\n }\\n-->\"\n },\n {\n \"title\": \"Explicit Size\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Explicit Size -->\\n<div box-layout height=\\\"${containerSize}px\\\">\\n <uni-icon name=\\\"${name}\\\" color=\\\"${color}\\\" ${size ?\\n<!-- args:\\n{\\n name: 'checkCircle',\\n size: 20,\\n containerSize: 48,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Icons are adaptive svg images. By default they grow to the space allotted to them and\\nuse the current color of the parent element — so a themed control can size its own glyph\\nthrough padding, and recoloring the container recolors the icon.\\nBoth defaults can be overridden:\\n- `color` statically sets the icon color, ignoring `currentColor`.\\n- `size` sets an explicit square size, for call sites that would otherwise need a\\n width/height CSS rule just to size one icon. Bare numbers are px; strings pass\\n through, so any CSS length works.\\n```html\\n```\\nLeave `size` off wherever the container already defines the box — that is still the\\npreferred form, and it is what keeps a themed `icon-button` in control of its glyph.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Icons are decorative (`aria-hidden`) — the parent control carries the accessible name.\",\n \"Icons come from the theme's `icons` map (masked with `currentColor`); unknown names render nothing.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"icon-button\",\n \"name\": \"IconButton\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"button[uni-icon-button], button[icon-button]\",\n \"api\": [\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name for the button. Alternative to projecting text content (`<button icon-button>Close</button>`); one of the two is required for an icon-only button to be announced correctly.\"\n },\n {\n \"name\": \"iconName\",\n \"kind\": \"input\",\n \"type\": \"IconName\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"symbolName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'ghost'\",\n \"description\": \"\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"\"\n },\n {\n \"name\": \"disable\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"loading\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"opticalSize\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"24\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<button icon-button iconName=\\\"${iconName}\\\" variant=\\\"${variant}\\\" size=\\\"${size}\\\" ${argsToTemplate(\\n props\\n)}></button>\\n<!-- args:\\n{\\n iconName: 'search',\\n size: 'lg',\\n variant: 'ghost',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A square, icon-only button for toolbars, bars, and tight layouts. Renders a real\\n`<button>` around a symbol or icon, with ghost as the default variant so it sits\\nquietly on any surface. Because there is no visible text, the accessible name comes\\nfrom projected (visually hidden) text or `ariaLabel`.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Icon-only buttons need a name: project text (rendered visually hidden) or set `ariaLabel`.\",\n \"The icon/symbol itself is decorative (`aria-hidden`).\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"input\",\n \"name\": \"Input\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-input\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"type\",\n \"kind\": \"input\",\n \"type\": \"UniInputType\",\n \"required\": false,\n \"default\": \"'text'\",\n \"description\": \"Native input type. Text-like types only — `date`/`time` have dedicated components, and non-text types break the input chrome and the string value.\"\n },\n {\n \"name\": \"readonly\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"min\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"minLength\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"maxLength\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"pattern\",\n \"kind\": \"input\",\n \"type\": \"readonly RegExp[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"Patterns the value must match — all of them, per Signal Forms. The native `pattern` attribute can only express one, so it is reflected only when there is exactly one; Signal Forms validates the rest either way.\"\n },\n {\n \"name\": \"step\",\n \"kind\": \"input\",\n \"type\": \"number | string\",\n \"required\": false,\n \"description\": \"Granularity for `type=\\\"number\\\"`, e.g. `0.01` or `'any'`.\"\n },\n {\n \"name\": \"autocomplete\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Autofill hint, e.g. `email`, `current-password`, `off`.\"\n },\n {\n \"name\": \"inputMode\",\n \"kind\": \"input\",\n \"type\": \"UniInputMode\",\n \"required\": false,\n \"description\": \"On-screen keyboard hint; defaults to whatever `type` implies.\"\n },\n {\n \"name\": \"list\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id of a `<datalist>` supplying suggestions.\"\n },\n {\n \"name\": \"spellcheck\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"grow\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'Email Address',\\n placeholder: 'Enter your email',\\n value: '',\\n disabled: false,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"With Value\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Value -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'Username',\\n placeholder: 'Enter username',\\n value: 'john.doe',\\n disabled: false,\\n touched: true,\\n invalid: false,\\n dirty: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'Disabled Input',\\n placeholder: 'This input is disabled',\\n value: 'Cannot edit this',\\n disabled: true,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Invalid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'Email Address',\\n placeholder: 'Enter your email',\\n value: 'invalid-email',\\n disabled: false,\\n touched: true,\\n invalid: true,\\n dirty: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Required\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Required -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'Full Name',\\n placeholder: 'This field is required',\\n value: '',\\n disabled: false,\\n touched: true,\\n invalid: true,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Long Label\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Long Label -->\\n<uni-input ${argsToTemplate(props)}>\\n</uni-input>\\n<!-- args:\\n{\\n label: 'A Very Long Label That Demonstrates How The Component Handles Extended Text',\\n placeholder: 'Enter some text',\\n value: '',\\n disabled: false,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Types\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Types -->\\n<div stack-layout gap=\\\"md\\\" maxWidth=\\\"320px\\\">\\n<uni-input label=\\\"Email\\\" type=\\\"email\\\" autocomplete=\\\"email\\\" placeholder=\\\"you@example.com\\\" />\\n<uni-input label=\\\"Password\\\" type=\\\"password\\\" autocomplete=\\\"current-password\\\" placeholder=\\\"••••••••\\\" />\\n<uni-input label=\\\"Quantity\\\" type=\\\"number\\\" inputMode=\\\"numeric\\\" [min]=\\\"0\\\" [max]=\\\"99\\\" step=\\\"1\\\" placeholder=\\\"0\\\" />\\n<uni-input label=\\\"Website\\\" type=\\\"url\\\" placeholder=\\\"https://example.com\\\" />\\n<uni-input label=\\\"Phone\\\" type=\\\"tel\\\" inputMode=\\\"tel\\\" autocomplete=\\\"tel\\\" placeholder=\\\"+1 555 0100\\\" />\\n</div>\"\n },\n {\n \"title\": \"With datalist\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With datalist -->\\n<div box-layout maxWidth=\\\"320px\\\">\\n<uni-input label=\\\"Country\\\" list=\\\"uni-input-countries\\\" placeholder=\\\"Start typing…\\\" />\\n<datalist id=\\\"uni-input-countries\\\">\\n <option value=\\\"Australia\\\"></option>\\n <option value=\\\"Austria\\\"></option>\\n <option value=\\\"Canada\\\"></option>\\n <option value=\\\"Denmark\\\"></option>\\n</datalist>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Single-line text field with the shared input chrome (themed color, border, typeface,\\nfocus ring, error state). It implements `FormValueControl<string>`: bind a Signal\\nForms field with `[formField]`, or drive `[(value)]` directly. Errors style the field\\nonly after the user has interacted (touched or dirty), and `required` syncs from\\n`required()` validators automatically.\\nProject adornments with the `pre-input` / `post-input` slots. For multi-line text\\nuse Textarea; for search semantics use Search Input.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`label` is required and becomes the accessible name (`aria-label`).\",\n \"`aria-invalid` reflects the error state once the field was touched or is dirty.\",\n \"`aria-required` mirrors the `required` state synced from validators.\",\n \"Link external error text with `ariaDescribedBy`.\"\n ]\n },\n \"relatedTokens\": [\n \"input.behavior.typeface\",\n \"input.behavior.color\",\n \"input.behavior.textColor\",\n \"input.behavior.disabledColor\",\n \"input.behavior.disabledTextColor\",\n \"input.behavior.border\",\n \"input.behavior.borderRadius\",\n \"input.behavior.errorShadow\",\n \"input.behavior.errorBorder\",\n \"input.behavior.height\",\n \"input.behavior.paddingLeft\",\n \"input.behavior.focusOutline\",\n \"input.behavior.focusOutlineOffset\"\n ]\n },\n {\n \"id\": \"input-box\",\n \"name\": \"InputBox\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-input-box\",\n \"api\": [\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"error\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"minWidth\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'0'\",\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Override the themed field height, e.g. `'auto'` for multi-line fields.\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"grow\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"managedInset\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Stop applying the themed leading inset to the inner control, for fields that place it themselves. The inset normally rides the `<input>`, which is right while the text is the field's leading edge. It is wrong the moment an adornment sits in front: a currency prefix would hug the border while the number it belongs to is indented past it. A field with adornments takes the inset over and puts it on whichever element is actually first.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-input-box ${argsToTemplate(props)}>\\n <input type=\\\"text\\\" placeholder=\\\"Type here...\\\" />\\n</uni-input-box>\\n<!-- args:\\n{\\n disabled: false,\\n error: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Error State\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Error State -->\\n<uni-input-box ${argsToTemplate(props)}>\\n <input type=\\\"text\\\" placeholder=\\\"Type here...\\\" />\\n</uni-input-box>\\n<!-- args:\\n{\\n disabled: false,\\n error: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-input-box ${argsToTemplate(props)}>\\n <input type=\\\"text\\\" placeholder=\\\"Type here...\\\" />\\n</uni-input-box>\\n<!-- args:\\n{\\n disabled: true,\\n error: false,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Input Box is the themed shell shared by all text-like form controls\\n([Input](?path=/docs/components-forms-input--input),\\n[Select](?path=/docs/components-forms-select--select), Multi Select Dropdown). It projects any\\nnative `input` or `select` element, strips the platform's default styling, and applies the\\n`input` component theme options: colors, border, radius, focus outline, and the error and\\ndisabled states.\\nUse it directly when composing a custom form control that should match the design system's\\ninput styling.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"json-view\",\n \"name\": \"JsonView\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-json-view\",\n \"api\": [\n {\n \"name\": \"json\",\n \"kind\": \"input\",\n \"type\": \"unknown\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rows\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"6\",\n \"description\": \"\"\n },\n {\n \"name\": \"fontSize\",\n \"kind\": \"input\",\n \"type\": \"AbsoluteSize | string\",\n \"required\": false,\n \"default\": \"'medium'\",\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"default\": \"'100%'\",\n \"description\": \"\"\n },\n {\n \"name\": \"selectOnClick\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{\\n json: { a: { b: ['c', 'd', 'e', 'f'], g: ['h', 'i'] }, j: 'k' },\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The JSON View component provides a simple way to display JSON data in a formatted, readable manner. It renders the JSON in a textarea element, making it easy for users to view and copy the content. The component automatically formats the JSON with proper indentation for better readability.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"menu\",\n \"name\": \"Menu\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-menu\",\n \"api\": [\n {\n \"name\": \"menuItems\",\n \"kind\": \"input\",\n \"type\": \"MenuItem[]\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"activeItem\",\n \"kind\": \"input\",\n \"type\": \"MenuItem\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"placement\",\n \"kind\": \"input\",\n \"type\": \"Placement\",\n \"required\": false,\n \"default\": \"'bottom-start'\",\n \"description\": \"\"\n },\n {\n \"name\": \"menuItemClicked\",\n \"kind\": \"output\",\n \"type\": \"MenuItem\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div box-layout containerColor=\\\"primary\\\" padding=\\\"sm\\\">\\n <uni-menu ${argsToTemplate(props)}>\\n <button text-button variant=\\\"ghost\\\" symbolRight=\\\"arrow_drop_down\\\">Menu</button>\\n </uni-menu>\\n</div>\\n<!-- args:\\n{\\n menuItems: [\\n { label: 'Language', symbolName: 'translate' },\\n { label: 'Settings', symbolName: 'settings' },\\n { label: 'Logout', symbolName: 'logout' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Tones\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Tones -->\\n<div box-layout containerColor=\\\"primary\\\" padding=\\\"sm\\\">\\n <uni-menu ${argsToTemplate(props)}>\\n <button text-button variant=\\\"ghost\\\" symbolRight=\\\"arrow_drop_down\\\">Menu</button>\\n </uni-menu>\\n</div>\\n<!-- args:\\n{\\n menuItems: [\\n { label: 'Rename', symbolName: 'edit' },\\n { label: 'Duplicate', symbolName: 'content_copy' },\\n { label: 'Share', symbolName: 'share', disabled: true },\\n { divider: true },\\n { label: 'Delete', symbolName: 'delete', variant: 'warn' },\\n ],\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Menus can be linked to any component, but it is recommended to use either the `text-button` or `icon-button` component.\\nMenus are populated by creating an array of Menu Items (`MenuItem[]`) and binding it to the `Menu` component.\\nActions are optional as the `Menu` component also emits the clicked menu item via the `menuItemClicked` output attribute.\\n### Menu Item Interface\\nAn item is either a labeled action, a templated action, or a divider:\\n```\\nMenuItem =\\n | { label: string; symbolName?: string; action?: () => void;\\n variant?: Variant; disabled?: boolean }\\n | { template: TemplateRef<T>; context: T; symbolName?: string;\\n action?: () => void; variant?: Variant; disabled?: boolean }\\n | { divider: true }\\n```\\n- `variant` routes through the theme's `menuItem` variants — e.g. `variant: 'warn'`\\n renders the item in the theme's destructive tone.\\n- `disabled` items render with the disabled color and are skipped by keyboard\\n navigation.\\n- `{ divider: true }` renders a `role=\\\"separator\\\"` rule styled by the `menu`\\n theme options.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Full ARIA menu pattern: arrows and Home/End move, first-letter typeahead jumps, Enter/Space activates.\",\n \"ArrowDown/ArrowUp on the trigger opens onto the first/last item; focus returns to the trigger on close.\"\n ]\n },\n \"relatedTokens\": [\n \"menu.behavior.minWidth\",\n \"menu.behavior.paddingVertical\",\n \"menu.behavior.paddingHorizontal\",\n \"menu.behavior.dividerBorder\",\n \"menu.behavior.dividerSpacing\"\n ]\n },\n {\n \"id\": \"menu-item\",\n \"name\": \"MenuItem\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-menu-item], [menu-item]\",\n \"api\": [\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"template\",\n \"kind\": \"input\",\n \"type\": \"TemplateRef<T>\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"context\",\n \"kind\": \"input\",\n \"type\": \"T\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"symbolName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"active\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant | undefined\",\n \"required\": false,\n \"description\": \"Tone routed through the theme's `menuItem` variants (e.g. 'warn').\"\n },\n {\n \"name\": \"hoverColor\",\n \"kind\": \"input\",\n \"type\": \"ContainerColorToken | undefined\",\n \"required\": false,\n \"description\": \"Per-instance override of the theme's `menuItem.hoverColor`.\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"multi-select\",\n \"name\": \"MultiSelect\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-multi-select\",\n \"api\": [\n {\n \"name\": \"options\",\n \"kind\": \"input\",\n \"type\": \"Option<T>[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"selections\",\n \"kind\": \"input\",\n \"type\": \"T[] | null | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"updates\",\n \"kind\": \"output\",\n \"type\": \"T[] | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"flexDirection\",\n \"kind\": \"input\",\n \"type\": \"'row' | 'row-reverse' | 'column' | 'column-reverse'\",\n \"required\": false,\n \"default\": \"'column'\",\n \"description\": \"\"\n },\n {\n \"name\": \"checkboxGap\",\n \"kind\": \"input\",\n \"type\": \"NullableSize | undefined\",\n \"required\": false,\n \"default\": \"'sm'\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-multi-select ${argsToTemplate(props)}>\\n</uni-multi-select>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n { value: 'option4', label: 'Option 4' },\\n ],\\n selections: ['option1', 'option3'],\\n }\\n-->\"\n },\n {\n \"title\": \"Empty\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Empty -->\\n<uni-multi-select ${argsToTemplate(props)}>\\n</uni-multi-select>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n ],\\n selections: undefined,\\n }\\n-->\"\n },\n {\n \"title\": \"Single Selection\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Single Selection -->\\n<uni-multi-select ${argsToTemplate(props)}>\\n</uni-multi-select>\\n<!-- args:\\n{\\n options: [\\n { value: 'red', label: 'Red' },\\n { value: 'green', label: 'Green' },\\n { value: 'blue', label: 'Blue' },\\n ],\\n selections: ['red'],\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled Options -->\\n<uni-multi-select ${argsToTemplate(props)}>\\n</uni-multi-select>\\n<!-- args:\\n{\\n options: [\\n { value: 'email', label: 'Email' },\\n { value: 'sms', label: 'SMS — verify a phone number first', disabled: true },\\n { value: 'push', label: 'Push' },\\n { value: 'fax', label: 'Fax — retired', disabled: true },\\n ],\\n selections: ['email'],\\n }\\n-->\"\n },\n {\n \"title\": \"Many Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Many Options -->\\n<uni-multi-select ${argsToTemplate(props)}>\\n</uni-multi-select>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'First Option' },\\n { value: 'option2', label: 'Second Option' },\\n { value: 'option3', label: 'Third Option' },\\n { value: 'option4', label: 'Fourth Option' },\\n { value: 'option5', label: 'Fifth Option' },\\n { value: 'option6', label: 'Sixth Option' },\\n { value: 'option7', label: 'Seventh Option' },\\n { value: 'option8', label: 'Eighth Option' },\\n ],\\n selections: ['option2', 'option4', 'option6'],\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Inline multiple-choice: every option visible as a toggleable item, selection\\nemitted as an array. Reach for it when the option set is small enough to show all\\nat once and seeing the full set helps the choice; when space is tight or options\\nare many, use Multi Select Dropdown instead.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Options are real checkboxes in a labelled group — Space toggles, Tab moves between them.\",\n \"Selection state is announced per option.\",\n \"Disabled options stay rendered and announced, not hidden — removing them would\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"multi-select-dropdown\",\n \"name\": \"MultiSelectDropdown\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-multi-select-dropdown\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"T[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"options\",\n \"kind\": \"input\",\n \"type\": \"Options<T>\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"What the field is for, e.g. \\\"Fruits\\\". Rendered visually hidden inside the trigger so its accessible name reads \\\"Fruits, Apple, Pear\\\" — without it a screen reader announces only the current selection, with no clue which field it belongs to.\"\n },\n {\n \"name\": \"debounceTime\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"200\",\n \"description\": \"Debounce for the filter box, matching the library's input debounce.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n { value: 'option4', label: 'Option 4' },\\n ],\\n value: ['option1', 'option3'],\\n }\\n-->\"\n },\n {\n \"title\": \"Empty\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Empty -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n ],\\n value: [],\\n }\\n-->\"\n },\n {\n \"title\": \"Single Selection\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Single Selection -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'red', label: 'Red' },\\n { value: 'green', label: 'Green' },\\n { value: 'blue', label: 'Blue' },\\n ],\\n value: ['red'],\\n }\\n-->\"\n },\n {\n \"title\": \"Many Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Many Options -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'First Option' },\\n { value: 'option2', label: 'Second Option' },\\n { value: 'option3', label: 'Third Option' },\\n { value: 'option4', label: 'Fourth Option' },\\n { value: 'option5', label: 'Fifth Option' },\\n { value: 'option6', label: 'Sixth Option' },\\n { value: 'option7', label: 'Seventh Option' },\\n { value: 'option8', label: 'Eighth Option' },\\n ],\\n value: ['option2', 'option4', 'option6'],\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled Options -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'email', label: 'Email' },\\n { value: 'sms', label: 'SMS — verify a phone number first', disabled: true },\\n { value: 'push', label: 'Push' },\\n { value: 'fax', label: 'Fax — retired', disabled: true },\\n ],\\n value: ['email'],\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n ],\\n value: ['option1'],\\n disabled: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Error State\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Error State -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n ],\\n value: [],\\n invalid: true,\\n touched: true,\\n }\\n-->\"\n },\n {\n \"title\": \"With Placeholder\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Placeholder -->\\n<uni-multi-select-dropdown ${argsToTemplate(props)}>\\n</uni-multi-select-dropdown>\\n<!-- args:\\n{\\n options: [\\n { value: 'apple', label: 'Apple' },\\n { value: 'banana', label: 'Banana' },\\n { value: 'orange', label: 'Orange' },\\n { value: 'grape', label: 'Grape' },\\n ],\\n value: [],\\n placeholder: 'Choose your favorite fruits...',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Multiple choice behind a compact trigger: a disclosure popover containing a search\\nfield, checkbox options, and a Done action. Implements `FormValueControl` with an\\narray value for Signal Forms, and shows a summarized selection in the trigger.\\nThe popover surface, radius, and elevation resolve from the\\n`multiSelectDropdown` theme options.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"The trigger is a disclosure (`aria-haspopup=\\\"dialog\\\"`, `aria-expanded`); the popover contains native focusables Tab reaches normally.\",\n \"The search input is labelled; options are real checkboxes announced with their state.\",\n \"Escape closes the popover and returns focus to the trigger.\",\n \"Disabled options stay rendered and announced; arrows step over them and\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"notification-badge\",\n \"name\": \"NotificationBadge\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-notification-badge\",\n \"api\": [\n {\n \"name\": \"count\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"maxCount\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"99\",\n \"description\": \"\"\n },\n {\n \"name\": \"badgeVariant\",\n \"kind\": \"input\",\n \"type\": \"'dot' | 'count' | 'pill'\",\n \"required\": false,\n \"default\": \"'count'\",\n \"description\": \"\"\n },\n {\n \"name\": \"color\",\n \"kind\": \"input\",\n \"type\": \"Variant | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"position\",\n \"kind\": \"input\",\n \"type\": \"'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\",\n \"required\": false,\n \"default\": \"'top-right'\",\n \"description\": \"\"\n },\n {\n \"name\": \"show\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Screen-reader text for the badge (e.g. \\\"5 unread messages\\\"). Without it a sensible default is announced; a bare number or dot carries no meaning.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<div box-layout padding=\\\"md\\\">\\n<uni-notification-badge\\n [count]=\\\"count\\\"\\n [maxCount]=\\\"maxCount\\\"\\n [badgeVariant]=\\\"badgeVariant\\\"\\n [color]=\\\"color\\\"\\n [position]=\\\"position\\\"\\n [show]=\\\"show\\\">\\n <button uni-text-button>\\n Button with Badge\\n </button>\\n</uni-notification-badge>\\n</div>\\n<!-- args:\\n{\\n count: 5,\\n badgeVariant: 'count',\\n color: 'warn',\\n position: 'top-right',\\n show: true,\\n maxCount: 99,\\n }\\n-->\"\n },\n {\n \"title\": \"Dot\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Dot -->\\n<div box-layout padding=\\\"md\\\">\\n<uni-notification-badge\\n [count]=\\\"count\\\"\\n [maxCount]=\\\"maxCount\\\"\\n [badgeVariant]=\\\"badgeVariant\\\"\\n [color]=\\\"color\\\"\\n [position]=\\\"position\\\"\\n [show]=\\\"show\\\">\\n <button uni-text-button>\\n Button with Badge\\n </button>\\n</uni-notification-badge>\\n</div>\\n<!-- args:\\n{\\n badgeVariant: 'dot',\\n color: 'warn',\\n position: 'top-right',\\n show: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Count\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Count -->\\n<div box-layout padding=\\\"md\\\">\\n<uni-notification-badge\\n [count]=\\\"count\\\"\\n [maxCount]=\\\"maxCount\\\"\\n [badgeVariant]=\\\"badgeVariant\\\"\\n [color]=\\\"color\\\"\\n [position]=\\\"position\\\"\\n [show]=\\\"show\\\">\\n <button uni-text-button>\\n Button with Badge\\n </button>\\n</uni-notification-badge>\\n</div>\\n<!-- args:\\n{\\n count: 12,\\n badgeVariant: 'count',\\n color: 'warn',\\n position: 'top-right',\\n show: true,\\n maxCount: 99,\\n }\\n-->\"\n },\n {\n \"title\": \"Pill\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Pill -->\\n<div box-layout padding=\\\"md\\\">\\n<uni-notification-badge\\n [count]=\\\"count\\\"\\n [maxCount]=\\\"maxCount\\\"\\n [badgeVariant]=\\\"badgeVariant\\\"\\n [color]=\\\"color\\\"\\n [position]=\\\"position\\\"\\n [show]=\\\"show\\\">\\n <button uni-text-button>\\n Button with Badge\\n </button>\\n</uni-notification-badge>\\n</div>\\n<!-- args:\\n{\\n count: 1234,\\n badgeVariant: 'pill',\\n color: 'warn',\\n position: 'top-right',\\n show: true,\\n maxCount: 999,\\n }\\n-->\"\n },\n {\n \"title\": \"Large Count\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Large Count -->\\n<div box-layout padding=\\\"md\\\">\\n<uni-notification-badge\\n [count]=\\\"count\\\"\\n [maxCount]=\\\"maxCount\\\"\\n [badgeVariant]=\\\"badgeVariant\\\"\\n [color]=\\\"color\\\"\\n [position]=\\\"position\\\"\\n [show]=\\\"show\\\">\\n <button uni-text-button>\\n Button with Badge\\n </button>\\n</uni-notification-badge>\\n</div>\\n<!-- args:\\n{\\n count: 150,\\n badgeVariant: 'count',\\n color: 'warn',\\n position: 'top-right',\\n show: true,\\n maxCount: 99,\\n }\\n-->\"\n },\n {\n \"title\": \"Different Colors\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Different Colors -->\\n<div wrap-layout gap=\\\"md\\\" padding=\\\"md\\\">\\n<uni-notification-badge [count]=\\\"3\\\" color=\\\"primary\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Primary</button>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"5\\\" color=\\\"secondary\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Secondary</button>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"7\\\" color=\\\"success\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Success</button>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"9\\\" color=\\\"warn\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Warning</button>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"11\\\" color=\\\"tertiary\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Tertiary</button>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"13\\\" color=\\\"quaternary\\\" position=\\\"top-right\\\">\\n <button uni-text-button>Quaternary</button>\\n</uni-notification-badge>\\n</div>\"\n },\n {\n \"title\": \"Different Positions\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Different Positions -->\\n<div wrap-layout gap=\\\"lg\\\" padding=\\\"lg\\\">\\n<uni-notification-badge [count]=\\\"1\\\" position=\\\"top-right\\\">\\n <div center-layout [width]=\\\"60\\\" [height]=\\\"60\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Top Right\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"2\\\" position=\\\"top-left\\\">\\n <div center-layout [width]=\\\"60\\\" [height]=\\\"60\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Top Left\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"3\\\" position=\\\"bottom-right\\\">\\n <div center-layout [width]=\\\"60\\\" [height]=\\\"60\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Bottom Right\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"4\\\" position=\\\"bottom-left\\\">\\n <div center-layout [width]=\\\"60\\\" [height]=\\\"60\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Bottom Left\\n </div>\\n</uni-notification-badge>\\n</div>\"\n },\n {\n \"title\": \"Variant Comparison\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variant Comparison -->\\n<div wrap-layout gap=\\\"lg\\\" padding=\\\"lg\\\">\\n<uni-notification-badge badgeVariant=\\\"dot\\\">\\n <div center-layout [width]=\\\"80\\\" [height]=\\\"80\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Dot Variant\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"8\\\" badgeVariant=\\\"count\\\">\\n <div center-layout [width]=\\\"80\\\" [height]=\\\"80\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Count Variant\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"123\\\" badgeVariant=\\\"pill\\\" [maxCount]=\\\"99\\\">\\n <div center-layout [width]=\\\"80\\\" [height]=\\\"80\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"xs\\\">\\n Pill Variant\\n </div>\\n</uni-notification-badge>\\n</div>\"\n },\n {\n \"title\": \"With Icons\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Icons -->\\n<div wrap-layout gap=\\\"lg\\\" padding=\\\"lg\\\">\\n<uni-notification-badge [count]=\\\"12\\\">\\n <div center-layout [width]=\\\"48\\\" [height]=\\\"48\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"max\\\">\\n 📧\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge badgeVariant=\\\"dot\\\">\\n <div center-layout [width]=\\\"48\\\" [height]=\\\"48\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"max\\\">\\n 🔔\\n </div>\\n</uni-notification-badge>\\n<uni-notification-badge [count]=\\\"999\\\" [maxCount]=\\\"99\\\" badgeVariant=\\\"pill\\\">\\n <div center-layout [width]=\\\"48\\\" [height]=\\\"48\\\" containerColor=\\\"surface-variant\\\" border=\\\"light\\\" borderRadius=\\\"max\\\">\\n 💬\\n </div>\\n</uni-notification-badge>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Attention indicator anchored to whatever it wraps — an icon button, a nav item, an\\navatar. Three shapes: `dot` (something is new), `count` (how many), and `pill`\\n(counts that need room); `maxCount` caps the display (\\\"99+\\\"). Position it on any\\ncorner of the wrapped content.\\nRadius and offset resolve from the `notificationBadge` theme options; the badge\\nwears the active `variant` color.\",\n \"dos\": [],\n \"donts\": [\n \"Convey urgency by color alone — the count/dot shape carries the signal\"\n ],\n \"accessibility\": [\n \"The visual badge is hidden from assistive tech; a visually-hidden text announcement carries the meaning (\\\"3 notifications\\\").\",\n \"Provide `ariaLabel` context when the wrapped control's purpose isn't obvious from its own name.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"notifications\",\n \"name\": \"Notifications\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-notifications\",\n \"api\": []\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"number-input\",\n \"name\": \"NumberInput\",\n \"status\": \"stable\",\n \"summary\": \"Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat.\",\n \"description\": \"Numeric field with locale-aware parsing, `Intl` formatting on commit, prefix/suffix adornments and steppers that hold to repeat. Not `<input type=\\\"number\\\">`, and the first reason is a data-loss bug: per the HTML value sanitization algorithm, a number input whose text is not a valid floating-point number reports `value === ''`. Type `12,50` as most of Europe does, or paste `1,234.56` from a spreadsheet, and the app reads an empty field. This is `type=\\\"text\\\"` with `role=\\\"spinbutton\\\"`, which is the only way to keep the user's malformed text on screen and tell them about it. Chrome comes from `uni-input-box`, so error, disabled and focus states match every other field. All arithmetic runs on the cdk's exact decimal helpers.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-number-input, NumberInput\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"number | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"valueAsString\",\n \"kind\": \"model\",\n \"type\": \"string | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"Exact binding, as a canonical decimal string. Bind this instead of `value` where a cent in the fifth decimal place matters; both stay in sync, so it is a one-word change from the ordinary case.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name, e.g. \\\"Unit price\\\".\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"preset\",\n \"kind\": \"input\",\n \"type\": \"UniNumberPreset\",\n \"required\": false,\n \"default\": \"'decimal'\",\n \"description\": \"\"\n },\n {\n \"name\": \"currency\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"ISO 4217 code, e.g. `'USD'`. Implies `preset=\\\"currency\\\"`.\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"BCP 47 tag. Defaults to the document language, then the browser's.\"\n },\n {\n \"name\": \"prefix\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Static adornment before the number, e.g. `'$'`. Never parseable input.\"\n },\n {\n \"name\": \"suffix\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Static adornment after the number, e.g. `'kg'`, `'/mo'`.\"\n },\n {\n \"name\": \"decimals\",\n \"kind\": \"input\",\n \"type\": \"number | [min: number, max: number]\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"grouping\",\n \"kind\": \"input\",\n \"type\": \"'auto' | 'always' | 'min2' | false\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"numberFormat\",\n \"kind\": \"input\",\n \"type\": \"Intl.NumberFormatOptions\",\n \"required\": false,\n \"description\": \"Escape hatch, merged over the preset.\"\n },\n {\n \"name\": \"roundingMode\",\n \"kind\": \"input\",\n \"type\": \"UniRoundingMode\",\n \"required\": false,\n \"default\": \"'half-up'\",\n \"description\": \"\"\n },\n {\n \"name\": \"align\",\n \"kind\": \"input\",\n \"type\": \"'start' | 'end' | 'center'\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"valueIsFraction\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"The model is a fraction: `0.15` displays as `15%`.\"\n },\n {\n \"name\": \"unitAnnouncement\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Spoken long form of an abbreviated suffix, e.g. `'kilograms'` for `kg`.\"\n },\n {\n \"name\": \"readOnly\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"embedded\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Renders without its own input-box chrome, for composers like uni-slider.\"\n },\n {\n \"name\": \"min\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"step\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"1\",\n \"description\": \"\"\n },\n {\n \"name\": \"largeStep\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"`PageUp`/`PageDown` and `Shift+Arrow`. Default: `step × 10`.\"\n },\n {\n \"name\": \"smallStep\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"`Alt+Arrow`, Figma's fine-nudge convention. Unset disables it.\"\n },\n {\n \"name\": \"stepOrigin\",\n \"kind\": \"input\",\n \"type\": \"'min' | 'zero'\",\n \"required\": false,\n \"default\": \"'min'\",\n \"description\": \"\"\n },\n {\n \"name\": \"wrap\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Cyclic fields only — 23 → 0 hours, 359 → 0 degrees.\"\n },\n {\n \"name\": \"clampOnCommit\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"`false` refuses an out-of-range commit instead of clamping it.\"\n },\n {\n \"name\": \"emptyStepValue\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"What ↑ commits on an empty field. Default: `min ?? 0`.\"\n },\n {\n \"name\": \"commitOnBlur\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"selectOnFocus\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"allowExpressions\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"`12*3` → 36. Off by default: a parser in a form field is a real cost.\"\n },\n {\n \"name\": \"wheel\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Scroll-to-step. Off by default — see `onWheel`.\"\n },\n {\n \"name\": \"repeat\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"stepperLayout\",\n \"kind\": \"input\",\n \"type\": \"UniNumberInputOptions['stepperLayout']\",\n \"required\": false,\n \"description\": \"Overrides the themed layout for this instance.\"\n },\n {\n \"name\": \"stepped\",\n \"kind\": \"output\",\n \"type\": \"UniNumberStepped\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniNumberRejection\",\n \"required\": false,\n \"description\": \"A commit was refused; the raw text stays in the field.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Quantity', value: 1, min: 1, max: 99 }\\n-->\"\n },\n {\n \"title\": \"Money\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Money -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Unit price', currency: 'USD', value: 1234.5, min: 0, step: 0.01 }\\n-->\"\n },\n {\n \"title\": \"Percent\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Percent -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Discount', preset: 'percent', value: 15, min: 0, max: 100 }\\n-->\"\n },\n {\n \"title\": \"Units\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Units -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{\\n label: 'Weight',\\n suffix: 'kg',\\n unitAnnouncement: 'kilograms',\\n value: 72,\\n min: 0,\\n step: 0.5,\\n }\\n-->\"\n },\n {\n \"title\": \"Split Steppers\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Split Steppers -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Seats', preset: 'integer', stepperLayout: 'split', value: 2, min: 1, max: 8 }\\n-->\"\n },\n {\n \"title\": \"Expressions\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Expressions -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Line total', currency: 'USD', allowExpressions: true, value: 350 }\\n-->\"\n },\n {\n \"title\": \"Cyclic Hours\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Cyclic Hours -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Hour', preset: 'integer', value: 23, min: 0, max: 23, wrap: true }\\n-->\"\n },\n {\n \"title\": \"No Steppers\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: No Steppers -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Year', preset: 'integer', stepperLayout: 'none', value: 2026 }\\n-->\"\n },\n {\n \"title\": \"Read Only\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Read Only -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Invoice total', currency: 'USD', value: 4820.75, readOnly: true }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-number-input ${argsToTemplate(props)}></uni-number-input>\\n<!-- args:\\n{ label: 'Quantity', value: 3, disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The field for a quantity, a price, a percentage or a measurement — typed entry\\nwith locale-aware parsing, `Intl` formatting on commit, prefix and suffix\\nadornments, min/max/step fences, and steppers that hold to repeat. Reach for it\\nwhenever the exact figure matters; reach for `uni-slider` when the *position*\\nis the information, and pair the two when users need both.\\nIt is deliberately not `<input type=\\\"number\\\">`. Per the HTML value sanitization\\nalgorithm, a number input whose text is not a valid floating-point number\\nreports `value === ''` — so `12,50` as most of Europe writes it, or `1,234.56`\\npasted from a spreadsheet, arrives at your app as an empty field. This is\\n`type=\\\"text\\\"` with `role=\\\"spinbutton\\\"`, which keeps the user's text on screen\\nand tells them what is wrong with it. All arithmetic runs on exact scaled-integer\\ndecimals, so stepping `0.1` never lands on `0.30000000000000004` and `1.15`\\nrounds to `1.2` where `toFixed(1)` gives `1.1`. Field chrome comes from the\\nshared `input` theme options via `uni-input-box`.\",\n \"dos\": [\n \"Use `preset` and `currency` rather than assembling `decimals` and `grouping` by hand.\",\n \"Set `align=\\\"end\\\"` in tables and numeric columns — that is a layout decision, made where the layout is.\",\n \"Bind `[(valueAsString)]` for money that accumulates through arithmetic; a dev-mode warning fires when a bound `value` cannot round-trip.\",\n \"Set `min` to say a field cannot go negative. There is no `allowNegative`, because two inputs saying the same thing can disagree.\"\n ],\n \"donts\": [\n \"Don't use it for formatted *strings* — phone numbers, card numbers, postcodes. Those are not quantities and belong to a masked text input.\",\n \"Don't turn on `wheel` for fields in a long scrolling form; a value that changes as the page scrolls past is silent data corruption.\",\n \"Don't clamp values yourself on every keystroke. Clamping happens on commit, because a `min=10` field that clamps live can never be typed into.\"\n ],\n \"accessibility\": [\n \"The control is `<input type=\\\"text\\\" inputmode=\\\"decimal\\\">` with `role=\\\"spinbutton\\\"`, `aria-valuenow`, `aria-valuemin` and `aria-valuemax`. `type=\\\"text\\\"` is what keeps malformed text visible instead of reporting an empty value.\",\n \"`aria-valuetext` carries the formatted string *with* its affixes — \\\"$1,234.56\\\", \\\"15 percent\\\", \\\"72 kilograms\\\" — because `aria-valuenow` alone announces \\\"1234.56\\\", which is the one thing about a money field that is not the point. The adornments are `aria-hidden` so they are not read twice.\",\n \"An empty field omits `aria-valuenow` entirely, per APG, and sets `aria-valuetext` to \\\"Empty\\\".\",\n \"Keyboard: arrows step by `step`; `Shift+Arrow` and `Page Up`/`Page Down` by `largeStep`; `Alt+Arrow` by `smallStep` when set; `Home`/`End` to the fences, and they no-op when that bound is undefined. `Enter` commits without submitting the form, `Escape` reverts the draft, `Tab` commits and moves on.\",\n \"The stepper buttons are real `<button>`s named `Increase {label}` / `Decrease {label}` with `tabindex=\\\"-1\\\"` — they are pointer affordances, and the keyboard route is the arrow keys. The whole field is one tab stop.\",\n \"**Target size.** `split` and `trailing` give each button a full-height square that clears the 24×24 minimum of WCAG 2.2 SC 2.5.8. `stacked` cannot: two arrows sharing a 32px field are 16px each. It is the dense desktop default because a mouse is precise, and on a **coarse pointer the layout switches to `split` automatically**. Set `stepperLayout: 'split'` in the theme if you need the larger targets everywhere.\",\n \"One `role=\\\"status\\\"` region announces clamps, fences, rejections and expression results. Held stepping announces **on release only**: narrating two hundred intermediate values is a denial of service.\",\n \"An unparseable draft gets a dashed underline as well as the error border, because colour alone cannot carry \\\"this is not a number\\\" (WCAG 1.4.1).\",\n \"`inputmode` is `numeric` only when negatives and decimals are both impossible, since several mobile keypads omit `−` and `.` from that layout.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"number-range-input\",\n \"name\": \"NumberRangeInput\",\n \"status\": \"stable\",\n \"summary\": \"Two linked numeric fields in one chrome, with one `{ start, end }` value — price filters, thresholds, tolerances.\",\n \"description\": \"Two linked numeric fields in one chrome, with one `{ start, end }` value — price filters, thresholds, tolerances. `start`/`end` deliberately match `UniDateRange`, so the library has one range vocabulary, and they avoid colliding with the `min`/`max` **inputs**, which mean the fence rather than the value. It owns its commit path rather than nesting two `uni-number-input`s, because the two behaviours the spec asks for need *different* bounds: a stepper must be fenced at the other end, while a typed commit must reach the parent un-clamped so a backwards range can be swapped instead of destroyed. A child field applies one bound pair to both. The arithmetic, parsing and formatting are still the cdk's, shared with every other numeric control.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-number-range-input, NumberRangeInput\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniNumberRange | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Names the group, e.g. \\\"Price range\\\".\"\n },\n {\n \"name\": \"startLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Minimum'\",\n \"description\": \"\"\n },\n {\n \"name\": \"endLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Maximum'\",\n \"description\": \"\"\n },\n {\n \"name\": \"preset\",\n \"kind\": \"input\",\n \"type\": \"UniNumberPreset\",\n \"required\": false,\n \"default\": \"'decimal'\",\n \"description\": \"\"\n },\n {\n \"name\": \"currency\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"prefix\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"suffix\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"decimals\",\n \"kind\": \"input\",\n \"type\": \"number | [min: number, max: number]\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"grouping\",\n \"kind\": \"input\",\n \"type\": \"'auto' | 'always' | 'min2' | false\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"roundingMode\",\n \"kind\": \"input\",\n \"type\": \"UniRoundingMode\",\n \"required\": false,\n \"default\": \"'half-up'\",\n \"description\": \"\"\n },\n {\n \"name\": \"placeholderStart\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"placeholderEnd\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"min\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"step\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"1\",\n \"description\": \"\"\n },\n {\n \"name\": \"minGap\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Enforced distance between the two ends.\"\n },\n {\n \"name\": \"swapped\",\n \"kind\": \"output\",\n \"type\": \"UniNumberRange\",\n \"required\": false,\n \"description\": \"The ends were entered backwards and have been exchanged.\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniNumberRangeRejection\",\n \"required\": false,\n \"description\": \"A typed commit on one end could not be read; its text stays in place.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{\\n label: 'Price range',\\n currency: 'USD',\\n min: 0,\\n max: 5000,\\n step: 10,\\n value: { start: 200, end: 1500 },\\n }\\n-->\"\n },\n {\n \"title\": \"Price Filter\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Price Filter -->\\n<!-- args:\\n{\\n label: 'Price range',\\n currency: 'USD',\\n min: 0,\\n max: 5000,\\n step: 10,\\n value: { start: 200, end: 1500 },\\n }\\n-->\"\n },\n {\n \"title\": \"Minimum Gap\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Minimum Gap -->\\n<!-- args:\\n{ label: 'Temperature tolerance', suffix: '°C', min: -20, max: 40, minGap: 5, value: { start: 5, end: 20 } }\\n-->\"\n },\n {\n \"title\": \"Open Ended\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Open Ended -->\\n<!-- args:\\n{ label: 'Price range', currency: 'USD', value: { start: 50 } }\\n-->\"\n },\n {\n \"title\": \"Custom End Labels\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Custom End Labels -->\\n<!-- args:\\n{ label: 'Delivery window', suffix: ' days', startLabel: 'From', endLabel: 'To', min: 0, value: { start: 2, end: 7 } }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<!-- args:\\n{ disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Two linked numeric fields in one chrome, with a single `{ start, end }` value —\\nprice filters, thresholds, tolerances. Reach for it when both ends of a range\\nneed typing; reach for `uni-slider` in `range` mode when the *position* is the\\ninformation, and for two separate `uni-number-input`s when the values are not\\ntwo ends of one answer.\\nThe value uses `start`/`end` deliberately, matching `UniDateRange`, so the\\nlibrary has one range vocabulary — and so they never collide with the `min` and\\n`max` **inputs**, which mean the fence rather than the value. Formatting,\\nparsing and the exact decimal arithmetic are the same cdk primitives every other\\nnumeric control uses, so `1,200` and the keyboard map behave identically here.\",\n \"dos\": [\n \"Give it a `label` that names the quantity, not the widget — \\\"Price range\\\", not \\\"Range\\\".\",\n \"Use `minGap` wherever a zero-width range is meaningless.\",\n \"Set `min`/`max` for the outer fence and let the ends fence each other.\"\n ],\n \"donts\": [\n \"Don't use it for two unrelated numbers. One value means one question; two questions want two fields.\",\n \"Don't assume both ends are set — `{ start }` and `{ end }` alone are valid, so narrow before arithmetic.\",\n \"Don't add your own swap or ordering logic on top; the component guarantees `start <= end` in the value it emits.\"\n ],\n \"accessibility\": [\n \"The two ends sit in a `role=\\\"group\\\"` named by `label`, and each is an `<input role=\\\"spinbutton\\\">` named `{label}, Minimum` and `{label}, Maximum`. **Two tab stops, honestly — it is two questions.**\",\n \"Each end's `aria-valuemin` / `aria-valuemax` report **the other end's position**, held off by `minGap`, not the outer bounds — so a screen-reader user is told where the wall actually is rather than where the range ends.\",\n \"`aria-valuetext` carries the formatted value with its affixes on both ends, so a price range announces \\\"$500\\\", not \\\"500\\\".\",\n \"Keyboard map is `uni-number-input`'s: arrows step, `Shift+Arrow` and `Page Up`/`Page Down` step large, `Home`/`End` jump to **that end's own wall**, `Enter` commits, `Escape` reverts, blur commits.\",\n \"**Stepping is fenced; typing swaps.** A stepper can never walk one end through the other. A *typed* backwards commit is swapped instead, and announced — the user pointed at the range they meant, and clamping would destroy the number they just entered.\",\n \"A refused draft flags only the end it was typed into. It keeps its text and gets a dashed underline as well as the error border, because colour alone cannot carry \\\"this is not a number\\\" (WCAG 1.4.1). The other end stays valid.\",\n \"Swaps, gap corrections, fences and refusals each announce through one `role=\\\"status\\\"` region — every one of them is otherwise a purely visual event.\",\n \"The divider is `aria-hidden`: it is punctuation, and the two ends are already named.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"paginator\",\n \"name\": \"Paginator\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"data\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-paginator\",\n \"api\": [\n {\n \"name\": \"datasource\",\n \"kind\": \"input\",\n \"type\": \"UniDatasource<T>\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"initPageSize\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"showPageSize\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"showPageJumper\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"showPageNumbers\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-paginator ${argsToTemplate(props)} />\\n<div box-layout paddingTop=\\\"md\\\">\\n @for (record of datasource.records(); track record.id) {\\n <div>{{ record.name }}</div>\\n }\\n</div>\\n<!-- args:\\n{\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n initPageSize: 5,\\n showPageSize: true,\\n showPageJumper: true,\\n showPageNumbers: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Page Numbers Only\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Page Numbers Only -->\\n<uni-paginator ${argsToTemplate(props)} />\\n<div box-layout paddingTop=\\\"md\\\">\\n @for (record of datasource.records(); track record.id) {\\n <div>{{ record.name }}</div>\\n }\\n</div>\\n<!-- args:\\n{\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n initPageSize: 5,\\n showPageSize: false,\\n showPageJumper: false,\\n showPageNumbers: true,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Paginator drives page navigation for any `UniDatasource`: first/previous/next/last\\nbuttons, truncated page numbers, an editable page size, and a page jumper. Each section can\\nbe toggled independently, so it can render as a full control bar or a minimal pager — the\\n[Data Table](?path=/docs/components-data-display-data-table--data-table) stories use one paginator in the header\\nfor page size and another in the footer for page numbers.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"A `role=\\\"navigation\\\"` landmark; pages are real buttons with `aria-current=\\\"page\\\"` on the active one.\",\n \"The page-number input is labelled.\"\n ]\n },\n \"relatedTokens\": [\n \"paginator.behavior.gap\",\n \"paginator.behavior.textRole\",\n \"paginator.behavior.inputBorder\",\n \"paginator.behavior.inputBorderRadius\",\n \"paginator.behavior.pageBorderRadius\",\n \"paginator.behavior.currentPageBorder\",\n \"paginator.behavior.currentPageBorderRadius\"\n ]\n },\n {\n \"id\": \"popover\",\n \"name\": \"Popover\",\n \"status\": \"stable\",\n \"summary\": \"Anchored, top-layer panel on the native `popover` element — the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal.\",\n \"description\": \"Anchored, top-layer panel on the native `popover` element — the browser owns positioning (CSS anchor positioning), stacking, and, in rich mode, light dismissal. Two modes share one implementation: - `rich` (default): a click-toggled disclosure. The projected `[trigger]` carries `aria-expanded`/`aria-controls`; with no trigger content the app drives `open` and no element claims controller ARIA. Focus stays on the trigger (APG disclosure) unless the panel marks an `[autofocus]` field, and returns to the trigger on close. - `tooltip`: hover/focus-triggered, `role=\\\"tooltip\\\"` + `aria-describedby`, WCAG 1.4.13 dismissable/hoverable/persistent. Content must not contain focusable elements. Anchoring and control are separate: `anchor` re-anchors the panel to any element (or id) while the trigger keeps the disclosure semantics.\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-popover\",\n \"api\": [\n {\n \"name\": \"placement\",\n \"kind\": \"input\",\n \"type\": \"Placement\",\n \"required\": false,\n \"default\": \"'bottom'\",\n \"description\": \"\"\n },\n {\n \"name\": \"autoClose\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Light-dismiss on outside click / Escape (native popover=\\\"auto\\\").\"\n },\n {\n \"name\": \"open\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Two-way open state; light dismissal and hover timers sync back into it.\"\n },\n {\n \"name\": \"mode\",\n \"kind\": \"input\",\n \"type\": \"'rich' | 'tooltip'\",\n \"required\": false,\n \"default\": \"'rich'\",\n \"description\": \"`rich` = click-toggled disclosure; `tooltip` = hover/focus description.\"\n },\n {\n \"name\": \"anchor\",\n \"kind\": \"input\",\n \"type\": \"HTMLElement | string\",\n \"required\": false,\n \"description\": \"Anchor the panel to another element (or element id, resolved each time the panel opens) while the projected trigger keeps the disclosure ARIA. Empty string means unset.\"\n },\n {\n \"name\": \"header\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Title rendered in the header row and used as the accessible name.\"\n },\n {\n \"name\": \"closable\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Renders a \\\"Close\\\" icon button in the header row.\"\n },\n {\n \"name\": \"arrow\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"maxWidth\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"description\": \"Panel max-width; numbers are px. Defaults to the theme's `maxWidth`.\"\n },\n {\n \"name\": \"openDelay\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Tooltip-mode hover-open delay, ms; defaults to the theme option.\"\n },\n {\n \"name\": \"closeDelay\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Tooltip-mode pointer-leave close delay, ms; defaults to the theme option.\"\n },\n {\n \"name\": \"opened\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"closed\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-popover placement=\\\"${placement}\\\" [autoClose]=\\\"${autoClose}\\\" [arrow]=\\\"${arrow}\\\" #popover>\\n <button text-button trigger>Open Popover</button>\\n <div stack-layout gap=\\\"sm\\\">\\n <div>\\n <span uni-text=\\\"title-small\\\" display=\\\"block\\\">\\n This is a Popover.\\n </span>\\n It is possible to add any markup you want to a Popover.\\n </div>\\n <div>\\n <button text-button symbolLeft=\\\"thumb_up\\\" size=\\\"sm\\\" variant=\\\"secondary\\\" (click)=\\\"popover.hidePopover()\\\">OK!</button>\\n </div>\\n </div>\\n</uni-popover>\\n<!-- args:\\n{\\n placement: 'right-start',\\n autoClose: true,\\n arrow: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Structured Form\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Structured Form -->\\n<uni-popover header=\\\"Rename view\\\" [closable]=\\\"true\\\" #popover>\\n<button text-button trigger>Rename…</button>\\n<uni-input label=\\\"Name\\\" autofocus></uni-input>\\n<button text-button popover-footer size=\\\"sm\\\" variant=\\\"secondary\\\" (click)=\\\"popover.hidePopover()\\\">Apply</button>\\n</uni-popover>\"\n },\n {\n \"title\": \"Detached Anchor\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Detached Anchor -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-input label=\\\"Project name\\\" id=\\\"detached-demo-field\\\"></uni-input>\\n<uni-popover anchor=\\\"detached-demo-field\\\" placement=\\\"bottom-start\\\" header=\\\"Naming rules\\\">\\n <button text-button trigger size=\\\"sm\\\" variant=\\\"ghost\\\">Show naming rules</button>\\n Lowercase, dashes for spaces, unique within the workspace.\\n</uni-popover>\\n</div>\"\n },\n {\n \"title\": \"Tooltip Mode\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Tooltip Mode -->\\n<uni-popover mode=\\\"tooltip\\\" placement=\\\"top\\\">\\n<button text-button trigger variant=\\\"ghost\\\">Publishing</button>\\nPublishes to every connected space at once.\\n</uni-popover>\"\n },\n {\n \"title\": \"Manual Close\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Manual Close -->\\n<uni-popover [autoClose]=\\\"false\\\" header=\\\"Cookie consent\\\" #popover>\\n<button text-button trigger>Preferences</button>\\nThis panel ignores outside clicks.\\n<button text-button popover-footer size=\\\"sm\\\" (click)=\\\"popover.hidePopover()\\\">Save</button>\\n</uni-popover>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Popover is an anchored, non-modal panel on the native popover top layer: the\\nbrowser owns positioning, stacking, and light dismissal. Rich mode (the\\ndefault) is a click-toggled disclosure for short callouts, small forms, and\\ncompact actions; `mode=\\\"tooltip\\\"` turns the same element into a hover/focus\\ndescription with the full WCAG 1.4.13 contract. Anchoring and control are\\nseparate — `anchor` re-anchors the panel to any element or id while the\\nprojected `[trigger]` keeps the disclosure semantics, and with no trigger the\\napp drives the two-way `open` model directly.\",\n \"dos\": [\n \"Use rich mode for short callouts, small forms, and compact action clusters\",\n \"Give form popovers an `[autofocus]` field and a `[popover-footer]` action\",\n \"Use `anchor` when the panel should hug a field the trigger merely explains\"\n ],\n \"donts\": [\n \"Put focusable content inside tooltip mode — promote it to rich mode instead\",\n \"Reach for a popover when the flow needs modality; that is a dialog\"\n ],\n \"accessibility\": [\n \"Rich mode wires `aria-expanded`/`aria-controls` onto the focusable trigger; with no projected trigger, no element claims controller ARIA.\",\n \"Tooltip mode is `role=\\\"tooltip\\\"` + `aria-describedby` — a description, never a name — and warns in dev mode if the content contains focusable elements.\",\n \"Focus stays on the trigger when the panel opens (APG disclosure) unless the panel marks an `[autofocus]` field; close returns focus to the trigger.\",\n \"The panel sits in the DOM right after the trigger, so Tab order is natural and there is no focus trap in either mode.\"\n ]\n },\n \"relatedTokens\": [\n \"popover.behavior.color\",\n \"popover.behavior.border\",\n \"popover.behavior.borderRadius\",\n \"popover.behavior.shadow\",\n \"popover.behavior.typeface\",\n \"popover.behavior.padding\",\n \"popover.behavior.maxWidth\",\n \"popover.behavior.offset\",\n \"popover.behavior.arrowSize\",\n \"popover.behavior.closeSymbol\",\n \"popover.behavior.headerTypeface\",\n \"popover.behavior.tooltipPadding\",\n \"popover.behavior.tooltipOpenDelay\",\n \"popover.behavior.tooltipCloseDelay\",\n \"popover.behavior.motion\"\n ]\n },\n {\n \"id\": \"progress-bar\",\n \"name\": \"ProgressBar\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-progress-bar\",\n \"api\": [\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"560\",\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"24\",\n \"description\": \"\"\n },\n {\n \"name\": \"percent\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name describing what is progressing (e.g. \\\"Upload progress\\\").\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-progress-bar percent=\\\"${percent}\\\" ${argsToTemplate(props)}></uni-progress-bar>\\n<!-- args:\\n{\\n percent: 60,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The progress bar is a graphical way of representing progress to completion.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`role=\\\"progressbar\\\"` with `aria-valuenow`/`min`/`max`; name it with `ariaLabel`.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"progress-gauge\",\n \"name\": \"ProgressGauge\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-progress-gauge\",\n \"api\": [\n {\n \"name\": \"percent\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name describing what is progressing.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-progress-gauge percent=\\\"${percent}\\\" variant=\\\"${variant}\\\" size=\\\"${size}\\\"></uni-progress-gauge>\\n<!-- args:\\n{\\n percent: 60,\\n size: 'lg',\\n variant: 'primary',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The progress gauge is a graphical way of representing progress to completion as well as scoring or ranking.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`role=\\\"progressbar\\\"` with `aria-valuenow`/`min`/`max`; name it with `ariaLabel`. The SVG is decorative.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"quantity-stepper\",\n \"name\": \"QuantityStepper\",\n \"status\": \"stable\",\n \"summary\": \"`− 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either.\",\n \"description\": \"`− 3 +` for cart lines, table cells and seat counts: the numeric core with no field chrome, no label and no room for either. A separate component rather than a `chrome=\\\"bare\\\"` flag on `uni-number-input`, because this control is defined by what it does *not* have — presets, affixes, expressions, four stepper layouts — and eight inputs are easier to write correctly than forty with a list of which ones to leave alone. The arithmetic, parsing and hold-to-repeat are the cdk's, shared with the field, so `1,200` and the keyboard map behave identically in both. The middle stays a real input by default: typing `12` beats tapping `+` eleven times. `editable=false` is for read-mostly tables.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-quantity-stepper, QuantityStepper\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"number | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name. Never visible and always needed — a cart with six of these needs \\\"Quantity, Blue T-shirt (M)\\\", not six controls called \\\"Quantity\\\".\"\n },\n {\n \"name\": \"min\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"step\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"1\",\n \"description\": \"\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'md'\",\n \"description\": \"\"\n },\n {\n \"name\": \"editable\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"`false` renders the number as text: read-mostly tables.\"\n },\n {\n \"name\": \"deleteAtMin\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"The cart pattern in one attribute: at `min` the decrement button becomes a remove affordance and emits `removed` rather than stepping. Without it every shop reimplements the same `value === 1 ? remove() : step(-1)` branch outside the component.\"\n },\n {\n \"name\": \"removed\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"The remove affordance was activated — the row should come out. Named `removed`, not the spec's `emptied`: that word is a native `HTMLMediaElement` event, which `@angular-eslint/no-output-native` bans for good reason, and `removed` is already what `uni-tag` calls this same request.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ value: 1, min: 1, deleteAtMin: true }\\n-->\"\n },\n {\n \"title\": \"Cart Line\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Cart Line -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ value: 1, min: 1, deleteAtMin: true }\\n-->\"\n },\n {\n \"title\": \"Sizes\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Sizes -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ editable: false, value: 4 }\\n-->\"\n },\n {\n \"title\": \"Read Only Value\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Read Only Value -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ editable: false, value: 4 }\\n-->\"\n },\n {\n \"title\": \"Bounded\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Bounded -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ value: 8, min: 1, max: 8 }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<div row-layout gap=\\\"md\\\" alignItems=\\\"center\\\">\\n<uni-quantity-stepper label=\\\"Quantity, small\\\" size=\\\"sm\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, medium\\\" size=\\\"md\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n<uni-quantity-stepper label=\\\"Quantity, large\\\" size=\\\"lg\\\" [value]=\\\"value\\\" [min]=\\\"min\\\" />\\n</div>\\n<!-- args:\\n{ disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"`− 3 +` for a cart line, a table cell or a seat count: the numeric core with no\\nfield chrome, no label and no room for either. Reach for it inside a row that\\nalready says what is being counted; reach for `uni-number-input` when the field\\nneeds a label, an affix or a currency, and `uni-slider` when the position is\\nthe information.\\nA separate component rather than a flag on `uni-number-input`, because this\\ncontrol is defined by what it does *not* have — presets, affixes, expressions,\\nfour stepper layouts — and eight inputs are easier to write correctly than forty\\nplus a list of which ones to leave alone. The arithmetic, parsing and\\nhold-to-repeat come from the same cdk primitives, so `1,200` and the keyboard\\nmap behave identically in both.\",\n \"dos\": [\n \"Name the row's subject in `label`, not just the measure.\",\n \"Use `deleteAtMin` for cart lines so removal lives in the control rather than beside it.\",\n \"Keep `editable` on wherever someone might enter a large quantity — typing 12 beats tapping + eleven times.\"\n ],\n \"donts\": [\n \"Don't use it where a value needs a visible label, a unit or a currency; that is `uni-number-input`.\",\n \"Don't wire `removed` to a silent delete. It means \\\"the user asked to remove this row\\\" — confirm or offer an undo as your flow requires.\",\n \"Don't give it a wide range. Past a couple of dozen taps a typed field is the faster control.\"\n ],\n \"accessibility\": [\n \"The middle is an `<input role=\\\"spinbutton\\\">` named by `label`, with `aria-valuenow`, `aria-valuemin` and `aria-valuemax`. An empty stepper omits `aria-valuenow` and reads \\\"Empty\\\".\",\n \"**`label` is never visible and always required.** A cart with six of these needs \\\"Quantity, Blue T-shirt (M)\\\" on each, not six controls all called \\\"Quantity\\\".\",\n \"While `editable`, the input is the single tab stop and the buttons carry `tabindex=\\\"-1\\\"` as pointer affordances — the keyboard route is the arrow keys. With `editable=false` there is nothing else to focus, so the buttons become the tab stops and the wrapper takes `role=\\\"group\\\"` with the name.\",\n \"The buttons are square at the component's height, so the 24×24 pointer target of WCAG 2.2 SC 2.5.8 holds at `sm`, `md` and `lg`.\",\n \"Arrow keys step, `Enter` commits, `Escape` reverts, blur commits — the same map as `uni-number-input`.\",\n \"A `role=\\\"status\\\"` region announces fences, clamps and removals. Hold-to-repeat announces once, on release.\",\n \"At the fence the matching button is `disabled` rather than a silent no-op. With `deleteAtMin` the decrement stays enabled at `min`, because there it is the one control that still does something.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"radio\",\n \"name\": \"Radio\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-radio\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"checkedColor\",\n \"kind\": \"input\",\n \"type\": \"ColorKey\",\n \"required\": false,\n \"description\": \"Accent colour token, overriding the variant's themed accent for one instance. Mirrors the input of the same name on `uni-checkbox` and `uni-toggle`.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"options\",\n \"kind\": \"input\",\n \"type\": \"UniRadioOption[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"uniqueId('uni-radio-group')\",\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-radio ${argsToTemplate(args)}></uni-radio>\\n<!-- args:\\n{\\n label: 'Select an option',\\n variant: 'primary',\\n disabled: false,\\n value: 'option1',\\n name: 'radio-group',\\n options: defaultOptions,\\n }\\n-->\"\n },\n {\n \"title\": \"Without Label\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Without Label -->\\n<uni-radio ${argsToTemplate(args)}></uni-radio>\\n<!-- args:\\n{\\n label: '',\\n variant: 'primary',\\n disabled: false,\\n value: '',\\n name: 'radio-group',\\n options: defaultOptions,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-radio ${argsToTemplate(args)}></uni-radio>\\n<!-- args:\\n{\\n label: 'Disabled radio group',\\n variant: 'primary',\\n disabled: true,\\n value: 'option1',\\n name: 'radio-group',\\n options: defaultOptions,\\n }\\n-->\"\n },\n {\n \"title\": \"With Disabled Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Disabled Options -->\\n<uni-radio ${argsToTemplate(args)}></uni-radio>\\n<!-- args:\\n{\\n label: 'Some options disabled',\\n variant: 'primary',\\n disabled: false,\\n value: 'option1',\\n name: 'radio-group',\\n options: [\\n { label: 'Available Option', value: 'option1' },\\n { label: 'Disabled Option', value: 'option2', disabled: true },\\n { label: 'Another Available', value: 'option3' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Variants\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variants -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-radio label=\\\"Primary\\\" variant=\\\"primary\\\" [options]=\\\"options\\\" name=\\\"primary-group\\\"></uni-radio>\\n<uni-radio label=\\\"Secondary\\\" variant=\\\"secondary\\\" [options]=\\\"options\\\" name=\\\"secondary-group\\\"></uni-radio>\\n<uni-radio label=\\\"Success\\\" variant=\\\"success\\\" [options]=\\\"options\\\" name=\\\"success-group\\\"></uni-radio>\\n<uni-radio label=\\\"Warning\\\" variant=\\\"warn\\\" [options]=\\\"options\\\" name=\\\"warn-group\\\"></uni-radio>\\n<uni-radio label=\\\"Tertiary\\\" variant=\\\"tertiary\\\" [options]=\\\"options\\\" name=\\\"tertiary-group\\\"></uni-radio>\\n</div>\"\n },\n {\n \"title\": \"With Change Event\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Change Event -->\\n<div>\\n<uni-radio\\n label=\\\"Pick your favorite\\\"\\n [options]=\\\"options\\\"\\n [value]=\\\"selectedValue\\\"\\n (valueChange)=\\\"onRadioChange($event)\\\"\\n variant=\\\"primary\\\"\\n name=\\\"favorites\\\">\\n</uni-radio>\\n<div box-layout paddingTop=\\\"md\\\">\\n Current selection: {{ selectedValue || 'None' }}\\n</div>\\n<div box-layout paddingTop=\\\"sm\\\">\\n Last change: {{ lastChangeValue }}\\n</div>\\n</div>\"\n },\n {\n \"title\": \"Form Signals\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Form Signals -->\\n<div>\\n<uni-radio\\n label=\\\"Select your choice\\\"\\n variant=\\\"primary\\\"\\n [options]=\\\"options\\\"\\n [value]=\\\"currentValue\\\"\\n [disabled]=\\\"isDisabled\\\"\\n [invalid]=\\\"isInvalid\\\"\\n [touched]=\\\"isTouched\\\"\\n name=\\\"signals-demo\\\">\\n</uni-radio>\\n<div box-layout paddingTop=\\\"md\\\">\\n <p>Value: {{ currentValue }}</p>\\n <p>Touched: {{ isTouched }}</p>\\n <p>Invalid: {{ isInvalid }}</p>\\n <p>Disabled: {{ isDisabled }}</p>\\n</div>\\n<div row-layout gap=\\\"sm\\\" paddingTop=\\\"sm\\\">\\n<button\\n (click)=\\\"isTouched = true\\\">\\n Mark as Touched\\n</button>\\n<button\\n (click)=\\\"isDisabled = !isDisabled\\\">\\n Toggle Disabled\\n</button>\\n<button\\n (click)=\\\"isInvalid = !isInvalid\\\">\\n Toggle Invalid\\n</button>\\n</div>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Single choice among a small set of visible options. The component renders the whole\\ngroup from an `options` array (`{ label, value, disabled? }`), implements\\n`FormValueControl<string>` for Signal Forms, and defaults each group to a unique\\n`name` so multiple groups on a page never collide.\\nRing, fill, and size resolve from the `radio` theme options; the selected dot wears\\nthe active `variant` color.\",\n \"dos\": [\n \"Use for 2–5 mutually exclusive options that should all be visible\"\n ],\n \"donts\": [\n \"Use for long option lists — that is a select\"\n ],\n \"accessibility\": [\n \"`role=\\\"radiogroup\\\"` labelled by the group label via `aria-labelledby`.\",\n \"Native radio inputs: arrow keys move selection within the group, Tab moves out.\",\n \"`aria-invalid` reflects the error state once the group was touched or is dirty.\"\n ]\n },\n \"relatedTokens\": [\n \"radio.behavior.size\",\n \"radio.behavior.ringColor\",\n \"radio.behavior.fillColor\",\n \"radio.behavior.motion\"\n ]\n },\n {\n \"id\": \"ripple\",\n \"name\": \"Ripple\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"directives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uniRipple]\",\n \"api\": []\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"row\",\n \"name\": \"Row\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-row-layout], [row-layout]\",\n \"api\": [\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"default\": \"'flex'\",\n \"description\": \"\"\n },\n {\n \"name\": \"flexDirection\",\n \"kind\": \"input\",\n \"type\": \"OptionalFlexDirection\",\n \"required\": false,\n \"default\": \"'row'\",\n \"description\": \"\"\n },\n {\n \"name\": \"minWidth\",\n \"kind\": \"input\",\n \"type\": \"number | string | undefined\",\n \"required\": false,\n \"default\": \"'fit-content'\",\n \"description\": \"Defaults to `fit-content` (guards content collapse). Set `[minWidth]=\\\"0\\\"` when the row must shrink inside a constrained flex parent (scroll or text truncation containment).\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Button Row\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Button Row -->\\n<div row-layout ${argsToTemplate(props)}>\\n <button text-button>Button 1</button>\\n <button text-button>Button 2</button>\\n <button text-button>Button 3</button>\\n</div>\\n<!-- args:\\n{ gap: 'lg' }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"`Row` is a layout component used to group elements in a horizontal arrangement and applies a uniform space between them.\\n`Row` is an extension to the `Box` component and has all the `Box` attributes available to it.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"scroll-area\",\n \"name\": \"ScrollArea\",\n \"status\": \"stable\",\n \"summary\": \"Native scroll area with theme-driven scrollbar styling.\",\n \"description\": \"Native scroll area with theme-driven scrollbar styling. Scrollbars are styled entirely through Emotion-generated CSS: `::-webkit-scrollbar` rules cover Chromium/Safari, with a `scrollbar-width`/`scrollbar-color` fallback for Firefox.\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-scroll-area], [scroll-area]\",\n \"api\": [\n {\n \"name\": \"containerColor\",\n \"kind\": \"input\",\n \"type\": \"ContainerColorToken\",\n \"required\": false,\n \"description\": \"A container color *pair*: the named surface plus its paired on-color. Named `containerColor`, not `color`, for the same reason as the layout primitives: this is an attribute directive-style selector that shares elements with `uni-text`, which owns `color` and maps it to the CSS property. One `color` binding feeding both would render ink on ink.\"\n },\n {\n \"name\": \"borderRadius\",\n \"kind\": \"input\",\n \"type\": \"Radius\",\n \"required\": false,\n \"default\": \"'sm'\",\n \"description\": \"\"\n },\n {\n \"name\": \"padding\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingHorizontal\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingVertical\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingLeft\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingRight\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingTop\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"paddingBottom\",\n \"kind\": \"input\",\n \"type\": \"OptionalSize\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"border\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"OptionalValue\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"OptionalValue\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"appearance\",\n \"kind\": \"input\",\n \"type\": \"ScrollbarAppearance\",\n \"required\": false,\n \"default\": \"'compact'\",\n \"description\": \"\"\n },\n {\n \"name\": \"autoHeightDisabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"verticalScrollPadding\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"29\",\n \"description\": \"\"\n },\n {\n \"name\": \"scrollable\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div scroll-area ${argsToTemplate(props)} #scrollArea>\\n <button size=\\\"sm\\\" text-button variant=\\\"ghost\\\" symbolLeft=\\\"arrow_downward\\\" (click)=\\\"scrollArea.scrollToBottom()\\\">Scroll to bottom</button>\\n ${ngContent}\\n <button size=\\\"sm\\\" text-button variant=\\\"ghost\\\" symbolLeft=\\\"arrow_upward\\\" (click)=\\\"scrollArea.scrollToTop()\\\">Back to top</button>\\n</div>\\n<!-- args:\\n{\\n border: 'quaternary',\\n containerColor: 'tertiary-surface',\\n height: 200,\\n ngContent: `\\n <span uni-text=\\\"headline-medium\\\">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span>\\n <span uni-text=\\\"body-1-long\\\">\\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis facere debitis ullam, quae quidem, impedit\\n culpa nam\\n repellat in voluptatibus esse ab harum, hic? Aliquam nesciunt voluptates repellendus assumenda labore.\\n </p>\\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro quos voluptate doloribus. Optio unde\\n inventore, tempore\\n nemo repellat expedita! Quod, accusamus nobis iure. Aliquam quibusdam, nemo explicabo ipsum provident\\n asperiores.</p>\\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat, qui, rem! Debitis cum maiores iste,\\n possimus!\\n Obcaecati accusamus eaque expedita quo soluta quis, repudiandae similique, veritatis repellendus facere\\n suscipit!\\n Et!</p>\\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum doloremque repellat praesentium quae et\\n consectetur\\n iure quos porro, provident voluptates reprehenderit a. Accusamus ut, quaerat asperiores blanditiis\\n voluptate, sint\\n facilis.</p>\\n <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus beatae inventore nobis esse\\n temporibus\\n exercitationem\\n eos illo minima non magnam, provident sit doloribus maiores odio in animi quidem unde. Perferendis.</p>\\n\\n </span>\\n\\n\\n `,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A scroll container with themed, consistent scrollbars across browsers — thin\\nEmotion-styled WebKit scrollbars with a `scrollbar-width`/`scrollbar-color`\\nfallback. It detects scrollable state via ResizeObserver (the `scrollable` output)\\nand offers `scrollToTop`/`scrollToBottom` for programmatic control.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"search-input\",\n \"name\": \"SearchInput\",\n \"status\": \"stable\",\n \"summary\": \"Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead — pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox.\",\n \"description\": \"Generic search field: shared input chrome with a leading magnifier, a clear button while there's a query, Enter to submit, and optional type-ahead — pass `suggestions` (refresh them from `change`) and the field becomes an ARIA combobox with a keyboard-navigable listbox. Escape closes the list first, then clears the query.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-search-input\",\n \"api\": [\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name for the field, also the placeholder fallback.\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"default\": \"'100%'\",\n \"description\": \"\"\n },\n {\n \"name\": \"debounceTime\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"400\",\n \"description\": \"\"\n },\n {\n \"name\": \"suggestions\",\n \"kind\": \"input\",\n \"type\": \"string[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"Type-ahead entries. Keep them fresh from `change` emissions; the list shows while the field has focus and entries exist.\"\n },\n {\n \"name\": \"searchChange\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The debounced query, emitted as the user types.\"\n },\n {\n \"name\": \"searchSubmit\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"A committed search: Enter, or a suggestion chosen from the list.\"\n },\n {\n \"name\": \"suggestionSelected\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div box-layout maxWidth=\\\"420px\\\">\\n<uni-search-input\\n label=\\\"Search the docs\\\"\\n [debounceTime]=\\\"200\\\"\\n [suggestions]=\\\"suggestions\\\"\\n (searchChange)=\\\"filter($event)\\\"\\n (searchSubmit)=\\\"log($event)\\\"\\n></uni-search-input>\\n</div>\\n<!-- args:\\n{ label: 'Search' }\\n-->\"\n },\n {\n \"title\": \"Type-ahead\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Type-ahead -->\\n<div box-layout maxWidth=\\\"420px\\\">\\n<uni-search-input\\n label=\\\"Search the docs\\\"\\n [debounceTime]=\\\"200\\\"\\n [suggestions]=\\\"suggestions\\\"\\n (searchChange)=\\\"filter($event)\\\"\\n (searchSubmit)=\\\"log($event)\\\"\\n></uni-search-input>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Generic search field wearing the shared input chrome: a decorative leading magnifier,\\na clear button while there's a query, and Enter to submit (`searchSubmit`). `searchChange` emits\\ndebounced as the user types — use it to refresh results or the `suggestions` input.\\nWith `suggestions`, the field becomes an ARIA combobox: entries render in a listbox\\nunder the field, ArrowUp/Down move the highlight, Enter selects (emitting both\\n`suggestionSelected` and `searchSubmit`), and Escape closes the list first, then clears the\\nquery. The suggestion list's surface, elevation and radius resolve from the theme's\\n`searchInput` options, alongside the search/clear symbols.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"The field is an ARIA combobox: `aria-expanded`, `aria-controls`, and `aria-activedescendant` track the suggestion listbox.\",\n \"ArrowUp/ArrowDown move the active option, Enter selects, Escape closes the list first and clears the query second.\",\n \"The magnifier is decorative; the clear button has an accessible name (\\\"Clear search\\\").\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"select\",\n \"name\": \"Select\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-select\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"T | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"options\",\n \"kind\": \"input\",\n \"type\": \"Options<T>\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"grow\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible name for the select; a placeholder is not a label.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Select your country...',\\n options: [\\n { value: 'us', label: 'United States' },\\n { value: 'ca', label: 'Canada' },\\n { value: 'uk', label: 'United Kingdom' },\\n { value: 'au', label: 'Australia' },\\n ],\\n value: null,\\n disabled: false,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"With Value\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Value -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Select priority...',\\n options: [\\n { value: 'low', label: 'Low Priority' },\\n { value: 'medium', label: 'Medium Priority' },\\n { value: 'high', label: 'High Priority' },\\n { value: 'urgent', label: 'Urgent' },\\n ],\\n value: 'high',\\n disabled: false,\\n touched: true,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Cannot select...',\\n options: [\\n { value: 'option1', label: 'Option 1' },\\n { value: 'option2', label: 'Option 2' },\\n { value: 'option3', label: 'Option 3' },\\n ],\\n value: 'option2',\\n disabled: true,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled Options -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Select a plan...',\\n options: [\\n { value: 'free', label: 'Free' },\\n { value: 'pro', label: 'Pro' },\\n { value: 'team', label: 'Team — requires an organization', disabled: true },\\n { value: 'enterprise', label: 'Enterprise — contact sales', disabled: true },\\n ],\\n value: null,\\n disabled: false,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Invalid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Please select an option...',\\n options: [\\n { value: 'yes', label: 'Yes' },\\n { value: 'no', label: 'No' },\\n { value: 'maybe', label: 'Maybe' },\\n ],\\n value: null,\\n disabled: false,\\n touched: true,\\n invalid: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Many Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Many Options -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Select state or province...',\\n options: [\\n { value: 'al', label: 'Alabama' },\\n { value: 'ak', label: 'Alaska' },\\n { value: 'az', label: 'Arizona' },\\n { value: 'ar', label: 'Arkansas' },\\n { value: 'ca', label: 'California' },\\n { value: 'co', label: 'Colorado' },\\n { value: 'ct', label: 'Connecticut' },\\n { value: 'de', label: 'Delaware' },\\n { value: 'fl', label: 'Florida' },\\n { value: 'ga', label: 'Georgia' },\\n { value: 'hi', label: 'Hawaii' },\\n { value: 'id', label: 'Idaho' },\\n { value: 'il', label: 'Illinois' },\\n { value: 'in', label: 'Indiana' },\\n { value: 'ia', label: 'Iowa' },\\n ],\\n value: 'ca',\\n disabled: false,\\n touched: true,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Short Options\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Short Options -->\\n<uni-select ${argsToTemplate(props)}>\\n</uni-select>\\n<!-- args:\\n{\\n placeholder: 'Pick a size...',\\n options: [\\n { value: 'xs', label: 'XS' },\\n { value: 's', label: 'S' },\\n { value: 'm', label: 'M' },\\n { value: 'l', label: 'L' },\\n { value: 'xl', label: 'XL' },\\n ],\\n value: 'm',\\n disabled: false,\\n touched: false,\\n invalid: false,\\n dirty: false,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Single choice from a list, on a native `<select>` — platform pickers on mobile,\\nplatform keyboard behavior everywhere. Options are typed generically\\n(`options: T[]` with `optionLabel`/`optionValue` accessors), and the component\\nimplements `FormValueControl` for the Signal Forms `[formField]` directive. Errors\\nstyle the field only after interaction, matching Input.\\nFor choosing several, use Multi Select. When the list outgrows ~10 options, or\\nusers know what they're looking for and want to type it, use Combobox — the\\nvalue contract is identical (`T | null`, `compareWith`), so the swap is a\\ntemplate-only change.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Native `<select>`: platform keyboard interaction and mobile pickers for free.\",\n \"`label` becomes the accessible name; `aria-invalid` reflects the touched error state.\",\n \"Disabled options are rendered and announced, not hidden — removing them would\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"skeleton\",\n \"name\": \"Skeleton\",\n \"status\": \"stable\",\n \"summary\": \"Loading placeholder painted with surface tokens.\",\n \"description\": \"Loading placeholder painted with surface tokens. `text` renders one or more lines (the last line shortened, as real text would be), `rect` and `circle` render fixed shapes. The shimmer only animates when the user allows motion; it degrades to static blocks under `prefers-reduced-motion`. Color and radius are theme options with per-instance overrides, because one app routinely needs several: skeletons on a card and on the page background want different tints, and a pill placeholder wants a different corner than the text bars beside it.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-skeleton\",\n \"api\": [\n {\n \"name\": \"shape\",\n \"kind\": \"input\",\n \"type\": \"SkeletonShape\",\n \"required\": false,\n \"default\": \"'text'\",\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"CSS width; defaults to 100% for text/rect and `height` for circles.\"\n },\n {\n \"name\": \"height\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"CSS height per block; defaults to 1em (text), 96px (rect), 40px (circle).\"\n },\n {\n \"name\": \"lines\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"1\",\n \"description\": \"Number of text lines (text shape only).\"\n },\n {\n \"name\": \"color\",\n \"kind\": \"input\",\n \"type\": \"ColorKey | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Base color token; overrides the theme option for this skeleton.\"\n },\n {\n \"name\": \"highlightColor\",\n \"kind\": \"input\",\n \"type\": \"ColorKey | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Shimmer highlight token; overrides the theme option for this skeleton.\"\n },\n {\n \"name\": \"borderRadius\",\n \"kind\": \"input\",\n \"type\": \"Radius | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Radius token; overrides the theme option. Circles are always round.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Announces the skeleton to assistive tech as a polite status. Leave unset when a container already carries `aria-busy` — the skeleton then stays `aria-hidden`, as a decorative placeholder should.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Text Lines\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Text Lines -->\\n<div box-layout maxWidth=\\\"360px\\\" gap=\\\"md\\\">\\n<uni-card>\\n <div box-layout padding=\\\"md\\\" gap=\\\"sm\\\">\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n <uni-skeleton shape=\\\"rect\\\" borderRadius=\\\"max\\\" [width]=\\\"56\\\" [height]=\\\"20\\\" />\\n <uni-skeleton shape=\\\"rect\\\" [width]=\\\"120\\\" [height]=\\\"12\\\" />\\n </div>\\n <uni-skeleton [lines]=\\\"2\\\" />\\n </div>\\n</uni-card>\\n<uni-skeleton color=\\\"surface\\\" highlightColor=\\\"surface-variant\\\" [lines]=\\\"2\\\" />\\n</div>\\n<!-- args:\\n{ shape: 'text', lines: 3 }\\n-->\"\n },\n {\n \"title\": \"Per Instance Tokens\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Per Instance Tokens -->\\n<div box-layout maxWidth=\\\"360px\\\" gap=\\\"md\\\">\\n<uni-card>\\n <div box-layout padding=\\\"md\\\" gap=\\\"sm\\\">\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n <uni-skeleton shape=\\\"rect\\\" borderRadius=\\\"max\\\" [width]=\\\"56\\\" [height]=\\\"20\\\" />\\n <uni-skeleton shape=\\\"rect\\\" [width]=\\\"120\\\" [height]=\\\"12\\\" />\\n </div>\\n <uni-skeleton [lines]=\\\"2\\\" />\\n </div>\\n</uni-card>\\n<uni-skeleton color=\\\"surface\\\" highlightColor=\\\"surface-variant\\\" [lines]=\\\"2\\\" />\\n</div>\"\n },\n {\n \"title\": \"Card Placeholder\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Card Placeholder -->\\n<div box-layout maxWidth=\\\"360px\\\">\\n<uni-card>\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" padding=\\\"md\\\">\\n <uni-skeleton shape=\\\"circle\\\" [height]=\\\"40\\\" />\\n <div box-layout [grow]=\\\"1\\\">\\n <uni-skeleton [lines]=\\\"2\\\" />\\n </div>\\n </div>\\n <div box-layout paddingHorizontal=\\\"md\\\" paddingBottom=\\\"md\\\">\\n <uni-skeleton shape=\\\"rect\\\" [height]=\\\"120\\\" />\\n </div>\\n</uni-card>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Loading placeholder that sketches the shape of incoming content: `text` renders one or\\nmore lines (ending on a short line, as real copy would), `rect` stands in for media and\\ncharts, `circle` for avatars. Skeletons paint with the theme's surface tokens so they\\nsit naturally on any brand in both modes, and the shimmer sweep only animates for users\\nwho allow motion — under `prefers-reduced-motion` it degrades to calm static blocks.\\nSkeletons are `aria-hidden` by default; announce loading on the container (e.g. `aria-busy`)\\nwhere your app knows what is actually loading, or give a standalone skeleton a `label`.\",\n \"dos\": [],\n \"donts\": [\n \"Announce every skeleton in a group — label the container, or one skeleton, not twelve\"\n ],\n \"accessibility\": [\n \"Skeletons are `aria-hidden` unless given a `label` — announce loading on the container (e.g. `aria-busy`) where your app knows what is loading.\",\n \"A `label` puts `role=\\\"status\\\"` on the host with visually hidden text, so a standalone skeleton announces politely on mount.\",\n \"The shimmer respects `prefers-reduced-motion`, degrading to static blocks.\"\n ]\n },\n \"relatedTokens\": [\n \"skeleton.behavior.color\",\n \"skeleton.behavior.highlightColor\",\n \"skeleton.behavior.borderRadius\",\n \"skeleton.behavior.animation\",\n \"skeleton.behavior.duration\",\n \"skeleton.behavior.direction\",\n \"skeleton.behavior.highlightWidth\",\n \"skeleton.behavior.gap\"\n ]\n },\n {\n \"id\": \"slider\",\n \"name\": \"Slider\",\n \"status\": \"stable\",\n \"summary\": \"Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters.\",\n \"description\": \"Bounded numeric input by pointer, for values where the *position* is the information: volume, opacity, weightings, price filters. Custom thumbs rather than `<input type=\\\"range\\\">`, which the previous version used: one native range input cannot carry two thumbs, marks or a tooltip, and a second component for the range case would mean two keyboard maps to keep in step. The step model and the keyboard map are the cdk's, shared with the numeric fields, so nothing new is learned moving between them. All arithmetic on values runs through the cdk's exact decimal helpers — stepping `0.1` never yields `0.30000000000000004`. Only pointer *positions* use floats, and they are snapped to the grid before becoming a value.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-slider, Slider\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"number | UniNumberRange | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"Shape follows `mode`: a number when `single`, a `UniNumberRange` when `range`.\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name, e.g. \\\"Opacity\\\". Names the group in range mode.\"\n },\n {\n \"name\": \"mode\",\n \"kind\": \"input\",\n \"type\": \"'single' | 'range'\",\n \"required\": false,\n \"default\": \"'single'\",\n \"description\": \"\"\n },\n {\n \"name\": \"min\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"100\",\n \"description\": \"\"\n },\n {\n \"name\": \"step\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"1\",\n \"description\": \"\"\n },\n {\n \"name\": \"largeStep\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"`PageUp`/`PageDown` and `Shift+Arrow`. Default: a tenth of the range.\"\n },\n {\n \"name\": \"origin\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Fill anchor. Defaults to `min`; set `0` for a slider that spans ±.\"\n },\n {\n \"name\": \"marks\",\n \"kind\": \"input\",\n \"type\": \"UniSliderMark[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"snapToMarks\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Marks become the only valid stops — t-shirt sizing, Likert scales.\"\n },\n {\n \"name\": \"valueDisplay\",\n \"kind\": \"input\",\n \"type\": \"'none' | 'inline' | 'tooltip' | 'input'\",\n \"required\": false,\n \"default\": \"'none'\",\n \"description\": \"Where the current value is shown. `tooltip` appears on hover, focus and drag; `inline` sits at the trailing edge of the track; `input` seats a compact `uni-number-input` there, two-way bound to the same value — drag for the ballpark, type for the exact figure, which is the pairing that makes bounded numeric input actually usable. `input` applies to `single` mode only; a range would need two fields, and `inline` already reads well for two ends.\"\n },\n {\n \"name\": \"minGap\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"Enforced distance between the two ends, in range mode.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"\"\n },\n {\n \"name\": \"sliding\",\n \"kind\": \"output\",\n \"type\": \"number | UniNumberRange\",\n \"required\": false,\n \"description\": \"Continuous, during a drag or a held key. Bind this for a live preview.\"\n },\n {\n \"name\": \"changed\",\n \"kind\": \"output\",\n \"type\": \"number | UniNumberRange\",\n \"required\": false,\n \"description\": \"Committed — on pointer release and key-up. **A form should bind this**: piping a 60 Hz stream into a model is how sliders get blamed for jank.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Volume', value: 40, valueDisplay: 'inline' }\\n-->\"\n },\n {\n \"title\": \"Stepped Range\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Stepped Range -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Opacity', min: 0, max: 1, step: 0.05, value: 0.6, valueDisplay: 'inline' }\\n-->\"\n },\n {\n \"title\": \"Two Thumbs\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Two Thumbs -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{\\n label: 'Price range',\\n mode: 'range',\\n min: 0,\\n max: 1000,\\n step: 10,\\n minGap: 50,\\n value: { start: 200, end: 700 },\\n valueDisplay: 'inline',\\n }\\n-->\"\n },\n {\n \"title\": \"Marks\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Marks -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{\\n label: 'Size',\\n min: 1,\\n max: 5,\\n value: 3,\\n snapToMarks: true,\\n marks: [\\n { value: 1, label: 'XS' },\\n { value: 2, label: 'S' },\\n { value: 3, label: 'M' },\\n { value: 4, label: 'L' },\\n { value: 5, label: 'XL' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Tooltip\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Tooltip -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Brightness', value: 64, valueDisplay: 'tooltip' }\\n-->\"\n },\n {\n \"title\": \"Spanning Zero\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Spanning Zero -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Balance', min: -100, max: 100, origin: 0, value: -40, valueDisplay: 'inline' }\\n-->\"\n },\n {\n \"title\": \"Variant\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variant -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Storage used', value: 88, variant: 'warn', valueDisplay: 'inline' }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-slider ${argsToTemplate(props)}></uni-slider>\\n<!-- args:\\n{ label: 'Brightness', value: 70, disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Reach for a slider when the *position* is the information — volume, opacity,\\nweightings, price filters — and for a number field when the exact figure is. A\\nslider is a poor way to enter 47, and a text field is a poor way to feel where\\n47 sits between 0 and 100. Bind `changed` in a form; `sliding` streams every\\nframe of a drag and is there for live previews.\\nOne thumb by default, two when `mode=\\\"range\\\"`, with a `{ start, end }` value\\nthat reuses the range vocabulary from `uni-calendar`. Stepping is exact decimal\\narithmetic from the cdk, shared with the numeric input family, so a `0.1` step\\nnever lands on `0.30000000000000004`. Fill and thumb colour come from the\\n`variant` role pair; the track, geometry, marks and tooltip resolve from the\\ntheme's `slider` options.\",\n \"dos\": [\n \"Use `changed` for form binding and `sliding` only for live previews.\",\n \"Pair a slider with a number field when users need both a ballpark and an exact value.\",\n \"Give `marks` labels when the underlying numbers are not meaningful to a reader.\"\n ],\n \"donts\": [\n \"Don't use a slider for a value that needs precision or a wide range — a number field is faster and more accurate.\",\n \"Don't put a slider in a scrolling list without testing touch: the track claims horizontal drags.\",\n \"Don't rely on the visible readout alone; the value is already in `aria-valuetext`, and duplicating it into the live region is noise.\"\n ],\n \"accessibility\": [\n \"Each thumb is a `role=\\\"slider\\\"` with `aria-valuenow`, `aria-valuemin`, `aria-valuemax`, and `aria-valuetext` in the display format — so a money slider says \\\"$500\\\", not \\\"500\\\".\",\n \"Arrow keys step by `step`; `Shift+Arrow` and `Page Up`/`Page Down` step by `largeStep`; `Home`/`End` jump to the fences.\",\n \"Up and Down always follow the number. Left and Right follow the *picture*, so they mirror in right-to-left layouts.\",\n \"In range mode the thumbs are wrapped in a `role=\\\"group\\\"` named by `label`, named \\\"minimum\\\" and \\\"maximum\\\", and each thumb's `aria-valuemin`/`aria-valuemax` report the other thumb's position — the wall where it actually is.\",\n \"The thumb's hit area is padded to at least 24×24 (WCAG 2.2 SC 2.5.8) even when the visual dot is 16px.\",\n \"`label` is required and becomes the accessible name.\",\n \"The live region announces only fences and swaps; ordinary movement is already narrated by `aria-valuetext`.\"\n ]\n },\n \"relatedTokens\": [\n \"slider.behavior.trackHeight\",\n \"slider.behavior.trackColor\",\n \"slider.behavior.borderRadius\",\n \"slider.behavior.thumbSize\",\n \"slider.behavior.thumbBorderRadius\",\n \"slider.behavior.minTouchTarget\",\n \"slider.behavior.markSize\",\n \"slider.behavior.markColor\",\n \"slider.behavior.labelTypeface\",\n \"slider.behavior.labelColor\",\n \"slider.behavior.tooltipColor\",\n \"slider.behavior.tooltipTextColor\",\n \"slider.behavior.tooltipShadow\",\n \"slider.behavior.tooltipBorderRadius\",\n \"slider.behavior.transitionMs\"\n ]\n },\n {\n \"id\": \"snackbar\",\n \"name\": \"Snackbar\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-snackbar\",\n \"api\": [\n {\n \"name\": \"show\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"Two-way bindable open state: [(show)].\"\n },\n {\n \"name\": \"iconName\",\n \"kind\": \"input\",\n \"type\": \"IconName\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"symbolName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"timeout\",\n \"kind\": \"input\",\n \"type\": \"number | string | 'disabled'\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"actionLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"useVariant\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"action\",\n \"kind\": \"output\",\n \"type\": \"unknown\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"showing\",\n \"kind\": \"output\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<button text-button (click)=\\\"snackbar.open()\\\">Show Snackbar</button>\\n<uni-snackbar #snackbar ${argsToTemplate(props)}>\\n ${ngContent}\\n</uni-snackbar>\\n<!-- args:\\n{\\n ngContent: 'The record has been removed.',\\n variant: 'warn',\\n actionLabel: 'undo',\\n timeout: '5000',\\n symbolName: 'delete_sweep',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Snackbar component is used to give feedback to users after an action has taken place.\\nIt appears near the bottom center of the screen temporarily and floats above the UI to not affect the application's layout.\\nA side action can be defined (e.g. undoing a process or navigating to the details of a newly created record).\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`role=\\\"status\\\"` announces the message politely, without moving focus away\",\n \"The bar renders in the browser's top layer, so it cannot be covered by a\",\n \"It is a `popover=\\\"manual\\\"`, not a modal: the rest of the page stays\"\n ]\n },\n \"relatedTokens\": [\n \"snackbar.behavior.bottomPosition\",\n \"snackbar.behavior.motion\",\n \"snackbar.behavior.autoCloseDelay\"\n ]\n },\n {\n \"id\": \"sort-header\",\n \"name\": \"SortHeader\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"data\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-sort-header\",\n \"api\": [\n {\n \"name\": \"column\",\n \"kind\": \"input\",\n \"type\": \"keyof T\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"datasource\",\n \"kind\": \"input\",\n \"type\": \"UniDatasource<T>\",\n \"required\": false,\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-sort-header [datasource]=\\\"datasource\\\" [column]=\\\"column\\\">\\n <span uni-text=\\\"title-small\\\">Name</span>\\n</uni-sort-header>\\n<div box-layout paddingTop=\\\"md\\\">\\n @for (record of datasource.records().slice(0, 5); track record.id) {\\n <div>{{ record.name }}</div>\\n }\\n</div>\\n<!-- args:\\n{\\n column: 'name',\\n datasource: new UniRecordDatasource<any>(starWarsCharacters),\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Sort Header wraps a column heading and cycles the bound datasource's sort state\\n(ascending → descending → unsorted) when clicked. An animated arrow indicates the current\\nsort direction. It is used by the [Data Table](?path=/docs/components-data-display-data-table--data-table)\\nfor sortable columns, but can wrap any header content bound to a `UniDatasource`.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"stack\",\n \"name\": \"Stack\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-stack-layout], [stack-layout]\",\n \"api\": [\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"default\": \"'flex'\",\n \"description\": \"\"\n },\n {\n \"name\": \"flexDirection\",\n \"kind\": \"input\",\n \"type\": \"OptionalFlexDirection\",\n \"required\": false,\n \"default\": \"'column'\",\n \"description\": \"\"\n },\n {\n \"name\": \"minHeight\",\n \"kind\": \"input\",\n \"type\": \"number | string | undefined\",\n \"required\": false,\n \"default\": \"'fit-content'\",\n \"description\": \"Defaults to `fit-content` (guards content collapse). Set `[minHeight]=\\\"0\\\"` when the stack must shrink inside a constrained flex parent (scroll containment).\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Stacked Cards\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Stacked Cards -->\\n<div stack-layout ${argsToTemplate(props)}>\\n <uni-card><uni-card-content><span uni-text>Card 1</span></uni-card-content></uni-card>\\n <uni-card><uni-card-content><span uni-text>Card 2</span></uni-card-content></uni-card>\\n <uni-card><uni-card-content><span uni-text>Card 3</span></uni-card-content></uni-card>\\n <uni-card><uni-card-content><span uni-text>Card 4</span></uni-card-content></uni-card>\\n <uni-card><uni-card-content><span uni-text>Card 5</span></uni-card-content></uni-card>\\n</div>\\n<!-- args:\\n{ gap: 'lg' }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"`Stack` is a layout component used to group elements in a vertical arrangement and applies a uniform space between them.\\n`Stack` is an extension to the `Box` component and has all the `Box` attributes available to it.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"stat\",\n \"name\": \"Stat\",\n \"status\": \"stable\",\n \"summary\": \"KPI stat tile: muted label, large value (numbers auto-compact: 48234 → \\\"48.2K\\\"), an optional delta whose ink is decided by *direction × whether up is good* (never direction alone — churn going down is good news), and an optional decorative sparkline.\",\n \"description\": \"KPI stat tile: muted label, large value (numbers auto-compact: 48234 → \\\"48.2K\\\"), an optional delta whose ink is decided by *direction × whether up is good* (never direction alone — churn going down is good news), and an optional decorative sparkline. Frame, typography and inks are all `stat` theme tokens.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-stat\",\n \"api\": [\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"What is being measured, sentence case.\"\n },\n {\n \"name\": \"value\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": true,\n \"description\": \"The headline number: strings render verbatim, numbers auto-compact.\"\n },\n {\n \"name\": \"delta\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Signed change, e.g. \\\"+12.4%\\\" or \\\"-0.4%\\\". The sign drives the arrow.\"\n },\n {\n \"name\": \"upIsGood\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"Whether an upward movement is good news. Flip for churn, errors, cost.\"\n },\n {\n \"name\": \"caption\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Names the comparison period, e.g. \\\"vs last month\\\".\"\n },\n {\n \"name\": \"trend\",\n \"kind\": \"input\",\n \"type\": \"number[] | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Recent values for the decorative sparkline (12 points reads best).\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-stat ${argsToTemplate(props)}></uni-stat>\\n<!-- args:\\n{\\n label: 'Monthly recurring revenue',\\n value: '$48.2K',\\n delta: '+12.4%',\\n caption: 'vs last month',\\n trend: [31, 34, 33, 38, 37, 41, 40, 44, 43, 46, 47, 48],\\n }\\n-->\"\n },\n {\n \"title\": \"Down is good (churn)\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Down is good (churn) -->\\n<uni-stat ${argsToTemplate(props)}></uni-stat>\\n<!-- args:\\n{\\n label: 'Churn rate',\\n value: '2.1%',\\n delta: '-0.4%',\\n upIsGood: false,\\n caption: 'vs last month',\\n trend: [3.2, 3.1, 3.0, 2.8, 2.9, 2.7, 2.6, 2.4, 2.5, 2.3, 2.2, 2.1],\\n }\\n-->\"\n },\n {\n \"title\": \"KPI row\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: KPI row -->\\n<div grid-layout templateColumns=\\\"repeat(auto-fit, minmax(210px, 1fr))\\\" gap=\\\"sm\\\">\\n<uni-stat label=\\\"Monthly recurring revenue\\\" [value]=\\\"48234\\\" delta=\\\"+12.4%\\\" caption=\\\"vs last month\\\" [trend]=\\\"[31,34,33,38,37,41,40,44,43,46,47,48]\\\" />\\n<uni-stat label=\\\"Active users\\\" [value]=\\\"12900\\\" delta=\\\"+3.1%\\\" caption=\\\"vs last week\\\" [trend]=\\\"[9,10,10,11,10,11,12,11,12,12,13,12.9]\\\" />\\n<uni-stat label=\\\"Churn rate\\\" value=\\\"2.1%\\\" delta=\\\"-0.4%\\\" [upIsGood]=\\\"false\\\" caption=\\\"vs last month\\\" />\\n<uni-stat label=\\\"Open tickets\\\" [value]=\\\"87\\\" delta=\\\"+16\\\" [upIsGood]=\\\"false\\\" caption=\\\"vs yesterday\\\" />\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The KPI tile a dashboard leads with: a muted label, a large headline value (numbers\\nauto-compact — `48234` renders \\\"48.2K\\\"), an optional signed delta, and an optional\\ndecorative sparkline.\\nThe delta's color is decided by **direction × whether up is good**, never direction\\nalone — set `upIsGood` to `false` for measures like churn, errors, or cost, and a\\nfalling number correctly reads as good news. The arrow is accompanied by\\nscreen-reader text (\\\"up\\\"/\\\"down\\\"), so state never relies on color alone, and `caption`\\nnames the comparison period.\\nFrame (surface, border primitive, radius), typography (the type scale's `stat` role\\nfor values), delta inks (the semantic `success`/`error`), and sparkline colors all\\nresolve from the theme's `stat` options.\",\n \"dos\": [],\n \"donts\": [\n \"Rely on delta color alone — the arrow + wording carry direction for everyone\"\n ],\n \"accessibility\": [\n \"The delta arrow is decorative; screen readers hear \\\"up\\\"/\\\"down\\\" in words instead.\",\n \"The sparkline is `aria-hidden` — the value and delta carry the information.\"\n ]\n },\n \"relatedTokens\": [\n \"stat.behavior.labelTypeface\",\n \"stat.behavior.valueTypeface\",\n \"stat.behavior.color\",\n \"stat.behavior.border\",\n \"stat.behavior.borderRadius\",\n \"stat.behavior.positiveColor\",\n \"stat.behavior.negativeColor\",\n \"stat.behavior.trendColor\",\n \"stat.behavior.trendAccent\",\n \"stat.behavior.padding\",\n \"stat.behavior.gap\"\n ]\n },\n {\n \"id\": \"symbol\",\n \"name\": \"Symbol\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-symbol\",\n \"api\": [\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"fill\",\n \"kind\": \"input\",\n \"type\": \"SymbolFill\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"weight\",\n \"kind\": \"input\",\n \"type\": \"SymbolWeight\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"grade\",\n \"kind\": \"input\",\n \"type\": \"SymbolGrade\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"opticalSize\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{\\n name: 'settings',\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The Symbol Component integrates the latest [Material Symbols](https://fonts.google.com/icons?icon.platform=web&icon.style=Rounded&icon.set=Material+Symbols&query=les).\\nMaterial Symbols consolidates over 3,275 glyphs (icons) in a single font file with a wide range of design variants.\\nSymbols are available in three styles and four adjustable variable font styles (fill, weight, grade, and optical size).\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"Symbols are decorative (`aria-hidden`) — the parent control carries the accessible name.\"\n ]\n },\n \"relatedTokens\": [\n \"symbol.behavior.fill\",\n \"symbol.behavior.weight\",\n \"symbol.behavior.grade\",\n \"symbol.behavior.opticalSize\"\n ]\n },\n {\n \"id\": \"tab\",\n \"name\": \"Tab\",\n \"status\": \"stable\",\n \"summary\": \"One tab inside `uni-tabs`: a label for the tablist plus projected panel content.\",\n \"description\": \"One tab inside `uni-tabs`: a label for the tablist plus projected panel content. Content is captured in a template and only instantiated while the tab is selected, so inactive panels cost nothing.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tab\",\n \"api\": [\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"tabs\",\n \"name\": \"Tabs\",\n \"status\": \"stable\",\n \"summary\": \"WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped.\",\n \"description\": \"WAI-ARIA tabs: roving tabindex, automatic activation (arrow keys move focus and select), Home/End, disabled tabs skipped. Only the selected panel is instantiated. All styling resolves from `tabs` theme option tokens.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tabs\",\n \"api\": [\n {\n \"name\": \"selectedIndex\",\n \"kind\": \"model\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"Index of the selected tab; two-way bindable.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-tabs [selectedIndex]=\\\"selectedIndex ?? 0\\\">\\n<uni-tab label=\\\"Overview\\\">\\n <span uni-text=\\\"body-1-long\\\">\\n Arrow keys move between tabs (disabled tabs are skipped), Home and End jump\\n to the extremes, and only the selected panel is rendered.\\n </span>\\n</uni-tab>\\n<uni-tab label=\\\"Activity\\\">\\n <span uni-text=\\\"body-1-long\\\">Recent activity would render here.</span>\\n</uni-tab>\\n<uni-tab label=\\\"Settings\\\">\\n <span uni-text=\\\"body-1-long\\\">Settings content, instantiated on selection.</span>\\n</uni-tab>\\n</uni-tabs>\"\n },\n {\n \"title\": \"With Disabled Tab\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Disabled Tab -->\\n<uni-tabs>\\n<uni-tab label=\\\"Open\\\"><span uni-text=\\\"body-1-long\\\">Open items.</span></uni-tab>\\n<uni-tab label=\\\"Archived\\\" [disabled]=\\\"true\\\">\\n <span uni-text=\\\"body-1-long\\\">Unreachable while disabled.</span>\\n</uni-tab>\\n<uni-tab label=\\\"All\\\"><span uni-text=\\\"body-1-long\\\">Everything.</span></uni-tab>\\n</uni-tabs>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Tabs organize peer views behind a single switcher. Each `uni-tab` supplies a label and\\nits panel content; only the selected panel is instantiated, so heavy tab content costs\\nnothing until visited.\\nThe default tokens render underline tabs; a theme that sets `borderRadius: 'max'` and\\nan `activeColor` gets segmented pills without any component changes.\",\n \"dos\": [\n \"Use for peer views of the same subject (details, activity, settings)\",\n \"Keep labels to one or two words\"\n ],\n \"donts\": [\n \"Nest tabs inside tabs\",\n \"Use tabs for sequential steps — that is a stepper\"\n ],\n \"accessibility\": [\n \"Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired\",\n \"Arrow keys move between tabs with selection following focus, wrapping at the ends;\",\n \"Roving tabindex: only the selected tab sits in the tab order; the panel itself is\"\n ]\n },\n \"relatedTokens\": [\n \"tabs.behavior.typeface\",\n \"tabs.behavior.textColor\",\n \"tabs.behavior.activeTextColor\",\n \"tabs.behavior.indicatorColor\",\n \"tabs.behavior.indicatorThickness\",\n \"tabs.behavior.divider\",\n \"tabs.behavior.gap\",\n \"tabs.behavior.borderRadius\",\n \"tabs.behavior.padding\"\n ]\n },\n {\n \"id\": \"tag\",\n \"name\": \"Tag\",\n \"status\": \"stable\",\n \"summary\": \"Compact chip for categories, states, filters and tokens.\",\n \"description\": \"Compact chip for categories, states, filters and tokens. Two orthogonal style axes: `variant` picks the colour role and `tone` picks the archetype (soft / solid / outline). Both live in the theme's `tag` entry, so a theme restyles every chip in the app without touching markup. Structurally a chip is **body + trailing action as siblings**, never nested buttons: an interactive chip whose body is a `<button>` cannot contain the remove `<button>` (invalid HTML, and the inner control becomes unreachable for keyboard users). Both stay independently operable.\",\n \"category\": \"data\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tag\",\n \"api\": [\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'md'\",\n \"description\": \"\"\n },\n {\n \"name\": \"tone\",\n \"kind\": \"input\",\n \"type\": \"TagTone\",\n \"required\": false,\n \"default\": \"'soft'\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"value\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"maxWidth\",\n \"kind\": \"input\",\n \"type\": \"string | number\",\n \"required\": false,\n \"description\": \"Truncation budget, e.g. `'14ch'`. A number is treated as px.\"\n },\n {\n \"name\": \"avatarSrc\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"avatarName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Initials fallback when `avatarSrc` is absent or fails to load.\"\n },\n {\n \"name\": \"iconName\",\n \"kind\": \"input\",\n \"type\": \"IconName\",\n \"required\": false,\n \"description\": \"Theme icon primitive — the preferred glyph path.\"\n },\n {\n \"name\": \"symbolName\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Material Symbols ligature, for glyphs the theme's icon set doesn't carry.\"\n },\n {\n \"name\": \"dot\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Status dot in the current colour.\"\n },\n {\n \"name\": \"removable\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"interactive\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"selected\",\n \"kind\": \"input\",\n \"type\": \"boolean | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Toggle state. Left undefined the chip carries no `aria-pressed` at all — an interactive chip is not always a toggle (inside a tag input it is focusable so it can be removed), and announcing \\\"not pressed\\\" on a recipient chip is worse than announcing nothing.\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"removeLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Accessible-name override for the remove button.\"\n },\n {\n \"name\": \"controlTabIndex\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"0\",\n \"description\": \"Tab position of the chip's controls. A composite that owns its own roving focus — `uni-tag-input`, where the whole field is one tab stop — passes `-1` so Tab does not walk through every chip to reach the next control.\"\n },\n {\n \"name\": \"removed\",\n \"kind\": \"output\",\n \"type\": \"UniTagValue\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"activated\",\n \"kind\": \"output\",\n \"type\": \"UniTagValue\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ removable: true }\\n-->\"\n },\n {\n \"title\": \"Variants And Tones\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variants And Tones -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ removable: true }\\n-->\"\n },\n {\n \"title\": \"Sizes\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Sizes -->\\n<div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n<uni-tag size=\\\"sm\\\" label=\\\"Small\\\" />\\n<uni-tag size=\\\"md\\\" label=\\\"Medium\\\" />\\n<uni-tag size=\\\"lg\\\" label=\\\"Large\\\" />\\n</div>\\n<!-- args:\\n{ removable: true }\\n-->\"\n },\n {\n \"title\": \"Removable\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Removable -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ removable: true }\\n-->\"\n },\n {\n \"title\": \"Interactive\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Interactive -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ interactive: true, removable: true, selected: false }\\n-->\"\n },\n {\n \"title\": \"Selected\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Selected -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ interactive: true, selected: true, tone: 'solid' }\\n-->\"\n },\n {\n \"title\": \"Lead Elements\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Lead Elements -->\\n<div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\">\\n<uni-tag label=\\\"Alice Chen\\\" avatarName=\\\"Alice Chen\\\" removable=\\\"true\\\" />\\n<uni-tag label=\\\"Starred\\\" iconName=\\\"star\\\" />\\n<uni-tag label=\\\"Live\\\" [dot]=\\\"true\\\" variant=\\\"success\\\" />\\n<uni-tag label=\\\"Custom lead\\\">\\n <span tag-lead aria-hidden=\\\"true\\\">🎨</span>\\n</uni-tag>\\n</div>\\n<!-- args:\\n{ label: 'nope@@x', invalid: true, removable: true, variant: 'warn' }\\n-->\"\n },\n {\n \"title\": \"Invalid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ label: 'nope@@x', invalid: true, removable: true, variant: 'warn' }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{ label: 'Locked', disabled: true, removable: true }\\n-->\"\n },\n {\n \"title\": \"Truncated\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Truncated -->\\n<div box-layout gap=\\\"sm\\\">\\n@for (tone of ['soft', 'solid', 'outline']; track tone) {\\n <div row-layout gap=\\\"sm\\\" alignItems=\\\"center\\\" style=\\\"margin-bottom:8px\\\">\\n @for (variant of ['primary', 'secondary', 'tertiary', 'warn', 'success', 'ghost']; track variant) {\\n <uni-tag [variant]=\\\"variant\\\" [tone]=\\\"tone\\\" [label]=\\\"variant\\\" />\\n }\\n </div>\\n}\\n</div>\\n<!-- args:\\n{\\n label: 'A very long tag label that has to be truncated somewhere',\\n maxWidth: '18ch',\\n removable: true,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Compact chip for categories, states, filters and tokens. Two orthogonal style\\naxes: **`variant`** picks the colour role and **`tone`** picks the archetype\\n(`soft`, `solid`, `outline`). Both resolve from the theme's `tag` entry, so a\\ntheme restyles every chip in the app without touching markup.\",\n \"dos\": [\n \"Use `variant` for meaning (a `warn` chip for a problem) and `tone` for emphasis.\",\n \"Give `removable` chips a `value` so the handler knows which one to drop.\",\n \"Set `maxWidth` when user-supplied text could be arbitrarily long.\"\n ],\n \"donts\": [\n \"Don't make a whole chip clickable *and* nest the remove control inside it —\",\n \"Don't rely on chip colour alone to convey state.\",\n \"Don't put a remove control on a chip that is purely a label.\"\n ],\n \"accessibility\": [\n \"A static tag is **text, not a widget**: no role, no tab stop. Screen readers\",\n \"`removable` adds one real `<button>` named `Remove {label}`, overridable with\",\n \"`interactive` makes the body a `<button type=\\\"button\\\">`; `selected` maps to\",\n \"Icons, avatars, initials and dots are `aria-hidden` — the chip's text is its\",\n \"`invalid` sets `aria-invalid` and adds a non-colour cue.\"\n ]\n },\n \"relatedTokens\": [\n \"tag.behavior.borderRadius\",\n \"tag.behavior.typeface\",\n \"tag.behavior.gap\",\n \"tag.behavior.removeIcon\",\n \"tag.behavior.selectedIcon\"\n ]\n },\n {\n \"id\": \"tag-input\",\n \"name\": \"TagInput\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tag-input\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniTagItem[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name for the field, e.g. \\\"To\\\".\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"preset\",\n \"kind\": \"input\",\n \"type\": \"'text' | 'email'\",\n \"required\": false,\n \"default\": \"'text'\",\n \"description\": \"`email` wires an address validator, paste parser and space separator.\"\n },\n {\n \"name\": \"separators\",\n \"kind\": \"input\",\n \"type\": \"string[]\",\n \"required\": false,\n \"default\": \"[',', ';']\",\n \"description\": \"\"\n },\n {\n \"name\": \"commitOnBlur\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"allowDuplicates\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"max\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"tagVariant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"\"\n },\n {\n \"name\": \"tagTone\",\n \"kind\": \"input\",\n \"type\": \"TagTone\",\n \"required\": false,\n \"default\": \"'soft'\",\n \"description\": \"\"\n },\n {\n \"name\": \"tagSize\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"suggestions\",\n \"kind\": \"input\",\n \"type\": \"UniTagSuggestion[]\",\n \"required\": false,\n \"default\": \"[]\",\n \"description\": \"\"\n },\n {\n \"name\": \"query\",\n \"kind\": \"output\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Debounced text the app should filter `suggestions` from.\"\n },\n {\n \"name\": \"debounceTime\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"250\",\n \"description\": \"\"\n },\n {\n \"name\": \"added\",\n \"kind\": \"output\",\n \"type\": \"UniTagItem\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"removed\",\n \"kind\": \"output\",\n \"type\": \"UniTagItem\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniTagRejection\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ value: [{ value: 'alice@uni.dev', label: 'Alice Chen' }] }\\n-->\"\n },\n {\n \"title\": \"Email Recipients\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Email Recipients -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ value: [{ value: 'alice@uni.dev', label: 'Alice Chen' }] }\\n-->\"\n },\n {\n \"title\": \"Invalid Entry\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid Entry -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{\\n preset: 'email',\\n value: [\\n { value: 'alice@uni.dev', label: 'Alice Chen' },\\n { value: 'nope@@x', invalid: true },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"Locked Entry\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Locked Entry -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{\\n value: [\\n { value: 'owner@uni.dev', label: 'Thread owner', disabled: true },\\n { value: 'bob@uni.dev', label: 'Bob Ferrari' },\\n ],\\n }\\n-->\"\n },\n {\n \"title\": \"With Maximum\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Maximum -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ max: 3, value: [{ value: 'alpha' }, { value: 'beta' }] }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-tag-input\\nlabel=\\\"To\\\"\\npreset=\\\"email\\\"\\nplaceholder=\\\"Name or address…\\\"\\n[value]=\\\"value\\\"\\n[suggestions]=\\\"suggestions\\\"\\n(query)=\\\"onQuery($event)\\\"\\n/>\\n<!-- args:\\n{ disabled: true, value: [{ value: 'alpha' }, { value: 'beta' }] }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Type-to-add chip field: recipients, filters, labels. It is the **open-set**\\ncontrol — anything the user types can become a token, whether or not it matches\\na suggestion. For picking from a fixed list, use `uni-select` or\\n`uni-multi-select-dropdown` instead.\",\n \"dos\": [],\n \"donts\": [\n \"Don't use it to pick from a closed list — that is `uni-multi-select-dropdown`.\",\n \"Don't filter `suggestions` inside the component; drive them from `(query)`.\",\n \"Don't set `preset=\\\"email\\\"` for people's names: Space would split them.\"\n ],\n \"accessibility\": [\n \"The text input is `role=\\\"combobox\\\"` with `aria-expanded`, `aria-controls` and\",\n \"Every add, remove and rejection announces through a `role=\\\"status\\\"` live\",\n \"The removal route is described **once** for the field through\",\n \"`aria-invalid` is gated on `invalid && (touched || dirty)`, per the library's\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"text\",\n \"name\": \"Text\",\n \"status\": \"stable\",\n \"summary\": \"The typography primitive, applied as an attribute to any element so semantics stay yours.\",\n \"description\": \"The typography primitive, applied as an attribute to any element so semantics stay yours. The attribute value is the typeface: `<h1 uni-text=\\\"display-small\\\">`, `<span uni-text=\\\"caption\\\">`, dynamic via `[uni-text]=\\\"role()\\\"`. With no value, the typeface is inferred from the host element (h1 → headline-large, p → body-1-long, …), falling back to `title-small`; the `typeface` input remains as an explicit override. It is a directive, so it stacks with anything else on the element — a layout attribute (`<div stack-layout uni-text=\\\"title-small\\\">`) or a component's own host — rather than colliding with it.\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-text]\",\n \"api\": [\n {\n \"name\": \"uniText\",\n \"kind\": \"input\",\n \"type\": \"Typeface | ''\",\n \"required\": false,\n \"default\": \"'', { alias: 'uni-text' }\",\n \"description\": \"Typeface via the selector attribute: `uni-text=\\\"headline-large\\\"`.\"\n },\n {\n \"name\": \"typeface\",\n \"kind\": \"input\",\n \"type\": \"Typeface | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Explicit typeface; the attribute value wins when both are set.\"\n },\n {\n \"name\": \"color\",\n \"kind\": \"input\",\n \"type\": \"ColorKey\",\n \"required\": false,\n \"description\": \"The ink, mapping straight to the CSS `color` property.\"\n },\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"align\",\n \"kind\": \"input\",\n \"type\": \"OptionalTextAlign\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"nowrap\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"maxWidth\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"ellipsis\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Value shorthand\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Value shorthand -->\\n<div stack-layout gap=\\\"sm\\\">\\n<span uni-text=\\\"display-small\\\" display=\\\"block\\\">Display small</span>\\n<span uni-text=\\\"headline-medium\\\" display=\\\"block\\\">Headline medium</span>\\n<span uni-text=\\\"body-1-long\\\" display=\\\"block\\\">\\n Body copy set with uni-text=\\\"body-1-long\\\" — the attribute value is the typeface.\\n</span>\\n<span uni-text=\\\"caption\\\" color=\\\"on-background-variant\\\" display=\\\"block\\\">\\n A caption in the muted ink.\\n</span>\\n</div>\"\n },\n {\n \"title\": \"Element-aware defaults\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Element-aware defaults -->\\n<article box-layout maxWidth=\\\"640px\\\">\\n<h1 uni-text>An h1 is headline-large, free</h1>\\n<h2 uni-text>An h2 is headline-medium</h2>\\n<p uni-text>\\n A paragraph gets body-1-long with no configuration — semantic HTML and the\\n type scale reinforce each other. Explicit values always win:\\n</p>\\n<h2 uni-text=\\\"display-small\\\">An h2 promoted to display-small</h2>\\n<blockquote uni-text>Blockquotes read as quotes.</blockquote>\\n<small uni-text>And small print is caption.</small>\\n</article>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"The typography primitive, applied as an **attribute on any element** so your HTML\\nsemantics stay intact. The attribute value is the typeface —\\n`<h1 uni-text=\\\"display-small\\\">` — and `[uni-text]=\\\"role()\\\"` binds it dynamically.\\nWith no value, the typeface is inferred from the host element (`h1` →\\n`headline-large`, `p` → `body-1-long`, `small` → `caption`, `blockquote` → `quote`,\\nfalling back to `title-small`), so plain semantic markup is correctly set with zero\\nconfiguration. `color` takes any theme color token; `align`, `nowrap`, `maxWidth`,\\nand `ellipsis` handle common text layout.\\nIt is a directive, so it stacks with anything else on the element — a layout\\nattribute or a component's own host — rather than colliding with it:\\n```html\\n```\\nText owns `color`, because it maps straight to the CSS property. The layout\\ndirectives name their container pair `containerColor`, so the two never compete\\nfor one binding — set both on the same element and each reaches its own\\ndirective:\\n```html\\n Heading\\n```\\n`containerColor` sets a background **and** its paired on-color, so both\\ndirectives write `color` to the element. An explicit `uni-text` `color` always\\nwins that — it is emitted at higher specificity rather than left to stylesheet\\norder. Set no `color` and the container's on-color shows through, which is the\\npoint of a pair.\",\n \"dos\": [\n \"Reach for semantic elements first and let the element-aware defaults set the type\"\n ],\n \"donts\": [\n \"Use `span uni-text=\\\"headline-large\\\"` where a real heading belongs\"\n ],\n \"accessibility\": [\n \"Text never replaces your elements — headings stay `h1`–`h6`, paragraphs stay `p`,\",\n \"Type is styling only: pick the element for meaning, the typeface for appearance\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"textarea\",\n \"name\": \"Textarea\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-textarea\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"rows\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"Visible text rows. Defaults to the theme's `textarea` options.\"\n },\n {\n \"name\": \"readonly\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"name\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"''\",\n \"description\": \"\"\n },\n {\n \"name\": \"minLength\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"maxLength\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"autocomplete\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"spellcheck\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"width\",\n \"kind\": \"input\",\n \"type\": \"string | number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n },\n {\n \"name\": \"fullWidth\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"grow\",\n \"kind\": \"input\",\n \"type\": \"number | undefined\",\n \"required\": false,\n \"default\": \"undefined\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<uni-textarea ${argsToTemplate(props)}>\\n</uni-textarea>\\n<!-- args:\\n{ label: 'Message', placeholder: 'Tell us everything…' }\\n-->\"\n },\n {\n \"title\": \"Prefilled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Prefilled -->\\n<uni-textarea ${argsToTemplate(props)}>\\n</uni-textarea>\\n<!-- args:\\n{\\n label: 'Bio',\\n value: 'Design systems engineer.\\\\nOKLCH enthusiast.',\\n rows: 5,\\n }\\n-->\"\n },\n {\n \"title\": \"Invalid\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Invalid -->\\n<uni-textarea ${argsToTemplate(props)}>\\n</uni-textarea>\\n<!-- args:\\n{\\n label: 'Feedback',\\n placeholder: 'Required',\\n invalid: true,\\n touched: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<uni-textarea ${argsToTemplate(props)}>\\n</uni-textarea>\\n<!-- args:\\n{ label: 'Notes', value: 'Read-only content', disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Multi-line text field with the same Signal Forms contract as Input — use it anywhere\\nfree-form text runs past one line (comments, descriptions, feedback). It shares Input's\\nthemed chrome (color, border, error state, focus outline, typeface) and adds\\ntextarea-specific behavior from the theme's `textarea` options: default `rows` and the\\nCSS `resize` mode. Bind it to a form with the `[formField]` directive, or drive `[(value)]`\\ndirectly.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`label` is required and becomes the accessible name (`aria-label`).\",\n \"Error state is exposed as `aria-invalid` once the field was touched or is dirty; wire your error text with `ariaDescribedBy`.\"\n ]\n },\n \"relatedTokens\": [\n \"textarea.behavior.rows\",\n \"textarea.behavior.resize\"\n ]\n },\n {\n \"id\": \"theme-builder\",\n \"name\": \"ThemeBuilder\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"primitives\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-theme-builder\",\n \"api\": []\n }\n },\n \"examples\": [\n {\n \"title\": \"Builder\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Builder -->\\n<uni-theme-builder />\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"theme-switch\",\n \"name\": \"ThemeSwitch\",\n \"status\": \"stable\",\n \"summary\": \"Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).\",\n \"description\": \"Drop-in switcher for the themes registered via `UNI_THEMES`: a select over `ThemeService.themeOptions` that applies the choice through `selectTheme` (so it persists across reloads like any other theme selection).\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-theme-switch\",\n \"api\": [\n {\n \"name\": \"ariaLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Theme'\",\n \"description\": \"Accessible name for the underlying select.\"\n },\n {\n \"name\": \"themeChanged\",\n \"kind\": \"output\",\n \"type\": \"ThemeName\",\n \"required\": false,\n \"description\": \"Emits the selected theme key after it has been applied.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div stack-layout gap=\\\"md\\\" [width]=\\\"420\\\">\\n<uni-theme-switch></uni-theme-switch>\\n<uni-card>\\n <uni-card-header>Live preview</uni-card-header>\\n <uni-card-content>\\n <div stack-layout gap=\\\"md\\\">\\n <span uni-text typeface=\\\"body-2-long\\\">\\n Pick a theme above — every registered theme (UNI_THEMES) restyles\\n this card and these buttons instantly.\\n </span>\\n <div row-layout gap=\\\"sm\\\">\\n <button text-button variant=\\\"primary\\\">Primary</button>\\n <button text-button variant=\\\"secondary\\\">Secondary</button>\\n <button text-button variant=\\\"warn\\\">Danger</button>\\n </div>\\n </div>\\n </uni-card-content>\\n</uni-card>\\n</div>\\n<!-- args:\\n{}\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Drop-in switcher for every theme registered via `UNI_THEMES`. Renders a `uni-select` over\\n`ThemeService.themeOptions` and applies the choice through `ThemeService.selectTheme`, so the\\nselection persists across reloads exactly like any other theme change. Use it wherever an app\\noffers a theme choice — a settings page, an app-bar action, or a light/dark toggle backed by two\\nregistered themes. Because it reads the registry from the injected `UNI_THEMES` token, adding a\\nnew theme to the registry is all it takes for the switcher to offer it.\",\n \"dos\": [\n \"Register every selectable theme in `UNI_THEMES` (bootstrap) or via `registerTheme` (runtime); the switcher derives its options from the registry.\",\n \"Give the control a meaningful `ariaLabel` when \\\"Theme\\\" is ambiguous in context (e.g. \\\"Editor color theme\\\").\",\n \"Use `themeChanged` for side effects like analytics or syncing a user preference to a backend.\"\n ],\n \"donts\": [\n \"Don't try to write `ThemeService.theme` directly — it's a readonly signal. Go through `selectTheme`/`registerTheme` (persisted, listed) or `setTheme` (validated, unlisted) instead.\",\n \"Don't hardcode theme ids in app logic; read `ThemeService.selectedThemeKey()` instead.\",\n \"Don't use it for the palette-generation workflow — that's the Theme Builder; the switcher only picks among registered themes.\"\n ],\n \"accessibility\": [\n \"Built on a native `<select>` (via `uni-select`), so keyboard and screen-reader interaction come from the platform.\",\n \"Exposes `ariaLabel` (default \\\"Theme\\\") as the accessible name for the control.\",\n \"Theme changes restyle in place without moving focus or reloading, so context is preserved for assistive tech.\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"time-input\",\n \"name\": \"TimeInput\",\n \"status\": \"stable\",\n \"summary\": \"Time field: a combobox over time options — the same listbox contract as uni-search-input and uni-tag-input.\",\n \"description\": \"Time field: a combobox over time options — the same listbox contract as uni-search-input and uni-tag-input. Type `3p`, `930` or `15:00`, or pick `3:00 PM` from the list; the form always gets 24-hour `'HH:mm'` (`hour12` affects display only). The list is assistive, not exhaustive: any parseable time commits, unless `slots` pins the choices (a slot picker) — then a typed time must match one. Unreadable or unavailable text stays in the field, flagged, with a `rejected` event.\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-time-input, TimeInput\",\n \"api\": [\n {\n \"name\": \"value\",\n \"kind\": \"model\",\n \"type\": \"UniTime | undefined\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"Accessible name for the field, e.g. \\\"Start time\\\".\"\n },\n {\n \"name\": \"placeholder\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"minuteStep\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"30\",\n \"description\": \"Generated list granularity, in minutes.\"\n },\n {\n \"name\": \"minTime\",\n \"kind\": \"input\",\n \"type\": \"UniTime\",\n \"required\": false,\n \"description\": \"Earliest allowed time (inclusive), `'09:00'`.\"\n },\n {\n \"name\": \"maxTime\",\n \"kind\": \"input\",\n \"type\": \"UniTime\",\n \"required\": false,\n \"description\": \"Latest allowed time (inclusive), `'17:00'`.\"\n },\n {\n \"name\": \"slots\",\n \"kind\": \"input\",\n \"type\": \"UniTime[]\",\n \"required\": false,\n \"description\": \"Exact allowed times (scheduling). When set, typed entry must match one.\"\n },\n {\n \"name\": \"hour12\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"12-hour display; defaults from the locale. The value stays 24-hour.\"\n },\n {\n \"name\": \"locale\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"BCP 47 tag for the display format; defaults to the document language.\"\n },\n {\n \"name\": \"commitOnBlur\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"true\",\n \"description\": \"\"\n },\n {\n \"name\": \"embedded\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Renders without its own input-box chrome, for composers like uni-date-time-input.\"\n },\n {\n \"name\": \"rejected\",\n \"kind\": \"output\",\n \"type\": \"UniTimeInputRejection\",\n \"required\": false,\n \"description\": \"A typed commit was refused; the raw text stays in the field.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<!-- args:\\n{ minTime: '09:00', maxTime: '17:00', minuteStep: 30, value: '09:30' }\\n-->\"\n },\n {\n \"title\": \"Slots\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Slots -->\\n<!-- args:\\n{ label: 'Slot time', slots: ['09:00', '09:30', '11:00', '14:30'] }\\n-->\"\n },\n {\n \"title\": \"Twenty Four Hour\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Twenty Four Hour -->\\n<!-- args:\\n{ hour12: false, minTime: '08:00', maxTime: '18:00', value: '15:00' }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<!-- args:\\n{ value: '09:30', disabled: true }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A time field: a combobox over time options, sharing the exact listbox\\ncontract of `uni-search-input` and `uni-tag-input`. Type `3p`, `930` or\\n`15:00`, or pick `3:00 PM` from the list — the form always gets 24-hour\\n`'HH:mm'` (`hour12` affects display only). The list is **assistive, not\\nexhaustive**: any parseable time commits even if it isn't listed, unless\\n`slots` pins the choices.\\nTyped shorthand does what an appointment field should: `9` → 09:00,\\n`930` → 09:30, `3p` → 15:00, and a bare `3` leans PM in a 12-hour field —\\ntyping 3 into an appointment field means 15:00, not 03:00 (the bias yields\\nif `minTime`/`maxTime` say otherwise). Unreadable or unavailable text stays\\nin the field, flagged, with a `(rejected)` event.\",\n \"dos\": [\n \"Pin `slots` for scheduling; leave them off for free time entry fenced by\",\n \"Keep values 24-hour everywhere in app state; let `hour12` handle display.\"\n ],\n \"donts\": [\n \"Don't use `<input type=\\\"time\\\">` alongside it — the platform control brings\",\n \"Don't filter the option list as the user types; the list is a picker, not\"\n ],\n \"accessibility\": [\n \"The input is `role=\\\"combobox\\\"` with `aria-expanded`, `aria-controls` and\",\n \"Options are named in the display format (*\\\"3:00 PM\\\"*); the committed one\",\n \"Commits and rejections announce through `role=\\\"status\\\"`.\",\n \"Typing never selects an option — Enter commits the draft, not whatever\",\n \"`aria-invalid` is gated on `invalid && (touched || dirty)`; a refused\"\n ]\n },\n \"relatedTokens\": []\n },\n {\n \"id\": \"toggle\",\n \"name\": \"Toggle\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"forms\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-toggle\",\n \"api\": [\n {\n \"name\": \"checked\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"disabled\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"touched\",\n \"kind\": \"model\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"invalid\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"dirty\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"required\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"Synced from required() validators by the Signal Forms [formField] directive.\"\n },\n {\n \"name\": \"ariaDescribedBy\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"Id(s) of external element(s) describing this control — typically your app-rendered error message — exposed as aria-describedby.\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"checkedColor\",\n \"kind\": \"input\",\n \"type\": \"ColorKey\",\n \"required\": false,\n \"description\": \"Checked-state track color token, overriding the theme's `toggle.behavior.checkedColor`. This exists alongside the theme option because `variant` — where this color used to live exclusively — defaults to `'primary'`, so the component cannot tell \\\"set to primary\\\" from \\\"not set\\\". Without an input, a theme-level `checkedColor` would silently make per-instance `variant` inert.\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Default\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Default -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Enable feature\\\" [formField]=\\\"settings.enabled\\\" />\\n<div box-layout>\\n<p>Model: {{ model().enabled }}</p>\\n<p>Touched: {{ settings.enabled().touched() }}</p>\\n<p>Valid: {{ settings.enabled().valid() }}</p>\\n</div>\\n </div>\\n<!-- args:\\n{\\n label: 'Enable notifications',\\n variant: 'primary',\\n disabled: false,\\n checked: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Without Label\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Without Label -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Enable feature\\\" [formField]=\\\"settings.enabled\\\" />\\n<div box-layout>\\n<p>Model: {{ model().enabled }}</p>\\n<p>Touched: {{ settings.enabled().touched() }}</p>\\n<p>Valid: {{ settings.enabled().valid() }}</p>\\n</div>\\n </div>\\n<!-- args:\\n{\\n label: '',\\n variant: 'primary',\\n disabled: false,\\n }\\n-->\"\n },\n {\n \"title\": \"Disabled\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Disabled -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Enable feature\\\" [formField]=\\\"settings.enabled\\\" />\\n<div box-layout>\\n<p>Model: {{ model().enabled }}</p>\\n<p>Touched: {{ settings.enabled().touched() }}</p>\\n<p>Valid: {{ settings.enabled().valid() }}</p>\\n</div>\\n </div>\\n<!-- args:\\n{\\n label: 'Disabled toggle',\\n variant: 'primary',\\n disabled: true,\\n }\\n-->\"\n },\n {\n \"title\": \"Variants\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Variants -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Primary\\\" variant=\\\"primary\\\"></uni-toggle>\\n<uni-toggle label=\\\"Secondary\\\" variant=\\\"secondary\\\"></uni-toggle>\\n<uni-toggle label=\\\"Success\\\" variant=\\\"success\\\"></uni-toggle>\\n<uni-toggle label=\\\"Warning\\\" variant=\\\"warn\\\"></uni-toggle>\\n<uni-toggle label=\\\"Tertiary\\\" variant=\\\"tertiary\\\"></uni-toggle>\\n</div>\"\n },\n {\n \"title\": \"Sizes\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Sizes -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Small — 28x16\\\" size=\\\"sm\\\" [checked]=\\\"true\\\"></uni-toggle>\\n<uni-toggle label=\\\"Medium — 32x18\\\" size=\\\"md\\\" [checked]=\\\"true\\\"></uni-toggle>\\n<uni-toggle label=\\\"Large — 40x20 (default)\\\" size=\\\"lg\\\" [checked]=\\\"true\\\"></uni-toggle>\\n</div>\"\n },\n {\n \"title\": \"Checked Color\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Checked Color -->\\n<div stack-layout gap=\\\"md\\\">\\n<uni-toggle label=\\\"Variant primary (default)\\\" [checked]=\\\"true\\\"></uni-toggle>\\n<uni-toggle label=\\\"checkedColor success\\\" checkedColor=\\\"success\\\" [checked]=\\\"true\\\"></uni-toggle>\\n<uni-toggle label=\\\"checkedColor tertiary\\\" checkedColor=\\\"tertiary\\\" [checked]=\\\"true\\\"></uni-toggle>\\n</div>\"\n },\n {\n \"title\": \"With Change Event\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: With Change Event -->\\n<div>\\n<uni-toggle\\n label=\\\"Toggle me\\\"\\n [checked]=\\\"isChecked\\\"\\n (checkedChange)=\\\"onToggleChange($event)\\\"\\n variant=\\\"primary\\\">\\n</uni-toggle>\\n<div box-layout paddingTop=\\\"md\\\">\\n Current state: {{ isChecked ? 'On' : 'Off' }}\\n</div>\\n<div box-layout paddingTop=\\\"sm\\\">\\n Last change: {{ lastChangeValue }}\\n</div>\\n</div>\"\n },\n {\n \"title\": \"Form Signals\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Form Signals -->\\n<toggle-form-demo />\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A switch-style control for turning an option on or off with immediate effect —\\nprefer it over a checkbox when the change applies instantly (settings, feature\\nswitches) rather than as part of a submitted form. It implements\\n`FormCheckboxControl`, so it binds with the Signal Forms `[formField]` directive or a\\ndirect `[(checked)]` model.\\nTrack and knob colors resolve from the `toggle` theme options; geometry comes\\nfrom its `sizes` block, and the checked state wears `checkedColor` — falling back\\nto the active `variant`.\",\n \"dos\": [\n \"Use for instant on/off effects (settings, feature switches)\"\n ],\n \"donts\": [\n \"Use in submitted forms where nothing happens until save — that is a checkbox\"\n ],\n \"accessibility\": [\n \"Semantic `<input type=\\\"checkbox\\\">` with `role=\\\"switch\\\"`, properly associated with its label.\",\n \"Space toggles; focus indicators are provided for keyboard navigation.\",\n \"Screen readers announce the label and on/off state.\"\n ]\n },\n \"relatedTokens\": [\n \"toggle.behavior.trackColor\",\n \"toggle.behavior.knobColor\",\n \"toggle.behavior.motion\"\n ]\n },\n {\n \"id\": \"tooltip\",\n \"name\": \"Tooltip\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"feedback\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tooltip\",\n \"api\": [\n {\n \"name\": \"hoverDelay\",\n \"kind\": \"input\",\n \"type\": \"number\",\n \"required\": false,\n \"default\": \"500\",\n \"description\": \"\"\n },\n {\n \"name\": \"label\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"placement\",\n \"kind\": \"input\",\n \"type\": \"Placement\",\n \"required\": false,\n \"default\": \"'top'\",\n \"description\": \"\"\n },\n {\n \"name\": \"inlineText\",\n \"kind\": \"input\",\n \"type\": \"boolean\",\n \"required\": false,\n \"default\": \"false\",\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<span uni-text>Here is some text with a <uni-tooltip ${argsToTemplate(props)}>tooltip</uni-tooltip> in the middle.\\n</span>\\n<!-- args:\\n{\\n label: 'Bottom-start tooltip',\\n placement: 'bottom-start',\\n inlineText: true,\\n }\\n-->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"A tooltip is a brief, informative message that appears when a user interacts with an element.\\nIf using a tooltip within a body of text, set the `inlineText` option to `true`.\\nWrapping an interactive control (a button, a link) is supported: activating\\nthe control hides the bubble and keeps it hidden until the pointer leaves and\\nreturns, so a label that changes with the control's state (\\\"Expand\\\" →\\n\\\"Collapse\\\") never blinks back mid-interaction. Tapping a non-interactive\\ntooltip (inline text) still toggles the bubble.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": [\n \"`role=\\\"tooltip\\\"` linked to the trigger via `aria-describedby` (wired once — the bubble is always in the DOM).\",\n \"Shows on keyboard focus, hides on blur and Escape; stays open while hovered (WCAG 1.4.13).\",\n \"Non-focusable triggers get `tabindex=\\\"0\\\"` so keyboard users can reach the tooltip.\"\n ]\n },\n \"relatedTokens\": [\n \"tooltip.behavior.borderRadius\",\n \"tooltip.behavior.shadow\",\n \"tooltip.behavior.color\",\n \"tooltip.behavior.typeface\"\n ]\n },\n {\n \"id\": \"tour\",\n \"name\": \"Tour\",\n \"status\": \"stable\",\n \"summary\": \"A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise — announced through one `role=\\\"status\\\"` region).\",\n \"description\": \"A thin sequencer over one `uni-callout`: steps spotlight their targets, a footer walks Next/Back with dots-or-fraction progress, and `advanceOn` gates a step behind an interaction with its target (auto-advancing for clicks, unlocking Next otherwise — announced through one `role=\\\"status\\\"` region). Escape or the close button skips the tour and reports the step. `active` is a two-way model, so a tour is deep-linkable and inspectable; steps whose declared target cannot be resolved are skipped (with a dev warning) in the direction of travel rather than erroring.\",\n \"category\": \"components\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"uni-tour\",\n \"api\": [\n {\n \"name\": \"steps\",\n \"kind\": \"input\",\n \"type\": \"UniTourStep[]\",\n \"required\": true,\n \"description\": \"\"\n },\n {\n \"name\": \"active\",\n \"kind\": \"model\",\n \"type\": \"number | null\",\n \"required\": false,\n \"default\": \"null\",\n \"description\": \"The presented step index, or null when the tour is not running.\"\n },\n {\n \"name\": \"nextLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Next'\",\n \"description\": \"\"\n },\n {\n \"name\": \"backLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Back'\",\n \"description\": \"\"\n },\n {\n \"name\": \"skipLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Skip'\",\n \"description\": \"\"\n },\n {\n \"name\": \"doneLabel\",\n \"kind\": \"input\",\n \"type\": \"string\",\n \"required\": false,\n \"default\": \"'Done'\",\n \"description\": \"\"\n },\n {\n \"name\": \"started\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"finished\",\n \"kind\": \"output\",\n \"type\": \"void\",\n \"required\": false,\n \"description\": \"\"\n },\n {\n \"name\": \"variant\",\n \"kind\": \"input\",\n \"type\": \"Variant\",\n \"required\": false,\n \"default\": \"'primary'\",\n \"description\": \"Style archetype from the theme. Inherited from BaseComponent.\"\n },\n {\n \"name\": \"size\",\n \"kind\": \"input\",\n \"type\": \"Size\",\n \"required\": false,\n \"default\": \"'lg'\",\n \"description\": \"Size token from the theme. Inherited from BaseComponent. Only has an effect where the component theme defines a `sizes` block.\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"tour.start()\\\">Start tour</button>\\n<uni-input label=\\\"Search projects\\\" id=\\\"tour-demo-search\\\"></uni-input>\\n<uni-input label=\\\"Weekly report\\\" id=\\\"tour-demo-report\\\"></uni-input>\\n<uni-input label=\\\"Project name\\\" id=\\\"tour-demo-name\\\"></uni-input>\\n<div><button text-button variant=\\\"secondary\\\" id=\\\"tour-demo-create\\\">Create project</button></div>\\n<uni-tour #tour [steps]=\\\"steps\\\"></uni-tour>\\n</div>\"\n },\n {\n \"title\": \"Fraction Progress\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Fraction Progress -->\\n<div stack-layout gap=\\\"md\\\">\\n<button text-button (click)=\\\"tour.start()\\\">Start short tour</button>\\n<uni-input label=\\\"Search projects\\\" id=\\\"tour-demo-search\\\"></uni-input>\\n<uni-tour #tour [steps]=\\\"steps\\\"></uni-tour>\\n</div>\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Tour sequences one `uni-callout` through a list of steps: spotlight targets,\\ndim interludes, and interaction gates. A step with `advanceOn` locks Next\\nuntil the user performs the gesture on its target — clicks auto-advance\\n(the gesture is complete), anything else unlocks Next and announces it\\nthrough one polite `role=\\\"status\\\"` region, so nobody is yanked forward\\nmid-typing. Steps whose declared target cannot be found are skipped in the\\ndirection of travel with a dev warning, never an error. `active` is a\\ntwo-way model, so tours are deep-linkable; Escape or the close button skips\\nand reports the step through `skipped`.\",\n \"dos\": [\n \"Keep tours short and gate only steps whose gesture teaches something\",\n \"Handle `skipped`/`finished` and persist them — the tour holds no storage\"\n ],\n \"donts\": [\n \"Point steps at elements that may not exist without accepting the skip\",\n \"Span routes in one tour; sequence per page instead\"\n ],\n \"accessibility\": [\n \"Each panel is labelled `\\\"<title>, step <n> of <total>\\\"`; the dots are `aria-hidden` decoration.\",\n \"Gate unlocks are announced (\\\"Next available\\\") through a single persistent live region.\",\n \"Arrow-key navigation never fires while the user is typing in a spotlit target.\",\n \"The close button reads as the skip affordance (`skipLabel`).\"\n ]\n },\n \"relatedTokens\": [\n \"tour.behavior.progressStyle\",\n \"tour.behavior.footerGap\"\n ]\n },\n {\n \"id\": \"wrap\",\n \"name\": \"Wrap\",\n \"status\": \"stable\",\n \"summary\": \"\",\n \"description\": \"\",\n \"category\": \"layout\",\n \"version\": \"10.4.0\",\n \"bindings\": {\n \"angular\": {\n \"importPath\": \"@uni-design-system/uni-angular\",\n \"selectorOrTag\": \"[uni-wrap-layout], [wrap-layout]\",\n \"api\": [\n {\n \"name\": \"display\",\n \"kind\": \"input\",\n \"type\": \"OptionalDisplay\",\n \"required\": false,\n \"default\": \"'flex'\",\n \"description\": \"\"\n },\n {\n \"name\": \"wrapItems\",\n \"kind\": \"input\",\n \"type\": \"OptionalWrap\",\n \"required\": false,\n \"default\": \"'wrap'\",\n \"description\": \"\"\n }\n ]\n }\n },\n \"examples\": [\n {\n \"title\": \"Primary\",\n \"framework\": \"angular\",\n \"code\": \"<!-- Storybook story: Primary -->\"\n }\n ],\n \"guidelines\": {\n \"whenToUse\": \"Used to add space between elements and wraps automatically if there isn't enough space.\",\n \"dos\": [],\n \"donts\": [],\n \"accessibility\": []\n },\n \"relatedTokens\": []\n }\n ],\n \"tokens\": [\n {\n \"id\": \"color.primary\",\n \"value\": \"#6A6F8F\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#6A6F8F\",\n \"DarkTheme\": \"#AFB5D8\"\n }\n },\n {\n \"id\": \"color.on-primary\",\n \"value\": \"#F9FAFF\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F9FAFF\",\n \"DarkTheme\": \"#11132C\"\n }\n },\n {\n \"id\": \"color.primary-container\",\n \"value\": \"#DBDDEA\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#DBDDEA\",\n \"DarkTheme\": \"#4A4C57\"\n }\n },\n {\n \"id\": \"color.on-primary-container\",\n \"value\": \"#1A1C37\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#1A1C37\",\n \"DarkTheme\": \"#F9FAFF\"\n }\n },\n {\n \"id\": \"color.on-primary-container-variant\",\n \"value\": \"#5B5D68\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#5B5D68\",\n \"DarkTheme\": \"#BCBECB\"\n }\n },\n {\n \"id\": \"color.on-primary-container-border\",\n \"value\": \"#6A6F8F\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#6A6F8F\",\n \"DarkTheme\": \"#AFB5D8\"\n }\n },\n {\n \"id\": \"color.primary-surface\",\n \"value\": \"#F3F5FD\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F3F5FD\",\n \"DarkTheme\": \"#22242A\"\n }\n },\n {\n \"id\": \"color.on-primary-surface\",\n \"value\": \"#1E1F25\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#1E1F25\",\n \"DarkTheme\": \"#F9FAFF\"\n }\n },\n {\n \"id\": \"color.on-primary-surface-variant\",\n \"value\": \"#6A6F8F\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#6A6F8F\",\n \"DarkTheme\": \"#AFB5D8\"\n }\n },\n {\n \"id\": \"color.secondary\",\n \"value\": \"#8C685D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#8C685D\",\n \"DarkTheme\": \"#D5ADA1\"\n }\n },\n {\n \"id\": \"color.on-secondary\",\n \"value\": \"#FFF8F6\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FFF8F6\",\n \"DarkTheme\": \"#280C05\"\n }\n },\n {\n \"id\": \"color.secondary-container\",\n \"value\": \"#E9DAD6\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#E9DAD6\",\n \"DarkTheme\": \"#564A46\"\n }\n },\n {\n \"id\": \"color.on-secondary-container\",\n \"value\": \"#33160D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#33160D\",\n \"DarkTheme\": \"#FFF8F7\"\n }\n },\n {\n \"id\": \"color.on-secondary-container-variant\",\n \"value\": \"#675A57\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#675A57\",\n \"DarkTheme\": \"#CABCB7\"\n }\n },\n {\n \"id\": \"color.on-secondary-container-border\",\n \"value\": \"#8C685D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#8C685D\",\n \"DarkTheme\": \"#D5ADA1\"\n }\n },\n {\n \"id\": \"color.secondary-surface\",\n \"value\": \"#FDF3EF\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FDF3EF\",\n \"DarkTheme\": \"#292220\"\n }\n },\n {\n \"id\": \"color.on-secondary-surface\",\n \"value\": \"#251D1B\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#251D1B\",\n \"DarkTheme\": \"#FFF8F7\"\n }\n },\n {\n \"id\": \"color.on-secondary-surface-variant\",\n \"value\": \"#8C685D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#8C685D\",\n \"DarkTheme\": \"#D5ADA1\"\n }\n },\n {\n \"id\": \"color.tertiary\",\n \"value\": \"#597B66\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#597B66\",\n \"DarkTheme\": \"#9EC2AB\"\n }\n },\n {\n \"id\": \"color.on-tertiary\",\n \"value\": \"#F0FFF5\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F0FFF5\",\n \"DarkTheme\": \"#001C0D\"\n }\n },\n {\n \"id\": \"color.tertiary-container\",\n \"value\": \"#D5E2D9\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#D5E2D9\",\n \"DarkTheme\": \"#465049\"\n }\n },\n {\n \"id\": \"color.on-tertiary-container\",\n \"value\": \"#052615\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#052615\",\n \"DarkTheme\": \"#F0FFF5\"\n }\n },\n {\n \"id\": \"color.on-tertiary-container-variant\",\n \"value\": \"#56615A\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#56615A\",\n \"DarkTheme\": \"#B7C3BB\"\n }\n },\n {\n \"id\": \"color.on-tertiary-container-border\",\n \"value\": \"#597B66\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#597B66\",\n \"DarkTheme\": \"#9EC2AB\"\n }\n },\n {\n \"id\": \"color.tertiary-surface\",\n \"value\": \"#EFF8F2\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#EFF8F2\",\n \"DarkTheme\": \"#1F2622\"\n }\n },\n {\n \"id\": \"color.on-tertiary-surface\",\n \"value\": \"#1B211D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#1B211D\",\n \"DarkTheme\": \"#F4FDF7\"\n }\n },\n {\n \"id\": \"color.on-tertiary-surface-variant\",\n \"value\": \"#557762\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#557762\",\n \"DarkTheme\": \"#9EC2AB\"\n }\n },\n {\n \"id\": \"color.quaternary\",\n \"value\": \"#61636A\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#61636A\",\n \"DarkTheme\": \"#A2A4AC\"\n }\n },\n {\n \"id\": \"color.on-quaternary\",\n \"value\": \"#F9FAFF\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F9FAFF\",\n \"DarkTheme\": \"#15161C\"\n }\n },\n {\n \"id\": \"color.quaternary-surface\",\n \"value\": \"#F3F5FD\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F3F5FD\",\n \"DarkTheme\": \"#22242A\"\n }\n },\n {\n \"id\": \"color.on-quaternary-surface\",\n \"value\": \"#1E1F25\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#1E1F25\",\n \"DarkTheme\": \"#F9FAFF\"\n }\n },\n {\n \"id\": \"color.on-quaternary-surface-variant\",\n \"value\": \"#6A6F8F\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#6A6F8F\",\n \"DarkTheme\": \"#AFB5D8\"\n }\n },\n {\n \"id\": \"color.on-quaternary-container-variant\",\n \"value\": \"#5B5D68\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#5B5D68\",\n \"DarkTheme\": \"#AEB0BD\"\n }\n },\n {\n \"id\": \"color.on-quaternary-container-border\",\n \"value\": \"#61636A\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#61636A\",\n \"DarkTheme\": \"#A2A4AC\"\n }\n },\n {\n \"id\": \"color.error\",\n \"value\": \"#CC2827\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#CC2827\",\n \"DarkTheme\": \"#FF968A\"\n }\n },\n {\n \"id\": \"color.on-error\",\n \"value\": \"#FFF8F7\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FFF8F7\",\n \"DarkTheme\": \"#290B09\"\n }\n },\n {\n \"id\": \"color.error-container\",\n \"value\": \"#FFD2CC\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FFD2CC\",\n \"DarkTheme\": \"#69413C\"\n }\n },\n {\n \"id\": \"color.on-error-container\",\n \"value\": \"#331512\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#331512\",\n \"DarkTheme\": \"#FFF8F7\"\n }\n },\n {\n \"id\": \"color.warn\",\n \"value\": \"#AC5700\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#AC5700\",\n \"DarkTheme\": \"#FF9B51\"\n }\n },\n {\n \"id\": \"color.on-warn\",\n \"value\": \"#FFF9F5\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FFF9F5\",\n \"DarkTheme\": \"#270E00\"\n }\n },\n {\n \"id\": \"color.warn-container\",\n \"value\": \"#FDD5BA\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FDD5BA\",\n \"DarkTheme\": \"#66442E\"\n }\n },\n {\n \"id\": \"color.on-warn-container\",\n \"value\": \"#311805\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#311805\",\n \"DarkTheme\": \"#FFF9F5\"\n }\n },\n {\n \"id\": \"color.on-warn-container-variant\",\n \"value\": \"#78543C\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#78543C\",\n \"DarkTheme\": \"#DFB69B\"\n }\n },\n {\n \"id\": \"color.on-warn-container-border\",\n \"value\": \"#AC5700\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#AC5700\",\n \"DarkTheme\": \"#FF9B51\"\n }\n },\n {\n \"id\": \"color.success\",\n \"value\": \"#008341\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#008341\",\n \"DarkTheme\": \"#59D483\"\n }\n },\n {\n \"id\": \"color.on-success\",\n \"value\": \"#F1FEF4\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F1FEF4\",\n \"DarkTheme\": \"#011C0A\"\n }\n },\n {\n \"id\": \"color.success-container\",\n \"value\": \"#C3EACC\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#C3EACC\",\n \"DarkTheme\": \"#34563D\"\n }\n },\n {\n \"id\": \"color.on-success-container\",\n \"value\": \"#092613\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#092613\",\n \"DarkTheme\": \"#F1FEF4\"\n }\n },\n {\n \"id\": \"color.on-success-container-variant\",\n \"value\": \"#43684D\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#43684D\",\n \"DarkTheme\": \"#A3CBAD\"\n }\n },\n {\n \"id\": \"color.on-success-container-border\",\n \"value\": \"#008341\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#008341\",\n \"DarkTheme\": \"#59D483\"\n }\n },\n {\n \"id\": \"color.background\",\n \"value\": \"#FDFDFF\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#FDFDFF\",\n \"DarkTheme\": \"#101117\"\n }\n },\n {\n \"id\": \"color.on-background\",\n \"value\": \"#202127\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#202127\",\n \"DarkTheme\": \"#E5E7F0\"\n }\n },\n {\n \"id\": \"color.on-background-variant\",\n \"value\": \"#5C5D65\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#5C5D65\",\n \"DarkTheme\": \"#AFB0B9\"\n }\n },\n {\n \"id\": \"color.surface\",\n \"value\": \"#F9FAFF\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F9FAFF\",\n \"DarkTheme\": \"#17181E\"\n }\n },\n {\n \"id\": \"color.on-surface\",\n \"value\": \"#202127\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#202127\",\n \"DarkTheme\": \"#E5E7F0\"\n }\n },\n {\n \"id\": \"color.surface-variant\",\n \"value\": \"#E9EBF3\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#E9EBF3\",\n \"DarkTheme\": \"#313239\"\n }\n },\n {\n \"id\": \"color.on-surface-variant\",\n \"value\": \"#36373E\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#36373E\",\n \"DarkTheme\": \"#AFB0B9\"\n }\n },\n {\n \"id\": \"color.inverse-surface\",\n \"value\": \"#2C2D34\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#2C2D34\",\n \"DarkTheme\": \"#E5E7F0\"\n }\n },\n {\n \"id\": \"color.on-inverse-surface\",\n \"value\": \"#F3F5FD\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F3F5FD\",\n \"DarkTheme\": \"#202127\"\n }\n },\n {\n \"id\": \"color.on-inverse-surface-primary\",\n \"value\": \"#8D93B4\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#8D93B4\",\n \"DarkTheme\": \"#5F6483\"\n }\n },\n {\n \"id\": \"color.on-inverse-surface-variant\",\n \"value\": \"#8D93B4\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#8D93B4\",\n \"DarkTheme\": \"#5F6483\"\n }\n },\n {\n \"id\": \"color.inverse-container\",\n \"value\": \"#2C2D34\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#2C2D34\",\n \"DarkTheme\": \"#E5E7F0\"\n }\n },\n {\n \"id\": \"color.on-inverse-container\",\n \"value\": \"#F3F5FD\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#F3F5FD\",\n \"DarkTheme\": \"#202127\"\n }\n },\n {\n \"id\": \"color.outline\",\n \"value\": \"#7E8088\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#7E8088\",\n \"DarkTheme\": \"#90929A\"\n }\n },\n {\n \"id\": \"color.shadow\",\n \"value\": \"#000000\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#000000\",\n \"DarkTheme\": \"#000000\"\n }\n },\n {\n \"id\": \"color.scrim\",\n \"value\": \"#000000\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#000000\",\n \"DarkTheme\": \"#000000\"\n }\n },\n {\n \"id\": \"color.surface-tint\",\n \"value\": \"#6A6F8F\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#6A6F8F\",\n \"DarkTheme\": \"#AFB5D8\"\n }\n },\n {\n \"id\": \"color.transparent\",\n \"value\": \"rgba(0,0,0,0)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0)\",\n \"DarkTheme\": \"rgba(0,0,0,0)\"\n }\n },\n {\n \"id\": \"color.ghost\",\n \"value\": \"rgba(0,0,0,0)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0)\",\n \"DarkTheme\": \"rgba(0,0,0,0)\"\n }\n },\n {\n \"id\": \"color.disabled\",\n \"value\": \"rgba(0,0,0,0.12)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.12)\",\n \"DarkTheme\": \"rgba(255,255,255,0.12)\"\n }\n },\n {\n \"id\": \"color.on-disabled\",\n \"value\": \"rgba(0,0,0,0.38)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.38)\",\n \"DarkTheme\": \"rgba(255,255,255,0.38)\"\n }\n },\n {\n \"id\": \"color.disabled-container\",\n \"value\": \"#EFF1FA\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"#EFF1FA\",\n \"DarkTheme\": \"#2C2D34\"\n }\n },\n {\n \"id\": \"color.on-disabled-container\",\n \"value\": \"rgba(0,0,0,0.38)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.38)\",\n \"DarkTheme\": \"rgba(255,255,255,0.38)\"\n }\n },\n {\n \"id\": \"color.disabled-surface\",\n \"value\": \"rgba(0,0,0,0.12)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.12)\",\n \"DarkTheme\": \"rgba(255,255,255,0.12)\"\n }\n },\n {\n \"id\": \"color.on-disabled-surface\",\n \"value\": \"rgba(0,0,0,0.5)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.5)\",\n \"DarkTheme\": \"rgba(255,255,255,0.5)\"\n }\n },\n {\n \"id\": \"color.on-disabled-surface-variant\",\n \"value\": \"rgba(0,0,0,0.4)\",\n \"type\": \"color\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0,0,0,0.4)\",\n \"DarkTheme\": \"rgba(255,255,255,0.4)\"\n }\n },\n {\n \"id\": \"radius.none\",\n \"value\": \"none\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"none\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"radius.xxs\",\n \"value\": \"4px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"4px\",\n \"DarkTheme\": \"4px\"\n }\n },\n {\n \"id\": \"radius.xs\",\n \"value\": \"8px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"8px\",\n \"DarkTheme\": \"8px\"\n }\n },\n {\n \"id\": \"radius.sm\",\n \"value\": \"16px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"16px\",\n \"DarkTheme\": \"16px\"\n }\n },\n {\n \"id\": \"radius.md\",\n \"value\": \"24px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"24px\",\n \"DarkTheme\": \"24px\"\n }\n },\n {\n \"id\": \"radius.lg\",\n \"value\": \"32px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"32px\",\n \"DarkTheme\": \"32px\"\n }\n },\n {\n \"id\": \"radius.max\",\n \"value\": \"999px\",\n \"type\": \"radius\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"999px\",\n \"DarkTheme\": \"999px\"\n }\n },\n {\n \"id\": \"spacing.none\",\n \"value\": 0,\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": 0,\n \"DarkTheme\": 0\n }\n },\n {\n \"id\": \"spacing.xxs\",\n \"value\": \"2px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"2px\",\n \"DarkTheme\": \"2px\"\n }\n },\n {\n \"id\": \"spacing.xs\",\n \"value\": \"4px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"4px\",\n \"DarkTheme\": \"4px\"\n }\n },\n {\n \"id\": \"spacing.sm\",\n \"value\": \"8px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"8px\",\n \"DarkTheme\": \"8px\"\n }\n },\n {\n \"id\": \"spacing.md\",\n \"value\": \"16px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"16px\",\n \"DarkTheme\": \"16px\"\n }\n },\n {\n \"id\": \"spacing.lg\",\n \"value\": \"32px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"32px\",\n \"DarkTheme\": \"32px\"\n }\n },\n {\n \"id\": \"spacing.xl\",\n \"value\": \"64px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"64px\",\n \"DarkTheme\": \"64px\"\n }\n },\n {\n \"id\": \"spacing.xxl\",\n \"value\": \"128px\",\n \"type\": \"spacing\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"128px\",\n \"DarkTheme\": \"128px\"\n }\n },\n {\n \"id\": \"border.primary\",\n \"value\": \"1px solid #6A6F8F\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #6A6F8F\",\n \"DarkTheme\": \"1px solid #AFB5D8\"\n }\n },\n {\n \"id\": \"border.secondary\",\n \"value\": \"1px solid #8C685D\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #8C685D\",\n \"DarkTheme\": \"1px solid #D5ADA1\"\n }\n },\n {\n \"id\": \"border.tertiary\",\n \"value\": \"1px solid #597B66\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #597B66\",\n \"DarkTheme\": \"1px solid #9EC2AB\"\n }\n },\n {\n \"id\": \"border.quaternary\",\n \"value\": \"1px solid #61636A\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #61636A\",\n \"DarkTheme\": \"1px solid #A2A4AC\"\n }\n },\n {\n \"id\": \"border.warn\",\n \"value\": \"1px solid #AC5700\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #AC5700\",\n \"DarkTheme\": \"1px solid #FF9B51\"\n }\n },\n {\n \"id\": \"border.success\",\n \"value\": \"1px solid #008341\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #008341\",\n \"DarkTheme\": \"1px solid #59D483\"\n }\n },\n {\n \"id\": \"border.light\",\n \"value\": \"1px solid #7E8088\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #7E8088\",\n \"DarkTheme\": \"1px solid #90929A\"\n }\n },\n {\n \"id\": \"border.dark\",\n \"value\": \"1px solid #202127\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px solid #202127\",\n \"DarkTheme\": \"1px solid #E5E7F0\"\n }\n },\n {\n \"id\": \"border.dotted\",\n \"value\": \"1px dotted #202127\",\n \"type\": \"border\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"1px dotted #202127\",\n \"DarkTheme\": \"1px dotted #E5E7F0\"\n }\n },\n {\n \"id\": \"shadow.raised\",\n \"value\": \"rgba(23, 25, 43, 0.2) 0px 2px 1px -1px, rgba(23, 25, 43, 0.14) 0px 1px 1px 0px, rgba(23, 25, 43, 0.12) 0px 1px 3px 0px\",\n \"type\": \"shadow\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(23, 25, 43, 0.2) 0px 2px 1px -1px, rgba(23, 25, 43, 0.14) 0px 1px 1px 0px, rgba(23, 25, 43, 0.12) 0px 1px 3px 0px\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"shadow.menu\",\n \"value\": \"rgba(23, 25, 43, 0.2) 0px 3px 3px -2px, rgba(23, 25, 43, 0.14) 0px 3px 4px 0px, rgba(23, 25, 43, 0.12) 0px 1px 8px 0px\",\n \"type\": \"shadow\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(23, 25, 43, 0.2) 0px 3px 3px -2px, rgba(23, 25, 43, 0.14) 0px 3px 4px 0px, rgba(23, 25, 43, 0.12) 0px 1px 8px 0px\",\n \"DarkTheme\": \"0px 4px 12px rgba(0, 0, 0, 0.45)\"\n }\n },\n {\n \"id\": \"shadow.dialog\",\n \"value\": \"rgba(23, 25, 43, 0.2) 0px 3px 5px -1px, rgba(23, 25, 43, 0.14) 0px 6px 10px 0px, rgba(23, 25, 43, 0.12) 0px 1px 18px 0px\",\n \"type\": \"shadow\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(23, 25, 43, 0.2) 0px 3px 5px -1px, rgba(23, 25, 43, 0.14) 0px 6px 10px 0px, rgba(23, 25, 43, 0.12) 0px 1px 18px 0px\",\n \"DarkTheme\": \"0px 8px 28px rgba(0, 0, 0, 0.55)\"\n }\n },\n {\n \"id\": \"shadow.warn\",\n \"value\": \"0 0 5px rgba(204, 40, 39, 0.5), inset 0 0 5px rgba(204, 40, 39, 0.3)\",\n \"type\": \"shadow\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"0 0 5px rgba(204, 40, 39, 0.5), inset 0 0 5px rgba(204, 40, 39, 0.3)\",\n \"DarkTheme\": \"0 0 5px rgba(255, 150, 138, 0.55), inset 0 0 5px rgba(255, 150, 138, 0.35)\"\n }\n },\n {\n \"id\": \"backdrop.scrim\",\n \"value\": \"{\\\"background\\\":\\\"rgba(255, 255, 255, 0.6)\\\",\\\"backdropFilter\\\":\\\"blur(2px)\\\"}\",\n \"type\": \"backdrop\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"background\\\":\\\"rgba(255, 255, 255, 0.6)\\\",\\\"backdropFilter\\\":\\\"blur(2px)\\\"}\",\n \"DarkTheme\": \"{\\\"background\\\":\\\"rgba(255, 255, 255, 0.6)\\\",\\\"backdropFilter\\\":\\\"blur(2px)\\\"}\"\n }\n },\n {\n \"id\": \"thickness.thin\",\n \"value\": 1,\n \"type\": \"thickness\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": 1,\n \"DarkTheme\": 1\n }\n },\n {\n \"id\": \"thickness.standard\",\n \"value\": 2,\n \"type\": \"thickness\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"thickness.thick\",\n \"value\": 4,\n \"type\": \"thickness\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": 4,\n \"DarkTheme\": 4\n }\n },\n {\n \"id\": \"typography.display-large\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":57,\\\"lineHeight\\\":64,\\\"fontWeight\\\":\\\"normal\\\",\\\"letterSpacing\\\":-0.25}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":57,\\\"lineHeight\\\":64,\\\"fontWeight\\\":\\\"normal\\\",\\\"letterSpacing\\\":-0.25}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":57,\\\"lineHeight\\\":64,\\\"fontWeight\\\":\\\"normal\\\",\\\"letterSpacing\\\":-0.25}\"\n }\n },\n {\n \"id\": \"typography.display-medium\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":45,\\\"lineHeight\\\":52,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":45,\\\"lineHeight\\\":52,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":45,\\\"lineHeight\\\":52,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.display-small\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":36,\\\"lineHeight\\\":44,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":36,\\\"lineHeight\\\":44,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":36,\\\"lineHeight\\\":44,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.headline-large\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":40,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":40,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":40,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.headline-medium\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":28,\\\"lineHeight\\\":36,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":28,\\\"lineHeight\\\":36,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":28,\\\"lineHeight\\\":36,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.headline-small\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":24,\\\"lineHeight\\\":32,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":24,\\\"lineHeight\\\":32,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":24,\\\"lineHeight\\\":32,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.title-large\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":22,\\\"lineHeight\\\":28,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":22,\\\"lineHeight\\\":28,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":22,\\\"lineHeight\\\":28,\\\"fontWeight\\\":\\\"normal\\\"}\"\n }\n },\n {\n \"id\": \"typography.title-medium\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.15}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.15}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.15}\"\n }\n },\n {\n \"id\": \"typography.title-small\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontWeight\\\":\\\"medium\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"letterSpacing\\\":0.1}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontWeight\\\":\\\"medium\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"letterSpacing\\\":0.1}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontWeight\\\":\\\"medium\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"letterSpacing\\\":0.1}\"\n }\n },\n {\n \"id\": \"typography.body-1-long\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":22}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":22}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":22}\"\n }\n },\n {\n \"id\": \"typography.body-1-short\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\"\n }\n },\n {\n \"id\": \"typography.body-2-long\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":18}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":18}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":18}\"\n }\n },\n {\n \"id\": \"typography.body-2-short\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\"\n }\n },\n {\n \"id\": \"typography.subtitle-1\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"letterSpacing\\\":0.15}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"letterSpacing\\\":0.15}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"letterSpacing\\\":0.15}\"\n }\n },\n {\n \"id\": \"typography.subtitle-2\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.1}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.1}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.1}\"\n }\n },\n {\n \"id\": \"typography.label\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\"\n }\n },\n {\n \"id\": \"typography.button\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"textTransform\\\":\\\"capitalize\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"textTransform\\\":\\\"capitalize\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"textTransform\\\":\\\"capitalize\\\"}\"\n }\n },\n {\n \"id\": \"typography.caption\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":12,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":0.4}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":12,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":0.4}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":12,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":0.4}\"\n }\n },\n {\n \"id\": \"typography.overline\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":10,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":1.5,\\\"textTransform\\\":\\\"uppercase\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":10,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":1.5,\\\"textTransform\\\":\\\"uppercase\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":10,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":1.5,\\\"textTransform\\\":\\\"uppercase\\\"}\"\n }\n },\n {\n \"id\": \"typography.paragraph\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\"\n }\n },\n {\n \"id\": \"typography.quote\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\"\n }\n },\n {\n \"id\": \"typography.note\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":22,\\\"fontStyle\\\":\\\"italic\\\"}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":22,\\\"fontStyle\\\":\\\"italic\\\"}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":22,\\\"fontStyle\\\":\\\"italic\\\"}\"\n }\n },\n {\n \"id\": \"typography.badge\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\"\n }\n },\n {\n \"id\": \"typography.stat\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":38,\\\"fontWeight\\\":600,\\\"letterSpacing\\\":-0.32}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":38,\\\"fontWeight\\\":600,\\\"letterSpacing\\\":-0.32}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":38,\\\"fontWeight\\\":600,\\\"letterSpacing\\\":-0.32}\"\n }\n },\n {\n \"id\": \"typography.tag\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":15,\\\"lineHeight\\\":20,\\\"fontWeight\\\":600}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":15,\\\"lineHeight\\\":20,\\\"fontWeight\\\":600}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":15,\\\"lineHeight\\\":20,\\\"fontWeight\\\":600}\"\n }\n },\n {\n \"id\": \"typography.input\",\n \"value\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":24}\",\n \"type\": \"typography\",\n \"kind\": \"style\",\n \"target\": \"emotion-css\",\n \"themeValues\": {\n \"LightTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":24}\",\n \"DarkTheme\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":24}\"\n }\n },\n {\n \"id\": \"alert.behavior.topPosition\",\n \"value\": 40,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"alert\",\n \"themeValues\": {\n \"LightTheme\": 40,\n \"DarkTheme\": 40\n }\n },\n {\n \"id\": \"alert.behavior.borderRadius\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"alert\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"alert.behavior.motion\",\n \"value\": \"notification\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"alert\",\n \"themeValues\": {\n \"LightTheme\": \"notification\",\n \"DarkTheme\": \"notification\"\n }\n },\n {\n \"id\": \"alert.behavior.elevation\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"alert\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"breadcrumb.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"breadcrumb\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"breadcrumb.behavior.color\",\n \"value\": \"on-background-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"breadcrumb\",\n \"themeValues\": {\n \"LightTheme\": \"on-background-variant\",\n \"DarkTheme\": \"on-background-variant\"\n }\n },\n {\n \"id\": \"breadcrumb.behavior.currentColor\",\n \"value\": \"on-background\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"breadcrumb\",\n \"themeValues\": {\n \"LightTheme\": \"on-background\",\n \"DarkTheme\": \"on-background\"\n }\n },\n {\n \"id\": \"breadcrumb.behavior.separatorSymbol\",\n \"value\": \"chevron_right\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"breadcrumb\",\n \"themeValues\": {\n \"LightTheme\": \"chevron_right\",\n \"DarkTheme\": \"chevron_right\"\n }\n },\n {\n \"id\": \"breadcrumb.behavior.gap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"breadcrumb\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"appBar.behavior.color\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"appBar.behavior.height\",\n \"value\": 56,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": 56,\n \"DarkTheme\": 56\n }\n },\n {\n \"id\": \"appBar.behavior.divider\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"appBar.behavior.typeface\",\n \"value\": \"title-large\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": \"title-large\",\n \"DarkTheme\": \"title-large\"\n }\n },\n {\n \"id\": \"appBar.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"appBar.behavior.gap\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"appBar\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawer.behavior.color\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"drawer.behavior.width\",\n \"value\": 280,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": 280,\n \"DarkTheme\": 280\n }\n },\n {\n \"id\": \"drawer.behavior.divider\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"drawer.behavior.elevation\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"drawer.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawer.behavior.backdrop\",\n \"value\": \"scrim\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"scrim\",\n \"DarkTheme\": \"scrim\"\n }\n },\n {\n \"id\": \"drawer.behavior.scrim\",\n \"value\": true,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": true,\n \"DarkTheme\": true\n }\n },\n {\n \"id\": \"drawer.behavior.background\",\n \"value\": \"solid\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"solid\",\n \"DarkTheme\": \"solid\"\n }\n },\n {\n \"id\": \"drawer.behavior.motion\",\n \"value\": \"panel\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawer\",\n \"themeValues\": {\n \"LightTheme\": \"panel\",\n \"DarkTheme\": \"panel\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.height\",\n \"value\": 56,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": 56,\n \"DarkTheme\": 56\n }\n },\n {\n \"id\": \"drawerHeader.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.textRole\",\n \"value\": \"title-medium\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"title-medium\",\n \"DarkTheme\": \"title-medium\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.textAlign\",\n \"value\": \"left\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"left\",\n \"DarkTheme\": \"left\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.divider\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.closeButtonIcon\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"drawerHeader.behavior.closeButtonSize\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerHeader\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.gap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.justifyContent\",\n \"value\": \"flex-end\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"flex-end\",\n \"DarkTheme\": \"flex-end\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.confirmButtonVariant\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.cancelButtonVariant\",\n \"value\": \"quaternary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"quaternary\",\n \"DarkTheme\": \"quaternary\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.buttonSize\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.divider\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"drawerButtons.behavior.stretch\",\n \"value\": false,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": false,\n \"DarkTheme\": false\n }\n },\n {\n \"id\": \"drawerButtons.behavior.reverseOrder\",\n \"value\": false,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"drawerButtons\",\n \"themeValues\": {\n \"LightTheme\": false,\n \"DarkTheme\": false\n }\n },\n {\n \"id\": \"avatar.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatar\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"avatar.behavior.typeface\",\n \"value\": \"subtitle-2\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatar\",\n \"themeValues\": {\n \"LightTheme\": \"subtitle-2\",\n \"DarkTheme\": \"subtitle-2\"\n }\n },\n {\n \"id\": \"avatar.behavior.fallbackSymbol\",\n \"value\": \"person\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatar\",\n \"themeValues\": {\n \"LightTheme\": \"person\",\n \"DarkTheme\": \"person\"\n }\n },\n {\n \"id\": \"avatarGroup.behavior.overlap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatarGroup\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"avatarGroup.behavior.ringColor\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatarGroup\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"avatarGroup.behavior.ringWidth\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"avatarGroup\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"searchInput.behavior.searchSymbol\",\n \"value\": \"search\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"search\",\n \"DarkTheme\": \"search\"\n }\n },\n {\n \"id\": \"searchInput.behavior.clearSymbol\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"searchInput.behavior.listColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"searchInput.behavior.listShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"searchInput.behavior.listBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"searchInput.behavior.activeColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"searchInput.behavior.maxSuggestions\",\n \"value\": 8,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"searchInput\",\n \"themeValues\": {\n \"LightTheme\": 8,\n \"DarkTheme\": 8\n }\n },\n {\n \"id\": \"checkbox.behavior.size\",\n \"value\": 20,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"checkbox\",\n \"themeValues\": {\n \"LightTheme\": 20,\n \"DarkTheme\": 20\n }\n },\n {\n \"id\": \"checkbox.behavior.boxColor\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"checkbox\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"checkbox.behavior.borderRadius\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"checkbox\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"checkbox.behavior.focusRingGap\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"checkbox\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"radio.behavior.size\",\n \"value\": 20,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"radio\",\n \"themeValues\": {\n \"LightTheme\": 20,\n \"DarkTheme\": 20\n }\n },\n {\n \"id\": \"radio.behavior.ringColor\",\n \"value\": \"outline\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"radio\",\n \"themeValues\": {\n \"LightTheme\": \"outline\",\n \"DarkTheme\": \"outline\"\n }\n },\n {\n \"id\": \"radio.behavior.fillColor\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"radio\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"radio.behavior.motion\",\n \"value\": \"control\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"radio\",\n \"themeValues\": {\n \"LightTheme\": \"control\",\n \"DarkTheme\": \"control\"\n }\n },\n {\n \"id\": \"dialog.behavior.borderRadius\",\n \"value\": \"lg\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"lg\",\n \"DarkTheme\": \"lg\"\n }\n },\n {\n \"id\": \"dialog.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"dialog.behavior.border\",\n \"value\": \"quaternary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"quaternary\",\n \"DarkTheme\": \"quaternary\"\n }\n },\n {\n \"id\": \"dialog.behavior.padding\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dialog.behavior.inset\",\n \"value\": \"lg\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"lg\",\n \"DarkTheme\": \"lg\"\n }\n },\n {\n \"id\": \"dialog.behavior.elevation\",\n \"value\": \"dialog\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"dialog\",\n \"DarkTheme\": \"dialog\"\n }\n },\n {\n \"id\": \"dialog.behavior.backdrop\",\n \"value\": \"scrim\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"scrim\",\n \"DarkTheme\": \"scrim\"\n }\n },\n {\n \"id\": \"dialog.behavior.motion\",\n \"value\": \"panel\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialog\",\n \"themeValues\": {\n \"LightTheme\": \"panel\",\n \"DarkTheme\": \"panel\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.gap\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.paddingBottom\",\n \"value\": \"lg\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"lg\",\n \"DarkTheme\": \"lg\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.justifyContent\",\n \"value\": \"center\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"center\",\n \"DarkTheme\": \"center\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.confirmButtonVariant\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.cancelButtonVariant\",\n \"value\": \"warn\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"warn\",\n \"DarkTheme\": \"warn\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.buttonSize\",\n \"value\": \"lg\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": \"lg\",\n \"DarkTheme\": \"lg\"\n }\n },\n {\n \"id\": \"dialogButtons.behavior.stretch\",\n \"value\": false,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": false,\n \"DarkTheme\": false\n }\n },\n {\n \"id\": \"dialogButtons.behavior.reverseOrder\",\n \"value\": false,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogButtons\",\n \"themeValues\": {\n \"LightTheme\": false,\n \"DarkTheme\": false\n }\n },\n {\n \"id\": \"dialogHeader.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"dialogHeader.behavior.color\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"dialogHeader.behavior.height\",\n \"value\": 48,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": 48,\n \"DarkTheme\": 48\n }\n },\n {\n \"id\": \"dialogHeader.behavior.textRole\",\n \"value\": \"title-large\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"title-large\",\n \"DarkTheme\": \"title-large\"\n }\n },\n {\n \"id\": \"dialogHeader.behavior.textAlign\",\n \"value\": \"center\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"center\",\n \"DarkTheme\": \"center\"\n }\n },\n {\n \"id\": \"dialogHeader.behavior.closeButtonIcon\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"dialogHeader.behavior.closeButtonSize\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dialogHeader\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"dropdown.behavior.border\",\n \"value\": \"none\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dropdown\",\n \"themeValues\": {\n \"LightTheme\": \"none\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"dropdown.behavior.borderRadius\",\n \"value\": \"xxs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dropdown\",\n \"themeValues\": {\n \"LightTheme\": \"xxs\",\n \"DarkTheme\": \"xxs\"\n }\n },\n {\n \"id\": \"dropdown.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dropdown\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"dropdown.behavior.shadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dropdown\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"dropdown.behavior.motion\",\n \"value\": \"popup\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dropdown\",\n \"themeValues\": {\n \"LightTheme\": \"popup\",\n \"DarkTheme\": \"popup\"\n }\n },\n {\n \"id\": \"menu.behavior.minWidth\",\n \"value\": 184,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menu\",\n \"themeValues\": {\n \"LightTheme\": 184,\n \"DarkTheme\": 184\n }\n },\n {\n \"id\": \"menu.behavior.paddingVertical\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menu\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"menu.behavior.paddingHorizontal\",\n \"value\": \"none\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menu\",\n \"themeValues\": {\n \"LightTheme\": \"none\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"menu.behavior.dividerBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menu\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"menu.behavior.dividerSpacing\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menu\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"menuItem.behavior.height\",\n \"value\": 38,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": 38,\n \"DarkTheme\": 38\n }\n },\n {\n \"id\": \"menuItem.behavior.paddingHorizontal\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"menuItem.behavior.gap\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"menuItem.behavior.borderRadius\",\n \"value\": \"none\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"none\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"menuItem.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"menuItem.behavior.hoverColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"menuItem.behavior.activeSymbol\",\n \"value\": \"check\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"check\",\n \"DarkTheme\": \"check\"\n }\n },\n {\n \"id\": \"menuItem.behavior.motion\",\n \"value\": \"control\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"menuItem\",\n \"themeValues\": {\n \"LightTheme\": \"control\",\n \"DarkTheme\": \"control\"\n }\n },\n {\n \"id\": \"popover.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"popover.behavior.border\",\n \"value\": \"quaternary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"quaternary\",\n \"DarkTheme\": \"quaternary\"\n }\n },\n {\n \"id\": \"popover.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"popover.behavior.shadow\",\n \"value\": \"raised\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"raised\",\n \"DarkTheme\": \"raised\"\n }\n },\n {\n \"id\": \"popover.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"popover.behavior.padding\",\n \"value\": \"6px 12px\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"6px 12px\",\n \"DarkTheme\": \"6px 12px\"\n }\n },\n {\n \"id\": \"popover.behavior.maxWidth\",\n \"value\": \"38ch\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"38ch\",\n \"DarkTheme\": \"38ch\"\n }\n },\n {\n \"id\": \"popover.behavior.offset\",\n \"value\": 7,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": 7,\n \"DarkTheme\": 7\n }\n },\n {\n \"id\": \"popover.behavior.arrowSize\",\n \"value\": 8,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": 8,\n \"DarkTheme\": 8\n }\n },\n {\n \"id\": \"popover.behavior.closeSymbol\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"popover.behavior.headerTypeface\",\n \"value\": \"title-small\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"title-small\",\n \"DarkTheme\": \"title-small\"\n }\n },\n {\n \"id\": \"popover.behavior.tooltipPadding\",\n \"value\": \"4px 8px\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"4px 8px\",\n \"DarkTheme\": \"4px 8px\"\n }\n },\n {\n \"id\": \"popover.behavior.tooltipOpenDelay\",\n \"value\": 500,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": 500,\n \"DarkTheme\": 500\n }\n },\n {\n \"id\": \"popover.behavior.tooltipCloseDelay\",\n \"value\": 150,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": 150,\n \"DarkTheme\": 150\n }\n },\n {\n \"id\": \"popover.behavior.motion\",\n \"value\": \"panel\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"popover\",\n \"themeValues\": {\n \"LightTheme\": \"panel\",\n \"DarkTheme\": \"panel\"\n }\n },\n {\n \"id\": \"expand.behavior.motion\",\n \"value\": \"reveal\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"expand\",\n \"themeValues\": {\n \"LightTheme\": \"reveal\",\n \"DarkTheme\": \"reveal\"\n }\n },\n {\n \"id\": \"footer.behavior.height\",\n \"value\": 52,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"footer\",\n \"themeValues\": {\n \"LightTheme\": 52,\n \"DarkTheme\": 52\n }\n },\n {\n \"id\": \"footer.behavior.color\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"footer\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"footer.behavior.logoHeight\",\n \"value\": 18.6,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"footer\",\n \"themeValues\": {\n \"LightTheme\": 18.6,\n \"DarkTheme\": 18.6\n }\n },\n {\n \"id\": \"footer.behavior.logoPadding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"footer\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"input.behavior.typeface\",\n \"value\": \"input\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"input\",\n \"DarkTheme\": \"input\"\n }\n },\n {\n \"id\": \"input.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"input.behavior.textColor\",\n \"value\": \"on-primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-surface\",\n \"DarkTheme\": \"on-primary-surface\"\n }\n },\n {\n \"id\": \"input.behavior.disabledColor\",\n \"value\": \"disabled-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"disabled-surface\",\n \"DarkTheme\": \"disabled-surface\"\n }\n },\n {\n \"id\": \"input.behavior.disabledTextColor\",\n \"value\": \"on-disabled-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"on-disabled-surface\",\n \"DarkTheme\": \"on-disabled-surface\"\n }\n },\n {\n \"id\": \"input.behavior.border\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"input.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"input.behavior.errorShadow\",\n \"value\": \"warn\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"warn\",\n \"DarkTheme\": \"warn\"\n }\n },\n {\n \"id\": \"input.behavior.errorBorder\",\n \"value\": \"warn\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"warn\",\n \"DarkTheme\": \"warn\"\n }\n },\n {\n \"id\": \"input.behavior.height\",\n \"value\": 32,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": 32,\n \"DarkTheme\": 32\n }\n },\n {\n \"id\": \"input.behavior.paddingLeft\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"input.behavior.focusOutline\",\n \"value\": \"2px solid #6A6F8F\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": \"2px solid #6A6F8F\",\n \"DarkTheme\": \"2px solid #AFB5D8\"\n }\n },\n {\n \"id\": \"input.behavior.focusOutlineOffset\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"input\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"textarea.behavior.rows\",\n \"value\": 3,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"textarea\",\n \"themeValues\": {\n \"LightTheme\": 3,\n \"DarkTheme\": 3\n }\n },\n {\n \"id\": \"textarea.behavior.resize\",\n \"value\": \"vertical\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"textarea\",\n \"themeValues\": {\n \"LightTheme\": \"vertical\",\n \"DarkTheme\": \"vertical\"\n }\n },\n {\n \"id\": \"numberInput.behavior.stepperLayout\",\n \"value\": \"stacked\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"stacked\",\n \"DarkTheme\": \"stacked\"\n }\n },\n {\n \"id\": \"numberInput.behavior.incrementIcon\",\n \"value\": \"plus\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"plus\",\n \"DarkTheme\": \"plus\"\n }\n },\n {\n \"id\": \"numberInput.behavior.decrementIcon\",\n \"value\": \"minus\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"minus\",\n \"DarkTheme\": \"minus\"\n }\n },\n {\n \"id\": \"numberInput.behavior.stepUpIcon\",\n \"value\": \"chevronUp\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"chevronUp\",\n \"DarkTheme\": \"chevronUp\"\n }\n },\n {\n \"id\": \"numberInput.behavior.stepDownIcon\",\n \"value\": \"chevronDown\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"chevronDown\",\n \"DarkTheme\": \"chevronDown\"\n }\n },\n {\n \"id\": \"numberInput.behavior.stepperWidth\",\n \"value\": 32,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 32,\n \"DarkTheme\": 32\n }\n },\n {\n \"id\": \"numberInput.behavior.minTouchTarget\",\n \"value\": 24,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 24,\n \"DarkTheme\": 24\n }\n },\n {\n \"id\": \"numberInput.behavior.affixColor\",\n \"value\": \"on-primary-surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-surface-variant\",\n \"DarkTheme\": \"on-primary-surface-variant\"\n }\n },\n {\n \"id\": \"numberInput.behavior.affixGap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"numberInput.behavior.align\",\n \"value\": \"start\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": \"start\",\n \"DarkTheme\": \"start\"\n }\n },\n {\n \"id\": \"numberInput.behavior.tabularNumerals\",\n \"value\": true,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": true,\n \"DarkTheme\": true\n }\n },\n {\n \"id\": \"numberInput.behavior.repeatDelayMs\",\n \"value\": 500,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 500,\n \"DarkTheme\": 500\n }\n },\n {\n \"id\": \"numberInput.behavior.repeatIntervalMs\",\n \"value\": 100,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 100,\n \"DarkTheme\": 100\n }\n },\n {\n \"id\": \"numberInput.behavior.repeatFastIntervalMs\",\n \"value\": 25,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 25,\n \"DarkTheme\": 25\n }\n },\n {\n \"id\": \"numberInput.behavior.repeatRampMs\",\n \"value\": 2000,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberInput\",\n \"themeValues\": {\n \"LightTheme\": 2000,\n \"DarkTheme\": 2000\n }\n },\n {\n \"id\": \"numberRangeInput.behavior.partGap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberRangeInput\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"numberRangeInput.behavior.dividerText\",\n \"value\": \"–\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberRangeInput\",\n \"themeValues\": {\n \"LightTheme\": \"–\",\n \"DarkTheme\": \"–\"\n }\n },\n {\n \"id\": \"numberRangeInput.behavior.dividerColor\",\n \"value\": \"outline\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberRangeInput\",\n \"themeValues\": {\n \"LightTheme\": \"outline\",\n \"DarkTheme\": \"outline\"\n }\n },\n {\n \"id\": \"numberRangeInput.behavior.affixColor\",\n \"value\": \"on-primary-surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberRangeInput\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-surface-variant\",\n \"DarkTheme\": \"on-primary-surface-variant\"\n }\n },\n {\n \"id\": \"numberRangeInput.behavior.affixGap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"numberRangeInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"quantityStepper.behavior.incrementIcon\",\n \"value\": \"plus\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"quantityStepper\",\n \"themeValues\": {\n \"LightTheme\": \"plus\",\n \"DarkTheme\": \"plus\"\n }\n },\n {\n \"id\": \"quantityStepper.behavior.decrementIcon\",\n \"value\": \"minus\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"quantityStepper\",\n \"themeValues\": {\n \"LightTheme\": \"minus\",\n \"DarkTheme\": \"minus\"\n }\n },\n {\n \"id\": \"quantityStepper.behavior.deleteIcon\",\n \"value\": \"delete\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"quantityStepper\",\n \"themeValues\": {\n \"LightTheme\": \"delete\",\n \"DarkTheme\": \"delete\"\n }\n },\n {\n \"id\": \"quantityStepper.behavior.tabularNumerals\",\n \"value\": true,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"quantityStepper\",\n \"themeValues\": {\n \"LightTheme\": true,\n \"DarkTheme\": true\n }\n },\n {\n \"id\": \"quantityStepper.behavior.valueWidth\",\n \"value\": \"3ch\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"quantityStepper\",\n \"themeValues\": {\n \"LightTheme\": \"3ch\",\n \"DarkTheme\": \"3ch\"\n }\n },\n {\n \"id\": \"tabs.behavior.typeface\",\n \"value\": \"title-small\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"title-small\",\n \"DarkTheme\": \"title-small\"\n }\n },\n {\n \"id\": \"tabs.behavior.textColor\",\n \"value\": \"on-surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"on-surface-variant\",\n \"DarkTheme\": \"on-surface-variant\"\n }\n },\n {\n \"id\": \"tabs.behavior.activeTextColor\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"tabs.behavior.indicatorColor\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"tabs.behavior.indicatorThickness\",\n \"value\": \"standard\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"standard\",\n \"DarkTheme\": \"standard\"\n }\n },\n {\n \"id\": \"tabs.behavior.divider\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"tabs.behavior.gap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"tabs.behavior.borderRadius\",\n \"value\": \"none\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"none\",\n \"DarkTheme\": \"none\"\n }\n },\n {\n \"id\": \"tabs.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tabs\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.textRole\",\n \"value\": \"input\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"input\",\n \"DarkTheme\": \"input\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.textColor\",\n \"value\": \"on-primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-surface\",\n \"DarkTheme\": \"on-primary-surface\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.dividerBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.searchInputBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.searchInputBorderRadius\",\n \"value\": \"xxs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"xxs\",\n \"DarkTheme\": \"xxs\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.focusOutline\",\n \"value\": \"2px solid #6A6F8F\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": \"2px solid #6A6F8F\",\n \"DarkTheme\": \"2px solid #AFB5D8\"\n }\n },\n {\n \"id\": \"multiSelectDropdown.behavior.focusOutlineOffset\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"multiSelectDropdown\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"badge.behavior.borderRadius\",\n \"value\": \"xxs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"badge\",\n \"themeValues\": {\n \"LightTheme\": \"xxs\",\n \"DarkTheme\": \"xxs\"\n }\n },\n {\n \"id\": \"tag.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tag\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"tag.behavior.typeface\",\n \"value\": \"tag\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tag\",\n \"themeValues\": {\n \"LightTheme\": \"tag\",\n \"DarkTheme\": \"tag\"\n }\n },\n {\n \"id\": \"tag.behavior.gap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tag\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"tag.behavior.removeIcon\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tag\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"tag.behavior.selectedIcon\",\n \"value\": \"check\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tag\",\n \"themeValues\": {\n \"LightTheme\": \"check\",\n \"DarkTheme\": \"check\"\n }\n },\n {\n \"id\": \"tagInput.behavior.chipGap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"tagInput.behavior.chipSize\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"tagInput.behavior.minInputWidth\",\n \"value\": \"12ch\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"12ch\",\n \"DarkTheme\": \"12ch\"\n }\n },\n {\n \"id\": \"tagInput.behavior.listColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"tagInput.behavior.listShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"tagInput.behavior.listBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"tagInput.behavior.activeColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"tagInput.behavior.maxSuggestions\",\n \"value\": 8,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tagInput\",\n \"themeValues\": {\n \"LightTheme\": 8,\n \"DarkTheme\": 8\n }\n },\n {\n \"id\": \"calendar.behavior.dayBorderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"calendar.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"calendar.behavior.gap\",\n \"value\": \"xxs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"xxs\",\n \"DarkTheme\": \"xxs\"\n }\n },\n {\n \"id\": \"calendar.behavior.navPrevSymbol\",\n \"value\": \"chevron_left\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"chevron_left\",\n \"DarkTheme\": \"chevron_left\"\n }\n },\n {\n \"id\": \"calendar.behavior.navNextSymbol\",\n \"value\": \"chevron_right\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"chevron_right\",\n \"DarkTheme\": \"chevron_right\"\n }\n },\n {\n \"id\": \"calendar.behavior.weekdayFormat\",\n \"value\": \"short\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"short\",\n \"DarkTheme\": \"short\"\n }\n },\n {\n \"id\": \"calendar.behavior.showOutsideDays\",\n \"value\": false,\n \"type\": \"boolean\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": false,\n \"DarkTheme\": false\n }\n },\n {\n \"id\": \"calendar.behavior.todayStyle\",\n \"value\": \"outline\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"calendar\",\n \"themeValues\": {\n \"LightTheme\": \"outline\",\n \"DarkTheme\": \"outline\"\n }\n },\n {\n \"id\": \"combobox.behavior.toggleIcon\",\n \"value\": \"chevronDown\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"chevronDown\",\n \"DarkTheme\": \"chevronDown\"\n }\n },\n {\n \"id\": \"combobox.behavior.clearIcon\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"combobox.behavior.selectedIcon\",\n \"value\": \"check\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"check\",\n \"DarkTheme\": \"check\"\n }\n },\n {\n \"id\": \"combobox.behavior.listColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"combobox.behavior.listShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"combobox.behavior.listBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"combobox.behavior.activeColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"combobox.behavior.maxVisibleOptions\",\n \"value\": 8,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": 8,\n \"DarkTheme\": 8\n }\n },\n {\n \"id\": \"combobox.behavior.descriptionColor\",\n \"value\": \"on-primary-surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"combobox\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-surface-variant\",\n \"DarkTheme\": \"on-primary-surface-variant\"\n }\n },\n {\n \"id\": \"dateInput.behavior.toggleSymbol\",\n \"value\": \"calendar_month\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateInput\",\n \"themeValues\": {\n \"LightTheme\": \"calendar_month\",\n \"DarkTheme\": \"calendar_month\"\n }\n },\n {\n \"id\": \"dateInput.behavior.popupShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateInput\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"dateInput.behavior.popupBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"dateInput.behavior.popupColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"timeInput.behavior.toggleSymbol\",\n \"value\": \"schedule\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": \"schedule\",\n \"DarkTheme\": \"schedule\"\n }\n },\n {\n \"id\": \"timeInput.behavior.listColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"timeInput.behavior.listShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"timeInput.behavior.listBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"timeInput.behavior.activeColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"timeInput.behavior.maxVisibleOptions\",\n \"value\": 7,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"timeInput\",\n \"themeValues\": {\n \"LightTheme\": 7,\n \"DarkTheme\": 7\n }\n },\n {\n \"id\": \"dateTimeInput.behavior.partGap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateTimeInput\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dateTimeInput.behavior.dividerColor\",\n \"value\": \"outline\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dateTimeInput\",\n \"themeValues\": {\n \"LightTheme\": \"outline\",\n \"DarkTheme\": \"outline\"\n }\n },\n {\n \"id\": \"button.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"button\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"button.behavior.typeface\",\n \"value\": \"button\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"button\",\n \"themeValues\": {\n \"LightTheme\": \"button\",\n \"DarkTheme\": \"button\"\n }\n },\n {\n \"id\": \"iconButton.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"iconButton\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"card.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"card\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"dataSearch.behavior.border\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataSearch\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"dataSearch.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataSearch\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"dataSearch.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataSearch\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"dataSearch.behavior.placeholderColor\",\n \"value\": \"disabled\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataSearch\",\n \"themeValues\": {\n \"LightTheme\": \"disabled\",\n \"DarkTheme\": \"disabled\"\n }\n },\n {\n \"id\": \"dataTable.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"dataTable.behavior.border\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"dataTable.behavior.borderRadius\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dataTable.behavior.headerPadding\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dataTable.behavior.footerPadding\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dataTable.behavior.thTextRole\",\n \"value\": \"headline-small\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"headline-small\",\n \"DarkTheme\": \"headline-small\"\n }\n },\n {\n \"id\": \"dataTable.behavior.thColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"dataTable.behavior.thVerticalBorder\",\n \"value\": \"dotted\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"dotted\",\n \"DarkTheme\": \"dotted\"\n }\n },\n {\n \"id\": \"dataTable.behavior.thHorizontalBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"dataTable.behavior.thPadding\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdTextRole\",\n \"value\": \"title-small\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"title-small\",\n \"DarkTheme\": \"title-small\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdColor\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdStickyColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdPadding\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdVerticalBorder\",\n \"value\": \"dotted\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"dotted\",\n \"DarkTheme\": \"dotted\"\n }\n },\n {\n \"id\": \"dataTable.behavior.tdHorizontalBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"dataTable.behavior.rowHoverColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"dataTable.behavior.loadingOverlayColor\",\n \"value\": \"scrim\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"scrim\",\n \"DarkTheme\": \"scrim\"\n }\n },\n {\n \"id\": \"dataTable.behavior.loadingSpinnerColor\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"dataTable.behavior.loadingSpinnerSize\",\n \"value\": 40,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"dataTable\",\n \"themeValues\": {\n \"LightTheme\": 40,\n \"DarkTheme\": 40\n }\n },\n {\n \"id\": \"notificationBadge.behavior.borderRadius\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"notificationBadge\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"notificationBadge.behavior.offset\",\n \"value\": -10,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"notificationBadge\",\n \"themeValues\": {\n \"LightTheme\": -10,\n \"DarkTheme\": -10\n }\n },\n {\n \"id\": \"paginator.behavior.gap\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"paginator.behavior.textRole\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"paginator.behavior.inputBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"paginator.behavior.inputBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"paginator.behavior.pageBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"paginator.behavior.currentPageBorder\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"paginator.behavior.currentPageBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"paginator\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"stat.behavior.labelTypeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"stat.behavior.valueTypeface\",\n \"value\": \"stat\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"stat\",\n \"DarkTheme\": \"stat\"\n }\n },\n {\n \"id\": \"stat.behavior.color\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"stat.behavior.border\",\n \"value\": \"light\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"light\",\n \"DarkTheme\": \"light\"\n }\n },\n {\n \"id\": \"stat.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"stat.behavior.positiveColor\",\n \"value\": \"success\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"success\",\n \"DarkTheme\": \"success\"\n }\n },\n {\n \"id\": \"stat.behavior.negativeColor\",\n \"value\": \"error\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"error\",\n \"DarkTheme\": \"error\"\n }\n },\n {\n \"id\": \"stat.behavior.trendColor\",\n \"value\": \"outline\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"outline\",\n \"DarkTheme\": \"outline\"\n }\n },\n {\n \"id\": \"stat.behavior.trendAccent\",\n \"value\": \"primary\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"primary\",\n \"DarkTheme\": \"primary\"\n }\n },\n {\n \"id\": \"stat.behavior.padding\",\n \"value\": \"md\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"md\",\n \"DarkTheme\": \"md\"\n }\n },\n {\n \"id\": \"stat.behavior.gap\",\n \"value\": \"xxs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"stat\",\n \"themeValues\": {\n \"LightTheme\": \"xxs\",\n \"DarkTheme\": \"xxs\"\n }\n },\n {\n \"id\": \"slider.behavior.trackHeight\",\n \"value\": 4,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": 4,\n \"DarkTheme\": 4\n }\n },\n {\n \"id\": \"slider.behavior.trackColor\",\n \"value\": \"primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"primary-container\",\n \"DarkTheme\": \"primary-container\"\n }\n },\n {\n \"id\": \"slider.behavior.borderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"slider.behavior.thumbSize\",\n \"value\": 16,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": 16,\n \"DarkTheme\": 16\n }\n },\n {\n \"id\": \"slider.behavior.thumbBorderRadius\",\n \"value\": \"max\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"max\",\n \"DarkTheme\": \"max\"\n }\n },\n {\n \"id\": \"slider.behavior.minTouchTarget\",\n \"value\": 24,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": 24,\n \"DarkTheme\": 24\n }\n },\n {\n \"id\": \"slider.behavior.markSize\",\n \"value\": 3,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": 3,\n \"DarkTheme\": 3\n }\n },\n {\n \"id\": \"slider.behavior.markColor\",\n \"value\": \"on-primary-container\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"on-primary-container\",\n \"DarkTheme\": \"on-primary-container\"\n }\n },\n {\n \"id\": \"slider.behavior.labelTypeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"slider.behavior.labelColor\",\n \"value\": \"on-surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"on-surface-variant\",\n \"DarkTheme\": \"on-surface-variant\"\n }\n },\n {\n \"id\": \"slider.behavior.tooltipColor\",\n \"value\": \"inverse-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"inverse-surface\",\n \"DarkTheme\": \"inverse-surface\"\n }\n },\n {\n \"id\": \"slider.behavior.tooltipTextColor\",\n \"value\": \"on-inverse-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"on-inverse-surface\",\n \"DarkTheme\": \"on-inverse-surface\"\n }\n },\n {\n \"id\": \"slider.behavior.tooltipShadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"slider.behavior.tooltipBorderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"slider.behavior.transitionMs\",\n \"value\": 120,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"slider\",\n \"themeValues\": {\n \"LightTheme\": 120,\n \"DarkTheme\": 120\n }\n },\n {\n \"id\": \"skeleton.behavior.color\",\n \"value\": \"surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"surface-variant\",\n \"DarkTheme\": \"surface-variant\"\n }\n },\n {\n \"id\": \"skeleton.behavior.highlightColor\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"skeleton.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"skeleton.behavior.animation\",\n \"value\": \"shimmer\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"shimmer\",\n \"DarkTheme\": \"shimmer\"\n }\n },\n {\n \"id\": \"skeleton.behavior.duration\",\n \"value\": 1.4,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": 1.4,\n \"DarkTheme\": 1.4\n }\n },\n {\n \"id\": \"skeleton.behavior.direction\",\n \"value\": \"ltr\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"ltr\",\n \"DarkTheme\": \"ltr\"\n }\n },\n {\n \"id\": \"skeleton.behavior.highlightWidth\",\n \"value\": 40,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": 40,\n \"DarkTheme\": 40\n }\n },\n {\n \"id\": \"skeleton.behavior.gap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"skeleton\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n },\n {\n \"id\": \"snackbar.behavior.bottomPosition\",\n \"value\": 40,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"snackbar\",\n \"themeValues\": {\n \"LightTheme\": 40,\n \"DarkTheme\": 40\n }\n },\n {\n \"id\": \"snackbar.behavior.motion\",\n \"value\": \"notification\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"snackbar\",\n \"themeValues\": {\n \"LightTheme\": \"notification\",\n \"DarkTheme\": \"notification\"\n }\n },\n {\n \"id\": \"snackbar.behavior.autoCloseDelay\",\n \"value\": 35000,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"snackbar\",\n \"themeValues\": {\n \"LightTheme\": 35000,\n \"DarkTheme\": 35000\n }\n },\n {\n \"id\": \"symbol.behavior.fill\",\n \"value\": 0,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"symbol\",\n \"themeValues\": {\n \"LightTheme\": 0,\n \"DarkTheme\": 0\n }\n },\n {\n \"id\": \"symbol.behavior.weight\",\n \"value\": 400,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"symbol\",\n \"themeValues\": {\n \"LightTheme\": 400,\n \"DarkTheme\": 400\n }\n },\n {\n \"id\": \"symbol.behavior.grade\",\n \"value\": 0,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"symbol\",\n \"themeValues\": {\n \"LightTheme\": 0,\n \"DarkTheme\": 0\n }\n },\n {\n \"id\": \"symbol.behavior.opticalSize\",\n \"value\": 24,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"symbol\",\n \"themeValues\": {\n \"LightTheme\": 24,\n \"DarkTheme\": 24\n }\n },\n {\n \"id\": \"toggle.behavior.trackColor\",\n \"value\": \"surface-variant\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"toggle\",\n \"themeValues\": {\n \"LightTheme\": \"surface-variant\",\n \"DarkTheme\": \"surface-variant\"\n }\n },\n {\n \"id\": \"toggle.behavior.knobColor\",\n \"value\": \"surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"toggle\",\n \"themeValues\": {\n \"LightTheme\": \"surface\",\n \"DarkTheme\": \"surface\"\n }\n },\n {\n \"id\": \"toggle.behavior.motion\",\n \"value\": \"control\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"toggle\",\n \"themeValues\": {\n \"LightTheme\": \"control\",\n \"DarkTheme\": \"control\"\n }\n },\n {\n \"id\": \"tooltip.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tooltip\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"tooltip.behavior.shadow\",\n \"value\": \"raised\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tooltip\",\n \"themeValues\": {\n \"LightTheme\": \"raised\",\n \"DarkTheme\": \"raised\"\n }\n },\n {\n \"id\": \"tooltip.behavior.color\",\n \"value\": \"inverse-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tooltip\",\n \"themeValues\": {\n \"LightTheme\": \"inverse-surface\",\n \"DarkTheme\": \"inverse-surface\"\n }\n },\n {\n \"id\": \"tooltip.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tooltip\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"callout.behavior.color\",\n \"value\": \"primary-surface\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"primary-surface\",\n \"DarkTheme\": \"primary-surface\"\n }\n },\n {\n \"id\": \"callout.behavior.borderRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"callout.behavior.shadow\",\n \"value\": \"menu\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"menu\",\n \"DarkTheme\": \"menu\"\n }\n },\n {\n \"id\": \"callout.behavior.width\",\n \"value\": \"320px\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"320px\",\n \"DarkTheme\": \"320px\"\n }\n },\n {\n \"id\": \"callout.behavior.padding\",\n \"value\": \"16px\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"16px\",\n \"DarkTheme\": \"16px\"\n }\n },\n {\n \"id\": \"callout.behavior.headerTypeface\",\n \"value\": \"title-small\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"title-small\",\n \"DarkTheme\": \"title-small\"\n }\n },\n {\n \"id\": \"callout.behavior.typeface\",\n \"value\": \"label\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"label\",\n \"DarkTheme\": \"label\"\n }\n },\n {\n \"id\": \"callout.behavior.closeSymbol\",\n \"value\": \"close\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"close\",\n \"DarkTheme\": \"close\"\n }\n },\n {\n \"id\": \"callout.behavior.arrowSize\",\n \"value\": 8,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": 8,\n \"DarkTheme\": 8\n }\n },\n {\n \"id\": \"callout.behavior.offset\",\n \"value\": 12,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": 12,\n \"DarkTheme\": 12\n }\n },\n {\n \"id\": \"callout.behavior.scrimColor\",\n \"value\": \"rgba(0, 0, 0, 0.45)\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"rgba(0, 0, 0, 0.45)\",\n \"DarkTheme\": \"rgba(0, 0, 0, 0.45)\"\n }\n },\n {\n \"id\": \"callout.behavior.spotlightPadding\",\n \"value\": 6,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": 6,\n \"DarkTheme\": 6\n }\n },\n {\n \"id\": \"callout.behavior.spotlightRadius\",\n \"value\": \"xs\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"xs\",\n \"DarkTheme\": \"xs\"\n }\n },\n {\n \"id\": \"callout.behavior.ringWidth\",\n \"value\": 2,\n \"type\": \"number\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": 2,\n \"DarkTheme\": 2\n }\n },\n {\n \"id\": \"callout.behavior.motion\",\n \"value\": \"panel\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"callout\",\n \"themeValues\": {\n \"LightTheme\": \"panel\",\n \"DarkTheme\": \"panel\"\n }\n },\n {\n \"id\": \"tour.behavior.progressStyle\",\n \"value\": \"dots\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tour\",\n \"themeValues\": {\n \"LightTheme\": \"dots\",\n \"DarkTheme\": \"dots\"\n }\n },\n {\n \"id\": \"tour.behavior.footerGap\",\n \"value\": \"sm\",\n \"type\": \"string\",\n \"kind\": \"behavioral\",\n \"target\": \"component-prop\",\n \"appliesTo\": \"tour\",\n \"themeValues\": {\n \"LightTheme\": \"sm\",\n \"DarkTheme\": \"sm\"\n }\n }\n ],\n \"themes\": [\n {\n \"id\": \"LightTheme\",\n \"name\": \"Light Theme\",\n \"description\": \"The Light Theme theme for the Uni Design System.\",\n \"styleOverrides\": {\n \"color.primary\": \"#6A6F8F\",\n \"color.on-primary\": \"#F9FAFF\",\n \"color.primary-container\": \"#DBDDEA\",\n \"color.on-primary-container\": \"#1A1C37\",\n \"color.on-primary-container-variant\": \"#5B5D68\",\n \"color.on-primary-container-border\": \"#6A6F8F\",\n \"color.primary-surface\": \"#F3F5FD\",\n \"color.on-primary-surface\": \"#1E1F25\",\n \"color.on-primary-surface-variant\": \"#6A6F8F\",\n \"color.secondary\": \"#8C685D\",\n \"color.on-secondary\": \"#FFF8F6\",\n \"color.secondary-container\": \"#E9DAD6\",\n \"color.on-secondary-container\": \"#33160D\",\n \"color.on-secondary-container-variant\": \"#675A57\",\n \"color.on-secondary-container-border\": \"#8C685D\",\n \"color.secondary-surface\": \"#FDF3EF\",\n \"color.on-secondary-surface\": \"#251D1B\",\n \"color.on-secondary-surface-variant\": \"#8C685D\",\n \"color.tertiary\": \"#597B66\",\n \"color.on-tertiary\": \"#F0FFF5\",\n \"color.tertiary-container\": \"#D5E2D9\",\n \"color.on-tertiary-container\": \"#052615\",\n \"color.on-tertiary-container-variant\": \"#56615A\",\n \"color.on-tertiary-container-border\": \"#597B66\",\n \"color.tertiary-surface\": \"#EFF8F2\",\n \"color.on-tertiary-surface\": \"#1B211D\",\n \"color.on-tertiary-surface-variant\": \"#557762\",\n \"color.quaternary\": \"#61636A\",\n \"color.on-quaternary\": \"#F9FAFF\",\n \"color.quaternary-surface\": \"#F3F5FD\",\n \"color.on-quaternary-surface\": \"#1E1F25\",\n \"color.on-quaternary-surface-variant\": \"#6A6F8F\",\n \"color.on-quaternary-container-variant\": \"#5B5D68\",\n \"color.on-quaternary-container-border\": \"#61636A\",\n \"color.error\": \"#CC2827\",\n \"color.on-error\": \"#FFF8F7\",\n \"color.error-container\": \"#FFD2CC\",\n \"color.on-error-container\": \"#331512\",\n \"color.warn\": \"#AC5700\",\n \"color.on-warn\": \"#FFF9F5\",\n \"color.warn-container\": \"#FDD5BA\",\n \"color.on-warn-container\": \"#311805\",\n \"color.on-warn-container-variant\": \"#78543C\",\n \"color.on-warn-container-border\": \"#AC5700\",\n \"color.success\": \"#008341\",\n \"color.on-success\": \"#F1FEF4\",\n \"color.success-container\": \"#C3EACC\",\n \"color.on-success-container\": \"#092613\",\n \"color.on-success-container-variant\": \"#43684D\",\n \"color.on-success-container-border\": \"#008341\",\n \"color.background\": \"#FDFDFF\",\n \"color.on-background\": \"#202127\",\n \"color.on-background-variant\": \"#5C5D65\",\n \"color.surface\": \"#F9FAFF\",\n \"color.on-surface\": \"#202127\",\n \"color.surface-variant\": \"#E9EBF3\",\n \"color.on-surface-variant\": \"#36373E\",\n \"color.inverse-surface\": \"#2C2D34\",\n \"color.on-inverse-surface\": \"#F3F5FD\",\n \"color.on-inverse-surface-primary\": \"#8D93B4\",\n \"color.on-inverse-surface-variant\": \"#8D93B4\",\n \"color.inverse-container\": \"#2C2D34\",\n \"color.on-inverse-container\": \"#F3F5FD\",\n \"color.outline\": \"#7E8088\",\n \"color.shadow\": \"#000000\",\n \"color.scrim\": \"#000000\",\n \"color.surface-tint\": \"#6A6F8F\",\n \"color.transparent\": \"rgba(0,0,0,0)\",\n \"color.ghost\": \"rgba(0,0,0,0)\",\n \"color.disabled\": \"rgba(0,0,0,0.12)\",\n \"color.on-disabled\": \"rgba(0,0,0,0.38)\",\n \"color.disabled-container\": \"#EFF1FA\",\n \"color.on-disabled-container\": \"rgba(0,0,0,0.38)\",\n \"color.disabled-surface\": \"rgba(0,0,0,0.12)\",\n \"color.on-disabled-surface\": \"rgba(0,0,0,0.5)\",\n \"color.on-disabled-surface-variant\": \"rgba(0,0,0,0.4)\",\n \"radius.none\": \"none\",\n \"radius.xxs\": \"4px\",\n \"radius.xs\": \"8px\",\n \"radius.sm\": \"16px\",\n \"radius.md\": \"24px\",\n \"radius.lg\": \"32px\",\n \"radius.max\": \"999px\",\n \"spacing.none\": 0,\n \"spacing.xxs\": \"2px\",\n \"spacing.xs\": \"4px\",\n \"spacing.sm\": \"8px\",\n \"spacing.md\": \"16px\",\n \"spacing.lg\": \"32px\",\n \"spacing.xl\": \"64px\",\n \"spacing.xxl\": \"128px\",\n \"border.primary\": \"1px solid #6A6F8F\",\n \"border.secondary\": \"1px solid #8C685D\",\n \"border.tertiary\": \"1px solid #597B66\",\n \"border.quaternary\": \"1px solid #61636A\",\n \"border.warn\": \"1px solid #AC5700\",\n \"border.success\": \"1px solid #008341\",\n \"border.light\": \"1px solid #7E8088\",\n \"border.dark\": \"1px solid #202127\",\n \"border.dotted\": \"1px dotted #202127\",\n \"shadow.raised\": \"rgba(23, 25, 43, 0.2) 0px 2px 1px -1px, rgba(23, 25, 43, 0.14) 0px 1px 1px 0px, rgba(23, 25, 43, 0.12) 0px 1px 3px 0px\",\n \"shadow.menu\": \"rgba(23, 25, 43, 0.2) 0px 3px 3px -2px, rgba(23, 25, 43, 0.14) 0px 3px 4px 0px, rgba(23, 25, 43, 0.12) 0px 1px 8px 0px\",\n \"shadow.dialog\": \"rgba(23, 25, 43, 0.2) 0px 3px 5px -1px, rgba(23, 25, 43, 0.14) 0px 6px 10px 0px, rgba(23, 25, 43, 0.12) 0px 1px 18px 0px\",\n \"shadow.warn\": \"0 0 5px rgba(204, 40, 39, 0.5), inset 0 0 5px rgba(204, 40, 39, 0.3)\",\n \"backdrop.scrim\": \"{\\\"background\\\":\\\"rgba(255, 255, 255, 0.6)\\\",\\\"backdropFilter\\\":\\\"blur(2px)\\\"}\",\n \"thickness.thin\": 1,\n \"thickness.standard\": 2,\n \"thickness.thick\": 4,\n \"typography.display-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":57,\\\"lineHeight\\\":64,\\\"fontWeight\\\":\\\"normal\\\",\\\"letterSpacing\\\":-0.25}\",\n \"typography.display-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":45,\\\"lineHeight\\\":52,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.display-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":36,\\\"lineHeight\\\":44,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":40,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":28,\\\"lineHeight\\\":36,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":24,\\\"lineHeight\\\":32,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.title-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":22,\\\"lineHeight\\\":28,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.title-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.15}\",\n \"typography.title-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontWeight\\\":\\\"medium\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"letterSpacing\\\":0.1}\",\n \"typography.body-1-long\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":22}\",\n \"typography.body-1-short\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.body-2-long\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":18}\",\n \"typography.body-2-short\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"typography.subtitle-1\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"letterSpacing\\\":0.15}\",\n \"typography.subtitle-2\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.1}\",\n \"typography.label\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"typography.button\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"textTransform\\\":\\\"capitalize\\\"}\",\n \"typography.caption\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":12,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":0.4}\",\n \"typography.overline\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":10,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":1.5,\\\"textTransform\\\":\\\"uppercase\\\"}\",\n \"typography.paragraph\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.quote\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.note\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":22,\\\"fontStyle\\\":\\\"italic\\\"}\",\n \"typography.badge\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.stat\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":38,\\\"fontWeight\\\":600,\\\"letterSpacing\\\":-0.32}\",\n \"typography.tag\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":15,\\\"lineHeight\\\":20,\\\"fontWeight\\\":600}\",\n \"typography.input\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":24}\"\n },\n \"componentOptions\": {\n \"alert\": {\n \"topPosition\": 40,\n \"borderRadius\": \"sm\",\n \"motion\": \"notification\",\n \"elevation\": \"md\"\n },\n \"breadcrumb\": {\n \"typeface\": \"label\",\n \"color\": \"on-background-variant\",\n \"currentColor\": \"on-background\",\n \"separatorSymbol\": \"chevron_right\",\n \"gap\": \"xs\"\n },\n \"appBar\": {\n \"color\": \"surface\",\n \"height\": 56,\n \"divider\": \"light\",\n \"typeface\": \"title-large\",\n \"padding\": \"md\",\n \"gap\": \"md\"\n },\n \"drawer\": {\n \"color\": \"surface\",\n \"width\": 280,\n \"divider\": \"light\",\n \"elevation\": \"menu\",\n \"padding\": \"md\",\n \"backdrop\": \"scrim\",\n \"scrim\": true,\n \"background\": \"solid\",\n \"motion\": \"panel\"\n },\n \"drawerHeader\": {\n \"height\": 56,\n \"padding\": \"md\",\n \"textRole\": \"title-medium\",\n \"textAlign\": \"left\",\n \"divider\": \"light\",\n \"closeButtonIcon\": \"close\",\n \"closeButtonSize\": \"md\"\n },\n \"drawerButtons\": {\n \"gap\": \"sm\",\n \"padding\": \"md\",\n \"justifyContent\": \"flex-end\",\n \"confirmButtonVariant\": \"primary\",\n \"cancelButtonVariant\": \"quaternary\",\n \"buttonSize\": \"md\",\n \"divider\": \"light\",\n \"stretch\": false,\n \"reverseOrder\": false\n },\n \"avatar\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"subtitle-2\",\n \"fallbackSymbol\": \"person\"\n },\n \"avatarGroup\": {\n \"overlap\": \"sm\",\n \"ringColor\": \"surface\",\n \"ringWidth\": 2\n },\n \"searchInput\": {\n \"searchSymbol\": \"search\",\n \"clearSymbol\": \"close\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxSuggestions\": 8\n },\n \"checkbox\": {\n \"size\": 20,\n \"boxColor\": \"surface\",\n \"borderRadius\": 2,\n \"focusRingGap\": 2\n },\n \"radio\": {\n \"size\": 20,\n \"ringColor\": \"outline\",\n \"fillColor\": \"surface\",\n \"motion\": \"control\"\n },\n \"dialog\": {\n \"borderRadius\": \"lg\",\n \"color\": \"primary-surface\",\n \"border\": \"quaternary\",\n \"padding\": \"sm\",\n \"inset\": \"lg\",\n \"elevation\": \"dialog\",\n \"backdrop\": \"scrim\",\n \"motion\": \"panel\"\n },\n \"dialogButtons\": {\n \"gap\": \"md\",\n \"padding\": \"md\",\n \"paddingBottom\": \"lg\",\n \"justifyContent\": \"center\",\n \"confirmButtonVariant\": \"primary\",\n \"cancelButtonVariant\": \"warn\",\n \"buttonSize\": \"lg\",\n \"stretch\": false,\n \"reverseOrder\": false\n },\n \"dialogHeader\": {\n \"borderRadius\": \"max\",\n \"color\": \"primary\",\n \"height\": 48,\n \"textRole\": \"title-large\",\n \"textAlign\": \"center\",\n \"closeButtonIcon\": \"close\",\n \"closeButtonSize\": \"md\"\n },\n \"dropdown\": {\n \"border\": \"none\",\n \"borderRadius\": \"xxs\",\n \"color\": \"primary-surface\",\n \"shadow\": \"menu\",\n \"motion\": \"popup\"\n },\n \"menu\": {\n \"minWidth\": 184,\n \"paddingVertical\": \"xs\",\n \"paddingHorizontal\": \"none\",\n \"dividerBorder\": \"light\",\n \"dividerSpacing\": \"xs\"\n },\n \"menuItem\": {\n \"height\": 38,\n \"paddingHorizontal\": \"md\",\n \"gap\": \"md\",\n \"borderRadius\": \"none\",\n \"typeface\": \"label\",\n \"hoverColor\": \"primary-container\",\n \"activeSymbol\": \"check\",\n \"motion\": \"control\"\n },\n \"popover\": {\n \"color\": \"primary-surface\",\n \"border\": \"quaternary\",\n \"borderRadius\": \"xs\",\n \"shadow\": \"raised\",\n \"typeface\": \"label\",\n \"padding\": \"6px 12px\",\n \"maxWidth\": \"38ch\",\n \"offset\": 7,\n \"arrowSize\": 8,\n \"closeSymbol\": \"close\",\n \"headerTypeface\": \"title-small\",\n \"tooltipPadding\": \"4px 8px\",\n \"tooltipOpenDelay\": 500,\n \"tooltipCloseDelay\": 150,\n \"motion\": \"panel\"\n },\n \"expand\": {\n \"motion\": \"reveal\"\n },\n \"footer\": {\n \"height\": 52,\n \"color\": \"primary\",\n \"logoHeight\": 18.6,\n \"logoPadding\": \"md\"\n },\n \"input\": {\n \"typeface\": \"input\",\n \"color\": \"primary-surface\",\n \"textColor\": \"on-primary-surface\",\n \"disabledColor\": \"disabled-surface\",\n \"disabledTextColor\": \"on-disabled-surface\",\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"errorShadow\": \"warn\",\n \"errorBorder\": \"warn\",\n \"height\": 32,\n \"paddingLeft\": \"sm\",\n \"focusOutline\": \"2px solid #6A6F8F\",\n \"focusOutlineOffset\": 2\n },\n \"textarea\": {\n \"rows\": 3,\n \"resize\": \"vertical\"\n },\n \"numberInput\": {\n \"stepperLayout\": \"stacked\",\n \"incrementIcon\": \"plus\",\n \"decrementIcon\": \"minus\",\n \"stepUpIcon\": \"chevronUp\",\n \"stepDownIcon\": \"chevronDown\",\n \"stepperWidth\": 32,\n \"minTouchTarget\": 24,\n \"affixColor\": \"on-primary-surface-variant\",\n \"affixGap\": \"xs\",\n \"align\": \"start\",\n \"tabularNumerals\": true,\n \"repeatDelayMs\": 500,\n \"repeatIntervalMs\": 100,\n \"repeatFastIntervalMs\": 25,\n \"repeatRampMs\": 2000\n },\n \"numberRangeInput\": {\n \"partGap\": \"sm\",\n \"dividerText\": \"–\",\n \"dividerColor\": \"outline\",\n \"affixColor\": \"on-primary-surface-variant\",\n \"affixGap\": \"xs\"\n },\n \"quantityStepper\": {\n \"incrementIcon\": \"plus\",\n \"decrementIcon\": \"minus\",\n \"deleteIcon\": \"delete\",\n \"tabularNumerals\": true,\n \"valueWidth\": \"3ch\"\n },\n \"tabs\": {\n \"typeface\": \"title-small\",\n \"textColor\": \"on-surface-variant\",\n \"activeTextColor\": \"primary\",\n \"indicatorColor\": \"primary\",\n \"indicatorThickness\": \"standard\",\n \"divider\": \"light\",\n \"gap\": \"sm\",\n \"borderRadius\": \"none\",\n \"padding\": \"md\"\n },\n \"multiSelectDropdown\": {\n \"textRole\": \"input\",\n \"textColor\": \"on-primary-surface\",\n \"dividerBorder\": \"light\",\n \"searchInputBorder\": \"light\",\n \"searchInputBorderRadius\": \"xxs\",\n \"focusOutline\": \"2px solid #6A6F8F\",\n \"focusOutlineOffset\": 2\n },\n \"badge\": {\n \"borderRadius\": \"xxs\"\n },\n \"tag\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"tag\",\n \"gap\": \"xs\",\n \"removeIcon\": \"close\",\n \"selectedIcon\": \"check\"\n },\n \"tagInput\": {\n \"chipGap\": \"xs\",\n \"chipSize\": \"md\",\n \"minInputWidth\": \"12ch\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxSuggestions\": 8\n },\n \"calendar\": {\n \"dayBorderRadius\": \"max\",\n \"typeface\": \"label\",\n \"gap\": \"xxs\",\n \"navPrevSymbol\": \"chevron_left\",\n \"navNextSymbol\": \"chevron_right\",\n \"weekdayFormat\": \"short\",\n \"showOutsideDays\": false,\n \"todayStyle\": \"outline\"\n },\n \"combobox\": {\n \"toggleIcon\": \"chevronDown\",\n \"clearIcon\": \"close\",\n \"selectedIcon\": \"check\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxVisibleOptions\": 8,\n \"descriptionColor\": \"on-primary-surface-variant\"\n },\n \"dateInput\": {\n \"toggleSymbol\": \"calendar_month\",\n \"popupShadow\": \"menu\",\n \"popupBorderRadius\": \"xs\",\n \"popupColor\": \"primary-surface\"\n },\n \"timeInput\": {\n \"toggleSymbol\": \"schedule\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxVisibleOptions\": 7\n },\n \"dateTimeInput\": {\n \"partGap\": \"sm\",\n \"dividerColor\": \"outline\"\n },\n \"button\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"button\"\n },\n \"iconButton\": {\n \"borderRadius\": \"max\"\n },\n \"card\": {\n \"borderRadius\": \"xs\"\n },\n \"dataSearch\": {\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"color\": \"primary-surface\",\n \"placeholderColor\": \"disabled\"\n },\n \"dataTable\": {\n \"color\": \"primary-surface\",\n \"border\": \"light\",\n \"borderRadius\": \"sm\",\n \"headerPadding\": \"sm\",\n \"footerPadding\": \"sm\",\n \"thTextRole\": \"headline-small\",\n \"thColor\": \"primary-container\",\n \"thVerticalBorder\": \"dotted\",\n \"thHorizontalBorder\": \"light\",\n \"thPadding\": \"sm\",\n \"tdTextRole\": \"title-small\",\n \"tdColor\": \"primary-surface\",\n \"tdStickyColor\": \"primary-container\",\n \"tdPadding\": \"sm\",\n \"tdVerticalBorder\": \"dotted\",\n \"tdHorizontalBorder\": \"light\",\n \"rowHoverColor\": \"primary-container\",\n \"loadingOverlayColor\": \"scrim\",\n \"loadingSpinnerColor\": \"primary\",\n \"loadingSpinnerSize\": 40\n },\n \"notificationBadge\": {\n \"borderRadius\": \"sm\",\n \"offset\": -10\n },\n \"paginator\": {\n \"gap\": \"xs\",\n \"textRole\": \"label\",\n \"inputBorder\": \"light\",\n \"inputBorderRadius\": \"xs\",\n \"pageBorderRadius\": \"xs\",\n \"currentPageBorder\": \"light\",\n \"currentPageBorderRadius\": \"xs\"\n },\n \"stat\": {\n \"labelTypeface\": \"label\",\n \"valueTypeface\": \"stat\",\n \"color\": \"surface\",\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"positiveColor\": \"success\",\n \"negativeColor\": \"error\",\n \"trendColor\": \"outline\",\n \"trendAccent\": \"primary\",\n \"padding\": \"md\",\n \"gap\": \"xxs\"\n },\n \"slider\": {\n \"trackHeight\": 4,\n \"trackColor\": \"primary-container\",\n \"borderRadius\": \"max\",\n \"thumbSize\": 16,\n \"thumbBorderRadius\": \"max\",\n \"minTouchTarget\": 24,\n \"markSize\": 3,\n \"markColor\": \"on-primary-container\",\n \"labelTypeface\": \"label\",\n \"labelColor\": \"on-surface-variant\",\n \"tooltipColor\": \"inverse-surface\",\n \"tooltipTextColor\": \"on-inverse-surface\",\n \"tooltipShadow\": \"menu\",\n \"tooltipBorderRadius\": \"xs\",\n \"transitionMs\": 120\n },\n \"skeleton\": {\n \"color\": \"surface-variant\",\n \"highlightColor\": \"surface\",\n \"borderRadius\": \"xs\",\n \"animation\": \"shimmer\",\n \"duration\": 1.4,\n \"direction\": \"ltr\",\n \"highlightWidth\": 40,\n \"gap\": \"sm\"\n },\n \"snackbar\": {\n \"bottomPosition\": 40,\n \"motion\": \"notification\",\n \"autoCloseDelay\": 35000\n },\n \"symbol\": {\n \"fill\": 0,\n \"weight\": 400,\n \"grade\": 0,\n \"opticalSize\": 24\n },\n \"toggle\": {\n \"trackColor\": \"surface-variant\",\n \"knobColor\": \"surface\",\n \"motion\": \"control\"\n },\n \"tooltip\": {\n \"borderRadius\": \"xs\",\n \"shadow\": \"raised\",\n \"color\": \"inverse-surface\",\n \"typeface\": \"label\"\n },\n \"callout\": {\n \"color\": \"primary-surface\",\n \"borderRadius\": \"xs\",\n \"shadow\": \"menu\",\n \"width\": \"320px\",\n \"padding\": \"16px\",\n \"headerTypeface\": \"title-small\",\n \"typeface\": \"label\",\n \"closeSymbol\": \"close\",\n \"arrowSize\": 8,\n \"offset\": 12,\n \"scrimColor\": \"rgba(0, 0, 0, 0.45)\",\n \"spotlightPadding\": 6,\n \"spotlightRadius\": \"xs\",\n \"ringWidth\": 2,\n \"motion\": \"panel\"\n },\n \"tour\": {\n \"progressStyle\": \"dots\",\n \"footerGap\": \"sm\"\n }\n },\n \"usage\": \"Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`LightTheme`).\"\n },\n {\n \"id\": \"DarkTheme\",\n \"name\": \"Dark Theme\",\n \"description\": \"The Dark Theme theme for the Uni Design System.\",\n \"styleOverrides\": {\n \"color.primary\": \"#AFB5D8\",\n \"color.on-primary\": \"#11132C\",\n \"color.primary-container\": \"#4A4C57\",\n \"color.on-primary-container\": \"#F9FAFF\",\n \"color.on-primary-container-variant\": \"#BCBECB\",\n \"color.on-primary-container-border\": \"#AFB5D8\",\n \"color.primary-surface\": \"#22242A\",\n \"color.on-primary-surface\": \"#F9FAFF\",\n \"color.on-primary-surface-variant\": \"#AFB5D8\",\n \"color.secondary\": \"#D5ADA1\",\n \"color.on-secondary\": \"#280C05\",\n \"color.secondary-container\": \"#564A46\",\n \"color.on-secondary-container\": \"#FFF8F7\",\n \"color.on-secondary-container-variant\": \"#CABCB7\",\n \"color.on-secondary-container-border\": \"#D5ADA1\",\n \"color.secondary-surface\": \"#292220\",\n \"color.on-secondary-surface\": \"#FFF8F7\",\n \"color.on-secondary-surface-variant\": \"#D5ADA1\",\n \"color.tertiary\": \"#9EC2AB\",\n \"color.on-tertiary\": \"#001C0D\",\n \"color.tertiary-container\": \"#465049\",\n \"color.on-tertiary-container\": \"#F0FFF5\",\n \"color.on-tertiary-container-variant\": \"#B7C3BB\",\n \"color.on-tertiary-container-border\": \"#9EC2AB\",\n \"color.tertiary-surface\": \"#1F2622\",\n \"color.on-tertiary-surface\": \"#F4FDF7\",\n \"color.on-tertiary-surface-variant\": \"#9EC2AB\",\n \"color.quaternary\": \"#A2A4AC\",\n \"color.on-quaternary\": \"#15161C\",\n \"color.quaternary-surface\": \"#22242A\",\n \"color.on-quaternary-surface\": \"#F9FAFF\",\n \"color.on-quaternary-surface-variant\": \"#AFB5D8\",\n \"color.on-quaternary-container-variant\": \"#AEB0BD\",\n \"color.on-quaternary-container-border\": \"#A2A4AC\",\n \"color.error\": \"#FF968A\",\n \"color.on-error\": \"#290B09\",\n \"color.error-container\": \"#69413C\",\n \"color.on-error-container\": \"#FFF8F7\",\n \"color.warn\": \"#FF9B51\",\n \"color.on-warn\": \"#270E00\",\n \"color.warn-container\": \"#66442E\",\n \"color.on-warn-container\": \"#FFF9F5\",\n \"color.on-warn-container-variant\": \"#DFB69B\",\n \"color.on-warn-container-border\": \"#FF9B51\",\n \"color.success\": \"#59D483\",\n \"color.on-success\": \"#011C0A\",\n \"color.success-container\": \"#34563D\",\n \"color.on-success-container\": \"#F1FEF4\",\n \"color.on-success-container-variant\": \"#A3CBAD\",\n \"color.on-success-container-border\": \"#59D483\",\n \"color.background\": \"#101117\",\n \"color.on-background\": \"#E5E7F0\",\n \"color.on-background-variant\": \"#AFB0B9\",\n \"color.surface\": \"#17181E\",\n \"color.on-surface\": \"#E5E7F0\",\n \"color.surface-variant\": \"#313239\",\n \"color.on-surface-variant\": \"#AFB0B9\",\n \"color.inverse-surface\": \"#E5E7F0\",\n \"color.on-inverse-surface\": \"#202127\",\n \"color.on-inverse-surface-primary\": \"#5F6483\",\n \"color.on-inverse-surface-variant\": \"#5F6483\",\n \"color.inverse-container\": \"#E5E7F0\",\n \"color.on-inverse-container\": \"#202127\",\n \"color.outline\": \"#90929A\",\n \"color.shadow\": \"#000000\",\n \"color.scrim\": \"#000000\",\n \"color.surface-tint\": \"#AFB5D8\",\n \"color.transparent\": \"rgba(0,0,0,0)\",\n \"color.ghost\": \"rgba(0,0,0,0)\",\n \"color.disabled\": \"rgba(255,255,255,0.12)\",\n \"color.on-disabled\": \"rgba(255,255,255,0.38)\",\n \"color.disabled-container\": \"#2C2D34\",\n \"color.on-disabled-container\": \"rgba(255,255,255,0.38)\",\n \"color.disabled-surface\": \"rgba(255,255,255,0.12)\",\n \"color.on-disabled-surface\": \"rgba(255,255,255,0.5)\",\n \"color.on-disabled-surface-variant\": \"rgba(255,255,255,0.4)\",\n \"radius.none\": \"none\",\n \"radius.xxs\": \"4px\",\n \"radius.xs\": \"8px\",\n \"radius.sm\": \"16px\",\n \"radius.md\": \"24px\",\n \"radius.lg\": \"32px\",\n \"radius.max\": \"999px\",\n \"spacing.none\": 0,\n \"spacing.xxs\": \"2px\",\n \"spacing.xs\": \"4px\",\n \"spacing.sm\": \"8px\",\n \"spacing.md\": \"16px\",\n \"spacing.lg\": \"32px\",\n \"spacing.xl\": \"64px\",\n \"spacing.xxl\": \"128px\",\n \"border.primary\": \"1px solid #AFB5D8\",\n \"border.secondary\": \"1px solid #D5ADA1\",\n \"border.tertiary\": \"1px solid #9EC2AB\",\n \"border.quaternary\": \"1px solid #A2A4AC\",\n \"border.warn\": \"1px solid #FF9B51\",\n \"border.success\": \"1px solid #59D483\",\n \"border.light\": \"1px solid #90929A\",\n \"border.dark\": \"1px solid #E5E7F0\",\n \"border.dotted\": \"1px dotted #E5E7F0\",\n \"shadow.raised\": \"none\",\n \"shadow.menu\": \"0px 4px 12px rgba(0, 0, 0, 0.45)\",\n \"shadow.dialog\": \"0px 8px 28px rgba(0, 0, 0, 0.55)\",\n \"shadow.warn\": \"0 0 5px rgba(255, 150, 138, 0.55), inset 0 0 5px rgba(255, 150, 138, 0.35)\",\n \"backdrop.scrim\": \"{\\\"background\\\":\\\"rgba(255, 255, 255, 0.6)\\\",\\\"backdropFilter\\\":\\\"blur(2px)\\\"}\",\n \"thickness.thin\": 1,\n \"thickness.standard\": 2,\n \"thickness.thick\": 4,\n \"typography.display-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":57,\\\"lineHeight\\\":64,\\\"fontWeight\\\":\\\"normal\\\",\\\"letterSpacing\\\":-0.25}\",\n \"typography.display-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":45,\\\"lineHeight\\\":52,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.display-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":36,\\\"lineHeight\\\":44,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":40,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":28,\\\"lineHeight\\\":36,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.headline-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":24,\\\"lineHeight\\\":32,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.title-large\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":22,\\\"lineHeight\\\":28,\\\"fontWeight\\\":\\\"normal\\\"}\",\n \"typography.title-medium\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.15}\",\n \"typography.title-small\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontWeight\\\":\\\"medium\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"letterSpacing\\\":0.1}\",\n \"typography.body-1-long\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":22}\",\n \"typography.body-1-short\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.body-2-long\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":18}\",\n \"typography.body-2-short\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"typography.subtitle-1\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24,\\\"letterSpacing\\\":0.15}\",\n \"typography.subtitle-2\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"letterSpacing\\\":0.1}\",\n \"typography.label\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20}\",\n \"typography.button\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":20,\\\"fontWeight\\\":\\\"medium\\\",\\\"textTransform\\\":\\\"capitalize\\\"}\",\n \"typography.caption\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":12,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":0.4}\",\n \"typography.overline\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":10,\\\"lineHeight\\\":18,\\\"letterSpacing\\\":1.5,\\\"textTransform\\\":\\\"uppercase\\\"}\",\n \"typography.paragraph\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.quote\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.note\": \"{\\\"fontFamily\\\":\\\"Roboto\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":22,\\\"fontStyle\\\":\\\"italic\\\"}\",\n \"typography.badge\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":16,\\\"lineHeight\\\":24}\",\n \"typography.stat\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":32,\\\"lineHeight\\\":38,\\\"fontWeight\\\":600,\\\"letterSpacing\\\":-0.32}\",\n \"typography.tag\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":15,\\\"lineHeight\\\":20,\\\"fontWeight\\\":600}\",\n \"typography.input\": \"{\\\"fontFamily\\\":\\\"Red Hat Display\\\",\\\"fontSize\\\":14,\\\"lineHeight\\\":24}\"\n },\n \"componentOptions\": {\n \"alert\": {\n \"topPosition\": 40,\n \"borderRadius\": \"sm\",\n \"motion\": \"notification\",\n \"elevation\": \"md\"\n },\n \"breadcrumb\": {\n \"typeface\": \"label\",\n \"color\": \"on-background-variant\",\n \"currentColor\": \"on-background\",\n \"separatorSymbol\": \"chevron_right\",\n \"gap\": \"xs\"\n },\n \"appBar\": {\n \"color\": \"surface\",\n \"height\": 56,\n \"divider\": \"light\",\n \"typeface\": \"title-large\",\n \"padding\": \"md\",\n \"gap\": \"md\"\n },\n \"drawer\": {\n \"color\": \"surface\",\n \"width\": 280,\n \"divider\": \"light\",\n \"elevation\": \"menu\",\n \"padding\": \"md\",\n \"backdrop\": \"scrim\",\n \"scrim\": true,\n \"background\": \"solid\",\n \"motion\": \"panel\"\n },\n \"drawerHeader\": {\n \"height\": 56,\n \"padding\": \"md\",\n \"textRole\": \"title-medium\",\n \"textAlign\": \"left\",\n \"divider\": \"light\",\n \"closeButtonIcon\": \"close\",\n \"closeButtonSize\": \"md\"\n },\n \"drawerButtons\": {\n \"gap\": \"sm\",\n \"padding\": \"md\",\n \"justifyContent\": \"flex-end\",\n \"confirmButtonVariant\": \"primary\",\n \"cancelButtonVariant\": \"quaternary\",\n \"buttonSize\": \"md\",\n \"divider\": \"light\",\n \"stretch\": false,\n \"reverseOrder\": false\n },\n \"avatar\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"subtitle-2\",\n \"fallbackSymbol\": \"person\"\n },\n \"avatarGroup\": {\n \"overlap\": \"sm\",\n \"ringColor\": \"surface\",\n \"ringWidth\": 2\n },\n \"searchInput\": {\n \"searchSymbol\": \"search\",\n \"clearSymbol\": \"close\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxSuggestions\": 8\n },\n \"checkbox\": {\n \"size\": 20,\n \"boxColor\": \"surface\",\n \"borderRadius\": 2,\n \"focusRingGap\": 2\n },\n \"radio\": {\n \"size\": 20,\n \"ringColor\": \"outline\",\n \"fillColor\": \"surface\",\n \"motion\": \"control\"\n },\n \"dialog\": {\n \"borderRadius\": \"lg\",\n \"color\": \"primary-surface\",\n \"border\": \"quaternary\",\n \"padding\": \"sm\",\n \"inset\": \"lg\",\n \"elevation\": \"dialog\",\n \"backdrop\": \"scrim\",\n \"motion\": \"panel\"\n },\n \"dialogButtons\": {\n \"gap\": \"md\",\n \"padding\": \"md\",\n \"paddingBottom\": \"lg\",\n \"justifyContent\": \"center\",\n \"confirmButtonVariant\": \"primary\",\n \"cancelButtonVariant\": \"warn\",\n \"buttonSize\": \"lg\",\n \"stretch\": false,\n \"reverseOrder\": false\n },\n \"dialogHeader\": {\n \"borderRadius\": \"max\",\n \"color\": \"primary\",\n \"height\": 48,\n \"textRole\": \"title-large\",\n \"textAlign\": \"center\",\n \"closeButtonIcon\": \"close\",\n \"closeButtonSize\": \"md\"\n },\n \"dropdown\": {\n \"border\": \"none\",\n \"borderRadius\": \"xxs\",\n \"color\": \"primary-surface\",\n \"shadow\": \"menu\",\n \"motion\": \"popup\"\n },\n \"menu\": {\n \"minWidth\": 184,\n \"paddingVertical\": \"xs\",\n \"paddingHorizontal\": \"none\",\n \"dividerBorder\": \"light\",\n \"dividerSpacing\": \"xs\"\n },\n \"menuItem\": {\n \"height\": 38,\n \"paddingHorizontal\": \"md\",\n \"gap\": \"md\",\n \"borderRadius\": \"none\",\n \"typeface\": \"label\",\n \"hoverColor\": \"primary-container\",\n \"activeSymbol\": \"check\",\n \"motion\": \"control\"\n },\n \"popover\": {\n \"color\": \"primary-surface\",\n \"border\": \"quaternary\",\n \"borderRadius\": \"xs\",\n \"shadow\": \"raised\",\n \"typeface\": \"label\",\n \"padding\": \"6px 12px\",\n \"maxWidth\": \"38ch\",\n \"offset\": 7,\n \"arrowSize\": 8,\n \"closeSymbol\": \"close\",\n \"headerTypeface\": \"title-small\",\n \"tooltipPadding\": \"4px 8px\",\n \"tooltipOpenDelay\": 500,\n \"tooltipCloseDelay\": 150,\n \"motion\": \"panel\"\n },\n \"expand\": {\n \"motion\": \"reveal\"\n },\n \"footer\": {\n \"height\": 52,\n \"color\": \"primary\",\n \"logoHeight\": 18.6,\n \"logoPadding\": \"md\"\n },\n \"input\": {\n \"typeface\": \"input\",\n \"color\": \"primary-surface\",\n \"textColor\": \"on-primary-surface\",\n \"disabledColor\": \"disabled-surface\",\n \"disabledTextColor\": \"on-disabled-surface\",\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"errorShadow\": \"warn\",\n \"errorBorder\": \"warn\",\n \"height\": 32,\n \"paddingLeft\": \"sm\",\n \"focusOutline\": \"2px solid #AFB5D8\",\n \"focusOutlineOffset\": 2\n },\n \"textarea\": {\n \"rows\": 3,\n \"resize\": \"vertical\"\n },\n \"numberInput\": {\n \"stepperLayout\": \"stacked\",\n \"incrementIcon\": \"plus\",\n \"decrementIcon\": \"minus\",\n \"stepUpIcon\": \"chevronUp\",\n \"stepDownIcon\": \"chevronDown\",\n \"stepperWidth\": 32,\n \"minTouchTarget\": 24,\n \"affixColor\": \"on-primary-surface-variant\",\n \"affixGap\": \"xs\",\n \"align\": \"start\",\n \"tabularNumerals\": true,\n \"repeatDelayMs\": 500,\n \"repeatIntervalMs\": 100,\n \"repeatFastIntervalMs\": 25,\n \"repeatRampMs\": 2000\n },\n \"numberRangeInput\": {\n \"partGap\": \"sm\",\n \"dividerText\": \"–\",\n \"dividerColor\": \"outline\",\n \"affixColor\": \"on-primary-surface-variant\",\n \"affixGap\": \"xs\"\n },\n \"quantityStepper\": {\n \"incrementIcon\": \"plus\",\n \"decrementIcon\": \"minus\",\n \"deleteIcon\": \"delete\",\n \"tabularNumerals\": true,\n \"valueWidth\": \"3ch\"\n },\n \"tabs\": {\n \"typeface\": \"title-small\",\n \"textColor\": \"on-surface-variant\",\n \"activeTextColor\": \"primary\",\n \"indicatorColor\": \"primary\",\n \"indicatorThickness\": \"standard\",\n \"divider\": \"light\",\n \"gap\": \"sm\",\n \"borderRadius\": \"none\",\n \"padding\": \"md\"\n },\n \"multiSelectDropdown\": {\n \"textRole\": \"input\",\n \"textColor\": \"on-primary-surface\",\n \"dividerBorder\": \"light\",\n \"searchInputBorder\": \"light\",\n \"searchInputBorderRadius\": \"xxs\",\n \"focusOutline\": \"2px solid #AFB5D8\",\n \"focusOutlineOffset\": 2\n },\n \"badge\": {\n \"borderRadius\": \"xxs\"\n },\n \"tag\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"tag\",\n \"gap\": \"xs\",\n \"removeIcon\": \"close\",\n \"selectedIcon\": \"check\"\n },\n \"tagInput\": {\n \"chipGap\": \"xs\",\n \"chipSize\": \"md\",\n \"minInputWidth\": \"12ch\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxSuggestions\": 8\n },\n \"calendar\": {\n \"dayBorderRadius\": \"max\",\n \"typeface\": \"label\",\n \"gap\": \"xxs\",\n \"navPrevSymbol\": \"chevron_left\",\n \"navNextSymbol\": \"chevron_right\",\n \"weekdayFormat\": \"short\",\n \"showOutsideDays\": false,\n \"todayStyle\": \"outline\"\n },\n \"combobox\": {\n \"toggleIcon\": \"chevronDown\",\n \"clearIcon\": \"close\",\n \"selectedIcon\": \"check\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxVisibleOptions\": 8,\n \"descriptionColor\": \"on-primary-surface-variant\"\n },\n \"dateInput\": {\n \"toggleSymbol\": \"calendar_month\",\n \"popupShadow\": \"menu\",\n \"popupBorderRadius\": \"xs\",\n \"popupColor\": \"primary-surface\"\n },\n \"timeInput\": {\n \"toggleSymbol\": \"schedule\",\n \"listColor\": \"primary-surface\",\n \"listShadow\": \"menu\",\n \"listBorderRadius\": \"xs\",\n \"activeColor\": \"primary-container\",\n \"maxVisibleOptions\": 7\n },\n \"dateTimeInput\": {\n \"partGap\": \"sm\",\n \"dividerColor\": \"outline\"\n },\n \"button\": {\n \"borderRadius\": \"max\",\n \"typeface\": \"button\"\n },\n \"iconButton\": {\n \"borderRadius\": \"max\"\n },\n \"card\": {\n \"borderRadius\": \"xs\"\n },\n \"dataSearch\": {\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"color\": \"primary-surface\",\n \"placeholderColor\": \"disabled\"\n },\n \"dataTable\": {\n \"color\": \"primary-surface\",\n \"border\": \"light\",\n \"borderRadius\": \"sm\",\n \"headerPadding\": \"sm\",\n \"footerPadding\": \"sm\",\n \"thTextRole\": \"headline-small\",\n \"thColor\": \"primary-container\",\n \"thVerticalBorder\": \"dotted\",\n \"thHorizontalBorder\": \"light\",\n \"thPadding\": \"sm\",\n \"tdTextRole\": \"title-small\",\n \"tdColor\": \"primary-surface\",\n \"tdStickyColor\": \"primary-container\",\n \"tdPadding\": \"sm\",\n \"tdVerticalBorder\": \"dotted\",\n \"tdHorizontalBorder\": \"light\",\n \"rowHoverColor\": \"primary-container\",\n \"loadingOverlayColor\": \"scrim\",\n \"loadingSpinnerColor\": \"primary\",\n \"loadingSpinnerSize\": 40\n },\n \"notificationBadge\": {\n \"borderRadius\": \"sm\",\n \"offset\": -10\n },\n \"paginator\": {\n \"gap\": \"xs\",\n \"textRole\": \"label\",\n \"inputBorder\": \"light\",\n \"inputBorderRadius\": \"xs\",\n \"pageBorderRadius\": \"xs\",\n \"currentPageBorder\": \"light\",\n \"currentPageBorderRadius\": \"xs\"\n },\n \"stat\": {\n \"labelTypeface\": \"label\",\n \"valueTypeface\": \"stat\",\n \"color\": \"surface\",\n \"border\": \"light\",\n \"borderRadius\": \"xs\",\n \"positiveColor\": \"success\",\n \"negativeColor\": \"error\",\n \"trendColor\": \"outline\",\n \"trendAccent\": \"primary\",\n \"padding\": \"md\",\n \"gap\": \"xxs\"\n },\n \"slider\": {\n \"trackHeight\": 4,\n \"trackColor\": \"primary-container\",\n \"borderRadius\": \"max\",\n \"thumbSize\": 16,\n \"thumbBorderRadius\": \"max\",\n \"minTouchTarget\": 24,\n \"markSize\": 3,\n \"markColor\": \"on-primary-container\",\n \"labelTypeface\": \"label\",\n \"labelColor\": \"on-surface-variant\",\n \"tooltipColor\": \"inverse-surface\",\n \"tooltipTextColor\": \"on-inverse-surface\",\n \"tooltipShadow\": \"menu\",\n \"tooltipBorderRadius\": \"xs\",\n \"transitionMs\": 120\n },\n \"skeleton\": {\n \"color\": \"surface-variant\",\n \"highlightColor\": \"surface\",\n \"borderRadius\": \"xs\",\n \"animation\": \"shimmer\",\n \"duration\": 1.4,\n \"direction\": \"ltr\",\n \"highlightWidth\": 40,\n \"gap\": \"sm\"\n },\n \"snackbar\": {\n \"bottomPosition\": 40,\n \"motion\": \"notification\",\n \"autoCloseDelay\": 35000\n },\n \"symbol\": {\n \"fill\": 0,\n \"weight\": 400,\n \"grade\": 0,\n \"opticalSize\": 24\n },\n \"toggle\": {\n \"trackColor\": \"surface-variant\",\n \"knobColor\": \"surface\",\n \"motion\": \"control\"\n },\n \"tooltip\": {\n \"borderRadius\": \"xs\",\n \"shadow\": \"raised\",\n \"color\": \"inverse-surface\",\n \"typeface\": \"label\"\n },\n \"callout\": {\n \"color\": \"primary-surface\",\n \"borderRadius\": \"xs\",\n \"shadow\": \"menu\",\n \"width\": \"320px\",\n \"padding\": \"16px\",\n \"headerTypeface\": \"title-small\",\n \"typeface\": \"label\",\n \"closeSymbol\": \"close\",\n \"arrowSize\": 8,\n \"offset\": 12,\n \"scrimColor\": \"rgba(0, 0, 0, 0.45)\",\n \"spotlightPadding\": 6,\n \"spotlightRadius\": \"xs\",\n \"ringWidth\": 2,\n \"motion\": \"panel\"\n },\n \"tour\": {\n \"progressStyle\": \"dots\",\n \"footerGap\": \"sm\"\n }\n },\n \"usage\": \"Apply style overrides through the Emotion theme provider (the `UniTheme` object), and pass component options as component inputs/props. Import the theme from `@uni-design-system/uni-core` (`DarkTheme`).\"\n }\n ],\n \"changelogs\": [\n {\n \"package\": \"@uni-design-system/uni-angular\",\n \"releases\": [\n {\n \"version\": \"10.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Give `uni-dialog` the drawer's three-row layout: a pinned `[uni-dialog-header]`, a scrolling body, and pinned `[uni-dialog-buttons]`.\",\n \"body\": \"The surface is now a flex column that is `overflow: clip` on both axes, so it is never the scroll container — previously a long form scrolled the dialog's own title and action buttons off the screen. Unlike the drawer, the dialog declares no height and stays sized by its content, growing until it reaches `calc(100dvh - 2 × inset)` and only then scrolling its body.\\n\\nNew theme options: `dialog.inset` (gap from the viewport edge before the body scrolls, default `lg`), `dialog.bodyPadding` (pads the scrolling row alone; `dialog.padding` still insets all three rows), and `divider` on `dialogHeader` / `dialogButtons` for a border between a pinned row and the body — all off or unchanged by default, so existing dialogs keep their appearance.\\n\\n`[uni-dialog-header]` gains the shorter `[dialog-header]` alias, matching `[dialog-buttons]`; the long form keeps working. The `defaultCloseButton` now actually floats in the corner — its `position: absolute` was being lost to the icon button's own class, which left it inline at the top of the surface.\\n\\nThe drawer's overlay scrim now fades in and out with the panel instead of snapping. Its `::backdrop` had a background and no animation at all, so the dimming appeared and vanished instantly around a panel that took 250ms to slide. A new `drawer.motion` option (default `panel`) times the slide, the scrim's fade and the side panel's width transition together, replacing the hardcoded 250ms literals. The global reduced-motion rule now also reaches `::backdrop`, so both the drawer's and the dialog's scrim honour the preference (WCAG 2.3.3).\\n\\nDialog and drawer scrims now come from one token. `UniTheme` gains a `backdrops` scale — open and named like `shadows` and `motion` — and both components' `backdrop` option points at a name (`'scrim'`) instead of carrying its own CSS. They had drifted: the dialog washed the page white and blurred it while the drawer dimmed it dark, and a theme that dressed the dialog left the drawer on the library default. A raw style object is still accepted on either option, so a theme that states one keeps working.\\n\\nThe dialog's fade now reads the theme's `motion` token too (new `dialog.motion` option, default `panel`), replacing a hardcoded `350ms ease-in`. It shared the drawer's scrim but not its timing, so the same surface arrived at two speeds; both are now 250ms and a theme retimes them together.\",\n \"commit\": \"cb5f08f\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-button`: the focus ring is themed, and the theme now outranks the reset.\",\n \"body\": \"**Five of the twelve variants had no visible keyboard focus ring.** The ring\\nresolved the variant _name_ as a colour token — the pattern 10.2.0 removed from\\ncheckbox, radio and toggle, missed on the one component where it costs an\\naccessibility failure rather than a wrong colour:\\n\\n```ts\\noutline: `2px solid ${this.theme.colors()[this.variant()]}`;\\n```\\n\\n`ghost` resolves to `transparent`, so its ring was drawn invisibly.\\n`light`, `onLight`, `dark` and `onDark` have no colour token at all, so the\\ndeclaration became `2px solid undefined` and the parser dropped it — as would\\nany intent a consumer registers. In every case `outline-offset` survived, so\\nthe element still shifted on focus and the missing ring went unnoticed. This\\nwas live without the registry involved.\\n\\nThe colour now comes from the variant's theme entry via `variantOptions`, the\\nmechanism the selection controls already use, and falls back to the reserved\\n`primary` accent rather than to nothing. Each variant keeps the ring colour it\\nhad; `ghost` gains a visible one. The ring also routes through the shared\\n`focusRingStyle`, so a theme defining `focusRing` primitives restyles the button\\nalongside every other control.\\n\\n**A theme could not give a button a border.** `border`, `outline`, `overflow`\\nand `transition` were applied _after_ the theme's styles, so a variant\\ndeclaring a border was silently erased and `!important` was the only way\\nthrough — which then spread to every state adjusting that border, since the\\nshorthand outranks the longhand.\\n\\nThe base theme was caught by its own reset: `secondary` is commented \\\"Hollow\\\"\\nand declares `1px solid`, and has been rendering borderless. **It now renders\\nits border** — the one visible change here for anyone on the default theme.\\n\\nThose four properties move ahead of the theme's styles, resolving the\\n`TODO: Set priority on theme-defined styles` that sat on this line. Structure\\nthe component genuinely owns — `position` for the ripple, the symbol slots —\\nstays after, and the reset still applies to every variant that does not\\noverride it.\\n\\n**`uni-icon-button`'s hover moved to the theme too.** It branched on\\n`variant() === 'ghost'` to choose between a raised shadow and a translucent\\nwash, after the theme's own styles. Being a binary partition, every intent a\\nconsumer registered fell into the not-ghost half and was given a lift whether\\nor not it suited — a recessive intent included — and no theme could correct it.\\nBoth themes in this repo declare a ghost hover and had it silently overridden.\\n\\nBoth treatments now live in `iconButton.variants` beside the colours they belong\\nwith. Rendering is unchanged for the variants the theme styles; a variant it\\ndoes not style no longer receives a hover it never asked for, and the `disabled`\\nvariant loses one it should never have had, since its block is also spread into\\n`&:disabled`.\\n\\n**`uni-icon-button` had no focus indicator at all.** Its structural block cleared\\nthe user-agent outline and put nothing back, in every variant — so the close\\naffordance in every dialog and drawer header was unreachable-looking under\\nkeyboard navigation. This was not reported; it was found while verifying the\\nbutton fix above.\\n\\nIt now draws the shared ring, with its colour read from the same\\n`variantOptions.focusColor` the button uses. The indicator is applied last on\\npurpose: its appearance is the theme's, through `focusColor` and the `focusRing`\\nprimitives, but whether one exists is not a style a theme should be able to\\nswitch off by accident.\",\n \"commit\": \"ab1689a\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Checkbox, radio and toggle take their accent from the theme, not from the\",\n \"body\": \"variant's name.\\n\\n**Twelve sites across the three controls resolved a variant name as a colour\\ntoken.** That held together only because every name in the closed union happened\\nto also be a colour. Under an open registry the coincidence ends by design:\\n`<uni-checkbox variant=\\\"destructive\\\">` would look up `colors['destructive']`,\\nmiss, and **silently render primary** — a wrong-coloured control with no error,\\nno warning, and nothing to grep for.\\n\\nCheckbox was worse than it looked. Alongside five `getThemeColor` calls it had\\ntwo more through a second resolver that built `on-${variant}`, so an\\nunregistered intent also missed its paired content colour and fell back to\\n`on-primary` — the tick would have stayed light on a dark fill even after the\\nbox was fixed.\\n\\nThe theme now says which colour draws each intent, through a new\\n`variantOptions` map on `ComponentTheme`:\\n\\n```ts\\ncheckbox: {\\n variantOptions: {\\n primary: { accent: 'primary' },\\n warn: { accent: 'warn' },\\n },\\n}\\n```\\n\\n`variantOptions` is per-variant data a component **reads**, as against `variants`,\\nwhich is CSS that gets **applied**. The distinction earns its place here: a\\ncheckbox's accent lands on the box outline, the checked and indeterminate fills,\\nthe tick and the focus ring at once, and expressing that as CSS would have meant\\nthe theme naming `.checkbox-check` and `.radio-inner` — promoting private DOM to\\npublic theme contract.\\n\\nAll three controls gain a `checkedColor` input as the per-instance override,\\nmatching the one `uni-toggle` already had; its resolution order is now input →\\nthe variant's themed accent → theme option. The base theme defines the same\\nseven intents `button` and `iconButton` do, so the library is consistent about\\nwhich exist by default, and `getThemeColor` — triplicated byte-for-byte across\\nthe three components, with a silent fallback to primary — is gone.\\n\\nRendering is unchanged for anything that does not set `variant`: the default\\nstill resolves to the primary accent and its paired on-colour.\",\n \"commit\": \"1cd0140\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`Variant` is an open registry: a design system can define its own intents.\",\n \"body\": \"A variant names _what an action means_, and it is the theme's job to describe\\nhow that intent is drawn. So the set of names was never Uni's to fix — an app\\nwhose actions are `destructive`, `subtle` and `info` had to translate them onto\\ntwelve names chosen elsewhere. `Variant` is now `keyof UniVariantRegistry`,\\nextended by declaration merging:\\n\\n```ts\\ndeclare module '@uni-design-system/uni-core' {\\n interface UniVariantRegistry {\\n destructive: true;\\n }\\n}\\n```\\n\\n`variant=\\\"destructive\\\"` then compiles wherever a variant is accepted, and\\n`variant=\\\"destructve\\\"` still does not — which the library's other open-token\\nidiom, `Named | (string & {})`, cannot give you, and which would also have\\ncollapsed the theme's `variants` map keys to `string`.\\n\\nOnly the type was ever closed: theme validation checks the _shape_ of a\\n`variants` block and never its key names, so a custom variant already reached\\n`componentStyle` untouched at runtime.\\n\\n**The registry extends; it cannot replace.** Declaration merging has no way to\\nremove a member, so Uni's twelve names stay legal in a consuming app; enforcing\\na house set is a lint concern rather than a type. Two names are reserved and\\ndocumented as always present: `primary`, which every component inherits as its\\ndefault, and `disabled`, which the disabled state resolves to.\\n\\n**An unthemed variant now says so.** With a closed union this was nearly\\nimpossible; with an open set it is the ordinary state of a work in progress —\\na variant registered and used before its theme block exists. The theme service\\nwarns once per component and variant in dev, naming what the theme does define,\\nmirroring what it already did for an unknown spacing token. Components that\\ntheme no variants at all stay silent, since a missing key there is not a gap.\",\n \"commit\": \"1cd0140\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-drawer` gains the API an editor panel needs, and a close it can refuse.\",\n \"body\": \"**Closing can now be vetoed.** Escape, the backdrop, the header's close button\\nand the footer's cancel all funnel through one decision that emits\\n`closeRequest` with a `reason` — `'escape' | 'backdrop' | 'close-button'`. Set\\n`disableAutoClose` and the drawer stops acting on its own: it asks, and waits\\nfor you to set `open`.\\n\\nThat split exists because the confirmation it has to accommodate is\\n_asynchronous_. A synchronous veto — a preventable event — cannot express\\n\\\"ask the user, then decide\\\", so every consumer would prevent unconditionally\\nand close manually anyway. Leave `disableAutoClose` off and behaviour is\\nunchanged, so adding a listener alone breaks nothing.\\n\\n```html\\n<uni-drawer [(open)]=\\\"open\\\" [disableAutoClose]=\\\"form.dirty()\\\" (closeRequest)=\\\"confirmDiscard()\\\" />\\n```\\n\\nNew inputs: `width` (per-instance override of the theme's width — a nav drawer\\nis 280 and an editor panel 480, and both live in one app), `headline` and\\n`defaultCloseButton` for the header row, and `initialFocus`, a selector resolved\\ninside the panel when it opens.\\n\\n**`ariaLabel` no longer defaults to `'Navigation'`.** A drawer with a header is\\nlabelled by that header via `aria-labelledby`; without one, `ariaLabel` is used;\\nwith neither, the drawer is unnamed. The old default meant every drawer that\\nwasn't a nav drawer announced itself as one, and a wrong accessible name is\\nworse than a missing one — the missing one is at least caught by an audit. If\\nyou relied on it, set `ariaLabel=\\\"Navigation\\\"` explicitly.\\n\\n**`scrim` turns the dimming off** without changing the modality. As a `scrim`\\ninput or a `drawer.behavior.scrim` theme option, false leaves `::backdrop`\\ntransparent so the page behind stays legible — an editor panel beside a board\\nthe user is still reading. Focus is still trapped and the page behind is still\\ninert: it is a visibility choice, not a modality one. `background` joins it,\\nselecting `solid`, `glass` or `gradient` as a token choice rather than per-app\\nCSS.\\n\\n**Fixed: a closed overlay drawer rendered in normal flow behind the page.** The\\npanel's `display: flex` outranks the UA stylesheet's\\n`dialog:not([open]) { display: none }`, so the drawer was visible on first\\npaint and reappeared behind the content after every close. An explicit\\n`&:not([open])` rule restores it. The closing animation is unaffected — `open`\\nis only removed once it ends.\",\n \"commit\": \"f28c951\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-drawer` is a three-row panel, and is no longer its own scroll container.\",\n \"body\": \"**The `<dialog>` used to be the scroller.** `over` mode set `overflowY: 'auto'`\\non the panel and put the theme's padding there too, which made a pinned header\\nor footer impossible: padding on a scrolling box scrolls away with its content,\\nand any row you pinned against it could not sit flush to the panel edge. It also\\nset only the one axis — and a single explicit overflow axis computes the other\\nto `auto`, which is exactly how a container becomes an accidental scroller.\\n`side` had it right already, setting both.\\n\\nThe panel is now a flex column of three rows — an optional\\n`[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]`\\n(alias `[drawer-buttons]`) — and **only the body scrolls**. The panel itself is\\n`overflow: clip` on both axes, explicitly, never the shorthand. The body carries\\n`overscroll-behavior: contain`, so scrolling to its end does not start scrolling\\nthe page behind it, and `position: relative`, so a stray absolutely positioned\\ndescendant is contained rather than re-homed into an ancestor.\\n\\nThose two must travel together: a positioned body _without_ a clipped shell is\\nworse than the status quo, because it pulls phantom overflow into the scroller\\ninstead of out of the panel.\\n\\n**`drawer.behavior.padding` is now the body's padding, not the panel's.** A\\ndrawer with no header or footer looks the same as before. One that gains either\\ngets rows flush to the panel edge, which is the point.\\n\\nTwo new theme entries, `drawerHeader` and `drawerButtons`, mirror the dialog\\npair knob for knob but default to a panel's posture rather than a dialog's: the\\nheader's title is left-aligned rather than centered, and the footer trails its\\nactions rather than centering them.\\n\\nNote one deliberate divergence from `[dialog-buttons]`: the drawer footer's\\n**confirm button does not close the drawer**. A panel's save is usually async\\nand can fail, so closing is left to the consumer via `(confirmed)`.\",\n \"commit\": \"f28c951\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-toggle` honours `size`, and the checked colour has a theme home.\",\n \"body\": \"**`size` did nothing.** `uni-toggle` inherits a bindable `size` input from\\n`BaseComponent`, but its geometry came from a single `toggle.behavior.size`\\nnumber, so `<uni-toggle size=\\\"sm\\\">` compiled, read as deliberate, and rendered\\nidentically to every other switch. The theme now carries a `sizes` block and the\\ninput selects from it.\\n\\n**Geometry is stated per size, not derived from ratios.** Each size token is a\\n`width` / `height` / `padding` triple — `padding` being the knob's inset — and\\nthe rest falls out: knob is `height - 2 * padding`, travel is `width - height`,\\nradius is `height / 2`. Real switch designs do not hold a constant proportion\\nacross sizes (a consumer's 32x18 and 28x16 pair differs in both track and knob\\nratio), so a single ratio token could match one size or the other but never\\nboth.\\n\\n`lg` is `BaseComponent`'s default and reproduces the previous geometry exactly —\\n40x20, knob 16 — so **no existing toggle moves**. A theme still setting the\\nlegacy `toggle.behavior.size` number keeps the old derived-ratio behaviour; that\\noption is now deprecated in favour of the `sizes` block.\\n\\n**Fixed: the knob would have overhung the track at any other proportion.** The\\nchecked transform was hardcoded to translate by one track height, which is only\\ncorrect while the track is `2x` wide and the knob `0.8x`. It is now derived, so\\nthe knob lands the same distance from each edge at every size.\\n\\n**New `checkedColor`, as an input and a theme option.** The on-state used to be\\nthe instance's `variant`, which meant an app wanting one switch colour repeated\\nan attribute on every call site. `toggle.behavior.checkedColor` sets it once;\\nthe input overrides per instance; `variant` remains the fallback when neither is\\nset. The focus ring follows the resolved colour rather than staying on `variant`.\\nAn input as well as an option is necessary because `variant` defaults to\\n`'primary'` and so cannot be distinguished from unset — without one, a themed\\n`checkedColor` would have silently made `variant` inert with no way back.\\n\\n**Toggle transitions are a motion token.** It hardcoded `0.3s ease` while\\n`uni-radio` already read `theme.motion(options.motion ?? 'control')`, so a theme\\nsetting a motion scale moved the radio and not the switch.\",\n \"commit\": \"67e17ea\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Document the drawer as an editor panel, and assert the layout that makes it one.\",\n \"body\": \"Both existing Drawer stories were navigation shells, so the shape that actually\\nstresses the component — a pinned header, a long scrolling form, a pinned save\\nbar — had no worked example. `EditorPanel` is that example, with a\\n`uni-number-input` and a `uni-quantity-stepper` near the bottom of the scroll,\\nwhere the sr-only overflow bug used to surface.\\n\\nIt carries a play function that asserts the scroll geometry: the panel's\\n`scrollHeight` equals its `clientHeight`, setting `scrollTop` on it does\\nnothing, the footer has no scrollable content of its own, the body scrolls to\\nits last element and stops, and no descendant has escaped its scroll container\\nto land on the panel. Those assertions live in the story rather than the unit\\nspec on purpose — jsdom has no layout engine, so every one of them would pass\\nvacuously there.\\n\\nThe MDX gains the three-row layout, the close-request contract, an input table,\\nand theme-option blocks for the two new component entries.\",\n \"commit\": \"f28c951\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"New **Experiments → Forms layout pressure** docs page: every form control in an\",\n \"body\": \"`auto 1fr` grid, with a bar showing what it left for its sibling.\\n\\nIt exists to make one class of bug visible, because nothing else can see it. A\\n`1fr` track is `minmax(auto, 1fr)`, and that `auto` floor is the control's own\\nmin-content size — so a control reporting a larger intrinsic width than it needs\\nquietly steals track width from whatever sits beside it, while still looking\\ncorrect in isolation. That shipped once: `uni-quantity-stepper`'s value cell is a\\nnative `<input>` defaulting to `size=\\\"20\\\"`, so it measured ~230px instead of\\n~92px and collapsed a consumer's grid column.\\n\\nNeither the specs nor `build-storybook` catch it — the specs assert computed\\nstyles and ARIA, and jsdom does not do layout — so it took a consumer report.\\nThe page is deliberately width-constrained, since on a wide canvas nothing\\ncompetes for the track and the defect cannot appear. The measurements are live\\nand update as the viewport changes.\",\n \"commit\": \"8f85b48\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Signal Forms docs said `[field]`; the directive is `[formField]`.\",\n \"body\": \"`[field]` was the selector in the Angular 21.0 Signal Forms preview and was\\nrenamed before release. In 21.2 the directive is `FormField`, selector\\n`[formField]`, with its required input aliased to `formField` — `[field]` does\\nnot exist at all. Every form control in this library was documented with the\\nname that had been removed, across seven component doc comments and five MDX\\nfiles, and all of it flowed into the MCP index and the generated API reference.\\nA consuming app found this, not us.\\n\\nNothing about the components changed: they already satisfy `FormValueControl` /\\n`FormCheckboxControl` and always bound correctly.\\n\\n**The reason it rotted is that nothing compiled a binding.** No spec or story in\\nthe library imported `@angular/forms/signals` — the toggle's \\\"Form Signals\\\" story\\nhand-bound `[checked]` and `[touched]` as plain props, which demonstrates\\nnothing about Signal Forms and would keep passing through any rename. There is\\nnow a spec that binds a real `form()` to `uni-toggle` through `[formField]` and\\nasserts the round trip in both directions, plus `touched` and `required`\\npropagation, so the next rename fails CI instead of the docs. The story binds a\\nreal form too.\",\n \"commit\": \"67e17ea\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Visually hidden text no longer inflates a consuming app's scroll containers.\",\n \"body\": \"**Eighteen controls quietly added scrollable distance to whatever box happened\\nto be above them.** `visuallyHidden` was `position: absolute`, and the controls\\nthat emit it — `uni-number-input`, `uni-quantity-stepper`, the toggle's hidden\\n`<input>`, and fifteen others — are `position: static`. An absolutely positioned\\nbox resolves its containing block to the nearest _positioned_ ancestor, so each\\n1x1 span skipped every `overflow: auto` between it and that ancestor and landed\\nin the distant ancestor's scrollable overflow. A consumer reported a fixed side\\npanel measuring `scrollHeight: 1891` against `clientHeight: 793` — the whole\\n1098px difference came from seven invisible spans that had escaped the panel's\\nbody scroller.\\n\\nThe helper is now `position: fixed`, whose containing block is the viewport, so\\nit joins no ancestor's scrollable overflow at all. The element stays 1x1 and\\nclipped to nothing, so screen reader behaviour is unchanged. Inside a\\n`transform`ed ancestor a fixed box re-anchors to that ancestor, which is\\nharmless here: where the box lands never mattered, only what it overflowed.\\n\\nThis class of bug is invisible in isolation — it needs a consumer to nest the\\ncontrol inside a scrolling shell before it appears — so it is now covered by a\\ntest that renders the emitting controls and asserts what actually reaches the\\nDOM, not just the recipe.\",\n \"commit\": \"f28c951\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Stepper buttons now leave focus in their field, and `uni-quantity-stepper`\",\n \"body\": \"follows the theme's field chrome.\\n\\n**Clicking `+` or `−` focused nothing.** Taking pointer capture means calling\\n`preventDefault()` on `pointerdown`, which also suppresses the browser's default\\nfocus handling — and the buttons carry `tabindex=\\\"-1\\\"`, so focus landed on\\n`<body>`. The arrow keys then did nothing, exactly when a user reaching for `+`\\nis most likely to try them. `createPressRepeat` gained a `focus` callback,\\ninvoked on press and handed the pressed button; `uni-number-input` and\\n`uni-quantity-stepper` point it at their text field, the way a native spinner\\ndoes. Where there is no field — a read-only quantity stepper, whose buttons are\\nthemselves the tab stops — focus goes to the button instead. **This affected\\n`uni-number-input` as well**, not just the stepper.\\n\\n**`uni-quantity-stepper` ignored a theme's field styling.** It carried its own\\n`color` / `border` / `borderRadius` tokens, so a theme that restyles `input` —\\nWellsourced fills its fields `#F3F2EF` — left the stepper stark white beside\\nthem. Those three now default to the shared `input` chrome and are unset in the\\nbase theme, so the stepper tracks whatever a theme does to its fields; they\\nremain available as per-component overrides for parting them deliberately. With\\nthe focus indicator and the dividers already sourced this way, the container is\\nnow consistently the field chrome unless a theme says otherwise.\",\n \"commit\": \"7545ff3\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-quantity-stepper` no longer claims ~230px of width it does not need.\",\n \"body\": \"The value cell is a native `<input>`, which defaults to `size=\\\"20\\\"`. Its\\n`flex: 1 1 auto` meant `flex-basis` resolved to that intrinsic ~20-character\\nwidth rather than to `valueWidth`, so the control measured ~230px instead of the\\n~92px its buttons and a 3ch value actually need. Worse, that inflated width is\\nthe control's `auto` size, and a `1fr` grid track is `minmax(auto, 1fr)` — so a\\nstepper stole track width from whatever sat beside it in a grid. Reported by\\nWellsourced, who worked around it with `uni-quantity-stepper input { width: 0 }`.\\n\\nThe input is now sized from its content (`size` bound to the rendered value's\\nlength), so the intrinsic width tells the truth. `valueWidth` stays the floor via\\n`min-width`, which is what keeps stepping 9 → 10 from reflowing the row, and the\\ncell still grows past it with the digits — measured at 92px for one to three\\ndigits, 116px at `12,000`, 140px at `1,234,567`.\\n\\nThis is deliberately not the `width`-instead-of-`min-width` fix that was also\\nsuggested: a fixed cell would have pinned the value at `valueWidth` and clipped\\nlonger numbers, losing the growth the option documents.\\n\\n**For consumers carrying the workaround:** it is safe to leave in place — the\\ncontrol measures the same 92px either way — but remove it to get the growth\\nback, since `width: 0` forces `flex-basis: 0` and pins the cell at the floor.\",\n \"commit\": \"8f85b48\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"`uni-slider` is rebuilt on custom thumbs instead of `<input type=\\\"range\\\">`,\",\n \"body\": \"gaining range mode, marks, a value readout and an exact decimal step model. This\\nis a breaking change to both the component's value shape and its theme options.\\n\\n**Why it could not stay native.** One `<input type=\\\"range\\\">` cannot carry two\\nthumbs, so range mode, thumb crossing and per-thumb ARIA bounds were all\\nunreachable; marks and a value tooltip were unstyleable through it. The\\nalternative — a second component for the range case — would have meant two\\nkeyboard implementations to keep in step, which is the drift the shared step\\nmodel exists to prevent. What the platform was giving us (the slider ARIA\\npattern and the keyboard map) is reimplemented explicitly and covered by 29\\nspecs.\\n\\n**Breaking: value shape.**\\n\\n```ts\\n// before\\nvalue = model<number>(0);\\n// after — the shape follows `mode`, and `null` is empty\\nvalue = model<number | UniNumberRange | null>(null);\\n```\\n\\nA `single` slider still reads and writes a plain number, so\\n`[(value)]=\\\"volume\\\"` is unchanged. Code that relied on `value()` being\\nnon-nullable, or that read it without narrowing, now needs to handle `null` and\\nthe `{ start, end }` range.\\n\\n**Breaking: theme options.** `slider.options.color` is **removed**. Fill and\\nthumb colour now come from the `variant` role pair, the rule every other\\ncomponent follows, so `variant=\\\"warn\\\"` recolours a slider with no theme edit. A\\ntheme that set `color` should delete it and pass `variant` at the call site.\\n`trackColor` now defaults to `primary-container` rather than `surface-variant`.\\n\\nNew options: `thumbBorderRadius`, `minTouchTarget`, `markSize`, `markColor`,\\n`labelTypeface`, `labelColor`, `tooltipColor`, `tooltipTextColor`,\\n`tooltipShadow`, `tooltipBorderRadius`, `transitionMs`. `trackHeight`,\\n`thumbSize` and `borderRadius` are unchanged.\\n\\n**New capability.**\\n- `mode=\\\"range\\\"` — two thumbs, a `{ start, end }` value, `minGap` to fence the\\n ends apart. Thumbs may cross and swap, and the dragged one keeps focus.\\n- `marks` and `snapToMarks` — labelled stops, spoken in place of the number.\\n- `valueDisplay` — `none`, `inline`, `tooltip`, or `input`, which seats a\\n compact `uni-number-input` at the trailing edge, two-way bound to the same\\n value: drag for the ballpark, type for the exact figure. Single mode only.\\n- `origin` — anchor the fill somewhere other than `min`, for sliders spanning ±.\\n- `sliding` and `changed` outputs, replacing an implicit per-frame model write.\\n **Bind `changed` in forms**; `sliding` fires every frame of a drag.\\n- `largeStep`, defaulting to a tenth of the range, for `PageUp`/`PageDown` and\\n `Shift+Arrow`.\\n- Right-to-left support: the horizontal arrows and the track mirror; the value\\n does not.\\n\\n**Also new: the `cdk/number` primitives** this is built on, shared with the\\nnumeric input family still to come — exact scaled-`BigInt` decimal arithmetic\\n(`stepDecimal`, `roundDecimal`, `clampDecimal`), locale-aware\\n`parseNumber`/`formatNumber` over `Intl`, and `createPressRepeat` for\\nhold-to-repeat stepper buttons. Stepping `0.1` twenty times from `0` now lands\\non exactly `2`, and `1.15` rounds to `1.2` where `(1.15).toFixed(1)` gives\\n`'1.1'`.\",\n \"commit\": \"21b655d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-number-input`: the field for a quantity, a price, a percentage or a\",\n \"body\": \"measurement, with locale-aware parsing, `Intl` formatting on commit,\\nprefix/suffix adornments, min/max/step fences and steppers that hold to repeat.\\n\\n```html\\n<uni-number-input label=\\\"Quantity\\\" [(value)]=\\\"qty\\\" [min]=\\\"1\\\" />\\n<uni-number-input label=\\\"Unit price\\\" currency=\\\"USD\\\" [(value)]=\\\"price\\\" />\\n```\\n\\n**Why not `<input type=\\\"number\\\">`.** Per the HTML value sanitization algorithm,\\na number input whose text is not a valid floating-point number reports\\n`value === ''`. Type `12,50` as most of Europe does, or paste `1,234.56` from a\\nspreadsheet, and the app reads an empty field with no way to tell that from a\\nblank one — a data-loss bug, and the reason this is `type=\\\"text\\\"` with\\n`role=\\\"spinbutton\\\"`. The platform control also cannot group thousands, cannot\\nplace an affix outside the editable text, has ~10px unstyleable spinners below\\nthe WCAG 2.2 target minimum, changes value on the scroll wheel while focused,\\nand steps in floats.\\n\\n**What it does instead.**\\n- **Presets** — `decimal`, `integer`, `currency`, `percent` — supply decimals,\\n grouping, affix and `inputmode` together, so a money field is `label`,\\n `currency=\\\"USD\\\"`, `[(value)]`. `numberFormat` is the escape hatch, merged over\\n the preset.\\n- **Parses what people actually type**: canonical ASCII always, locale grouping\\n (`1.234,56` in German), pasted affixes and currency symbols, accounting\\n negatives `(1,234.56)`, localized digit systems, compact `1.5k`, and — behind\\n `allowExpressions` — spreadsheet arithmetic like `12*3`, via a shunting-yard\\n parser that never calls `eval`.\\n- **Unreadable text stays in the field**, flagged with a dashed underline and a\\n `rejected` event, rather than being silently swallowed.\\n- **Exact arithmetic.** Stepping `0.1` twenty times from `0` lands on exactly\\n `2`; `1.15` rounds to `1.2` where `(1.15).toFixed(1)` gives `'1.1'`. A second\\n `valueAsString` model carries digits a `number` cannot, and a dev-mode warning\\n fires when a bound `value` cannot round-trip.\\n- **Percent never divides behind your back**: `preset=\\\"percent\\\"` shows `15%` for\\n `15`. Models that really are fractions set `valueIsFraction`.\\n- Clamping on commit rather than per keystroke, visible fences that disable the\\n matching stepper and announce, `wrap` for cyclic fields, `emptyStepValue`,\\n four stepper layouts, and hold-to-repeat that announces once on release.\\n\\n`uni-slider` gains `valueDisplay=\\\"input\\\"`, which seats one of these as its\\nreadout — drag for the ballpark, type for the exact value.\\n\\nAdds `numberInput` to `ComponentName` with a theme entry. Field chrome is not\\nduplicated there: colour, border, radius and focus come from the shared `input`\\noptions via `uni-input-box`, so a number field restyles with every other field.\\n\\n`uni-input-box` gains a `managedInset` input. The themed leading inset normally\\nrides the inner `<input>`, which is right while the text is the field's leading\\nedge and wrong the moment an adornment sits in front — a currency prefix would\\nhug the border while the number it belongs to sat indented past it. A field with\\nadornments sets `managedInset` and places the inset on whichever element is\\nactually first. Existing fields are unaffected: the default is `false`.\",\n \"commit\": \"2a79bb8\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-number-range-input`: two linked numeric fields in one chrome with a\",\n \"body\": \"single `{ start, end }` value — price filters, thresholds, tolerances. This\\ncompletes the numeric family alongside `uni-number-input`,\\n`uni-quantity-stepper` and the rebuilt `uni-slider`.\\n\\n```html\\n<uni-number-range-input label=\\\"Price range\\\" currency=\\\"USD\\\" [(value)]=\\\"price\\\" [minGap]=\\\"50\\\" />\\n```\\n\\n`start`/`end` deliberately match `UniDateRange`, so the library has one range\\nvocabulary, and they never collide with the `min`/`max` **inputs**, which mean\\nthe fence rather than the value.\\n\\n**The rules that make it one field rather than two glued together:**\\n- **Either end alone is a valid value.** `{ start: 50 }` means \\\"50 and up\\\",\\n which is a real filter. This is where it diverges from `uni-date-time-input`,\\n whose two parts are two halves of one answer.\\n- **Stepping is fenced; typing swaps.** A stepper can never walk one end through\\n the other — its wall is the other end, held off by `minGap`, and each end's\\n `aria-valuemin`/`aria-valuemax` report that wall rather than the outer bounds.\\n A _typed_ backwards commit is swapped and announced instead, the rule\\n `uni-calendar` applies to a backwards date range: clamping against the other\\n end would destroy the number just entered.\\n- **`minGap` pushes the end you edited**, not the other one, which is what makes\\n stepping behave as a fence rather than dragging the range along.\\n- A refused draft flags only the end it was typed into; the other stays valid.\\n- `preset`, `currency`, `prefix`, `suffix`, `decimals`, `grouping`, `locale` and\\n `roundingMode` are forwarded to both ends so the halves always read alike.\\n\\nIt owns its commit path rather than nesting two `uni-number-input`s, because the\\ntwo behaviours above need _different_ bounds — a stepper must be fenced at the\\nother end while a typed commit must arrive un-clamped — and a child field\\napplies one bound pair to both. The arithmetic, parsing and formatting are still\\nthe shared `cdk/number` primitives.\\n\\nAdds `numberRangeInput` to `ComponentName` with a theme entry (`partGap`,\\n`dividerText`, `dividerColor`). Field chrome is not duplicated there: colour,\\nborder, radius and focus come from the shared `input` options via\\n`uni-input-box`. `dividerText` is literal punctuation rather than an icon token —\\nan en dash between two numbers is not a glyph a theme swaps artwork for.\",\n \"commit\": \"e7875ee\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-quantity-stepper`: `− 3 +` for cart lines, table cells and seat counts\",\n \"body\": \"— the numeric core with no field chrome, no label and no room for either.\\n\\n```html\\n<uni-quantity-stepper label=\\\"Quantity, Blue T-shirt (M)\\\" [(value)]=\\\"qty\\\" [min]=\\\"1\\\" />\\n```\\n\\nA separate component rather than a `chrome=\\\"bare\\\"` flag on `uni-number-input`,\\nbecause this control is defined by what it does _not_ have — presets, affixes,\\nexpressions, four stepper layouts — and eight inputs are easier to write\\ncorrectly than forty plus a list of which ones to leave alone. The arithmetic,\\nparsing and hold-to-repeat come from the same `cdk/number` primitives, so\\n`1,200` and the keyboard map behave identically in both.\\n- **`deleteAtMin`** is the cart pattern in one attribute: at the floor the\\n decrement becomes a remove affordance, renamed `Remove {label}`, and emits\\n `removed` rather than stepping to zero. Without it every shop reimplements the\\n same `value === 1 ? remove() : step(-1)` branch outside the component. (The\\n spec called this output `emptied`; that is a native `HTMLMediaElement` event\\n name, which `@angular-eslint/no-output-native` rightly rejects, and `removed`\\n is already what `uni-tag` calls the same request.)\\n- The middle is a real input by default — typing `12` beats tapping `+` eleven\\n times, and it takes the same grouped and locale-aware entry the field does.\\n `editable=false` renders the number as text for read-mostly tables, and the\\n buttons become the tab stops since there is nothing else to focus.\\n- `size` is `sm` / `md` / `lg` at 24 / 32 / 40px _outer_ height, so an `md`\\n stepper lines up with a 32px field beside it, with the buttons square at that\\n height. `md` and `lg` clear the 24×24 pointer target of WCAG 2.2 SC 2.5.8;\\n `sm` leaves 22px inside its border and is the dense desktop option.\\n\\nAdds `quantityStepper` to `ComponentName` with a theme entry. Unlike the other\\nnumeric controls it does **not** inherit the shared `input` chrome — it is not a\\nfield — so it carries its own container tokens, defaulted to the same values\\n`input` uses so a cart stepper and a form field look related out of the box.\\nHeight comes from the entry's `sizes` block rather than an option.\",\n \"commit\": \"589cecb\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-angular`'s build now runs `tsc --noEmit` first, closing the last gap left\",\n \"body\": \"by the earlier \\\"typecheck the builds\\\" change — core and react already did this,\\nangular did not.\\n\\n`ng-packagr` alone does not surface every type error in the package. A real one\\nreached a Storybook build unnoticed: a form control declaring\\n`min = input(0)` where `FormValueControl` types the property as\\n`InputSignal<number | undefined>` (Signal Forms syncs it from `min()`\\nvalidators), which is a variance error `pnpm build` reported as success. Every\\nform control must declare `min`/`max` as `input<number | undefined>(…)` and read\\na `resolvedMin()` computed internally.\\n\\nAlso here:\\n- A `type-check` script, matching core and react, so `turbo type-check` covers\\n the whole workspace.\\n- `prototypes/**` is excluded from the package tsconfig. Those are standalone\\n design explorations that reference modules and dependencies which do not\\n exist in this package — excluding them is what makes a real typecheck\\n possible over the code that ships.\\n- Three latent type errors fixed: `vitest.config.ts` took `defineConfig` from\\n `vite`, whose overload does not accept the `test` block (it comes from\\n `vitest/config`); `spacing.spec.ts` lost callback inference through an\\n untyped `vi.spyOn` return; and `radio.motion.spec.ts` typed a `motion`\\n argument as `Record<string, unknown>` rather than `Motions`.\",\n \"commit\": \"ce94c8a\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Lint MDX prose for stray `{`, which MDX compiles to a JSX expression.\",\n \"body\": \"Writing `named \\\"Increase {label}\\\"` in a docs bullet makes `label` a reference to\\nan undefined variable, and the page dies at runtime with\\n`ReferenceError: label is not defined` under Storybook's \\\"The component failed to\\nrender properly\\\" banner. Nothing caught it: it is a React render error rather\\nthan a compile error, so **`build-storybook` passes**, and `check-doc-links.mjs`\\nonly validates link ids. Only opening the page found it — twice.\\n\\n`scripts/check-mdx-braces.mjs` now runs as part of the package's `lint` script,\\nso `turbo run lint` (and therefore CI) fails on it. It skips the four places a\\nbrace is legitimate — fenced code blocks, inline code spans including ones that\\nsoft-wrap across a line, ESM `import`/`export` statements, and JSX tags such as\\n`of={Stories.X}` or `rows={[…]}` — plus MDX comment containers. Hits are\\nreported as `file:line:column` with the offending line and the fix: backtick the\\ntext, or escape the brace as `\\\\{`.\\n\\nAlso available on its own as `pnpm lint:mdx`.\",\n \"commit\": \"5cf120b\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Three cosmetic fixes in the numeric family.\",\n \"body\": \"**`uni-quantity-stepper`'s dividers were heavier than its frame.** The rules\\neither side of the value took `dividerColor: 'outline'` — a solid grey — against\\nan outer border of the 8%-alpha `light` token, so the control read as three\\npieces stuck together rather than one frame. They now take the **same `border`\\ntoken as the container** and move with it on focus, so a focused stepper is not\\naccented on the outside and grey down the middle. `dividerColor` remains as an\\nopt-in override for a deliberately distinct rule, and is unset in the base theme.\\n\\n**`uni-quantity-stepper` had no focus state.** Every other field gets its focus\\nchrome from `uni-input-box`, which the stepper deliberately does not use — and\\nits inner input clears its own outline via `removeInputPlatformStyling`, so\\nfocusing the middle showed nothing at all. The container now carries the same\\n`:has(input:focus)` rule and the same `input` theme tokens the box applies\\n(`focusOutline`, `focusOutlineOffset`, and the optional `focusBorder` /\\n`focusShadow` / `focusColor`), so a stepper highlights exactly like the field\\nbeside it — including in themes such as Wellsourced that express focus as a\\nborder and ring rather than an outline. Error state still wins, keeping a\\nflagged control visibly flagged while it is corrected.\\n\\n**A trailing suffix sat against the right border.** The leading inset was\\nalready handled, so the two sides did not match. `uni-number-range-input` — which\\nhas no steppers — now insets both edges of its row, and `uni-number-input` insets\\nthe trailing edge whenever no stepper occupies it (`stepperLayout=\\\"none\\\"`, or a\\nread-only field). Where a stepper _is_ present the trailing edge is still left\\nto it, because a button is meant to reach the border.\\n\\nBoth insets ride the row rather than the `<input>`: `uni-input-box` styles\\n`& input` at a higher specificity than a component class can reach, so padding\\nset on the input itself is silently dropped.\",\n \"commit\": \"05f991f\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-tag-input`'s first chip no longer rides the left border.\",\n \"body\": \"The themed leading inset was applied by `uni-input-box` to the inner `<input>`,\\nwhich is the field's leading edge only while it is empty. Once a chip existed,\\nthe chip sat flush against the border while the text after it stayed indented.\\nThe chip row now owns the inset — it is the leading content — via the\\n`managedInset` input added alongside `uni-number-input`, so the first chip and\\nan empty field's placeholder both start at the same 8px as every other field's\\ntext. Wrapped chip rows are unaffected; vertical padding already handled those.\",\n \"commit\": \"1fe8941\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@10.0.0\"\n ]\n },\n {\n \"version\": \"9.0.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"9.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"Box learns `flex` / `shrink` / `basis` and `marginInline`.\",\n \"body\": \"**`flex`.** `grow` emits `flex-grow` alone, which leaves `flex-basis: auto` — so\\nit cannot express `flex: 1`, and any layout wanting siblings to share space\\nevenly regardless of content width had to stay in CSS. `[flex]=\\\"1\\\"` now emits\\nthe shorthand; `shrink` and `basis` cover the rest. `grow` is unchanged, so no\\nexisting layout moves.\\n\\nThese three go through a new `ThemeService.styleIfSet()`, which treats only\\n`undefined` as unset — the shared `style()` helper drops falsy values, which\\nwould have silently swallowed `[shrink]=\\\"0\\\"`, the single most useful value.\\n\\n**`marginInline`.** `margin: 0 auto` on a max-width container had no Box\\nequivalent, so page shells kept an inline style for it. `marginInline=\\\"auto\\\"`\\ncenters such a container, and a spacing token works too.\\n\\n```html\\n<main box-layout maxWidth=\\\"1200px\\\" marginInline=\\\"auto\\\" padding=\\\"lg\\\">…</main>\\n```\\n\\nOnly the inline axis is exposed. Block margins collapse and fight `gap`, which\\nis why the primitives carry no margin otherwise — inline margins do neither, so\\nthis is a deliberate line rather than a crack in the token-only surface.\",\n \"commit\": \"c0c6056\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"Every deprecated API is removed. The library now carries no `@deprecated`\",\n \"body\": \"symbols at all.\\n\\n**Per-component duration options → the `motion` scale.** Six components carried\\ntheir own duration knob that predated the motion scale and _won over_ it:\\n`expand.transitionSpeed`, `callout.transitionMs`, `radio.transitionSpeed`,\\n`menuItem.transitionSpeed`, `alert.transitionSpeed` and\\n`snackbar.transitionDelay`. All are gone, along with the precedence branch each\\none required — timing now comes from the token, full stop.\\n\\nRetime the token instead; one edit covers every component pointing at it. To\\nretime a single component, define a token of your own and point that\\ncomponent's `motion` option at it:\\n\\n```ts\\ncreateTheme({\\n …,\\n motion: { productive: { duration: 110, easing: 'ease' } },\\n components: { menuItem: { options: { motion: 'productive' } } },\\n});\\n```\\n\\nA `duration: 0` token is how a theme opts out of motion — that is what\\n`transitionSpeed: 0` used to mean. Both showcase themes are migrated this way\\n(Carbon to a 110ms `productive` token, Wellsourced to an `instant` one).\\n\\n**Options that never did anything.** `card.transitionSpeed` and\\n`inputBox.transitionSpeed` were read by nothing and never had been. Delete them\\nfrom your theme; nothing replaces them.\\n\\n**Renames and obsolete APIs**\\n- `inputBox.typeFace` → `typeface` (the casing every other component uses).\\n- `uni-tooltip`'s `appendToBody` input — inert since the tooltip moved to the\\n native top layer, which escapes any overflow context by itself.\\n- Box's `elevation` input → `shadow`, in both the Angular and React packages.\\n It was a second name for the same thing.\\n- The Angular `icons` re-export → import `BaseIcons` from\\n `@uni-design-system/uni-core`. The default set ships with every theme.\\n\\n**The HSL color legacy is gone from uni-core.** `uniColor`, `randomRangeValue`,\\n`CategorySaturation` and `CategoryLightness` are removed, superseded by the\\ndeterministic OKLCH engine (`generateThemes` / `generatePalette`) — same input,\\nsame theme, WCAG-checked. `RoleHues` and the `UniColor` type go with them: they\\nwere reachable only through `uniColor`, and `RoleHues` had gone stale enough to\\nhold saturation values in a table of hues.\\n\\n**Deferred output renames.** Three outputs were held back because renaming is\\nbreaking; this is that release. Each also drops an eslint escape it needed for\\nshadowing a native event name or using an `on` prefix.\\n\\n| Component | Before | After |\\n| -------------------- | ----------------- | ---------------- |\\n| `uni-debounce-input` | `(change)` | `(valueChange)` |\\n| `uni-search-input` | `(change)` | `(searchChange)` |\\n| `uni-search-input` | `(search)` | `(searchSubmit)` |\\n| `dragAndDrop` | `(onFileDropped)` | `(fileDropped)` |\\n\\n**`uni-dropdown`'s `color` input → `containerColor`,** completing the rule the\\nlayout directives set: every container-pair input in the library is now\\n`containerColor`, and plain `color` always means the CSS property.\\n\\n**`ThemeService.getSpacing('none')` now returns `0`, not the string `'none'`.**\\n`'none'` is not a valid length, so it was silently dropped wherever it landed —\\n`uni-menu` carried a comment working around exactly that, which is now deleted.\",\n \"commit\": \"8250162\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"`uni-input` gets a `type`, and the input chrome stops needing a wrapper div.\",\n \"body\": \"**Types.** `uni-input` was text-only with no `type` at all, so every email, URL,\\nnumber and phone field had to fall back to `uni-input-box` plus a hand-written\\nnative `<input>`, and `type=\\\"password\\\"` could not go through it. It now takes\\nthe text-like types: `text` (default), `email`, `password`, `search`, `tel`,\\n`url`, `number`.\\n\\nNon-text types (`checkbox`, `radio`, `file`, `range`, `color`) stay out — they\\nbreak both the input chrome and the `FormValueControl<string>` value contract —\\nas do `date` / `time` / `datetime-local`, which have dedicated components.\\n\\n**Native passthroughs.** `autocomplete`, `inputMode`, `list` (a `<datalist>` id),\\n`step` and `spellcheck` are plain passthroughs; an unset one emits no attribute.\\n`readonly`, `name`, `min`, `max`, `minLength`, `maxLength` and `pattern` are\\nSignal Forms' own optional control inputs, so the `[field]` directive syncs them\\nfrom your validators exactly as it already syncs `required` — and they are\\nreflected onto the native element so the browser contributes too. Signal Forms\\ntreats multiple `pattern`s as all-must-match, which the native attribute cannot\\nexpress, so it is reflected only when there is exactly one.\\n\\n`uni-textarea` gains `readonly`, `name`, `minLength`, `maxLength`, `autocomplete`\\nand `spellcheck`; `uni-debounce-input` gains `type`, `autocomplete` and\\n`inputMode`.\\n\\n**Sizing.** `uni-input-box`'s host is `display: contents`, so a width or layout\\nattribute set on the element itself was silently dropped and every call site\\nneeded a wrapper `<div>`. It now takes `width`, `fullWidth` and `grow` (joining\\n`minWidth`), which reach the real box inside; `uni-input`, `uni-textarea` and\\n`uni-select` forward all four. The `display: contents` behavior is now documented\\ntoo — it stays surprising even once sizing works.\\n\\nBoth `uni-input` and `uni-debounce-input` now accept the adornment slots as\\neither element or attribute selectors (`<span pre-input>` as well as\\n`<pre-input>`), which had drifted apart between them.\",\n \"commit\": \"c0c6056\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"The layout primitives and `uni-text` are now **directives**, so they compose.\",\n \"body\": \"They were components with attribute-only selectors, which meant any two of them\\non one element threw NG0300 (\\\"multiple components match\\\"). `<div row-layout\\nso it reached production as a silent style mismatch. `<uni-card box-layout>`\\nwas blocked for the same reason, and `box.component.ts` documented the\\nwrap-it-in-a-div workaround as permanent.\\n\\nAll eight are pure host-styling wrappers (an `<ng-content>`-only template plus a\\n`[class]` host binding), so as directives they render identically and now stack\\nfreely — with each other, with `uni-text`, and with a component's own host\\nelement. Angular reconciles the host `class` bindings additively, so each\\ncontributor's styles survive rather than one silently winning; there is a spec\\npinning that.\\n\\n```html\\n<div row-layout uni-text=\\\"title-small\\\" padding=\\\"md\\\">Heading</div>\\n<uni-card box-layout padding=\\\"lg\\\">…</uni-card>\\n```\\n\\n**BREAKING: class renames.** `UniBoxComponent` → `UniBoxDirective`, and likewise\\nfor Row, Stack, Center, Wrap, Grid, GridArea and Text. No compatibility aliases:\\na major is where the break belongs, and an alias shipped on day one of a major\\ntends to survive to the next one. Rename the symbols in your `imports: []`.\\n\\n**BREAKING: the layout directives' `color` is now `containerColor`.**\\n\\nComposing the two directives exposed a name collision. `color` was an input on\\nboth — a _container pair_ on the layout primitives, the CSS `color` property on\\n`uni-text` — so on a shared element one binding fed both: the box painted the\\nsurface, the text took the same token, and the text rendered as ink on identical\\nink. A deprecated alias would have kept that path alive, so there isn't one.\\n\\n`color` belongs to `uni-text`, which maps it straight to the CSS property. The\\ncontainer pair is an invented concept and now says so:\\n\\n```html\\n<!-- before -->\\n<div box-layout color=\\\"surface\\\">\\n <!-- after -->\\n <div box-layout containerColor=\\\"surface\\\"></div>\\n</div>\\n```\\n\\nThis applies to all seven layout directives (Box and its subclasses) and to\\n`uni-scroll-area`, which is attribute-selected too and carried the identical\\nhazard. `backgroundColor`, which sets only the background and no paired\\non-color, is unchanged, as is `color` on `uni-icon` / `uni-skeleton` /\\n`uni-badge` — there it already means a foreground color, the same sense as\\n`uni-text`'s.\\n\\nCodemod: rename `color` → `containerColor` on any element carrying a `*-layout`\\nor `scroll-area` attribute; leave `color` alone everywhere else.\\n\\nThe rename fixed the input collision; a second one sat underneath it in CSS.\\n`containerColor` emits a background **and** its paired on-color, so both\\ndirectives write `color` to the element — at equal specificity, which left the\\ncascade to Emotion's insertion order (text won on `row-layout`, lost on\\n`scroll-area`). An explicit `uni-text` `color` is now emitted at doubled\\nspecificity, so it deterministically wins; with no explicit color, the\\ncontainer's on-color still shows through as intended.\\n\\n`uni-dropdown` still names its container pair `color`. It is an element selector\\n(`<uni-dropdown>`), so the collision needs someone to put `uni-text` on a\\ncomponent host — possible, but not the natural path the layout attributes are.\\n\\n**New: `UNI_LAYOUT` and `UNI_FORMS`.** These are attribute selectors, so an\\nelement carrying one whose directive was never imported compiles cleanly and\\nsilently does nothing. Spreading a family is the cheapest guard:\\n\\n```ts\\nimports: [...UNI_LAYOUT];\\n```\",\n \"commit\": \"c0c6056\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"The spacing scale is open, and `createTheme` finally accepts one.\",\n \"body\": \"The scale was a closed seven-name union on a doubling curve (2/4/8/16/32/64px).\\nReal layouts are rarely built exclusively on one — the gaps between 8 and 16,\\nand 16 and 32, are where a lot of real spacing lives — and there was no way to\\nadd a step, because **`ThemeConfig` had no `spacing` field at all**:\\n`createTheme` hardcoded the base scale. The Wellsourced showcase theme had to\\nbolt its scale on after the fact with a post-hoc spread.\\n\\nThree changes, which only work together:\\n- `NullableSize` gains a `(string & {})` arm, so any name the theme defines is a\\n valid `padding` / `gap` / `marginInline` value while the seven named steps keep\\n their autocomplete. `Size` itself stays closed — it also types _component_\\n sizes, where an arbitrary name has nothing to resolve against.\\n- `Spacing` is spelled out as named-optional-keys plus an index signature\\n (mirroring `Typography`), rather than a `Partial<Record<…>>` that would\\n collapse to a plain string record and lose the named steps.\\n- `createTheme({ spacing })` merges over the base scale.\\n\\n```ts\\ncreateTheme({ id, name, colors, spacing: { tight: '6px', snug: '10px' } });\\n```\\n\\n```html\\n<div stack-layout padding=\\\"tight\\\" gap=\\\"snug\\\">…</div>\\n```\\n\\nBecause the scale is open, a mistyped token can no longer be a compile error. It\\nis dropped — an `undefined` CSS value simply does not render — and\\n`ThemeService` now warns once per unknown token in development, naming the\\ntokens the active theme does define. Scaffolded `uni-theme.ts` files carry a\\n`spacing` block so the static theme file stays the editable source of truth.\\n\\n**Behavior change:** `xxl` was in the `Size` union but defined by no base theme,\\nso `padding=\\\"xxl\\\"` type-checked and rendered nothing. It is now `128px`,\\ncompleting the doubling — any element relying on the silent drop will start\\nshowing spacing.\",\n \"commit\": \"c0c6056\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@9.0.0\"\n ]\n },\n {\n \"version\": \"8.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-callout` and `uni-expand` now read their timing from the theme's `motion`\",\n \"body\": \"scale, so every animated surface in the library is retimed from one place.\\nThey were the last two carrying their own motion options — in different units,\\nunder different names (`transitionMs` in milliseconds, `transitionSpeed` in\\nseconds).\\n\\nA third token joins `popup` and `panel`:\\n\\n| Token | Default | Used by |\\n| -------- | ----------------- | --------------------- |\\n| `reveal` | 350ms ease-in-out | expand, expand-toggle |\\n\\n`reveal` is a _base_ speed, not a final duration: `uni-expand` still scales it\\nby content height (√-of-height, clamped) so short regions stay snappy and tall\\nones aren't rushed, and its easing now drives the reveal curve, which was\\nhardcoded. `uni-expand-toggle` resolves the token the same way, so the chevron\\nand the region cannot drift apart. `uni-callout` maps onto `panel`, whose\\n250ms matches what it already used.\\n\\n**Not breaking.** `transitionMs` and `transitionSpeed` are deprecated but\\nstill honoured, and deliberately outrank `motion` — a theme that set either\\nkeeps precisely its current timing rather than being retimed underneath it.\\nThey are removed next major. Per-instance inputs, like `uni-expand`'s\\n`transitionSpeed`, still outrank everything.\\n\\nNothing moves differently by default: callout renders 0.25s ease and expand\\n0.35s ease-in-out exactly as before, verified against the rendered styles.\",\n \"commit\": \"1aca747\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `createAnnouncer()` in the CDK's a11y helpers: the polite live region a\",\n \"body\": \"form control uses for its running commentary — commits, clears, refused\\nentries, result counts — changes a sighted user sees but that are otherwise\\nsilent to a screen reader.\\n\\n`uni-combobox`, `uni-tag-input`, `uni-time-input`, `uni-date-input`,\\n`uni-calendar` and `uni-tour` now share it instead of carrying byte-identical\\ncopies. The helper holds no DOM and no styling: the `role=\\\"status\\\"` element\\nstays in each component's own template, where its placement and\\nvisually-hidden class already belong.\\n\\nThis fixes a real bug in `uni-tour`, which had a plain signal rather than a\\ncopy of the shared idiom. Assistive tech reads a live region when its content\\n_changes_, so writing the identical string is a no-op — its \\\"Next available\\\"\\ngate message was announced on the first step that used it and silently dropped\\non every later one. `createAnnouncer` breaks the equality with a trailing\\nspace, inaudible to a screen reader, alternating between the two forms so\\nnothing accumulates.\\n\\nConsuming the helper directly:\\n\\n```ts\\nprotected readonly announcer = createAnnouncer();\\n// this.announcer.announce('Alabama selected.');\\n```\\n\\n```html\\n<span role=\\\"status\\\" aria-live=\\\"polite\\\" [class]=\\\"srOnly\\\"> {{ announcer.message() }} </span>\\n```\\n\\nThe region must already be in the DOM when the component renders — one added\\nat the moment it gains text is not reliably announced.\",\n \"commit\": \"e459f91\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Home and End now move the caret in the combobox-style controls —\",\n \"body\": \"`uni-combobox`, `uni-search-input`, `uni-tag-input` — instead of jumping to\\nthe ends of the suggestion list. APG reserves those keys for text editing in\\nan editable combobox, and a field that claims them makes its own text\\nun-navigable exactly when you are most likely to be editing it: with the list\\nopen. `uni-time-input` already behaved this way.\\n\\nNothing is lost. ArrowUp on a closed list already opens it on the last option,\\nArrowDown on the first, and navigation wraps at both ends, so every position\\nHome/End reached is still one keystroke away.\\n\\n`uni-multi-select-dropdown` keeps them: its roving focus rides the option\\ncheckboxes rather than a text field, so there is no caret with a better claim.\\n\\n`ListboxNavigation` carries the switch as `homeEndNavigates`, defaulting to\\nfalse — off is the right default for a control built around a text input,\\nwhich is every consumer but one. If you build on the CDK helper directly and\\nwant the old behavior, pass `homeEndNavigates: true`.\\n\\nThis also fixes a sharper bug in `uni-search-input` and `uni-tag-input`, where\\nHome/End reached the navigation helper unconditionally: pressing either not\\nonly moved the active option but _opened a closed suggestion list_.\",\n \"commit\": \"6e2cfb1\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"The four listbox popups — `uni-search-input`, `uni-tag-input`,\",\n \"body\": \"`uni-time-input` and `uni-combobox` — now render in the browser's top layer,\\nanchored to their field, instead of as absolutely-positioned children of it.\\nPut any of them inside a card, a table cell, a scroll area or a dialog and the\\nsuggestion list is no longer clipped by that ancestor's `overflow`. The browser\\ntracks the field natively, so the list follows on scroll and resize with no\\nlisteners, and flips above the field near the bottom of the viewport.\\n\\nThey also open the way `uni-dropdown` does now — the same 100 ms scale-and-fade\\n— so every popup panel in the library animates alike instead of the listboxes\\nalone snapping into place. The origin is measured from where the popup actually\\nopened, so one that flips above its field near the bottom of the viewport still\\ngrows out of the edge it is attached to. Under `prefers-reduced-motion` there is\\nno transition at all.\\n\\nNothing changes in the components' APIs or in how they dismiss. The popups use\\n`popover=\\\"manual\\\"`, not `auto`: these controls already own dismissal through\\nfocusout, Escape and commit, and `auto`'s light-dismiss fires on pointerdown\\noutside the popup — which includes their own input, so it would close the list\\non every click into the field.\\n\\nPositioning is gated on CSS anchor positioning support, checked together with\\nthe top layer rather than separately. Browsers that have `popover` but not\\nanchors — Safari 17 through 25 — keep the previous in-flow popup, which still\\nclips inside `overflow: hidden` ancestors but stays on its field; promoting it\\nthere would strand the list a viewport height down the page, since a top-layer\\nelement has no positioned ancestor to resolve against.\\n\\nShared plumbing lives in `components/forms/listbox-popup.ts` alongside\\n`listboxPopupStyles()`, which grew an optional `anchor` and now emits the\\nin-flow rules as the base with the anchored ones in an `@supports` block.\",\n \"commit\": \"dd33baa\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`Option.disabled` now works in the three remaining `Options<T>` consumers, not\",\n \"body\": \"just `uni-combobox`: `uni-select`, `uni-multi-select-dropdown` and\\n`uni-multi-select`. Marking an individual choice `disabled` shows it without\\noffering it — the plan that needs an upgrade, the channel that needs a verified\\nphone number — instead of dropping it from the array and leaving the list\\nlying about what exists.\\n\\n`uni-select` passes it to the native `<option>`, so the platform handles\\nskipping, greying and announcement. The two multi-selects disable the option's\\ncheckbox and refuse the toggle even when called directly. In\\n`uni-multi-select-dropdown` the arrow keys step over disabled rows and Home/End\\nland on the nearest enabled option — `ListboxNavigation` already knew how, it\\njust was not being told which rows were disabled — so focus never parks on a\\ncheckbox that cannot take it.\\n\\n`selectAll()` on both multi-selects now selects only enabled options. A\\ndisabled option is not committable, so nothing may commit one on the user's\\nbehalf; `deselectAll()` still clears everything. If you relied on `selectAll()`\\nreturning every value including disabled ones, note that only options you have\\nexplicitly marked `disabled` are affected. Whole-field `disabled` is unchanged\\nand still disables the entire control.\",\n \"commit\": \"2910c67\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-alert`, `uni-snackbar`, `uni-radio` and `uni-menu-item` now read their\",\n \"body\": \"timing from the theme's `motion` scale, which completes the migration: every\\nanimated component in the library is retimed from one place.\\n\\nTwo tokens join `popup`, `panel` and `reveal`:\\n\\n| Token | Default | Used by |\\n| -------------- | ----------------- | ---------------- |\\n| `notification` | 350ms ease-in-out | alert, snackbar |\\n| `control` | 300ms ease | radio, menu-item |\\n\\n**One thing moves differently:** `menu-item`'s hover transition goes from\\n0.35s to 0.3s, joining `radio` on the shared `control` token. The two were\\nnever deliberately different — `radio`'s own option documented its 0.3 as\\n\\\"matching menuItem\\\", which was not true — so this corrects drift rather than\\nchanging a decision. A theme that wants the old timing can set the deprecated\\n`transitionSpeed`, or retime `control`. Everything else is byte-identical,\\nverified against the rendered styles.\\n\\n**Deprecated, still honoured, removed next major:**\\n`alert.transitionSpeed`, `snackbar.transitionDelay`, `radio.transitionSpeed`\\nand `menuItem.transitionSpeed` all still work and still outrank `motion`, so a\\ntheme that set them keeps its exact timing. `menu-item`'s escape hatch is\\nintact too: with neither the option nor a token set it still renders no\\ntransition at all, and a token with `duration: 0` is the way to ask for\\ninstant now.\\n\\n`card.transitionSpeed` and `input-box.transitionSpeed` are also deprecated,\\nfor a different reason: **neither was ever read by its component.** Setting\\nthem has never had any effect. They are removed next major and nothing needs\\nto replace them.\\n\\n`uni-skeleton` is deliberately left out. Its shimmer is a loop rather than a\\ntransition, and folding a repeating animation into a scale built around\\nentering and leaving would make the scale mean two different things.\",\n \"commit\": \"6f76c1d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-skeleton` picks up the knobs an app theme could not reach. `color`, `highlightColor` and `borderRadius` are now inputs that take a token name and fall back to the theme option, because one screen routinely needs several of each — text bars and a pill chip do not share a corner (`borderRadius=\\\"max\\\"`), and a skeleton on a card wants a different tint than one on the page background.\",\n \"body\": \"The shimmer is now a band swept with `transform` rather than an animated `background-position`: it composites instead of repainting every frame, and its geometry is themeable via two new options, `direction` (`'ltr' | 'rtl'`, default `'ltr'` — the sweep previously ran right-to-left) and `highlightWidth` (band width as a percentage of the block, default `40`). Both ends of the band are the base color, so it dissolves into the block with no alpha and no fringing.\\n\\nA new `label` input announces a standalone skeleton: set it and the host becomes `role=\\\"status\\\"` with visually hidden text instead of `aria-hidden=\\\"true\\\"`. Unlabelled skeletons stay `aria-hidden`, so container-level `aria-busy` patterns are unchanged.\",\n \"commit\": \"228c17f\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-snackbar` now renders in the browser's top layer, so it can no longer be\",\n \"body\": \"covered by a high `z-index` or clipped by an `overflow: hidden` or transformed\\nancestor. It was the last overlay in the library still competing on stacking\\norder: a `<dialog>` opened with `.show()`, which is the _non-modal_ form and\\nnever enters the top layer, left it relying on `zIndex: Z_INDEX.dialog`. That\\nheld only because apps mount the bar near the root — anywhere else, a\\nconfirmation of what just happened could be silently buried.\\n\\nThe bar is now a `popover=\\\"manual\\\"`. Manual rather than auto because a\\nsnackbar must not light-dismiss: a click anywhere else on the page would tear\\nit away from someone still reading it. It is not `showModal()` either — that\\nwould make the rest of the page inert to announce a transient message.\\n\\n`role=\\\"status\\\"`, the auto-close timer, its pause-on-hover and pause-on-focus\\nbehaviour, the entry and exit animations, and the `[(show)]` / `open()` /\\n`close()` API are all unchanged.\\n\\nThe element behind the component changed from `<dialog>` to `<div>`: the bar\\nis never modal, and `<dialog>`'s `open` attribute would have been a second,\\ncompeting notion of \\\"shown\\\" alongside the popover's own state. Styles that\\nreach inside the component to target `uni-snackbar dialog` need updating —\\n`uni-snackbar [role=\\\"status\\\"]` is the stable selector.\",\n \"commit\": \"eb795a3\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Overlay timing is now a theme token. `UniTheme` gains a `motion` scale\",\n \"body\": \"alongside `radii`, `shadows` and the rest, and the overlays point at it by\\nname instead of carrying their own hardcoded durations.\\n\\nUntil now a theme could slow a skeleton shimmer but not a dropdown: `expand`,\\n`skeleton` and `callout` each exposed their own motion option while\\n`uni-dropdown` hardcoded 100ms and the combobox-style listbox popups copied\\nthat constant. Retiming the library meant editing components.\\n\\nTwo tokens ship, because two things genuinely move differently — a small panel\\nattached to a control snaps, a larger free-floating surface settles:\\n\\n| Token | Default | Used by |\\n| ------- | ------------------ | --------------------------------------------------------------------------- |\\n| `popup` | 100ms linear, ×0.8 | dropdown, menu, multi-select, combobox, search-input, tag-input, time-input |\\n| `panel` | 250ms ease | popover |\\n\\nA token carries `duration` (ms), `easing`, and an optional `scale` for panels\\nthat grow into place — one token rather than separate duration and easing\\nscales, because they are one design decision: slowing a panel without\\nsoftening its curve reads as sluggish rather than calm.\\n\\n```ts\\ncreateTheme({\\n id: 'Calm',\\n name: 'Calm',\\n colors,\\n motion: { popup: { duration: 240, easing: 'ease-out', scale: 0.95 } },\\n});\\n```\\n\\nTokens you don't restate keep their base values, and a component can still\\npoint at a token of its own through its `motion` option.\\n\\nNothing moves differently by default — every current duration, easing and\\nscale is preserved exactly, verified against the rendered styles. Themes that\\npredate the scale keep working: `createTheme` fills it in, the validator does\\nnot require it, and a theme registered as JSON without it resolves to the base\\ntiming rather than failing. `motionSafe` remains the floor, so a theme decides\\nhow overlays move for people who want movement, never whether they move at\\nall.\\n\\n`callout`'s existing `transitionMs` option and the `expand`/`skeleton`\\ndurations are untouched for now; folding them into this scale is a follow-up.\",\n \"commit\": \"3b51ace\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-dropdown` now uses the CDK's overlay helpers instead of its own copies of\",\n \"body\": \"them. It predates `cdk/overlay`, so it had been carrying a duplicate\\nplacement-to-`transform-origin` map, a duplicate focus-restore rule, a\\nduplicate discrete-transition block, and hand-written anchor and toggle-state\\ncode. `TRANSFORM_ORIGINS` had no consumers at all as a result — the shared\\nconstant existed while the one component that needed it used its own copy.\\n\\nNo behaviour change: the dropdown's 100 ms linear scale-and-fade, its measured\\ntransform origin, its focus restore and its ARIA wiring are all identical,\\nverified against the rendered styles. Every export in `cdk/overlay` now has a\\nconsumer, and the component is 35 lines shorter.\\n\\n`discreteOverlayTransition()` takes an optional fourth argument, a\\n`transition-timing-function`. Omitted, nothing is emitted and the CSS initial\\nvalue stands, so existing callers are untouched.\\n\\nOne real inconsistency fixed along the way: the listbox popups\\n(`uni-combobox`, `uni-search-input`, `uni-tag-input`, `uni-time-input`) were\\nintroduced to match `uni-dropdown`'s animation but ran on the default `ease`,\\nwhile the dropdown uses `linear` — so a combobox and a multi-select dropdown\\nin the same form opened at visibly different rates. They now share the\\ndropdown's easing exactly.\",\n \"commit\": \"676ec55\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-combobox` docs: \\\"Allowing new values\\\" — free text never commits implicitly (closed-set contract: typing filters, a non-matching draft reverts with `(rejected)`). The supported create-new pattern is now documented with a working story: drive `[options]` from the debounced `(query)` with `[filterLocally]=\\\"false\\\"` and, when nothing matches exactly, append a sentinel option — `{ label: `Create \\\"${text}\\\"`, value: … }`. As a real option it commits through every normal path (arrow + Enter, click, Enter when the filter narrows to it alone); resolve it in `(selected)` by minting the entity and writing the model. Blur intentionally never commits the sentinel — creation takes an explicit Enter or click. Lighter alternative: listen to `(rejected: { query })` and offer creation outside the control. If most values are user-created, use `uni-tag-input` (open set) instead.\",\n \"body\": \"\",\n \"commit\": \"66f4051\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-dropdown` (and everything riding it — the date picker popup, menus, multi-select): the open/close scale animation now originates from the corner actually touching the trigger. The origin was mapped statically from the _requested_ placement, but `position-try-fallbacks` lets the browser flip the panel at viewport edges — so a `bottom-end` date picker repositioned above its field still animated from the top-right corner. The panel is now measured on each toggle (open and close-start) and the transform origin follows the rendered position, via the new cdk helper `transformOriginFor(panelRect, triggerRect)`.\",\n \"body\": \"\",\n \"commit\": \"dc7aef9\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-combobox` — the form-bound, closed-set, single-select autocomplete. `FormValueControl<T | null>` over the cdk's object `Options<T>`, so it drops into Signal Forms via `[field]`; minimum usage is `<uni-combobox label=\\\"State\\\" [options]=\\\"states\\\" [(value)]=\\\"state\\\" />`. Typing filters, it never selects: the draft commits on an active option, a unique exact label match, or (Enter only) a filter narrowed to one enabled option; anything else reverts and emits `(rejected)`. The value contract is identical to `uni-select` (`T | null`, `compareWith`), so swapping one for the other as a list grows is a template-only change. Filtering is local by default; `[filterLocally]=\\\"false\\\"` renders `options` verbatim and the app narrows them from the debounced `(query)` output — the async/server-side story. Glyphs are theme icon primitives (`toggleIcon`/`clearIcon`/`selectedIcon`) rendered by `uni-icon`.\",\n \"body\": \"Supporting cdk changes, both non-breaking:\\n- `Option<T>` gains optional `description` (secondary line, read as part of the option's name) and `disabled` (visible and announced, not committable).\\n- `ListboxNavigation` accepts a `disabled?: (index) => boolean` config hook — arrows skip disabled options, `Home`/`End` land on the nearest enabled one, an all-disabled list never activates. Existing consumers pass nothing and behave identically.\",\n \"commit\": \"eb8b7ae\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Listbox popups (`uni-search-input`, `uni-tag-input`, `uni-time-input`, `uni-combobox`): the active/hover option fill is now the themable `activeColor` option (default `'primary-container'`, on-color derived) instead of a hardcoded token pair. Set it when your theme maps `primary-container` and `primary-surface` to the same color — the keyboard highlight is otherwise invisible; a canvas/hover tint like the one your menus use is usually right (`searchInput: { options: { activeColor: 'tertiary-surface' } }`, and likewise `tagInput`/`timeInput`/`combobox`). The base theme carries the default explicitly so the option is discoverable in each component's Theme options table.\",\n \"body\": \"The four popups now share one style source, the exported `listboxPopupStyles(theme, options, { maxHeight? })` helper (`UniListboxPopupOptions`), so their surface trio and highlight can no longer drift apart. Rendering is unchanged under existing themes; the active row's text color now derives from `listColor`'s on-pair rather than assuming `on-primary-surface`.\",\n \"commit\": \"eb8b7ae\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Popover v2, `uni-callout`, and `uni-tour` — the coach-mark family from the popover prototype, plus shared overlay primitives in the cdk.\",\n \"body\": \"**`uni-popover` v2 (upgrade in place).** Everything v1 shipped keeps its exact behavior (`placement`, `autoClose`, the three methods — `togglePopover`'s event is now optional — and both slots), and the chrome now resolves from a real `popover` theme entry whose defaults match the old hardcoded look. New: a two-way `open` model; `mode=\\\"tooltip\\\"` (hover/focus timers, `role=\\\"tooltip\\\"` + `aria-describedby`, WCAG 1.4.13 hoverable/dismissable, dev warning on focusable content — `uni-tooltip` remains for the wrap-content case); a detached `anchor` input (element or id, resolved at open) so the panel can hug a field while the trigger keeps the disclosure ARIA — and with no trigger content, no element claims `aria-expanded` it doesn't deserve; structured anatomy (`header` + `closable` ✕, `[popover-header]`/`[popover-footer]` slots that collapse when empty); `arrow`, `maxWidth` (theme default `38ch` — the one visible change for long unwrapped content; set the theme's `maxWidth: 'none'` to opt out), `openDelay`/`closeDelay`, and `opened`/`closed` outputs. Focus follows the APG disclosure pattern: stays on the trigger unless the panel marks `[autofocus]`, returns on close.\\n\\n**`uni-callout` (new).** An anchored coach mark that dims the page and cuts a spotlight hole around its target. Every scrim piece is CSS-anchor-positioned, so the hole tracks scroll/resize/layout with zero listeners, and the spotlit element stays genuinely clickable through it (`targetInteractive=false` covers it instead). Non-modal `role=\\\"dialog\\\"` with the \\\"duet\\\" focus loop — Tab cycles the panel's controls plus the interactive target — and focus restore that respects a user who moved into the target. `backdrop: 'spotlight' | 'dim' | 'none'`, `dismissible`, `dismissOnBackdrop` (otherwise backdrop clicks pulse the panel), and a `dismissed` output with `reason` (`close-button`/`escape`/`backdrop`/`programmatic`) plus `key` — the storage-free \\\"don't show again\\\" hooks. Retargets in place when `target` changes while open, which is what the tour rides.\\n\\n**`uni-tour` (new).** A thin sequencer over one callout: `steps` with per-step placement/backdrop/interactivity, a two-way deep-linkable `active` model, Back/Next/Done with dots-or-fraction progress, and `advanceOn` interaction gates — clicks auto-advance, anything else unlocks Next and announces it through one polite live region. Missing-target steps are skipped in the direction of travel with a dev warning. Escape/✕ (named by `skipLabel`) skip and report the step.\\n\\n**cdk.** New `overlay` module (`TRANSFORM_ORIGINS`, `setAnchorName`/`clearAnchorName`, `resolveElement` — `''` is unset, `isToggleOpen`, `discreteOverlayTransition`, `restoreOverlayFocus`, `focusableElements`) extracted from the dropdown's plumbing (dropdown's public API unchanged); `spotlightStyles(anchor, { pad, ringWidth, scrimColor })` beside `anchorStyles`, returning the window/strips/cover pieces as pure `calc(anchor(...))` style objects.\\n\\n**Arrow fix.** `anchorArrowStyles` now clips the rotated-square arrow to its outer half with a per-placement `clip-path` cut exactly on the panel-edge diagonal: the two border strokes previously ran the full square and visibly cut into the panel surface; they now terminate precisely at the panel edge, and the panel's own border line — which sits just outside that edge — falls inside the kept half, so the arrow background covers it and the base reads as an opening in the border. Tooltip, popover, and callout inherit the fix with no call-site changes.\",\n \"commit\": \"6f87212\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Input options: `typeFace` → `typeface`, matching the tooltip/button/tabs casing. The base theme now writes `typeface`, and the input box reads the new key with the old one as a deprecated fallback, so themes that still set `typeFace` render unchanged. The `typeFace` key is deprecated and will be removed in the next major.\",\n \"body\": \"\",\n \"commit\": \"57a8c4c\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-select`: `compareWith` input for object values.\",\n \"body\": \"The select matched `value` against option values with `===`, so an object value that was structurally but not referentially equal — a saved record matched against options from a fresh fetch — never matched, and the native select silently rendered the first option (or the placeholder) instead of the preselection. The new `compareWith` input, called as `compareWith(optionValue, value)` and defaulting to reference equality, lets object-valued selects pass a key comparison like `(a, b) => a?.id === b?.id`. Primitive values were and remain unaffected.\",\n \"commit\": \"96113ee\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-notification-badge`: a theme that omits the `offset` option no longer breaks badge positioning — the position values serialized as the invalid length `'undefinedpx'` and the badge lost its corner placement. Missing `offset` now falls back to `0`.\",\n \"body\": \"\",\n \"commit\": \"57a8c4c\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-calendar` / `uni-date-input`: a bound `''` now counts as \\\"no value\\\".\",\n \"body\": \"An empty string — the only typeable empty for a string-typed model, and the natural \\\"no value yet\\\" in consumer code — slipped past the month path's nullish (`??`) guards into the grid math: `viewMonth` became `''`, the month heading threw `RangeError: Invalid time value` from `Intl.format` on every change-detection pass, and the grid rendered zero weeks. This hit on first render (the popup content projects eagerly), not just on open. The guards are now falsy, matching how `displayText`, `splitDateTime`, and the rest of the datetime path already treat `''`, so a calendar or date-input bound to `''` renders the current month exactly like `undefined`. `uni-time-input` and `uni-date-time-input` were already safe. Consumers no longer need to normalize `''` to `undefined` before binding — and note the `value` models were always typed `UniDate | undefined`, so no `$any()` cast is needed for a `string | undefined` draft signal.\",\n \"commit\": \"92e5d5e\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.\",\n \"body\": \"\",\n \"commit\": \"e706e38\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-menu`, `uni-multi-select`, `uni-data-table`: stop tracking loop collections by identity (NG0956).\",\n \"body\": \"`uni-menu` items, `uni-multi-select` options, and `uni-data-table` records tracked by object identity, so a consumer rebuilding the array each change-detection pass — the natural way to write `[menuItems]=\\\"[...]\\\"` or re-fetch table rows — recreated every DOM node and tripped NG0956. They now track by `$index` (none of these collections carries a stable key: menu items may be templates or dividers, option values may be objects, records are arbitrary), and data-table columns track by their unique `columnDef`. Consumers no longer need to memoize a stable array; DOM nodes — including a focused menu item — survive a rebuild.\",\n \"commit\": \"96113ee\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Calendar, date & time entry: `uni-calendar`, `uni-date-input`, `uni-time-input` and `uni-date-time-input`, plus a pure datetime helper layer in the cdk.\",\n \"body\": \"The most-requested form control family anywhere, built native-platform-first with zero runtime dependencies: `Intl` does all formatting and parsing (no date library), the popup rides the native popover top layer with CSS anchor positioning, and every day in the grid is a real `<button>`.\\n- **Values are plain ISO strings, never `Date`s** — `UniDate` (`'YYYY-MM-DD'`), `UniTime` (`'HH:mm'`, always 24-hour), `UniDateTime` (`'YYYY-MM-DDTHH:mm'`), `UniDateRange` (`{ start, end }`). A `Date` is a timestamp with a timezone problem; a calendar date is a label on a wall calendar. Strings are timezone-free, JSON-serializable and sortable with `<`, and `[value]=\\\"'2026-08-20'\\\"` is a complete, correct binding.\\n- **`uni-calendar`** is an inline month grid and a form control in its own right: single and range modes in one component (the value shape switches with `mode`), availability **markers** with screen-reader labels, `minDate`/`maxDate` fences, `disabledDates` as a list or predicate, and a two-way `month` model so an app can drive \\\"jump to June\\\". One tab stop with a roving-tabindex `role=\\\"grid\\\"`; the full APG keyboard map (arrows, week `Home`/`End`, `PageUp`/`PageDown` with `Shift` for years) crosses month edges, skips disabled days directionally, and stops at fences without wrapping. Range selection paints a live preview band, swaps a backwards commit instead of erroring, and narrates every step through a `role=\\\"status\\\"` region.\\n- **`uni-date-input`** is free-typed date entry — no input mask (masks fight paste, IMEs and screen-reader echo). The parser accepts ISO, locale-numeric text with the digit order read from `Intl.DateTimeFormat(locale).formatToParts()`, and the locale's own month names; a missing year resolves to the next occurrence and two-digit years are refused rather than guessed. Unreadable, fenced or unavailable text **stays in the field**, flagged, with a `rejected` event. The popup is the same `uni-calendar`, hosted in a `role=\\\"dialog\\\"` popover via the shared `uni-dropdown`; `↑`/`↓` on a committed value step ±1 day.\\n- **`uni-time-input`** is a combobox over time slots — byte-for-byte the search-input/tag-input listbox contract via the CDK's `ListboxNavigation`. `9` → 09:00, `930` → 09:30, `3p` → 15:00, and a bare `3` leans PM in a 12-hour field (the bias yields when `minTime`/`maxTime` say otherwise). `slots` pins the choices for scheduling, refusing a typed `5pm` as `'unavailable'`; `↑`/`↓` on a committed value step ±`minuteStep`.\\n- **`uni-date-time-input`** seats both parts in one `uni-input-box` chrome under one `role=\\\"group\\\"` label, emitting one combined value only when both parts are set. `slotsFor` is the scheduling flow in one attribute: the time part stays disabled until a day is chosen, then offers exactly that day's slots, and changing the day clears a slot that no longer exists. The parts gained an `embedded` input so the composer renders one shared box instead of nested chrome.\\n- **cdk `datetime` module** (public export): the string-math and `Intl` layer — `addDays`/`addMonths`/`buildMonthGrid`/`parseDateText`/`parseTimeText`/`timeSlots`/`localeWeekStart` and friends — pure functions, unit-tested hard, usable by apps directly.\\n- **uni-core**: `'calendar'`, `'dateInput'`, `'timeInput'`, `'dateTimeInput'` join `ComponentName` with base-theme entries (day geometry per size token, `dayBorderRadius: 'xxs'` for the square look, toggle glyphs, popup/list chrome). Selection, range and today colours are deliberately not options — they are the `primary` role pair, so themes restyle them by restyling the palette.\\n- **Naming note:** the fences are `minDate`/`maxDate`/`minTime`/`maxTime`/`minDateTime`/`maxDateTime` rather than the platform's `min`/`max`, because Signal Forms' `FormUiControl` reserves `min`/`max` as numeric signals on form controls.\",\n \"commit\": \"71bc74c\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Themable focus chrome: a shared `focusRing` primitive for every control, plus `focusBorder`/`focusShadow`/`focusColor` options for input boxes.\",\n \"body\": \"**Shared focus ring.** A theme can now restyle the keyboard-focus indicator across the whole library by defining `focusRing` **border** and/or **shadow** primitives: `ThemeService.focusRing()` (and the new selector-less `focusRingStyle()`) replaces its default 2px outline with that border — drawn as an outline hugging the control — plus the ring shadow. A `focusRing` **thickness** primitive sets the ring's outline offset (negative values overlay the control's resting border, reading as a border-color change). Checkbox, radio, toggle and slider now route their hand-rolled focus styles through the shared helper (calendar days and tag chips already did), so one primitive trio gives every control the same focus language. Themes without the primitives render exactly as before.\\n\\n**uni-core:** `Thicknesses` is now an open record like `Borders`/`Shadows` (extra named primitives allowed), and `createTheme` accepts a sparse `thicknesses` override merged over the base scale.\\n\\n**Also in this release:**\\n- Radio and toggle scope their transitions (border/background/transform) instead of `all`, so the focus ring's outline and shadow apply instantly — `transition: all` interpolated the outline from a stale color, flashing a dark ring before the themed ring color landed.\\n- The radio's dot grow/retract animation is a token — `radio.options.transitionSpeed` (seconds, default 0.3 preserving the current feel; 0 switches instantly).\\n- The checkbox focus ring rounds proportionally again (box radius plus its gap) and the gap itself is a new `checkbox.options.focusRingGap` option; a `focusRingStyle` call's explicit gap wins over the theme's `focusRing` thickness, then the branch defaults.\\n\\nThe `input` component options could previously restyle focus only through `focusOutline`/`focusOutlineOffset`. The new optional trio mirrors the error-state trio (`errorBorder`/`errorShadow`/`errorColor`) and applies while any projected control has focus: `focusBorder` swaps the border primitive, `focusShadow` draws a ring (e.g. a soft `0 0 0 3px` spread), and `focusColor` swaps the background. All three default to `undefined`, so existing themes render exactly as before, and they yield to the error state so a flagged field stays visibly flagged while being corrected.\\n\\nThe Wellsourced showcase theme now defines the `focusRing` pair for its app's `.search-input:focus` look — an ochre (`secondary`) 1px border with a 10% ring of the same hue, tinted per palette in light and dark — so text fields (which rest on a canvas tint and snap to the clean surface on focus), checkboxes, radios, toggles, sliders, calendar days and tag chips all share one focus treatment.\",\n \"commit\": \"1a6b382\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"`uni-tag` v2: themable, opt-in removal, two style axes\",\n \"body\": \"v1 was a single hardcoded look with the palette welded into its template, an\\nunconditional remove button, and no theme entry — a filter chip, a status pill\\nand a recipient token all rendered identically. v2 makes the chip a real themed\\ncomponent and the building block `uni-tag-input` composes.\\n\\n**Breaking (uni-angular)**\\n- **`(close)` is now `(removed)`.** The old name shadowed the native `close`\\n event and needed an eslint suppression to compile.\\n- **The remove button is opt-in** — set `[removable]=\\\"true\\\"`. Previously every\\n tag, including a plain category label, shipped a \\\"Remove …\\\" button into the\\n accessibility tree.\\n- Codemod: rename `(close)` → `(removed)` and add `[removable]=\\\"true\\\"` wherever\\n a `(close)` handler exists.\\n\\n**Fixed**\\n- **A falsy value can now be removed.** `handleClose` guarded with `if (v)`, so\\n a tag keyed `''` or `0` silently could not be dismissed. Every defined value\\n emits, and a tag with no value emits `undefined`.\\n- The remove control now sizes from the chip instead of the icon-button's own\\n `sm` size — it was 22px inside a 24px chip, and taller than an `sm` chip\\n entirely.\\n\\n**New**\\n- **Two orthogonal style axes**: `variant` picks the colour role, `tone` picks\\n the archetype (`soft` / `solid` / `outline`). Both resolve from the new `tag`\\n theme entry, with tones as nested `&.tone-*` selectors inside each variant so\\n a theme author restyles both axes in one place.\\n- **`'tag'` joins core's `ComponentName`**, with a `TagTone` type and a full\\n theme entry (`options` for radius/typeface/gap/symbols, `variants` per colour\\n role, `sizes` carrying geometry only).\\n- **`interactive`** turns the chip body into a `<button>` with `selected` mapped\\n to `aria-pressed`, keeping the remove control a sibling — nesting them would\\n be invalid HTML and would strand the inner control for keyboard users.\\n- **Lead slot**: `avatarSrc`, `avatarName` (initials fallback), `iconName`,\\n `symbolName` and `dot` convenience inputs, plus a `[tag-lead]` slot for\\n anything richer. Lead elements size from the chip height, and all are\\n `aria-hidden` so the chip's text stays its accessible name.\\n- **Glyphs are theme icon primitives, not Material ligatures.** The remove and\\n selected affordances resolve through the new `removeIcon` / `selectedIcon`\\n theme options (defaulting to the built-in `close` and `check`), so they mask\\n `currentColor`, recolour with the chip's tone, and can be swapped per theme.\\n They also contribute no text to the DOM, which a ligature does — one less way\\n for an accessible name to be polluted. `symbolName` remains as the escape\\n hatch for glyphs the theme's icon set doesn't carry.\\n- **`invalid`** sets `aria-invalid` and a dashed underline, so the state does\\n not rely on colour alone (WCAG 1.4.1); `disabled`, `maxWidth` truncation with\\n a `title`, and `removeLabel` for overriding the remove button's name.\\n- The component ships with 21 specs, having previously had none.\",\n \"commit\": \"760b761\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"`ThemeService`: validated writes, runtime theme registration, live options\",\n \"body\": \"The theme registry was bootstrap-frozen and nothing validated theme writes —\\nand a brand theme applied via `applyPalette` never appeared in\\n`uni-theme-switch`, leaving the select on a bogus value with no way back.\\n\\n**Breaking**\\n- `ThemeService.theme` is now a **readonly signal**. Direct `theme.set(...)`\\n calls (already discouraged in the docs) must move to `setTheme(input)`,\\n which validates and returns `ThemeParseResult` — acceptance or the complete\\n list of rejection reasons — leaving the active theme untouched on rejection.\\n- `selectTheme(name)` now returns `boolean` and, for an unknown name, **does\\n nothing** — previously it silently kept the old theme while still recording\\n the bad key in `selectedThemeKey` and localStorage.\\n- `themeOptions` is now a `computed` (was a once-written writable signal).\\n\\n**New**\\n- **`registerTheme(input, { select? })`** validates and adds a theme to the\\n live registry — it appears in `themeOptions`/`uni-theme-switch` immediately.\\n **`unregisterTheme(id)`** removes it, falling back to the first remaining\\n theme when it was active. Themes injected via `UNI_THEMES` are validated at\\n startup; malformed entries are excluded with a console warning listing every\\n reason.\\n- **`applyPalette` registers the generated theme under `CustomTheme`**, so\\n \\\"Your Brand\\\" is an ordinary, selectable option: it shows in the switcher,\\n survives switching away and back, and `clearCustomPalette` unregisters it.\\n- **`uni-select` fix:** a selection pointing at an option added in the same\\n change-detection pass now applies (per-option `[selected]` binding; the\\n select-level `[value]` write landed before new options existed and was\\n ignored by the browser) — any consumer with a growing options list was\\n affected.\",\n \"commit\": \"6a4c7da\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-multi-select-dropdown`: a real accessible name, keyboard navigation, debounced filtering — and its first specs\",\n \"body\": \"This was the weakest component in the library on exactly the axes the roadmap's\\ncombobox item names, and it had **no spec file at all**, which is why the\\nmissing accessible name survived since it was written.\\n- **New `label` input, and the trigger finally names the field.** Its\\n accessible name now reads \\\"Fruits, 2 selected, Apple, Cherry\\\". Previously it\\n announced only the current selection — a screen reader user heard\\n \\\"Option 1, Option 3\\\" with no way to tell which field it belonged to. The\\n selection count comes along, so \\\"how many did I pick\\\" is not left to counting\\n commas.\\n- **Arrow keys, Home and End walk the options** from anywhere in the panel,\\n including the filter box. Reaching the last of thirty options previously\\n meant thirty `Tab` presses. Wrapping and the index arithmetic come from the\\n CDK's shared `ListboxNavigation`, so the keys behave exactly as they do in\\n `uni-search-input` and `uni-tag-input`.\\n- **The filter is debounced** (new `debounceTime`, default 200ms) instead of\\n re-filtering on every keystroke — the open item in TODO.md.\\n- **An empty filter result says so** through `role=\\\"status\\\"`, rather than\\n leaving the panel blank.\\n- **The options are grouped** as a `role=\\\"group\\\"` labelled from `label`.\\n- **20 specs**, covering the accessible name, selection and toggling, disabled\\n behaviour, filtering and debounce, keyboard navigation, and the form-control\\n contract.\\n\\n**A deliberate non-change:** the options stay real checkboxes rather than\\nbecoming a multi-selectable `listbox`. APG notes that multi-select listboxes are\\nhandled inconsistently across screen readers and suggests a checkbox group\\ninstead, and real checkboxes keep each option's state announced natively — so\\nconverting would have traded a well-supported pattern for a fashionable one,\\nand duplicated the checkbox's animated visual into this component where it\\nwould drift.\",\n \"commit\": \"970c36d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-tag-input`, plus a shared listbox contract in the CDK\",\n \"body\": \"The type-to-add chip field — recipients, filters, labels. It is the **open-set**\\ncontrol: anything typed can become a token, whether or not it matches a\\nsuggestion. Closed-set picking stays with `uni-select` /\\n`uni-multi-select-dropdown`, which is the deliberate split — the two look alike\\nbut differ on the one thing that decides the value type, so a single component\\nwould force one of them to carry an API it can never use.\\n- **`FormValueControl<UniTagItem[]>`.** `{ value: 'a@b.com' }` is a complete\\n item; `label`, `avatarSrc`, `invalid` and `disabled` are optional enrichment.\\n- **Invalid entries stay in the value, flagged**, rather than being dropped — a\\n field that silently swallows a typo'd address is worse than one that shows it\\n in red, and Enter on the chip lifts it back into the input to fix. Duplicates\\n and over-`max` entries are refused through `(rejected)` with a reason.\\n- **Full keyboard contract**: separators commit, Tab commits without trapping,\\n Backspace on an empty field _focuses_ the last chip rather than deleting it\\n blind, and on a chip Backspace and Delete both remove but move focus in\\n opposite directions — what makes pruning a list feel right.\\n- **The whole field is one tab stop.** Chips carry `tabindex=\\\"-1\\\"`, so Tab never\\n walks through eight recipients to reach the next control.\\n- **Announces through a `role=\\\"status\\\"` live region** on every add, remove and\\n rejection; the removal route is described once per field rather than by every\\n chip.\\n- **`preset=\\\"email\\\"`** wires an address validator, a paste parser that unwraps\\n `Name <a@b.com>` and keeps an unterminated tail in the field, and Space as a\\n separator.\\n- **`'tagInput'` joins core's `ComponentName`** with a theme entry for the chip\\n field's own tokens. Field chrome is not duplicated — it comes from `input` via\\n `uni-input-box`, so a tag input restyles with every other field.\\n\\n**Also in this release**\\n- **`ListboxNavigation` in the CDK** (`createListboxNavigation`) owns the\\n combobox bookkeeping every type-ahead control needs: open state, active\\n option, wrap-around arithmetic, Home/End, and `aria-activedescendant` wiring\\n that can never point at an option a narrowing filter has removed.\\n `uni-search-input` now uses it — behaviour unchanged, and it gains Home/End\\n for free — and the multi-select combobox upgrade will too. Three hand-rolled\\n copies of one keyboard contract is how they drift.\\n- **`uni-tag` gains `controlTabIndex`**, so a composite that owns its own roving\\n focus can take its chips out of the tab order, and **`selected` is now\\n optional**: an interactive chip carries `aria-pressed` only when it is\\n genuinely a toggle. Announcing \\\"not pressed\\\" on a recipient chip is worse than\\n announcing nothing.\",\n \"commit\": \"de83fe4\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Themes registered from JSON get the built-in icons back\",\n \"body\": \"`registerTheme` and `setTheme` now hydrate a theme's icons on the way in: the\\nbuilt-in set is merged _under_ whatever icons the payload carries, so the\\ntheme's own icons still win.\\n\\nThis is what makes a theme fetched as JSON usable. Transports elide `BaseIcons`\\n— roughly 71% of a serialized theme, and bytes the consumer already ships — so\\nwithout hydration a fetched theme would validate cleanly and then render no\\nicons at all. The rule is the same one `createTheme` already applies at\\nconstruction (`{...BaseIcons, ...icons}`), so a theme behaves identically\\nwhether it was built in-process or arrived over the wire.\\n\\nThemes provided through `UNI_THEMES` are unaffected: they already carry the full\\nset, so hydration is a no-op.\",\n \"commit\": \"5414517\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Menu items no longer look preselected when opened with the mouse\",\n \"body\": \"Opening a `uni-menu` by click left the first item highlighted before the\\npointer had touched it, reading as a preselected default. Two correct\\nbehaviours combined badly: `onOpened()` implements ARIA roving focus by calling\\n`.focus()` on an item every open, and the item styles deliberately painted\\n`:focus` the same as `:hover`. Nothing was wrong with the focus itself — only\\nwith painting it after a pointer open.\\n- **The highlight now keys on `:focus-visible`.** Programmatic focus following a\\n click doesn't match it, while keyboard-driven focus does — so mouse users get\\n no phantom highlight, and keyboard users keep the focus cursor. Roving-focus\\n bookkeeping is untouched: a mouse open still moves focus to the first item, so\\n screen readers announce it exactly as before.\\n- **New `HOVER_OR_KEYBOARD_FOCUS` constant exported from uni-core**, holding\\n that selector. Emotion merges styles by _exact selector text_, so a component's\\n base rule and any theme variant restyling it have to agree character for\\n character — a variant keyed `'&:hover, &:focus'` would both fail to override\\n and reintroduce the phantom highlight. Naming the selector once removes the\\n trap; the base theme's `menuItem.warn` tone and the Carbon/Wellsourced\\n showcase themes now use it.\\n\\nThemes with their own `menuItem` variants should key the highlight with\\n`HOVER_OR_KEYBOARD_FOCUS`. Note that `:focus-visible` is a browser heuristic:\\nafter a user has been navigating by keyboard, a subsequent click may still show\\nthe highlight, which is the intended \\\"this person is using the keyboard\\\"\\nbehaviour rather than a regression.\",\n \"commit\": \"3279186\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@8.0.0\"\n ]\n },\n {\n \"version\": \"7.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`expand` gains a themable, size-aware speed\",\n \"body\": \"The reveal/collapse duration was hardcoded at 350ms, so a consumer wanting a\\nsnappier disclosure — or wanting adjacent styling to fade on the same clock —\\nhad nothing to reference. A fixed duration also reads differently at different\\nsizes: sluggish on a two-line region, rushed on a full-page one.\\n- **New `transitionSpeed` option in the `expand` theme options** (seconds,\\n default `0.35`, matching alert/card `transitionSpeed`) sets the base\\n duration. `'expand'` joins core's `ComponentName` union, so custom and\\n derived themes can type an `expand` entry.\\n- **Duration scales with content height.** The actual duration is\\n `transitionSpeed × √(height ÷ 240px)`, clamped to ~0.15–0.6s at the default\\n speed (the envelope scales proportionally with a themed speed), so perceived\\n speed stays steady across region sizes. The curve and its constants\\n (`expandDuration`, `EXPAND_DEFAULT_SPEED`, `EXPAND_MIN_DURATION`,\\n `EXPAND_MAX_DURATION`, `EXPAND_REFERENCE_HEIGHT`) are exported from\\n uni-core.\\n- **New per-instance `transitionSpeed` input** sets an exact duration for one\\n region, bypassing the scaling: `<uni-expand [transitionSpeed]=\\\"0.15\\\">`.\\n- **The resolved duration is exposed as the public `duration` signal** on\\n `uni-expand`, so adjacent styling can move on the reveal's clock with a\\n plain binding — `[style.transition-duration]=\\\"expand.duration() + 's'\\\"` —\\n keeping all timing in the theme/signal pipeline, with no custom CSS.\\n- **`expand-toggle` gains a matching `transitionSpeed` input** and otherwise\\n follows the theme token instead of its own hardcoded 350ms. Expand Area\\n binds the region's resolved `duration` to its toggle, keeping chevron and\\n reveal on one clock even when size-scaled or overridden.\\n- **Speed is theme-reactive**: swapping themes at runtime retimes regions and\\n chevrons live.\\n- **Enter/leave easing is now `ease-in-out`** (was `ease-in`), matching the\\n chevron rotation so trigger and region decelerate together.\\n- **`UniExpandOptions` is exported** from uni-angular for\\n `getComponentOptions<UniExpandOptions>('expand')` consumers.\",\n \"commit\": \"c828982\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Menus join the theme model: `menu` + `menuItem` component options, item tones, and dividers\",\n \"body\": \"The menu was the only composite component with no theme surface of its own —\\npanel chrome came from the shared `dropdown` entry and every item-level knob\\n(height 38, `primary-container` hover, `check` active symbol, `label` type\\nrole) was hardcoded. Every Uni menu therefore looked identical, and the gaps a\\nreal product hits first (a red Delete, a separator before it, disabled rows)\\nwere only reachable via `::ng-deep`.\\n- **New `menu` theme options** (`'menu'` joins core's `ComponentName` union):\\n `minWidth`, panel `color`/`border`/`borderRadius`/`shadow` (each falling\\n back to the `dropdown` options when unset, so menus follow generic popovers\\n until a theme deliberately splits them), `paddingVertical`/\\n `paddingHorizontal` (panel inset — `xs` inset plus item `borderRadius`\\n yields the \\\"hover pill\\\" look; `none` yields full-bleed rows), and\\n `dividerBorder`/`dividerSpacing` for separators.\\n- **New `menuItem` theme options + variants** (`'menuItem'` joins\\n `ComponentName`): `height`, `paddingHorizontal`, `gap`, `borderRadius`,\\n `typeface`, `textColor`, `hoverColor`, `activeSymbol` (undefined removes the\\n trailing check), and `transitionSpeed`. Theme `variants` on `menuItem` carry\\n tones — the base theme ships a `warn` tone for destructive actions.\\n- **`MenuItem` grows `variant`, `disabled`, and `{ divider: true }`.**\\n `variant: 'warn'` routes through the theme's `menuItem` variants; `disabled`\\n items render in the disabled color, carry `aria-disabled`, and are skipped\\n by keyboard navigation; dividers render as `role=\\\"separator\\\"` rules styled\\n by the `menu` options. `isDivider` and the `UniMenuOptions`/\\n `UniMenuItemOptions` interfaces are exported from uni-angular.\\n- **`uni-dropdown` panel chrome is now input-overridable**\\n (`border`/`borderRadius`/`shadow`/`color`), falling back to the `dropdown`\\n theme options — this is the mechanism `uni-menu` uses; other consumers are\\n unchanged.\\n- **Default-rendering change:** menus now have `minWidth: 184` from the base\\n theme (previously they sized to the widest item). All other defaults\\n reproduce the previous look, including the 0.35s hover transition.\\n- **The Carbon experiment themes gain menu styling** (sharp full-bleed 40px\\n rows, IBM Plex, `$layer-hover`, red danger option, ~110ms motion) with a new\\n Carbon Menu story demonstrating that the same component renders both\\n aesthetics untouched.\",\n \"commit\": \"6e8b429\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Tooltip no longer blinks after activating a wrapped control\",\n \"body\": \"Clicking a button inside `uni-tooltip` used to fall through to the bubble's\\ntap-to-toggle handler and then re-show on the still-hovering pointer — a\\nstate-flipping label (\\\"Expand\\\" → \\\"Collapse\\\") visibly blinked off and back on\\nafter the click.\\n- **Activating an interactive element inside the host now hides the bubble\\n and suppresses it** until the pointer leaves and returns (or focus moves\\n away). Tap-to-toggle is unchanged for non-interactive hosts (inline text).\\n- **`expand-toggle` drops its icon-only tooltip.** The rotating chevron plus\\n `aria-expanded` and the button's accessible name already say everything the\\n bubble restated; use the `label` input when a disclosure needs a visible\\n name.\",\n \"commit\": \"ba4e38d\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Centre `icon-button`'s glyph, fix `expand-toggle`'s rotation, make `expand`\",\n \"body\": \"block-level and motion-safe, and give `expand-toggle` a label\\n\\nGaps found while building collapsible sections in a consuming app, where each\\none had to be worked around locally.\\n- **`icon-button` centres its glyph.** Sizing `iconName` from the size token\\n (shipped in the previous release) made the glyph smaller than the button —\\n an `sm` button is a 22px box around an 18px icon — but the button was\\n `display: block`, so the glyph sat in the top-left corner with all the slack\\n on its right and bottom. It is now a centring flex box; flex is still\\n block-level, so the button's own layout is unchanged, and the\\n absolutely-positioned accessible-name span stays out of the flex flow.\\n **Visual change** for every `icon-button`: glyphs shift to the middle of the\\n box. `symbolName` ligatures centre too, which also means the known\\n oversized-ligature case (a 24px glyph in a 22px `sm` box) now clips evenly on\\n all sides instead of only bottom-right. Covered by a test.\\n- **`expand-toggle` rotates the glyph instead of its host.** This is a fix to\\n existing behaviour, visible in 7.1.0 and earlier: the 180° turn was applied to\\n the component host, which is both the tooltip's positioning box (`uni-tooltip`\\n sets `anchor-name` on its own element, nested inside the host) and taller than\\n the glyph, since an inline-level box reserves baseline descender space. So the\\n bubble bobbed along an arc as the chevron turned, and the chevron itself\\n drifted off-centre rather than spinning in place. The transform now lands on\\n `uni-icon` — a centred square sized to the glyph, and the only box here that\\n rotates symmetrically. The host keeps its `toggled` attribute, so any consumer\\n styling keyed on it still works.\\n- **`uni-expand` is now `display: block`.** As a custom element it defaulted to\\n `display: inline`, so its animated grid laid out as a block-in-inline box and\\n the revealed content's spacing came out subtly wrong. Every consumer was\\n writing `uni-expand { display: block }` by hand. **Visual change** for anyone\\n who was relying on the inline default or already shipping that override — the\\n override is now redundant and can be deleted.\\n- **The reveal respects `prefers-reduced-motion`** (WCAG 2.3.3). The\\n expand/collapse keyframes ran unconditionally; they're now wrapped in\\n `motionSafe`, as is `expand-toggle`'s chevron rotation. Under reduced motion\\n the region appears and disappears instantly. `overflow: hidden` moved inside\\n the guard deliberately: it exists to clip the box mid-animation, and leaving\\n it applied at rest would crop decorations that legitimately paint outside the\\n region (focus rings, offset outlines). Angular removes a leaving node on the\\n next frame when it detects no animation, so nothing hangs.\\n- **`expand-toggle` takes `label` and `sublabel`.** It was chevron-only, so any\\n disclosure that names its section — most of them — had to hand-roll the whole\\n trigger row and its styles, which is how consumers end up with a private\\n copy of this component. With `label` set the toggle renders a full-width row\\n (chevron, label, muted qualifier) as a single button whose accessible name is\\n the label, instead of an icon button sitting next to unrelated text. Only the\\n chevron rotates, so the label stays upright. Omit `label` and the icon-only\\n shape is unchanged, tooltip and all — `uni-expand-area` is unaffected.\",\n \"commit\": \"8d77ed7\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Size `icon-button`'s `iconName` glyph from its size token\",\n \"body\": \"`icon-button` rendered a `symbolName` ligature at a font size, but an `iconName`\\nmask with no size at all — and the base `iconButton` size tokens carry no\\npadding, so the icon filled the entire button box edge to edge. That made\\n`symbolName` → `iconName` a visual regression rather than a like-for-like swap,\\nwhich matters now that `uni-icon` is the preferred path (a mask paints on the\\nfirst frame, where a ligature waits on the variable font).\\n- `iconName` is now sized from the size token's `fontSize` — the same value that\\n scales the rest of the control — so the glyph sits inside the button and grows\\n with `size`. Concretely, `size=\\\"sm\\\"` renders an 18px glyph in a 22px button\\n instead of a 22px one.\\n- **Visual change** for existing `iconName` call sites: glyphs get slightly\\n smaller and gain breathing room. Themes that size icon-buttons with padding\\n (e.g. the Carbon example) set a matching `fontSize`, so they land on the same\\n glyph size either way and are unaffected.\\n- Known gap, now covered by a test that documents rather than blesses it:\\n `uni-symbol` takes its size from `opticalSize` (default 24) and ignores the\\n button's size token, so a `sm` button renders a 24px ligature in a 22px box.\\n Masked icons do not have that problem — one more reason to prefer `iconName`.\",\n \"commit\": \"c532c95\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Fix `uni-icon` ignoring `size=\\\"24\\\"` written as a static attribute\",\n \"body\": \"`size` appended `px` only to numbers, but a static template attribute arrives as\\na string — so `<uni-icon name=\\\"mail\\\" size=\\\"24\\\" />` emitted the invalid\\n`width: 24`. Browsers drop an invalid declaration, which silently fell back to\\nthe stylesheet's `width: 100%; height: 100%`.\\n\\nThat failed in two different ways depending on the container, neither of them\\nobvious: inside a fixed box the icon quietly filled it (a 16px glyph rendering\\nat 30px), and inside a content-sized flex row `height: 100%` collapsed to zero,\\nso the icon vanished while still occupying full width and pushing its label\\nacross the row.\\n\\nA bare numeric string is now treated as px, matching the number form. Genuine\\nCSS lengths (`'1.25rem'`, `'50%'`, `calc(…)`) still pass through untouched.\\n`[size]=\\\"24\\\"` was unaffected throughout, since property binding passes a real\\nnumber.\",\n \"commit\": \"c532c95\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Expand `BaseIcons` to 59 icons and add `uni-icon` sizing\",\n \"body\": \"The 34-icon set shipped in 7.0.0 covered the library's own components but not a\\nreal application — an app migrating off inline `<svg>` (or off `uni-symbol`, in\\nAngular) ran out of names almost immediately. Everything here is additive; all\\n34 existing names are unchanged.\\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\\n `logout`).\\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\\n row-aligned menus need the horizontal kebab.\\n - `star` is separate from `favorite`, which is the heart.\\n- **`uni-icon` gains an optional `size` input** (`CssLength` — bare numbers are\\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\\n behaviour is unchanged: the icon fills its container, which is what lets a\\n themed control size its own glyph through padding. Set, it applies\\n width/height as inline styles, so an explicit size wins over the\\n fill-the-container rule regardless of style injection order. This removes the\\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\\n `<uni-icon>` would otherwise need.\\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\\n foreign grid when the theme already ships the glyph. The tool cannot recognise\\n a shape, so it hands the caller the list to check against before adding\\n anything.\",\n \"commit\": \"c2421c0\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Replace `BaseIcons` with a normalized 34-icon Material Symbols set\",\n \"body\": \"The built-in icon set was 11 glyphs drawn from four different grids\\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\\noversized `close` — three optical weights in one set.\\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\\n sites and theme overrides keep working. Their **appearance changes**: the\\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\\n overall. `spinner` is carried over verbatim, keyframes intact.\\n- New `IconName` and `BaseIconName` types. `IconName` is\\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\\n while themes can still register arbitrary names via `createTheme({ icons })`.\\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\\n and `IconConfig` exports. Nothing in the library referenced them and\\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\\n `IconName` instead.\\n- New exported `svgToIconUri(svg, options?)` — the supported way to bring your\\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\\n source (drops the xml declaration, comments and fixed `width`/`height` so the\\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\\n a gradient/pattern fill, or more than one paint color. That last one is the\\n trap worth naming — masks use the alpha channel, so a multi-color logo\\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\\n when that is intended. `createTheme({ icons })` merges the result over\\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\\n helper, so tokens are byte-identical to the built-in set, and adds the\\n set-level checks a per-icon helper cannot make — which names override\\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\\n reported per icon rather than failing the batch, and re-running is safe\\n (already-encoded URIs pass through). The server instructions now point agents\\n at it whenever they encounter inline SVG.\\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\\n which fetches from the canonical Material Symbols source and validates every\\n glyph before writing — a malformed path, an off-grid viewBox or geometry\\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\\n file without writing. Add or change icons in that script's manifest and\\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\\n same invariants against the committed output.\",\n \"commit\": \"f7727aa\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@7.0.0\"\n ]\n },\n {\n \"version\": \"6.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Canonical MDX docs structure across the entire library\",\n \"body\": \"- Component docs pages now follow one flow (spec in AGENTS.md): imports → Overview →\\n Usage (the compact playground: story + source + knobs) → named variation examples →\\n **Theme options** → Accessibility → Do/Don't. Property/API/Methods/Events tables are\\n retired — the playground's controls are the API reference.\\n- New `ThemeOptions` docs block renders a component's per-theme option tokens live from\\n the active Storybook theme (with color swatches), distinguishing per-theme options\\n from per-instance inputs; data-table's raw `ThemeDataBlock` dump is replaced.\\n- All ~55 component pages conform: the 7 form-control pages (200–390 lines of legacy\\n API tables) rewritten; empty Overviews authored (card, tag, icon-button, scroll-area,\\n expand-area, data-table); accessibility bullets added across navigation, feedback,\\n and form components.\\n- The MCP index now carries when-to-use guidance for 55 of 70 components (was 41) and\\n accessibility guidance for 36 (was 21) — the remainder are subcomponents documented\\n on their parent pages and internal directives.\",\n \"commit\": \"4bfb057\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"Layout components are attribute-only, on any element\",\n \"body\": \"**Breaking:** the shorthand element selectors `Box`, `Stack`, `Row`, `Grid`, `Wrap`,\\nand `GridArea` are removed — a concept inherited from another library that conflicted\\nwith semantic HTML. Migrate to the attribute form: `<Box padding=\\\"md\\\">` →\\n`<div box-layout padding=\\\"md\\\">` (GridArea → `grid-area-layout`).\\n\\nIn exchange, the attribute selectors now apply to **any element**, not just `div` —\\nlayout and semantics compose: `<main box-layout [grow]=\\\"1\\\" padding=\\\"md\\\">`,\\n`<nav stack-layout gap=\\\"sm\\\">`, `<section stack-layout>`.\\n\\nAlso documented, unchanged in behavior: the sizing convention (number = px via\\nbinding, `[height]=\\\"420\\\"`; plain attribute = CSS length, `height=\\\"420px\\\"`) and\\nStack/Row's `fit-content` min-size defaults (set `[minHeight]=\\\"0\\\"` / `[minWidth]=\\\"0\\\"`\\nfor scroll containment). All internal usages, stories, and docs are migrated —\\nincluding the Divider story's `<Center>`, which had silently never rendered (Center\\nnever had an element selector).\",\n \"commit\": \"a02afee\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"Selector unification: one form per component\",\n \"body\": \"**Breaking:** every PascalCase alias selector is removed (`Card`, `Menu`, `Symbol`,\\n`Icon`, `Dialog`, `Button`, `Tabs`, `Snackbar`, `SelectInput`, `Confirmation`, … — a\\nconcept inherited from another library). Each component now has exactly one canonical\\nform, chosen by what the component is:\\n- **Widgets and content-renderers** keep their `uni-*` element: `<uni-card>`,\\n `<uni-menu>`, `<uni-symbol>`, `<uni-icon>`, `<uni-tabs>`, `<uni-select>`,\\n `<uni-confirmation-dialog>`, …\\n- **Decorators of native elements** are attribute-only, and their `div`-locks are\\n lifted: `[uni-badge]`, `[uni-dialog-header]` (e.g. on `<header>`),\\n `[uni-dialog-buttons]`/`[dialog-buttons]` (e.g. on `<footer>`),\\n `[uni-scroll-area]`/`[scroll-area]`, `[uni-menu-item]`/`[menu-item]` (e.g. on\\n `<li>`).\\n- **Host-locked selectors stay host-locked** where the native element carries the\\n behavior: `dialog[uni-dialog]`, `button[uni-text-button]`/`button[text-button]`,\\n `button[uni-icon-button]`/`button[icon-button]`.\\n\\nMigration is mechanical: `<Card>` → `<uni-card>`, `<Button …>` →\\n`<button text-button …>`, `<Dialog …>` → `<dialog uni-dialog …>`, `<Badge …>` →\\n`<div uni-badge …>`, `<ScrollArea …>` → `<div scroll-area …>`. All internal usages,\\nstories, and docs are migrated; `llms.txt` and the MCP index reflect the canonical\\nforms.\",\n \"commit\": \"f1796fb\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"Text is attribute-only, with a value shorthand and element-aware defaults\",\n \"body\": \"**Breaking:** the `uni-text` and `Text` element selectors are removed. Text is now the\\nattribute `[uni-text]` on any element, keeping your HTML semantics:\\n- **Value shorthand** — the attribute value is the typeface:\\n `<h1 uni-text=\\\"display-small\\\">`, `<span uni-text=\\\"caption\\\">`, dynamic via\\n `[uni-text]=\\\"role()\\\"`. The explicit `typeface` input still works (the attribute\\n value wins when both are set).\\n- **Element-aware defaults** — with no value, the typeface is inferred from the host:\\n `h1`→headline-large, `h2`→headline-medium, `h3`→headline-small, `h4`→title-large,\\n `p`→body-1-long, `small`/`figcaption`→caption, `blockquote`→quote, `label`→label,\\n else title-small. Plain semantic markup is correctly set with zero configuration.\\n\\nMigrate `<uni-text typeface=\\\"body-1-long\\\">…</uni-text>` →\\n`<p uni-text>…</p>` (or `<span uni-text=\\\"body-1-long\\\">` where no semantic element\\nfits). All internal usages, stories, and docs are migrated.\",\n \"commit\": \"a62e9b1\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Search input stripped back and made generic; debounce input dressed in the shared chrome\",\n \"body\": \"- **`uni-debounce-input`** now wears the themed input chrome via `uni-input-box`\\n (color, border, typeface, focus ring) and gains `label` (accessible name),\\n `placeholder`, `disabled`, `pre-input`/`post-input` attribute slots for adornments,\\n ARIA passthroughs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\\n for composite widgets, and `clear()`/`focus()` methods. Debounce behavior unchanged.\\n- **`uni-search-input` redesigned**: the opinionated solid-primary pill bar with the\\n embedded `title-large` label is gone. It's now a standard themed field — decorative\\n leading magnifier, clear button while a query exists (refocusing on clear), Enter\\n emits `search`, Escape closes/clears.\\n- **Type-ahead added**: pass `suggestions` (refresh from `change`) and the field\\n becomes an ARIA combobox — keyboard-navigable listbox (ArrowUp/Down, Enter selects,\\n emitting `suggestionSelected` + `search`), `aria-activedescendant` wiring, focus-out\\n closing. New `searchInput` theme options: `searchSymbol`, `clearSymbol`, suggestion\\n list `listColor`/`listShadow`/`listBorderRadius`, `maxSuggestions`.\\n- Visual breaking change for SearchInput consumers (deliberate strip-back); code API\\n is compatible (`label`/`width`/`change`/`search` retained; `label` is now the\\n accessible name + placeholder fallback rather than displayed text).\",\n \"commit\": \"5a6fc60\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Checkbox, radio, and toggle conform to theme tokens\",\n \"body\": \"- The last hardcoded control colors (`#FFF`, `#ccc`, `#d0d0d0`, `#e0e0e0`,\\n `rgba(0,0,0,0.2)`) are gone. Chrome now resolves from new option tokens —\\n checkbox `boxColor: 'surface'`; radio `ringColor: 'outline'` / `fillColor:\\n correctly on dark and brand themes.\\n- The checkbox's check/dash strokes wear the variant's paired on-color\\n (`on-primary`, `on-warn`, …) instead of assuming white; disabled states use the\\n `disabled`/`on-disabled` tokens; the toggle knob's shadow is the theme's\\n brand-tinted `raised` stack, and its hover uses the button convention's\\n brightness filter instead of a fixed grey.\",\n \"commit\": \"8953d59\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-stat` KPI tile\",\n \"body\": \"- Muted label + large headline value (numbers auto-compact via\\n `Intl.NumberFormat`: `48234` → \\\"48.2K\\\") set in a new `stat` type-scale role\\n (32px semibold, proportional figures).\\n- Optional signed `delta` whose ink is decided by direction × `upIsGood` — churn\\n going down reads green, tickets going up reads red — with the arrow glyph\\n accompanied by screen-reader \\\"up\\\"/\\\"down\\\" text so state never rides color alone;\\n `caption` names the comparison period.\\n- Optional decorative 12-point sparkline (`trend` input): stroke in the outline hue,\\n endpoint dotted in the accent, `aria-hidden`.\\n- Fully token-driven via `stat.options`: card-recipe frame (`color`/`border`/\\n `borderRadius`), `labelTypeface`/`valueTypeface`, `positiveColor`/`negativeColor`\\n (the semantic inks, AA-guaranteed on surface), `trendColor`/`trendAccent`, spacing.\",\n \"commit\": \"7a6da4f\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Fix invisible icons; icons become first-class theme primitives\",\n \"body\": \"- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\\n `icons: {}` — the icon record was never wired in, so all icons (dialog close, button\\n spinner, search/clear affordances) rendered nothing.\\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it — themes\\n can override or add icons under any name (inline SVG data URIs, masked with\\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\\n `BaseIcons` (deprecated).\\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\\n broken `url(\\\"undefined\\\")`.\\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\\n `generate-uni-theme` guidance instructs agents: never inline SVG in components —\\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.\",\n \"commit\": \"fea0b2e\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@6.0.0\"\n ]\n },\n {\n \"version\": \"5.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-avatar` and `uni-avatar-group` components\",\n \"body\": \"- Graceful fallback chain: image → initials derived from `name` (first + last) →\\n themed symbol. Accessible by default: `role=\\\"img\\\"` + `aria-label` from the name,\\n `aria-hidden` when purely decorative.\\n- Fully token-driven: variants color from the role's `*-container` tokens, sizes from\\n the theme's `avatar` size records, corner radius from `options.borderRadius`\\n (`max` = circles; a `sharp` theme gets square avatars), initials typeface from\\n `options.typeface`, fallback symbol from `options.fallbackSymbol`.\\n- `uni-avatar-group` stacks avatars with a token-driven overlap (spacing token) and\\n separator ring (`ringColor`/`ringWidth` options); `max` collapses the overflow into\\n a themed \\\"+N\\\" chip that is itself a `uni-avatar` (verbatim `text` input).\",\n \"commit\": \"1f5ee1d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-breadcrumb` component\",\n \"body\": \"- WAI-ARIA breadcrumb: labelled `nav` landmark wrapping an ordered list, the last item\\n marked `aria-current=\\\"page\\\"`, separators decorative (`aria-hidden`).\\n- Data-driven `items` (root first). Items with `href` render as real anchors; without\\n one they render as link-styled buttons emitting `itemClicked` for SPA routing.\\n- Token-driven via `breadcrumb.options`: `typeface`, link `color`, `currentColor`,\\n `separatorSymbol` (material symbol), and `gap` spacing.\",\n \"commit\": \"dca84b1\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Button corner rounding and typography conform to component-options tokens\",\n \"body\": \"- `button` and `iconButton` themes gain `options: { borderRadius: 'max' }`; the hardcoded\\n per-size pixel radii (11/13/18/24) and the icon button's inline `borderRadius: 999` are\\n removed. Components resolve the token through `theme.radius()`, so the theme's radii\\n scale — shape languages (`sharp` → square, `playful` → pill) and custom radii\\n primitives — now restyles buttons like every other tokened component.\\n- Back-compat: the options radius is applied before theme `sizes`/`fixed` styles, so\\n hand-authored themes that still set a size-level `borderRadius` keep winning; icon\\n buttons fall back to the legacy circle when a theme predates iconButton options.\\n- `button` themes also gain `options: { typeface: 'button' }`: the hardcoded\\n `fontFamily: 'Euphemia'` (a font no theme loads) is removed from `fixed` and the sizes;\\n labels now render the type scale's `button` role (Red Hat Display, medium, capitalize),\\n with per-size `fontSize` still applied by `sizes`. Point the token at any typography\\n role — including custom ones — to restyle every button label.\\n- New `UniButtonOptions` interface (`borderRadius`, `typeface`) exported from the button\\n model.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Card frame conforms to token primitives\",\n \"body\": \"- The card theme's hardcoded frame (`borderStyle`/`borderWidth`/`borderRadius: '8px'` in\\n `fixed`, `borderColor` per variant) is replaced by tokens: the card resolves its border\\n from the **border primitive named by its variant** (`borders.primary` …\\n `borders.success`), its corner radius from the radii scale (`options.borderRadius:\\n- `UniCardOptions` gains `border` (pin every card to one primitive — including a custom\\n one — instead of variant-following) and documents the existing `borderRadius`/\\n `elevation`; redefining a border primitive in a theme now restyles cards and every\\n other component sharing that token.\\n- Token styles apply under the merged theme style, so hand-authored themes that still\\n set card `fixed`/`variants` frame styles keep winning. No visual change for default\\n themes — this is pure tokenization.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-drawer` and `uni-app-bar` — the dashboard shell\",\n \"body\": \"- **`uni-drawer`** has two modes sharing one content slot: `side` renders an in-flow\\n `<aside>` that pushes content (width-animated open/close, divider border primitive at\\n its edge, `aria-hidden` while closed); `over` renders a native `<dialog>` in the top\\n layer — focus trap, Escape, and scrim backdrop come from the platform, sliding in\\n from `position` (`start`/`end`). `open` is a two-way `model()`; Escape and backdrop\\n clicks keep it in sync. Tokens: `drawer.options` (`color`, `width`, `divider`,\\n `elevation`, `padding`, `backdrop`).\\n- **`uni-app-bar`**: leading/trailing content projection slots around a `title` (or\\n custom center content), trailing pushed to the far edge; optional `sticky`. Tokens:\\n `appBar.options` (`color`, `height`, `divider`, `typeface`, `padding`, `gap`,\\n optional `elevation`).\\n- The Drawer \\\"DashboardShell\\\" story documents the composition recipe: app bar with a\\n menu toggle + side drawer + content.\",\n \"commit\": \"17cf662\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Progress gauge derives from the palette instead of hardcoded pastels\",\n \"body\": \"The gauge's track colors were fixed pastel hexes (`#b3d4ea`, `#b3e7c2`, …) that ignored\\nthe active theme entirely — secondary and success even shared the same green. Tracks now\\nuse the role's `*-container` token (the palette's soft tint of that role) and arcs the\\nrole base, so gauges follow any brand palette, in both light and dark modes.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-skeleton` loading placeholder\",\n \"body\": \"- Three shapes: `text` (multi-line, ending on a short line like real copy), `rect`,\\n and `circle`; explicit `width`/`height` accept CSS strings or px numbers.\\n- Painted with surface tokens (`skeleton.options`: `color`, `highlightColor`,\\n `borderRadius`, `gap`) so placeholders sit naturally on light and dark themes; the\\n shimmer sweep (`animation`/`duration` options) only runs when the user allows motion\\n and degrades to static blocks under `prefers-reduced-motion`.\\n- `aria-hidden` — placeholders are invisible to assistive tech by design.\",\n \"commit\": \"4ccf18b\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-slider` component — clears the declared-but-unbuilt `ComponentName` entry\",\n \"body\": \"- Native `<input type=\\\"range\\\">` under the hood: platform keyboard interaction\\n (arrows, Home/End, Page Up/Down) and ARIA slider semantics for free; Signal Forms\\n contract (`FormValueControl<number>`) matching Input/Textarea.\\n- `min`/`max`/`step` inputs (fractional steps supported), required accessible `label`.\\n- Token-driven via `slider.options`: fill/thumb `color`, `trackColor`, `borderRadius`,\\n and geometry (`trackHeight`, `thumbSize`). The fill level rides a CSS custom\\n property, so dragging never regenerates Emotion styles; Firefox uses the native\\n `::-moz-range-progress`, WebKit a gradient stop.\",\n \"commit\": \"5d9062a\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-tabs` / `uni-tab` components\",\n \"body\": \"- Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired\\n `aria-selected`/`aria-controls`/`aria-labelledby`, roving tabindex, automatic\\n activation on ArrowLeft/ArrowRight (wrapping, disabled tabs skipped), Home/End,\\n and motion-safe transitions.\\n- `selectedIndex` is a two-way `model()`; selection snaps to the nearest enabled tab.\\n Panel content is captured per-tab and only the selected panel is instantiated.\\n- Every visual knob is a theme option token (`tabs.options`): `typeface`, `textColor`,\\n `activeTextColor`, `indicatorColor`, `indicatorThickness` (thickness token),\\n `divider` (border primitive), `gap`/`padding` (spacing tokens), `borderRadius`, and\\n optional `activeColor` — the defaults render underline tabs; `borderRadius: 'max'` +\\n `activeColor` turns them into segmented pills with no component changes.\",\n \"commit\": \"15a8f73\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-textarea` component\",\n \"body\": \"- Multi-line text field with the same Signal Forms contract as `uni-input`\\n (`FormValueControl<string>`: `value` model, `disabled`/`invalid`/`dirty`/`required`,\\n touched-aware error styling, `aria-*` wiring).\\n- Reuses `uni-input-box` for its chrome, so it inherits the input's themed color,\\n border, typeface, focus outline, and disabled treatment automatically; the box's\\n field selectors now cover `textarea` (with auto height and vertical padding), and\\n the box accepts a `height` override.\\n- Theme options follow the token pattern: `textarea: { options: { rows: 3, resize:\\n instance.\",\n \"commit\": \"b04b97b\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Theme Builder becomes the full playground (PRD §5.2)\",\n \"body\": \"- **Light & dark side by side**: both palettes generate on every input change,\\n independent of the storybook-wide mode toggle, each rendered in its own panel.\\n- **Contrast report panel**: live pass/fail matrix over all checked pairs (summary +\\n failing rows always visible, full detail on demand). Failures only occur with hard\\n brand pins; the panel says so and points at soft targets.\\n- **Shape language input** (`sharp`/`modern`/`playful`): applies `ShapeRadii` live via\\n the new `radii` pass-through on `BrandPaletteConfig`/`createThemeFromPalette`.\\n- **Export paths**: copy the static `uni-theme.ts` (via `emitThemeFile`), copy a\\n pre-encoded `ng add` command, or copy W3C DTCG JSON for both modes via the new\\n `emitDtcgTokens()` interop emitter in uni-core (Style Dictionary compatible).\",\n \"commit\": \"8f55b4c\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.1.0\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix `ng add` against real published packages (found by fresh `ng new` e2e):\",\n \"body\": \"- The schematic bundle is CJS, but ng-packagr stamps `\\\"type\\\": \\\"module\\\"` into the\\n published package.json, so Node loaded it as ESM and the CLI reported \\\"no ng add\\n actions\\\". A nested `schematics/package.json` (`\\\"type\\\": \\\"commonjs\\\"`) scopes the\\n bundle back to CJS.\\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\\n signature), failing under `ng new`'s strict `noPropertyAccessFromIndexSignature`.\\n The emitter (and the MCP tool's guidance) now uses bracket access throughout.\\n- `uni-angular`'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\\n instead of `workspace:*` (published as an exact pin). Alongside changesets'\\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\\n inflated to majors by the peer-dependents rule — the cause of the 4.0.0 and 5.0.0\\n version jumps.\",\n \"commit\": \"f2951db\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"OKLCH theme generation engine (`concepts/generation`)\",\n \"body\": \"- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\\n (110 checked pairs per theme pair). Pure and deterministic.\\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\\n (C ≤ 0.16), and a contrast guard-rail that adjusts lightness only — never hue.\\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\\n- Semantic inks re-tuned per role: error 27°/C 0.20, warn 55°/C 0.18 (rotated off amber —\\n dark yellow reads brown), success 152°/C 0.16.\\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\\n derived defaults — themes can define custom named primitives and rewire per-component\\n options without restating untouched sections.\\n- New `emitThemeFile()` renders a static `uni-theme.ts` — literal colors, visible border\\n primitives, sparse component overrides — the editable source of truth; the engine\\n never ships to the browser.\\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\\n links, scaffolds a themed smoke test, and prints the contrast summary.\\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\\n snippet, and contrast report, with agent guidance to edit the file for restyling.\\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.\",\n \"commit\": \"f7f0bdd\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@5.0.0\"\n ]\n },\n {\n \"version\": \"4.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Porting Components\",\n \"body\": \"\",\n \"commit\": \"ef9b3b5\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@4.0.0\"\n ]\n },\n {\n \"version\": \"3.0.2\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Extending the Symbol component to support theme options.\",\n \"body\": \"\",\n \"commit\": \"dcaf166\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.2\"\n ]\n },\n {\n \"version\": \"3.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Exporting new components and formatting.\",\n \"body\": \"\",\n \"commit\": \"fabbb73\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.1\"\n ]\n },\n {\n \"version\": \"3.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Exporting Components, Themes, and CDK\",\n \"body\": \"\",\n \"commit\": \"54a945c\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.0\"\n ]\n },\n {\n \"version\": \"2.0.4\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Exporting multiple Angular Components\",\n \"body\": \"\",\n \"commit\": \"ad5dd15\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.4\"\n ]\n },\n {\n \"version\": \"2.0.3\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"fix: setting dist directory in publishConfig\",\n \"body\": \"\",\n \"commit\": \"eb80cff\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.3\"\n ]\n },\n {\n \"version\": \"2.0.2\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.2\"\n ]\n },\n {\n \"version\": \"2.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Setting Fixed Versioning for all packages.\",\n \"body\": \"\",\n \"commit\": \"be0fb26\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.1\"\n ]\n },\n {\n \"version\": \"2.0.0\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@1.1.0\"\n ]\n },\n {\n \"version\": \"1.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"init release\",\n \"body\": \"\",\n \"commit\": \"7d18157\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@1.0.0\"\n ]\n }\n ]\n },\n {\n \"package\": \"@uni-design-system/uni-core\",\n \"releases\": [\n {\n \"version\": \"10.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Give `uni-dialog` the drawer's three-row layout: a pinned `[uni-dialog-header]`, a scrolling body, and pinned `[uni-dialog-buttons]`.\",\n \"body\": \"The surface is now a flex column that is `overflow: clip` on both axes, so it is never the scroll container — previously a long form scrolled the dialog's own title and action buttons off the screen. Unlike the drawer, the dialog declares no height and stays sized by its content, growing until it reaches `calc(100dvh - 2 × inset)` and only then scrolling its body.\\n\\nNew theme options: `dialog.inset` (gap from the viewport edge before the body scrolls, default `lg`), `dialog.bodyPadding` (pads the scrolling row alone; `dialog.padding` still insets all three rows), and `divider` on `dialogHeader` / `dialogButtons` for a border between a pinned row and the body — all off or unchanged by default, so existing dialogs keep their appearance.\\n\\n`[uni-dialog-header]` gains the shorter `[dialog-header]` alias, matching `[dialog-buttons]`; the long form keeps working. The `defaultCloseButton` now actually floats in the corner — its `position: absolute` was being lost to the icon button's own class, which left it inline at the top of the surface.\\n\\nThe drawer's overlay scrim now fades in and out with the panel instead of snapping. Its `::backdrop` had a background and no animation at all, so the dimming appeared and vanished instantly around a panel that took 250ms to slide. A new `drawer.motion` option (default `panel`) times the slide, the scrim's fade and the side panel's width transition together, replacing the hardcoded 250ms literals. The global reduced-motion rule now also reaches `::backdrop`, so both the drawer's and the dialog's scrim honour the preference (WCAG 2.3.3).\\n\\nDialog and drawer scrims now come from one token. `UniTheme` gains a `backdrops` scale — open and named like `shadows` and `motion` — and both components' `backdrop` option points at a name (`'scrim'`) instead of carrying its own CSS. They had drifted: the dialog washed the page white and blurred it while the drawer dimmed it dark, and a theme that dressed the dialog left the drawer on the library default. A raw style object is still accepted on either option, so a theme that states one keeps working.\\n\\nThe dialog's fade now reads the theme's `motion` token too (new `dialog.motion` option, default `panel`), replacing a hardcoded `350ms ease-in`. It shared the drawer's scrim but not its timing, so the same surface arrived at two speeds; both are now 250ms and a theme retimes them together.\",\n \"commit\": \"cb5f08f\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-button`: the focus ring is themed, and the theme now outranks the reset.\",\n \"body\": \"**Five of the twelve variants had no visible keyboard focus ring.** The ring\\nresolved the variant _name_ as a colour token — the pattern 10.2.0 removed from\\ncheckbox, radio and toggle, missed on the one component where it costs an\\naccessibility failure rather than a wrong colour:\\n\\n```ts\\noutline: `2px solid ${this.theme.colors()[this.variant()]}`;\\n```\\n\\n`ghost` resolves to `transparent`, so its ring was drawn invisibly.\\n`light`, `onLight`, `dark` and `onDark` have no colour token at all, so the\\ndeclaration became `2px solid undefined` and the parser dropped it — as would\\nany intent a consumer registers. In every case `outline-offset` survived, so\\nthe element still shifted on focus and the missing ring went unnoticed. This\\nwas live without the registry involved.\\n\\nThe colour now comes from the variant's theme entry via `variantOptions`, the\\nmechanism the selection controls already use, and falls back to the reserved\\n`primary` accent rather than to nothing. Each variant keeps the ring colour it\\nhad; `ghost` gains a visible one. The ring also routes through the shared\\n`focusRingStyle`, so a theme defining `focusRing` primitives restyles the button\\nalongside every other control.\\n\\n**A theme could not give a button a border.** `border`, `outline`, `overflow`\\nand `transition` were applied _after_ the theme's styles, so a variant\\ndeclaring a border was silently erased and `!important` was the only way\\nthrough — which then spread to every state adjusting that border, since the\\nshorthand outranks the longhand.\\n\\nThe base theme was caught by its own reset: `secondary` is commented \\\"Hollow\\\"\\nand declares `1px solid`, and has been rendering borderless. **It now renders\\nits border** — the one visible change here for anyone on the default theme.\\n\\nThose four properties move ahead of the theme's styles, resolving the\\n`TODO: Set priority on theme-defined styles` that sat on this line. Structure\\nthe component genuinely owns — `position` for the ripple, the symbol slots —\\nstays after, and the reset still applies to every variant that does not\\noverride it.\\n\\n**`uni-icon-button`'s hover moved to the theme too.** It branched on\\n`variant() === 'ghost'` to choose between a raised shadow and a translucent\\nwash, after the theme's own styles. Being a binary partition, every intent a\\nconsumer registered fell into the not-ghost half and was given a lift whether\\nor not it suited — a recessive intent included — and no theme could correct it.\\nBoth themes in this repo declare a ghost hover and had it silently overridden.\\n\\nBoth treatments now live in `iconButton.variants` beside the colours they belong\\nwith. Rendering is unchanged for the variants the theme styles; a variant it\\ndoes not style no longer receives a hover it never asked for, and the `disabled`\\nvariant loses one it should never have had, since its block is also spread into\\n`&:disabled`.\\n\\n**`uni-icon-button` had no focus indicator at all.** Its structural block cleared\\nthe user-agent outline and put nothing back, in every variant — so the close\\naffordance in every dialog and drawer header was unreachable-looking under\\nkeyboard navigation. This was not reported; it was found while verifying the\\nbutton fix above.\\n\\nIt now draws the shared ring, with its colour read from the same\\n`variantOptions.focusColor` the button uses. The indicator is applied last on\\npurpose: its appearance is the theme's, through `focusColor` and the `focusRing`\\nprimitives, but whether one exists is not a style a theme should be able to\\nswitch off by accident.\",\n \"commit\": \"ab1689a\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Checkbox, radio and toggle take their accent from the theme, not from the\",\n \"body\": \"variant's name.\\n\\n**Twelve sites across the three controls resolved a variant name as a colour\\ntoken.** That held together only because every name in the closed union happened\\nto also be a colour. Under an open registry the coincidence ends by design:\\n`<uni-checkbox variant=\\\"destructive\\\">` would look up `colors['destructive']`,\\nmiss, and **silently render primary** — a wrong-coloured control with no error,\\nno warning, and nothing to grep for.\\n\\nCheckbox was worse than it looked. Alongside five `getThemeColor` calls it had\\ntwo more through a second resolver that built `on-${variant}`, so an\\nunregistered intent also missed its paired content colour and fell back to\\n`on-primary` — the tick would have stayed light on a dark fill even after the\\nbox was fixed.\\n\\nThe theme now says which colour draws each intent, through a new\\n`variantOptions` map on `ComponentTheme`:\\n\\n```ts\\ncheckbox: {\\n variantOptions: {\\n primary: { accent: 'primary' },\\n warn: { accent: 'warn' },\\n },\\n}\\n```\\n\\n`variantOptions` is per-variant data a component **reads**, as against `variants`,\\nwhich is CSS that gets **applied**. The distinction earns its place here: a\\ncheckbox's accent lands on the box outline, the checked and indeterminate fills,\\nthe tick and the focus ring at once, and expressing that as CSS would have meant\\nthe theme naming `.checkbox-check` and `.radio-inner` — promoting private DOM to\\npublic theme contract.\\n\\nAll three controls gain a `checkedColor` input as the per-instance override,\\nmatching the one `uni-toggle` already had; its resolution order is now input →\\nthe variant's themed accent → theme option. The base theme defines the same\\nseven intents `button` and `iconButton` do, so the library is consistent about\\nwhich exist by default, and `getThemeColor` — triplicated byte-for-byte across\\nthe three components, with a silent fallback to primary — is gone.\\n\\nRendering is unchanged for anything that does not set `variant`: the default\\nstill resolves to the primary accent and its paired on-colour.\",\n \"commit\": \"1cd0140\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`Variant` is an open registry: a design system can define its own intents.\",\n \"body\": \"A variant names _what an action means_, and it is the theme's job to describe\\nhow that intent is drawn. So the set of names was never Uni's to fix — an app\\nwhose actions are `destructive`, `subtle` and `info` had to translate them onto\\ntwelve names chosen elsewhere. `Variant` is now `keyof UniVariantRegistry`,\\nextended by declaration merging:\\n\\n```ts\\ndeclare module '@uni-design-system/uni-core' {\\n interface UniVariantRegistry {\\n destructive: true;\\n }\\n}\\n```\\n\\n`variant=\\\"destructive\\\"` then compiles wherever a variant is accepted, and\\n`variant=\\\"destructve\\\"` still does not — which the library's other open-token\\nidiom, `Named | (string & {})`, cannot give you, and which would also have\\ncollapsed the theme's `variants` map keys to `string`.\\n\\nOnly the type was ever closed: theme validation checks the _shape_ of a\\n`variants` block and never its key names, so a custom variant already reached\\n`componentStyle` untouched at runtime.\\n\\n**The registry extends; it cannot replace.** Declaration merging has no way to\\nremove a member, so Uni's twelve names stay legal in a consuming app; enforcing\\na house set is a lint concern rather than a type. Two names are reserved and\\ndocumented as always present: `primary`, which every component inherits as its\\ndefault, and `disabled`, which the disabled state resolves to.\\n\\n**An unthemed variant now says so.** With a closed union this was nearly\\nimpossible; with an open set it is the ordinary state of a work in progress —\\na variant registered and used before its theme block exists. The theme service\\nwarns once per component and variant in dev, naming what the theme does define,\\nmirroring what it already did for an unknown spacing token. Components that\\ntheme no variants at all stay silent, since a missing key there is not a gap.\",\n \"commit\": \"1cd0140\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-drawer` is a three-row panel, and is no longer its own scroll container.\",\n \"body\": \"**The `<dialog>` used to be the scroller.** `over` mode set `overflowY: 'auto'`\\non the panel and put the theme's padding there too, which made a pinned header\\nor footer impossible: padding on a scrolling box scrolls away with its content,\\nand any row you pinned against it could not sit flush to the panel edge. It also\\nset only the one axis — and a single explicit overflow axis computes the other\\nto `auto`, which is exactly how a container becomes an accidental scroller.\\n`side` had it right already, setting both.\\n\\nThe panel is now a flex column of three rows — an optional\\n`[uni-drawer-header]`, the projected body, an optional `[uni-drawer-buttons]`\\n(alias `[drawer-buttons]`) — and **only the body scrolls**. The panel itself is\\n`overflow: clip` on both axes, explicitly, never the shorthand. The body carries\\n`overscroll-behavior: contain`, so scrolling to its end does not start scrolling\\nthe page behind it, and `position: relative`, so a stray absolutely positioned\\ndescendant is contained rather than re-homed into an ancestor.\\n\\nThose two must travel together: a positioned body _without_ a clipped shell is\\nworse than the status quo, because it pulls phantom overflow into the scroller\\ninstead of out of the panel.\\n\\n**`drawer.behavior.padding` is now the body's padding, not the panel's.** A\\ndrawer with no header or footer looks the same as before. One that gains either\\ngets rows flush to the panel edge, which is the point.\\n\\nTwo new theme entries, `drawerHeader` and `drawerButtons`, mirror the dialog\\npair knob for knob but default to a panel's posture rather than a dialog's: the\\nheader's title is left-aligned rather than centered, and the footer trails its\\nactions rather than centering them.\\n\\nNote one deliberate divergence from `[dialog-buttons]`: the drawer footer's\\n**confirm button does not close the drawer**. A panel's save is usually async\\nand can fail, so closing is left to the consumer via `(confirmed)`.\",\n \"commit\": \"f28c951\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-toggle` honours `size`, and the checked colour has a theme home.\",\n \"body\": \"**`size` did nothing.** `uni-toggle` inherits a bindable `size` input from\\n`BaseComponent`, but its geometry came from a single `toggle.behavior.size`\\nnumber, so `<uni-toggle size=\\\"sm\\\">` compiled, read as deliberate, and rendered\\nidentically to every other switch. The theme now carries a `sizes` block and the\\ninput selects from it.\\n\\n**Geometry is stated per size, not derived from ratios.** Each size token is a\\n`width` / `height` / `padding` triple — `padding` being the knob's inset — and\\nthe rest falls out: knob is `height - 2 * padding`, travel is `width - height`,\\nradius is `height / 2`. Real switch designs do not hold a constant proportion\\nacross sizes (a consumer's 32x18 and 28x16 pair differs in both track and knob\\nratio), so a single ratio token could match one size or the other but never\\nboth.\\n\\n`lg` is `BaseComponent`'s default and reproduces the previous geometry exactly —\\n40x20, knob 16 — so **no existing toggle moves**. A theme still setting the\\nlegacy `toggle.behavior.size` number keeps the old derived-ratio behaviour; that\\noption is now deprecated in favour of the `sizes` block.\\n\\n**Fixed: the knob would have overhung the track at any other proportion.** The\\nchecked transform was hardcoded to translate by one track height, which is only\\ncorrect while the track is `2x` wide and the knob `0.8x`. It is now derived, so\\nthe knob lands the same distance from each edge at every size.\\n\\n**New `checkedColor`, as an input and a theme option.** The on-state used to be\\nthe instance's `variant`, which meant an app wanting one switch colour repeated\\nan attribute on every call site. `toggle.behavior.checkedColor` sets it once;\\nthe input overrides per instance; `variant` remains the fallback when neither is\\nset. The focus ring follows the resolved colour rather than staying on `variant`.\\nAn input as well as an option is necessary because `variant` defaults to\\n`'primary'` and so cannot be distinguished from unset — without one, a themed\\n`checkedColor` would have silently made `variant` inert with no way back.\\n\\n**Toggle transitions are a motion token.** It hardcoded `0.3s ease` while\\n`uni-radio` already read `theme.motion(options.motion ?? 'control')`, so a theme\\nsetting a motion scale moved the radio and not the switch.\",\n \"commit\": \"67e17ea\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Stepper buttons now leave focus in their field, and `uni-quantity-stepper`\",\n \"body\": \"follows the theme's field chrome.\\n\\n**Clicking `+` or `−` focused nothing.** Taking pointer capture means calling\\n`preventDefault()` on `pointerdown`, which also suppresses the browser's default\\nfocus handling — and the buttons carry `tabindex=\\\"-1\\\"`, so focus landed on\\n`<body>`. The arrow keys then did nothing, exactly when a user reaching for `+`\\nis most likely to try them. `createPressRepeat` gained a `focus` callback,\\ninvoked on press and handed the pressed button; `uni-number-input` and\\n`uni-quantity-stepper` point it at their text field, the way a native spinner\\ndoes. Where there is no field — a read-only quantity stepper, whose buttons are\\nthemselves the tab stops — focus goes to the button instead. **This affected\\n`uni-number-input` as well**, not just the stepper.\\n\\n**`uni-quantity-stepper` ignored a theme's field styling.** It carried its own\\n`color` / `border` / `borderRadius` tokens, so a theme that restyles `input` —\\nWellsourced fills its fields `#F3F2EF` — left the stepper stark white beside\\nthem. Those three now default to the shared `input` chrome and are unset in the\\nbase theme, so the stepper tracks whatever a theme does to its fields; they\\nremain available as per-component overrides for parting them deliberately. With\\nthe focus indicator and the dividers already sourced this way, the container is\\nnow consistently the field chrome unless a theme says otherwise.\",\n \"commit\": \"7545ff3\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"`uni-slider` is rebuilt on custom thumbs instead of `<input type=\\\"range\\\">`,\",\n \"body\": \"gaining range mode, marks, a value readout and an exact decimal step model. This\\nis a breaking change to both the component's value shape and its theme options.\\n\\n**Why it could not stay native.** One `<input type=\\\"range\\\">` cannot carry two\\nthumbs, so range mode, thumb crossing and per-thumb ARIA bounds were all\\nunreachable; marks and a value tooltip were unstyleable through it. The\\nalternative — a second component for the range case — would have meant two\\nkeyboard implementations to keep in step, which is the drift the shared step\\nmodel exists to prevent. What the platform was giving us (the slider ARIA\\npattern and the keyboard map) is reimplemented explicitly and covered by 29\\nspecs.\\n\\n**Breaking: value shape.**\\n\\n```ts\\n// before\\nvalue = model<number>(0);\\n// after — the shape follows `mode`, and `null` is empty\\nvalue = model<number | UniNumberRange | null>(null);\\n```\\n\\nA `single` slider still reads and writes a plain number, so\\n`[(value)]=\\\"volume\\\"` is unchanged. Code that relied on `value()` being\\nnon-nullable, or that read it without narrowing, now needs to handle `null` and\\nthe `{ start, end }` range.\\n\\n**Breaking: theme options.** `slider.options.color` is **removed**. Fill and\\nthumb colour now come from the `variant` role pair, the rule every other\\ncomponent follows, so `variant=\\\"warn\\\"` recolours a slider with no theme edit. A\\ntheme that set `color` should delete it and pass `variant` at the call site.\\n`trackColor` now defaults to `primary-container` rather than `surface-variant`.\\n\\nNew options: `thumbBorderRadius`, `minTouchTarget`, `markSize`, `markColor`,\\n`labelTypeface`, `labelColor`, `tooltipColor`, `tooltipTextColor`,\\n`tooltipShadow`, `tooltipBorderRadius`, `transitionMs`. `trackHeight`,\\n`thumbSize` and `borderRadius` are unchanged.\\n\\n**New capability.**\\n- `mode=\\\"range\\\"` — two thumbs, a `{ start, end }` value, `minGap` to fence the\\n ends apart. Thumbs may cross and swap, and the dragged one keeps focus.\\n- `marks` and `snapToMarks` — labelled stops, spoken in place of the number.\\n- `valueDisplay` — `none`, `inline`, `tooltip`, or `input`, which seats a\\n compact `uni-number-input` at the trailing edge, two-way bound to the same\\n value: drag for the ballpark, type for the exact figure. Single mode only.\\n- `origin` — anchor the fill somewhere other than `min`, for sliders spanning ±.\\n- `sliding` and `changed` outputs, replacing an implicit per-frame model write.\\n **Bind `changed` in forms**; `sliding` fires every frame of a drag.\\n- `largeStep`, defaulting to a tenth of the range, for `PageUp`/`PageDown` and\\n `Shift+Arrow`.\\n- Right-to-left support: the horizontal arrows and the track mirror; the value\\n does not.\\n\\n**Also new: the `cdk/number` primitives** this is built on, shared with the\\nnumeric input family still to come — exact scaled-`BigInt` decimal arithmetic\\n(`stepDecimal`, `roundDecimal`, `clampDecimal`), locale-aware\\n`parseNumber`/`formatNumber` over `Intl`, and `createPressRepeat` for\\nhold-to-repeat stepper buttons. Stepping `0.1` twenty times from `0` now lands\\non exactly `2`, and `1.15` rounds to `1.2` where `(1.15).toFixed(1)` gives\\n`'1.1'`.\",\n \"commit\": \"21b655d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-number-input`: the field for a quantity, a price, a percentage or a\",\n \"body\": \"measurement, with locale-aware parsing, `Intl` formatting on commit,\\nprefix/suffix adornments, min/max/step fences and steppers that hold to repeat.\\n\\n```html\\n<uni-number-input label=\\\"Quantity\\\" [(value)]=\\\"qty\\\" [min]=\\\"1\\\" />\\n<uni-number-input label=\\\"Unit price\\\" currency=\\\"USD\\\" [(value)]=\\\"price\\\" />\\n```\\n\\n**Why not `<input type=\\\"number\\\">`.** Per the HTML value sanitization algorithm,\\na number input whose text is not a valid floating-point number reports\\n`value === ''`. Type `12,50` as most of Europe does, or paste `1,234.56` from a\\nspreadsheet, and the app reads an empty field with no way to tell that from a\\nblank one — a data-loss bug, and the reason this is `type=\\\"text\\\"` with\\n`role=\\\"spinbutton\\\"`. The platform control also cannot group thousands, cannot\\nplace an affix outside the editable text, has ~10px unstyleable spinners below\\nthe WCAG 2.2 target minimum, changes value on the scroll wheel while focused,\\nand steps in floats.\\n\\n**What it does instead.**\\n- **Presets** — `decimal`, `integer`, `currency`, `percent` — supply decimals,\\n grouping, affix and `inputmode` together, so a money field is `label`,\\n `currency=\\\"USD\\\"`, `[(value)]`. `numberFormat` is the escape hatch, merged over\\n the preset.\\n- **Parses what people actually type**: canonical ASCII always, locale grouping\\n (`1.234,56` in German), pasted affixes and currency symbols, accounting\\n negatives `(1,234.56)`, localized digit systems, compact `1.5k`, and — behind\\n `allowExpressions` — spreadsheet arithmetic like `12*3`, via a shunting-yard\\n parser that never calls `eval`.\\n- **Unreadable text stays in the field**, flagged with a dashed underline and a\\n `rejected` event, rather than being silently swallowed.\\n- **Exact arithmetic.** Stepping `0.1` twenty times from `0` lands on exactly\\n `2`; `1.15` rounds to `1.2` where `(1.15).toFixed(1)` gives `'1.1'`. A second\\n `valueAsString` model carries digits a `number` cannot, and a dev-mode warning\\n fires when a bound `value` cannot round-trip.\\n- **Percent never divides behind your back**: `preset=\\\"percent\\\"` shows `15%` for\\n `15`. Models that really are fractions set `valueIsFraction`.\\n- Clamping on commit rather than per keystroke, visible fences that disable the\\n matching stepper and announce, `wrap` for cyclic fields, `emptyStepValue`,\\n four stepper layouts, and hold-to-repeat that announces once on release.\\n\\n`uni-slider` gains `valueDisplay=\\\"input\\\"`, which seats one of these as its\\nreadout — drag for the ballpark, type for the exact value.\\n\\nAdds `numberInput` to `ComponentName` with a theme entry. Field chrome is not\\nduplicated there: colour, border, radius and focus come from the shared `input`\\noptions via `uni-input-box`, so a number field restyles with every other field.\\n\\n`uni-input-box` gains a `managedInset` input. The themed leading inset normally\\nrides the inner `<input>`, which is right while the text is the field's leading\\nedge and wrong the moment an adornment sits in front — a currency prefix would\\nhug the border while the number it belongs to sat indented past it. A field with\\nadornments sets `managedInset` and places the inset on whichever element is\\nactually first. Existing fields are unaffected: the default is `false`.\",\n \"commit\": \"2a79bb8\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-number-range-input`: two linked numeric fields in one chrome with a\",\n \"body\": \"single `{ start, end }` value — price filters, thresholds, tolerances. This\\ncompletes the numeric family alongside `uni-number-input`,\\n`uni-quantity-stepper` and the rebuilt `uni-slider`.\\n\\n```html\\n<uni-number-range-input label=\\\"Price range\\\" currency=\\\"USD\\\" [(value)]=\\\"price\\\" [minGap]=\\\"50\\\" />\\n```\\n\\n`start`/`end` deliberately match `UniDateRange`, so the library has one range\\nvocabulary, and they never collide with the `min`/`max` **inputs**, which mean\\nthe fence rather than the value.\\n\\n**The rules that make it one field rather than two glued together:**\\n- **Either end alone is a valid value.** `{ start: 50 }` means \\\"50 and up\\\",\\n which is a real filter. This is where it diverges from `uni-date-time-input`,\\n whose two parts are two halves of one answer.\\n- **Stepping is fenced; typing swaps.** A stepper can never walk one end through\\n the other — its wall is the other end, held off by `minGap`, and each end's\\n `aria-valuemin`/`aria-valuemax` report that wall rather than the outer bounds.\\n A _typed_ backwards commit is swapped and announced instead, the rule\\n `uni-calendar` applies to a backwards date range: clamping against the other\\n end would destroy the number just entered.\\n- **`minGap` pushes the end you edited**, not the other one, which is what makes\\n stepping behave as a fence rather than dragging the range along.\\n- A refused draft flags only the end it was typed into; the other stays valid.\\n- `preset`, `currency`, `prefix`, `suffix`, `decimals`, `grouping`, `locale` and\\n `roundingMode` are forwarded to both ends so the halves always read alike.\\n\\nIt owns its commit path rather than nesting two `uni-number-input`s, because the\\ntwo behaviours above need _different_ bounds — a stepper must be fenced at the\\nother end while a typed commit must arrive un-clamped — and a child field\\napplies one bound pair to both. The arithmetic, parsing and formatting are still\\nthe shared `cdk/number` primitives.\\n\\nAdds `numberRangeInput` to `ComponentName` with a theme entry (`partGap`,\\n`dividerText`, `dividerColor`). Field chrome is not duplicated there: colour,\\nborder, radius and focus come from the shared `input` options via\\n`uni-input-box`. `dividerText` is literal punctuation rather than an icon token —\\nan en dash between two numbers is not a glyph a theme swaps artwork for.\",\n \"commit\": \"e7875ee\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-quantity-stepper`: `− 3 +` for cart lines, table cells and seat counts\",\n \"body\": \"— the numeric core with no field chrome, no label and no room for either.\\n\\n```html\\n<uni-quantity-stepper label=\\\"Quantity, Blue T-shirt (M)\\\" [(value)]=\\\"qty\\\" [min]=\\\"1\\\" />\\n```\\n\\nA separate component rather than a `chrome=\\\"bare\\\"` flag on `uni-number-input`,\\nbecause this control is defined by what it does _not_ have — presets, affixes,\\nexpressions, four stepper layouts — and eight inputs are easier to write\\ncorrectly than forty plus a list of which ones to leave alone. The arithmetic,\\nparsing and hold-to-repeat come from the same `cdk/number` primitives, so\\n`1,200` and the keyboard map behave identically in both.\\n- **`deleteAtMin`** is the cart pattern in one attribute: at the floor the\\n decrement becomes a remove affordance, renamed `Remove {label}`, and emits\\n `removed` rather than stepping to zero. Without it every shop reimplements the\\n same `value === 1 ? remove() : step(-1)` branch outside the component. (The\\n spec called this output `emptied`; that is a native `HTMLMediaElement` event\\n name, which `@angular-eslint/no-output-native` rightly rejects, and `removed`\\n is already what `uni-tag` calls the same request.)\\n- The middle is a real input by default — typing `12` beats tapping `+` eleven\\n times, and it takes the same grouped and locale-aware entry the field does.\\n `editable=false` renders the number as text for read-mostly tables, and the\\n buttons become the tab stops since there is nothing else to focus.\\n- `size` is `sm` / `md` / `lg` at 24 / 32 / 40px _outer_ height, so an `md`\\n stepper lines up with a 32px field beside it, with the buttons square at that\\n height. `md` and `lg` clear the 24×24 pointer target of WCAG 2.2 SC 2.5.8;\\n `sm` leaves 22px inside its border and is the dense desktop option.\\n\\nAdds `quantityStepper` to `ComponentName` with a theme entry. Unlike the other\\nnumeric controls it does **not** inherit the shared `input` chrome — it is not a\\nfield — so it carries its own container tokens, defaulted to the same values\\n`input` uses so a cart stepper and a form field look related out of the box.\\nHeight comes from the entry's `sizes` block rather than an option.\",\n \"commit\": \"589cecb\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"9.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-react`'s Switch reads the `success` color token instead of hand-rolling an\",\n \"body\": \"HSL string from a color-generation internal, and both packages now typecheck as\\npart of their build.\\n\\nThe Switch built its \\\"on\\\" color as `hsl(${RoleHues.success.default}, 32%, 50%)`\\n— a fixed green assembled from the HSL generation tables rather than the theme,\\nso it never recolored with the theme and broke when those tables were removed.\\nIt now reads `useTheme().colors.success`.\\n\\nThe reason that reached a deploy is the build. `vite build` transpiles with\\nesbuild, which strips types without checking them, and it treats\\n`@uni-design-system/uni-core` as an external — so neither the type layer nor the\\nmodule graph ever verified that an imported core export exists. `pnpm turbo run\\n- `core` and `react` now run `tsc --noEmit` as the first half of `build`, so a\\n removed or renamed core export fails the consumer's build.\\n- A `type-check` turbo task exists for running that pass alone.\\n- CI builds **both** Storybooks, not just Angular's. These bundle uni-core\\n instead of externalizing it, so they are the step that resolves its exports\\n against real consumer source.\\n\\nThis also cleared four pre-existing type errors in `IconTextRow`, which did\\narithmetic on `fontSize` / `lineHeight` — typed `CssLength` (`number | string`)\\n— and passed the result to props typed `number`. They are coerced through one\\ndocumented helper now.\",\n \"commit\": \"f926cd5\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"9.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"Every deprecated API is removed. The library now carries no `@deprecated`\",\n \"body\": \"symbols at all.\\n\\n**Per-component duration options → the `motion` scale.** Six components carried\\ntheir own duration knob that predated the motion scale and _won over_ it:\\n`expand.transitionSpeed`, `callout.transitionMs`, `radio.transitionSpeed`,\\n`menuItem.transitionSpeed`, `alert.transitionSpeed` and\\n`snackbar.transitionDelay`. All are gone, along with the precedence branch each\\none required — timing now comes from the token, full stop.\\n\\nRetime the token instead; one edit covers every component pointing at it. To\\nretime a single component, define a token of your own and point that\\ncomponent's `motion` option at it:\\n\\n```ts\\ncreateTheme({\\n …,\\n motion: { productive: { duration: 110, easing: 'ease' } },\\n components: { menuItem: { options: { motion: 'productive' } } },\\n});\\n```\\n\\nA `duration: 0` token is how a theme opts out of motion — that is what\\n`transitionSpeed: 0` used to mean. Both showcase themes are migrated this way\\n(Carbon to a 110ms `productive` token, Wellsourced to an `instant` one).\\n\\n**Options that never did anything.** `card.transitionSpeed` and\\n`inputBox.transitionSpeed` were read by nothing and never had been. Delete them\\nfrom your theme; nothing replaces them.\\n\\n**Renames and obsolete APIs**\\n- `inputBox.typeFace` → `typeface` (the casing every other component uses).\\n- `uni-tooltip`'s `appendToBody` input — inert since the tooltip moved to the\\n native top layer, which escapes any overflow context by itself.\\n- Box's `elevation` input → `shadow`, in both the Angular and React packages.\\n It was a second name for the same thing.\\n- The Angular `icons` re-export → import `BaseIcons` from\\n `@uni-design-system/uni-core`. The default set ships with every theme.\\n\\n**The HSL color legacy is gone from uni-core.** `uniColor`, `randomRangeValue`,\\n`CategorySaturation` and `CategoryLightness` are removed, superseded by the\\ndeterministic OKLCH engine (`generateThemes` / `generatePalette`) — same input,\\nsame theme, WCAG-checked. `RoleHues` and the `UniColor` type go with them: they\\nwere reachable only through `uniColor`, and `RoleHues` had gone stale enough to\\nhold saturation values in a table of hues.\\n\\n**Deferred output renames.** Three outputs were held back because renaming is\\nbreaking; this is that release. Each also drops an eslint escape it needed for\\nshadowing a native event name or using an `on` prefix.\\n\\n| Component | Before | After |\\n| -------------------- | ----------------- | ---------------- |\\n| `uni-debounce-input` | `(change)` | `(valueChange)` |\\n| `uni-search-input` | `(change)` | `(searchChange)` |\\n| `uni-search-input` | `(search)` | `(searchSubmit)` |\\n| `dragAndDrop` | `(onFileDropped)` | `(fileDropped)` |\\n\\n**`uni-dropdown`'s `color` input → `containerColor`,** completing the rule the\\nlayout directives set: every container-pair input in the library is now\\n`containerColor`, and plain `color` always means the CSS property.\\n\\n**`ThemeService.getSpacing('none')` now returns `0`, not the string `'none'`.**\\n`'none'` is not a valid length, so it was silently dropped wherever it landed —\\n`uni-menu` carried a comment working around exactly that, which is now deleted.\",\n \"commit\": \"8250162\"\n },\n {\n \"bump\": \"major\",\n \"title\": \"The spacing scale is open, and `createTheme` finally accepts one.\",\n \"body\": \"The scale was a closed seven-name union on a doubling curve (2/4/8/16/32/64px).\\nReal layouts are rarely built exclusively on one — the gaps between 8 and 16,\\nand 16 and 32, are where a lot of real spacing lives — and there was no way to\\nadd a step, because **`ThemeConfig` had no `spacing` field at all**:\\n`createTheme` hardcoded the base scale. The Wellsourced showcase theme had to\\nbolt its scale on after the fact with a post-hoc spread.\\n\\nThree changes, which only work together:\\n- `NullableSize` gains a `(string & {})` arm, so any name the theme defines is a\\n valid `padding` / `gap` / `marginInline` value while the seven named steps keep\\n their autocomplete. `Size` itself stays closed — it also types _component_\\n sizes, where an arbitrary name has nothing to resolve against.\\n- `Spacing` is spelled out as named-optional-keys plus an index signature\\n (mirroring `Typography`), rather than a `Partial<Record<…>>` that would\\n collapse to a plain string record and lose the named steps.\\n- `createTheme({ spacing })` merges over the base scale.\\n\\n```ts\\ncreateTheme({ id, name, colors, spacing: { tight: '6px', snug: '10px' } });\\n```\\n\\n```html\\n<div stack-layout padding=\\\"tight\\\" gap=\\\"snug\\\">…</div>\\n```\\n\\nBecause the scale is open, a mistyped token can no longer be a compile error. It\\nis dropped — an `undefined` CSS value simply does not render — and\\n`ThemeService` now warns once per unknown token in development, naming the\\ntokens the active theme does define. Scaffolded `uni-theme.ts` files carry a\\n`spacing` block so the static theme file stays the editable source of truth.\\n\\n**Behavior change:** `xxl` was in the `Size` union but defined by no base theme,\\nso `padding=\\\"xxl\\\"` type-checked and rendered nothing. It is now `128px`,\\ncompleting the doubling — any element relying on the silent drop will start\\nshowing spacing.\",\n \"commit\": \"c0c6056\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-callout` and `uni-expand` now read their timing from the theme's `motion`\",\n \"body\": \"scale, so every animated surface in the library is retimed from one place.\\nThey were the last two carrying their own motion options — in different units,\\nunder different names (`transitionMs` in milliseconds, `transitionSpeed` in\\nseconds).\\n\\nA third token joins `popup` and `panel`:\\n\\n| Token | Default | Used by |\\n| -------- | ----------------- | --------------------- |\\n| `reveal` | 350ms ease-in-out | expand, expand-toggle |\\n\\n`reveal` is a _base_ speed, not a final duration: `uni-expand` still scales it\\nby content height (√-of-height, clamped) so short regions stay snappy and tall\\nones aren't rushed, and its easing now drives the reveal curve, which was\\nhardcoded. `uni-expand-toggle` resolves the token the same way, so the chevron\\nand the region cannot drift apart. `uni-callout` maps onto `panel`, whose\\n250ms matches what it already used.\\n\\n**Not breaking.** `transitionMs` and `transitionSpeed` are deprecated but\\nstill honoured, and deliberately outrank `motion` — a theme that set either\\nkeeps precisely its current timing rather than being retimed underneath it.\\nThey are removed next major. Per-instance inputs, like `uni-expand`'s\\n`transitionSpeed`, still outrank everything.\\n\\nNothing moves differently by default: callout renders 0.25s ease and expand\\n0.35s ease-in-out exactly as before, verified against the rendered styles.\",\n \"commit\": \"1aca747\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-alert`, `uni-snackbar`, `uni-radio` and `uni-menu-item` now read their\",\n \"body\": \"timing from the theme's `motion` scale, which completes the migration: every\\nanimated component in the library is retimed from one place.\\n\\nTwo tokens join `popup`, `panel` and `reveal`:\\n\\n| Token | Default | Used by |\\n| -------------- | ----------------- | ---------------- |\\n| `notification` | 350ms ease-in-out | alert, snackbar |\\n| `control` | 300ms ease | radio, menu-item |\\n\\n**One thing moves differently:** `menu-item`'s hover transition goes from\\n0.35s to 0.3s, joining `radio` on the shared `control` token. The two were\\nnever deliberately different — `radio`'s own option documented its 0.3 as\\n\\\"matching menuItem\\\", which was not true — so this corrects drift rather than\\nchanging a decision. A theme that wants the old timing can set the deprecated\\n`transitionSpeed`, or retime `control`. Everything else is byte-identical,\\nverified against the rendered styles.\\n\\n**Deprecated, still honoured, removed next major:**\\n`alert.transitionSpeed`, `snackbar.transitionDelay`, `radio.transitionSpeed`\\nand `menuItem.transitionSpeed` all still work and still outrank `motion`, so a\\ntheme that set them keeps its exact timing. `menu-item`'s escape hatch is\\nintact too: with neither the option nor a token set it still renders no\\ntransition at all, and a token with `duration: 0` is the way to ask for\\ninstant now.\\n\\n`card.transitionSpeed` and `input-box.transitionSpeed` are also deprecated,\\nfor a different reason: **neither was ever read by its component.** Setting\\nthem has never had any effect. They are removed next major and nothing needs\\nto replace them.\\n\\n`uni-skeleton` is deliberately left out. Its shimmer is a loop rather than a\\ntransition, and folding a repeating animation into a scale built around\\nentering and leaving would make the scale mean two different things.\",\n \"commit\": \"6f76c1d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-skeleton` picks up the knobs an app theme could not reach. `color`, `highlightColor` and `borderRadius` are now inputs that take a token name and fall back to the theme option, because one screen routinely needs several of each — text bars and a pill chip do not share a corner (`borderRadius=\\\"max\\\"`), and a skeleton on a card wants a different tint than one on the page background.\",\n \"body\": \"The shimmer is now a band swept with `transform` rather than an animated `background-position`: it composites instead of repainting every frame, and its geometry is themeable via two new options, `direction` (`'ltr' | 'rtl'`, default `'ltr'` — the sweep previously ran right-to-left) and `highlightWidth` (band width as a percentage of the block, default `40`). Both ends of the band are the base color, so it dissolves into the block with no alpha and no fringing.\\n\\nA new `label` input announces a standalone skeleton: set it and the host becomes `role=\\\"status\\\"` with visually hidden text instead of `aria-hidden=\\\"true\\\"`. Unlabelled skeletons stay `aria-hidden`, so container-level `aria-busy` patterns are unchanged.\",\n \"commit\": \"228c17f\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Overlay timing is now a theme token. `UniTheme` gains a `motion` scale\",\n \"body\": \"alongside `radii`, `shadows` and the rest, and the overlays point at it by\\nname instead of carrying their own hardcoded durations.\\n\\nUntil now a theme could slow a skeleton shimmer but not a dropdown: `expand`,\\n`skeleton` and `callout` each exposed their own motion option while\\n`uni-dropdown` hardcoded 100ms and the combobox-style listbox popups copied\\nthat constant. Retiming the library meant editing components.\\n\\nTwo tokens ship, because two things genuinely move differently — a small panel\\nattached to a control snaps, a larger free-floating surface settles:\\n\\n| Token | Default | Used by |\\n| ------- | ------------------ | --------------------------------------------------------------------------- |\\n| `popup` | 100ms linear, ×0.8 | dropdown, menu, multi-select, combobox, search-input, tag-input, time-input |\\n| `panel` | 250ms ease | popover |\\n\\nA token carries `duration` (ms), `easing`, and an optional `scale` for panels\\nthat grow into place — one token rather than separate duration and easing\\nscales, because they are one design decision: slowing a panel without\\nsoftening its curve reads as sluggish rather than calm.\\n\\n```ts\\ncreateTheme({\\n id: 'Calm',\\n name: 'Calm',\\n colors,\\n motion: { popup: { duration: 240, easing: 'ease-out', scale: 0.95 } },\\n});\\n```\\n\\nTokens you don't restate keep their base values, and a component can still\\npoint at a token of its own through its `motion` option.\\n\\nNothing moves differently by default — every current duration, easing and\\nscale is preserved exactly, verified against the rendered styles. Themes that\\npredate the scale keep working: `createTheme` fills it in, the validator does\\nnot require it, and a theme registered as JSON without it resolves to the base\\ntiming rather than failing. `motionSafe` remains the floor, so a theme decides\\nhow overlays move for people who want movement, never whether they move at\\nall.\\n\\n`callout`'s existing `transitionMs` option and the `expand`/`skeleton`\\ndurations are untouched for now; folding them into this scale is a follow-up.\",\n \"commit\": \"3b51ace\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`'combobox'` joins `ComponentName`, with a base-theme entry: `toggleIcon: 'chevronDown'`, `clearIcon: 'close'`, `selectedIcon: 'check'` (BaseIcons names rendered by `uni-icon` — not Material Symbol ligatures), the listbox surface trio (`listColor`/`listShadow`/`listBorderRadius`), `activeColor`, `descriptionColor`, and `maxVisibleOptions: 8` — a scroll height, never a cap. Field chrome comes from the `input` entry via `uni-input-box`, as everywhere.\",\n \"body\": \"\",\n \"commit\": \"eb8b7ae\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Listbox popups (`uni-search-input`, `uni-tag-input`, `uni-time-input`, `uni-combobox`): the active/hover option fill is now the themable `activeColor` option (default `'primary-container'`, on-color derived) instead of a hardcoded token pair. Set it when your theme maps `primary-container` and `primary-surface` to the same color — the keyboard highlight is otherwise invisible; a canvas/hover tint like the one your menus use is usually right (`searchInput: { options: { activeColor: 'tertiary-surface' } }`, and likewise `tagInput`/`timeInput`/`combobox`). The base theme carries the default explicitly so the option is discoverable in each component's Theme options table.\",\n \"body\": \"The four popups now share one style source, the exported `listboxPopupStyles(theme, options, { maxHeight? })` helper (`UniListboxPopupOptions`), so their surface trio and highlight can no longer drift apart. Rendering is unchanged under existing themes; the active row's text color now derives from `listColor`'s on-pair rather than assuming `on-primary-surface`.\",\n \"commit\": \"eb8b7ae\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`'popover'`, `'callout'`, and `'tour'` join `ComponentName`, with base-theme entries. The popover defaults reproduce the previously hardcoded look (`primary-surface`, `quaternary` border, `xs` radius, `raised` shadow, `6px 12px` padding, 7px offset) plus the tooltip-mode options; the callout entry carries the scrim/spotlight geometry (`scrimColor`, `spotlightPadding`, `spotlightRadius`, `ringWidth` — the ring color is deliberately the `variant` role, not an option); the tour entry is just `progressStyle` and `footerGap`, since its skin is the callout's.\",\n \"body\": \"\",\n \"commit\": \"6f87212\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`createTheme` accepts a sparse `typography` override, deep-merged over the base type scale — restate only the roles (or the individual `TextStyle` fields within a role) that change, and add product-specific roles under any name. Closes the gap where a derived theme (e.g. the Carbon experiment) had to spread `typography` over the created theme by hand.\",\n \"body\": \"\",\n \"commit\": \"57a8c4c\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Input options: `typeFace` → `typeface`, matching the tooltip/button/tabs casing. The base theme now writes `typeface`, and the input box reads the new key with the old one as a deprecated fallback, so themes that still set `typeFace` render unchanged. The `typeFace` key is deprecated and will be removed in the next major.\",\n \"body\": \"\",\n \"commit\": \"57a8c4c\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.\",\n \"body\": \"\",\n \"commit\": \"e706e38\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Calendar, date & time entry: `uni-calendar`, `uni-date-input`, `uni-time-input` and `uni-date-time-input`, plus a pure datetime helper layer in the cdk.\",\n \"body\": \"The most-requested form control family anywhere, built native-platform-first with zero runtime dependencies: `Intl` does all formatting and parsing (no date library), the popup rides the native popover top layer with CSS anchor positioning, and every day in the grid is a real `<button>`.\\n- **Values are plain ISO strings, never `Date`s** — `UniDate` (`'YYYY-MM-DD'`), `UniTime` (`'HH:mm'`, always 24-hour), `UniDateTime` (`'YYYY-MM-DDTHH:mm'`), `UniDateRange` (`{ start, end }`). A `Date` is a timestamp with a timezone problem; a calendar date is a label on a wall calendar. Strings are timezone-free, JSON-serializable and sortable with `<`, and `[value]=\\\"'2026-08-20'\\\"` is a complete, correct binding.\\n- **`uni-calendar`** is an inline month grid and a form control in its own right: single and range modes in one component (the value shape switches with `mode`), availability **markers** with screen-reader labels, `minDate`/`maxDate` fences, `disabledDates` as a list or predicate, and a two-way `month` model so an app can drive \\\"jump to June\\\". One tab stop with a roving-tabindex `role=\\\"grid\\\"`; the full APG keyboard map (arrows, week `Home`/`End`, `PageUp`/`PageDown` with `Shift` for years) crosses month edges, skips disabled days directionally, and stops at fences without wrapping. Range selection paints a live preview band, swaps a backwards commit instead of erroring, and narrates every step through a `role=\\\"status\\\"` region.\\n- **`uni-date-input`** is free-typed date entry — no input mask (masks fight paste, IMEs and screen-reader echo). The parser accepts ISO, locale-numeric text with the digit order read from `Intl.DateTimeFormat(locale).formatToParts()`, and the locale's own month names; a missing year resolves to the next occurrence and two-digit years are refused rather than guessed. Unreadable, fenced or unavailable text **stays in the field**, flagged, with a `rejected` event. The popup is the same `uni-calendar`, hosted in a `role=\\\"dialog\\\"` popover via the shared `uni-dropdown`; `↑`/`↓` on a committed value step ±1 day.\\n- **`uni-time-input`** is a combobox over time slots — byte-for-byte the search-input/tag-input listbox contract via the CDK's `ListboxNavigation`. `9` → 09:00, `930` → 09:30, `3p` → 15:00, and a bare `3` leans PM in a 12-hour field (the bias yields when `minTime`/`maxTime` say otherwise). `slots` pins the choices for scheduling, refusing a typed `5pm` as `'unavailable'`; `↑`/`↓` on a committed value step ±`minuteStep`.\\n- **`uni-date-time-input`** seats both parts in one `uni-input-box` chrome under one `role=\\\"group\\\"` label, emitting one combined value only when both parts are set. `slotsFor` is the scheduling flow in one attribute: the time part stays disabled until a day is chosen, then offers exactly that day's slots, and changing the day clears a slot that no longer exists. The parts gained an `embedded` input so the composer renders one shared box instead of nested chrome.\\n- **cdk `datetime` module** (public export): the string-math and `Intl` layer — `addDays`/`addMonths`/`buildMonthGrid`/`parseDateText`/`parseTimeText`/`timeSlots`/`localeWeekStart` and friends — pure functions, unit-tested hard, usable by apps directly.\\n- **uni-core**: `'calendar'`, `'dateInput'`, `'timeInput'`, `'dateTimeInput'` join `ComponentName` with base-theme entries (day geometry per size token, `dayBorderRadius: 'xxs'` for the square look, toggle glyphs, popup/list chrome). Selection, range and today colours are deliberately not options — they are the `primary` role pair, so themes restyle them by restyling the palette.\\n- **Naming note:** the fences are `minDate`/`maxDate`/`minTime`/`maxTime`/`minDateTime`/`maxDateTime` rather than the platform's `min`/`max`, because Signal Forms' `FormUiControl` reserves `min`/`max` as numeric signals on form controls.\",\n \"commit\": \"71bc74c\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Themable focus chrome: a shared `focusRing` primitive for every control, plus `focusBorder`/`focusShadow`/`focusColor` options for input boxes.\",\n \"body\": \"**Shared focus ring.** A theme can now restyle the keyboard-focus indicator across the whole library by defining `focusRing` **border** and/or **shadow** primitives: `ThemeService.focusRing()` (and the new selector-less `focusRingStyle()`) replaces its default 2px outline with that border — drawn as an outline hugging the control — plus the ring shadow. A `focusRing` **thickness** primitive sets the ring's outline offset (negative values overlay the control's resting border, reading as a border-color change). Checkbox, radio, toggle and slider now route their hand-rolled focus styles through the shared helper (calendar days and tag chips already did), so one primitive trio gives every control the same focus language. Themes without the primitives render exactly as before.\\n\\n**uni-core:** `Thicknesses` is now an open record like `Borders`/`Shadows` (extra named primitives allowed), and `createTheme` accepts a sparse `thicknesses` override merged over the base scale.\\n\\n**Also in this release:**\\n- Radio and toggle scope their transitions (border/background/transform) instead of `all`, so the focus ring's outline and shadow apply instantly — `transition: all` interpolated the outline from a stale color, flashing a dark ring before the themed ring color landed.\\n- The radio's dot grow/retract animation is a token — `radio.options.transitionSpeed` (seconds, default 0.3 preserving the current feel; 0 switches instantly).\\n- The checkbox focus ring rounds proportionally again (box radius plus its gap) and the gap itself is a new `checkbox.options.focusRingGap` option; a `focusRingStyle` call's explicit gap wins over the theme's `focusRing` thickness, then the branch defaults.\\n\\nThe `input` component options could previously restyle focus only through `focusOutline`/`focusOutlineOffset`. The new optional trio mirrors the error-state trio (`errorBorder`/`errorShadow`/`errorColor`) and applies while any projected control has focus: `focusBorder` swaps the border primitive, `focusShadow` draws a ring (e.g. a soft `0 0 0 3px` spread), and `focusColor` swaps the background. All three default to `undefined`, so existing themes render exactly as before, and they yield to the error state so a flagged field stays visibly flagged while being corrected.\\n\\nThe Wellsourced showcase theme now defines the `focusRing` pair for its app's `.search-input:focus` look — an ochre (`secondary`) 1px border with a 10% ring of the same hue, tinted per palette in light and dark — so text fields (which rest on a canvas tint and snap to the clean surface on focus), checkboxes, radios, toggles, sliders, calendar days and tag chips all share one focus treatment.\",\n \"commit\": \"1a6b382\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Menu items no longer look preselected when opened with the mouse\",\n \"body\": \"Opening a `uni-menu` by click left the first item highlighted before the\\npointer had touched it, reading as a preselected default. Two correct\\nbehaviours combined badly: `onOpened()` implements ARIA roving focus by calling\\n`.focus()` on an item every open, and the item styles deliberately painted\\n`:focus` the same as `:hover`. Nothing was wrong with the focus itself — only\\nwith painting it after a pointer open.\\n- **The highlight now keys on `:focus-visible`.** Programmatic focus following a\\n click doesn't match it, while keyboard-driven focus does — so mouse users get\\n no phantom highlight, and keyboard users keep the focus cursor. Roving-focus\\n bookkeeping is untouched: a mouse open still moves focus to the first item, so\\n screen readers announce it exactly as before.\\n- **New `HOVER_OR_KEYBOARD_FOCUS` constant exported from uni-core**, holding\\n that selector. Emotion merges styles by _exact selector text_, so a component's\\n base rule and any theme variant restyling it have to agree character for\\n character — a variant keyed `'&:hover, &:focus'` would both fail to override\\n and reintroduce the phantom highlight. Naming the selector once removes the\\n trap; the base theme's `menuItem.warn` tone and the Carbon/Wellsourced\\n showcase themes now use it.\\n\\nThemes with their own `menuItem` variants should key the highlight with\\n`HOVER_OR_KEYBOARD_FOCUS`. Note that `:focus-visible` is a browser heuristic:\\nafter a user has been navigating by keyboard, a subsequent click may still show\\nthe highlight, which is the intended \\\"this person is using the keyboard\\\"\\nbehaviour rather than a regression.\",\n \"commit\": \"3279186\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-tag-input`, plus a shared listbox contract in the CDK\",\n \"body\": \"The type-to-add chip field — recipients, filters, labels. It is the **open-set**\\ncontrol: anything typed can become a token, whether or not it matches a\\nsuggestion. Closed-set picking stays with `uni-select` /\\n`uni-multi-select-dropdown`, which is the deliberate split — the two look alike\\nbut differ on the one thing that decides the value type, so a single component\\nwould force one of them to carry an API it can never use.\\n- **`FormValueControl<UniTagItem[]>`.** `{ value: 'a@b.com' }` is a complete\\n item; `label`, `avatarSrc`, `invalid` and `disabled` are optional enrichment.\\n- **Invalid entries stay in the value, flagged**, rather than being dropped — a\\n field that silently swallows a typo'd address is worse than one that shows it\\n in red, and Enter on the chip lifts it back into the input to fix. Duplicates\\n and over-`max` entries are refused through `(rejected)` with a reason.\\n- **Full keyboard contract**: separators commit, Tab commits without trapping,\\n Backspace on an empty field _focuses_ the last chip rather than deleting it\\n blind, and on a chip Backspace and Delete both remove but move focus in\\n opposite directions — what makes pruning a list feel right.\\n- **The whole field is one tab stop.** Chips carry `tabindex=\\\"-1\\\"`, so Tab never\\n walks through eight recipients to reach the next control.\\n- **Announces through a `role=\\\"status\\\"` live region** on every add, remove and\\n rejection; the removal route is described once per field rather than by every\\n chip.\\n- **`preset=\\\"email\\\"`** wires an address validator, a paste parser that unwraps\\n `Name <a@b.com>` and keeps an unterminated tail in the field, and Space as a\\n separator.\\n- **`'tagInput'` joins core's `ComponentName`** with a theme entry for the chip\\n field's own tokens. Field chrome is not duplicated — it comes from `input` via\\n `uni-input-box`, so a tag input restyles with every other field.\\n\\n**Also in this release**\\n- **`ListboxNavigation` in the CDK** (`createListboxNavigation`) owns the\\n combobox bookkeeping every type-ahead control needs: open state, active\\n option, wrap-around arithmetic, Home/End, and `aria-activedescendant` wiring\\n that can never point at an option a narrowing filter has removed.\\n `uni-search-input` now uses it — behaviour unchanged, and it gains Home/End\\n for free — and the multi-select combobox upgrade will too. Three hand-rolled\\n copies of one keyboard contract is how they drift.\\n- **`uni-tag` gains `controlTabIndex`**, so a composite that owns its own roving\\n focus can take its chips out of the tab order, and **`selected` is now\\n optional**: an interactive chip carries `aria-pressed` only when it is\\n genuinely a toggle. Announcing \\\"not pressed\\\" on a recipient chip is worse than\\n announcing nothing.\",\n \"commit\": \"de83fe4\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`uni-tag` v2: themable, opt-in removal, two style axes\",\n \"body\": \"v1 was a single hardcoded look with the palette welded into its template, an\\nunconditional remove button, and no theme entry — a filter chip, a status pill\\nand a recipient token all rendered identically. v2 makes the chip a real themed\\ncomponent and the building block `uni-tag-input` composes.\\n\\n**Breaking (uni-angular)**\\n- **`(close)` is now `(removed)`.** The old name shadowed the native `close`\\n event and needed an eslint suppression to compile.\\n- **The remove button is opt-in** — set `[removable]=\\\"true\\\"`. Previously every\\n tag, including a plain category label, shipped a \\\"Remove …\\\" button into the\\n accessibility tree.\\n- Codemod: rename `(close)` → `(removed)` and add `[removable]=\\\"true\\\"` wherever\\n a `(close)` handler exists.\\n\\n**Fixed**\\n- **A falsy value can now be removed.** `handleClose` guarded with `if (v)`, so\\n a tag keyed `''` or `0` silently could not be dismissed. Every defined value\\n emits, and a tag with no value emits `undefined`.\\n- The remove control now sizes from the chip instead of the icon-button's own\\n `sm` size — it was 22px inside a 24px chip, and taller than an `sm` chip\\n entirely.\\n\\n**New**\\n- **Two orthogonal style axes**: `variant` picks the colour role, `tone` picks\\n the archetype (`soft` / `solid` / `outline`). Both resolve from the new `tag`\\n theme entry, with tones as nested `&.tone-*` selectors inside each variant so\\n a theme author restyles both axes in one place.\\n- **`'tag'` joins core's `ComponentName`**, with a `TagTone` type and a full\\n theme entry (`options` for radius/typeface/gap/symbols, `variants` per colour\\n role, `sizes` carrying geometry only).\\n- **`interactive`** turns the chip body into a `<button>` with `selected` mapped\\n to `aria-pressed`, keeping the remove control a sibling — nesting them would\\n be invalid HTML and would strand the inner control for keyboard users.\\n- **Lead slot**: `avatarSrc`, `avatarName` (initials fallback), `iconName`,\\n `symbolName` and `dot` convenience inputs, plus a `[tag-lead]` slot for\\n anything richer. Lead elements size from the chip height, and all are\\n `aria-hidden` so the chip's text stays its accessible name.\\n- **Glyphs are theme icon primitives, not Material ligatures.** The remove and\\n selected affordances resolve through the new `removeIcon` / `selectedIcon`\\n theme options (defaulting to the built-in `close` and `check`), so they mask\\n `currentColor`, recolour with the chip's tone, and can be swapped per theme.\\n They also contribute no text to the DOM, which a ligature does — one less way\\n for an accessible name to be polluted. `symbolName` remains as the escape\\n hatch for glyphs the theme's icon set doesn't carry.\\n- **`invalid`** sets `aria-invalid` and a dashed underline, so the state does\\n not rely on colour alone (WCAG 1.4.1); `disabled`, `maxWidth` truncation with\\n a `title`, and `removeLabel` for overriding the remove button's name.\\n- The component ships with 21 specs, having previously had none.\",\n \"commit\": \"760b761\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Theme validation contract: `parseTheme` / `assertTheme` / `isUniTheme`\",\n \"body\": \"Every theme scale is `Partial<Record<…>>`, so a malformed theme — hand\\nwritten, generated, or fetched as JSON — rendered as silent `undefined` CSS\\nwith no diagnosis. Core now ships a **dependency-free** structural validator\\n(core stays zero-dep; no zod outside the MCP):\\n- **`parseTheme(input): ThemeParseResult`** collects every issue rather than\\n failing fast: `{ success, theme?, issues: [{ path, message }] }` with dotted\\n paths like `colors.primary` or `typography.label.fontSize`. Acceptance /\\n rejection **with reasons** is the API.\\n- **`assertTheme(input)`** throws with all reasons; **`isUniTheme`** is the\\n type-guard form; **`formatThemeIssues`** renders issues for logs.\\n- The contract requires what components can't render without: 16\\n `REQUIRED_COLOR_TOKENS`, all 22 canonical `REQUIRED_TEXT_ROLES` (with\\n `fontFamily`/`fontSize`/`lineHeight`), the spacing/radii/shadow/thickness\\n scale keys, and recursively-valid component style expressions. All\\n `REQUIRED_*` sets are exported for tooling (MCP, docs, registries). Themes\\n remain free to add arbitrary named primitives on every scale.\\n- Because a `UniTheme` is plain serializable data, the same contract\\n validates JSON round-trips — the foundation for theme distribution and\\n runtime theme registries (ROADMAP Track 1).\",\n \"commit\": \"6a4c7da\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"A wire format for themes: `hydrateTheme` / `dehydrateTheme`\",\n \"body\": \"A `UniTheme` is plain serializable data, which makes JSON the natural transport\\nfor distributing themes — but a serialized theme is ~50 KB and **~71% of that is\\nthe 61 built-in icon data URIs that every uni-core consumer already ships**.\\n- **`dehydrateTheme(theme)`** returns the wire form: icons identical to\\n `BaseIcons` are dropped, genuine overrides kept. A theme goes from ~50 KB to\\n ~14 KB, and still passes `parseTheme`.\\n- **`hydrateTheme(theme)`** restores the built-in set on the way in, applying\\n the same `{...BaseIcons, ...icons}` contract `createTheme` applies at\\n construction — the theme's own icons win, built-ins fill the rest.\\n- **`generateUniThemes` now returns the `ContrastReport`** alongside the\\n light/dark pair, so a caller can generate registration-ready themes and their\\n WCAG audit in one call instead of falling back to `emitThemeFile` (which\\n returns TypeScript source) just to see the report.\\n- **`summarizeContrast(report)`** is extracted and exported, so the generated\\n theme file's header and every other consumer word the audit identically.\",\n \"commit\": \"5414517\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`expand` gains a themable, size-aware speed\",\n \"body\": \"The reveal/collapse duration was hardcoded at 350ms, so a consumer wanting a\\nsnappier disclosure — or wanting adjacent styling to fade on the same clock —\\nhad nothing to reference. A fixed duration also reads differently at different\\nsizes: sluggish on a two-line region, rushed on a full-page one.\\n- **New `transitionSpeed` option in the `expand` theme options** (seconds,\\n default `0.35`, matching alert/card `transitionSpeed`) sets the base\\n duration. `'expand'` joins core's `ComponentName` union, so custom and\\n derived themes can type an `expand` entry.\\n- **Duration scales with content height.** The actual duration is\\n `transitionSpeed × √(height ÷ 240px)`, clamped to ~0.15–0.6s at the default\\n speed (the envelope scales proportionally with a themed speed), so perceived\\n speed stays steady across region sizes. The curve and its constants\\n (`expandDuration`, `EXPAND_DEFAULT_SPEED`, `EXPAND_MIN_DURATION`,\\n `EXPAND_MAX_DURATION`, `EXPAND_REFERENCE_HEIGHT`) are exported from\\n uni-core.\\n- **New per-instance `transitionSpeed` input** sets an exact duration for one\\n region, bypassing the scaling: `<uni-expand [transitionSpeed]=\\\"0.15\\\">`.\\n- **The resolved duration is exposed as the public `duration` signal** on\\n `uni-expand`, so adjacent styling can move on the reveal's clock with a\\n plain binding — `[style.transition-duration]=\\\"expand.duration() + 's'\\\"` —\\n keeping all timing in the theme/signal pipeline, with no custom CSS.\\n- **`expand-toggle` gains a matching `transitionSpeed` input** and otherwise\\n follows the theme token instead of its own hardcoded 350ms. Expand Area\\n binds the region's resolved `duration` to its toggle, keeping chevron and\\n reveal on one clock even when size-scaled or overridden.\\n- **Speed is theme-reactive**: swapping themes at runtime retimes regions and\\n chevrons live.\\n- **Enter/leave easing is now `ease-in-out`** (was `ease-in`), matching the\\n chevron rotation so trigger and region decelerate together.\\n- **`UniExpandOptions` is exported** from uni-angular for\\n `getComponentOptions<UniExpandOptions>('expand')` consumers.\",\n \"commit\": \"c828982\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Menus join the theme model: `menu` + `menuItem` component options, item tones, and dividers\",\n \"body\": \"The menu was the only composite component with no theme surface of its own —\\npanel chrome came from the shared `dropdown` entry and every item-level knob\\n(height 38, `primary-container` hover, `check` active symbol, `label` type\\nrole) was hardcoded. Every Uni menu therefore looked identical, and the gaps a\\nreal product hits first (a red Delete, a separator before it, disabled rows)\\nwere only reachable via `::ng-deep`.\\n- **New `menu` theme options** (`'menu'` joins core's `ComponentName` union):\\n `minWidth`, panel `color`/`border`/`borderRadius`/`shadow` (each falling\\n back to the `dropdown` options when unset, so menus follow generic popovers\\n until a theme deliberately splits them), `paddingVertical`/\\n `paddingHorizontal` (panel inset — `xs` inset plus item `borderRadius`\\n yields the \\\"hover pill\\\" look; `none` yields full-bleed rows), and\\n `dividerBorder`/`dividerSpacing` for separators.\\n- **New `menuItem` theme options + variants** (`'menuItem'` joins\\n `ComponentName`): `height`, `paddingHorizontal`, `gap`, `borderRadius`,\\n `typeface`, `textColor`, `hoverColor`, `activeSymbol` (undefined removes the\\n trailing check), and `transitionSpeed`. Theme `variants` on `menuItem` carry\\n tones — the base theme ships a `warn` tone for destructive actions.\\n- **`MenuItem` grows `variant`, `disabled`, and `{ divider: true }`.**\\n `variant: 'warn'` routes through the theme's `menuItem` variants; `disabled`\\n items render in the disabled color, carry `aria-disabled`, and are skipped\\n by keyboard navigation; dividers render as `role=\\\"separator\\\"` rules styled\\n by the `menu` options. `isDivider` and the `UniMenuOptions`/\\n `UniMenuItemOptions` interfaces are exported from uni-angular.\\n- **`uni-dropdown` panel chrome is now input-overridable**\\n (`border`/`borderRadius`/`shadow`/`color`), falling back to the `dropdown`\\n theme options — this is the mechanism `uni-menu` uses; other consumers are\\n unchanged.\\n- **Default-rendering change:** menus now have `minWidth: 184` from the base\\n theme (previously they sized to the widest item). All other defaults\\n reproduce the previous look, including the 0.35s hover transition.\\n- **The Carbon experiment themes gain menu styling** (sharp full-bleed 40px\\n rows, IBM Plex, `$layer-hover`, red danger option, ~110ms motion) with a new\\n Carbon Menu story demonstrating that the same component renders both\\n aesthetics untouched.\",\n \"commit\": \"6e8b429\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Add `funnel` and `building` icons\",\n \"body\": \"Two gaps found while migrating a real app off inline SVG — both cases where the\\nexisting set forced the app to keep hand-drawn artwork.\\n- **`funnel`** (`filter_alt`) — `filter` is `filter_list`, the stacked-lines\\n metaphor. Apps that name the feature itself a funnel (\\\"Funnel Analytics\\\") draw\\n the shape, and substituting stacked lines loses the reference.\\n- **`building`** (`apartment`) — pairs with `home` for residential-vs-commercial\\n distinctions, which had no built-in counterpart.\\n\\nBoth are Material Symbols Outlined 300 on the shared `0 -960 960 960` grid, so\\nthe set is now 61 icons. Note `building` carries more internal detail than most\\nof the set; it reads well from ~14px but goes muddy below ~12px, so prefer a\\nlarger size or `home`'s simpler silhouette in very small badges.\",\n \"commit\": \"e72ec94\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Expand `BaseIcons` to 59 icons and add `uni-icon` sizing\",\n \"body\": \"The 34-icon set shipped in 7.0.0 covered the library's own components but not a\\nreal application — an app migrating off inline `<svg>` (or off `uni-symbol`, in\\nAngular) ran out of names almost immediately. Everything here is additive; all\\n34 existing names are unchanged.\\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\\n `logout`).\\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\\n row-aligned menus need the horizontal kebab.\\n - `star` is separate from `favorite`, which is the heart.\\n- **`uni-icon` gains an optional `size` input** (`CssLength` — bare numbers are\\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\\n behaviour is unchanged: the icon fills its container, which is what lets a\\n themed control size its own glyph through padding. Set, it applies\\n width/height as inline styles, so an explicit size wins over the\\n fill-the-container rule regardless of style injection order. This removes the\\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\\n `<uni-icon>` would otherwise need.\\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\\n foreign grid when the theme already ships the glyph. The tool cannot recognise\\n a shape, so it hands the caller the list to check against before adding\\n anything.\",\n \"commit\": \"c2421c0\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"Replace `BaseIcons` with a normalized 34-icon Material Symbols set\",\n \"body\": \"The built-in icon set was 11 glyphs drawn from four different grids\\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\\noversized `close` — three optical weights in one set.\\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\\n sites and theme overrides keep working. Their **appearance changes**: the\\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\\n overall. `spinner` is carried over verbatim, keyframes intact.\\n- New `IconName` and `BaseIconName` types. `IconName` is\\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\\n while themes can still register arbitrary names via `createTheme({ icons })`.\\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\\n and `IconConfig` exports. Nothing in the library referenced them and\\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\\n `IconName` instead.\\n- New exported `svgToIconUri(svg, options?)` — the supported way to bring your\\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\\n source (drops the xml declaration, comments and fixed `width`/`height` so the\\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\\n a gradient/pattern fill, or more than one paint color. That last one is the\\n trap worth naming — masks use the alpha channel, so a multi-color logo\\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\\n when that is intended. `createTheme({ icons })` merges the result over\\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\\n helper, so tokens are byte-identical to the built-in set, and adds the\\n set-level checks a per-icon helper cannot make — which names override\\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\\n reported per icon rather than failing the batch, and re-running is safe\\n (already-encoded URIs pass through). The server instructions now point agents\\n at it whenever they encounter inline SVG.\\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\\n which fetches from the canonical Material Symbols source and validates every\\n glyph before writing — a malformed path, an off-grid viewBox or geometry\\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\\n file without writing. Add or change icons in that script's manifest and\\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\\n same invariants against the committed output.\",\n \"commit\": \"f7727aa\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"TextStyle now accepts CSS length strings, not just px numbers\",\n \"body\": \"- `fontSize`, `lineHeight`, `letterSpacing`, `textIndent`, and `wordSpacing` on\\n `TextStyle` are widened from `number` to the new exported `CssLength`\\n (`number | string`). Bare numbers still mean px, matching Emotion's own\\n convention; strings pass through verbatim, so any unit the CSS engine accepts\\n works — `'1.2rem'`, `'2em'`, `'clamp(1rem, 2vw, 1.5rem)'`, unitless\\n line-height multipliers like `'1.5'`, etc.\\n- `toTypeface` no longer blindly appends `px`: numbers are converted, strings\\n are passed through untouched. Existing numeric themes are unaffected.\",\n \"commit\": \"28323ec\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Search input stripped back and made generic; debounce input dressed in the shared chrome\",\n \"body\": \"- **`uni-debounce-input`** now wears the themed input chrome via `uni-input-box`\\n (color, border, typeface, focus ring) and gains `label` (accessible name),\\n `placeholder`, `disabled`, `pre-input`/`post-input` attribute slots for adornments,\\n ARIA passthroughs (`role`, `ariaExpanded`, `ariaControls`, `ariaActivedescendant`)\\n for composite widgets, and `clear()`/`focus()` methods. Debounce behavior unchanged.\\n- **`uni-search-input` redesigned**: the opinionated solid-primary pill bar with the\\n embedded `title-large` label is gone. It's now a standard themed field — decorative\\n leading magnifier, clear button while a query exists (refocusing on clear), Enter\\n emits `search`, Escape closes/clears.\\n- **Type-ahead added**: pass `suggestions` (refresh from `change`) and the field\\n becomes an ARIA combobox — keyboard-navigable listbox (ArrowUp/Down, Enter selects,\\n emitting `suggestionSelected` + `search`), `aria-activedescendant` wiring, focus-out\\n closing. New `searchInput` theme options: `searchSymbol`, `clearSymbol`, suggestion\\n list `listColor`/`listShadow`/`listBorderRadius`, `maxSuggestions`.\\n- Visual breaking change for SearchInput consumers (deliberate strip-back); code API\\n is compatible (`label`/`width`/`change`/`search` retained; `label` is now the\\n accessible name + placeholder fallback rather than displayed text).\",\n \"commit\": \"5a6fc60\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Checkbox, radio, and toggle conform to theme tokens\",\n \"body\": \"- The last hardcoded control colors (`#FFF`, `#ccc`, `#d0d0d0`, `#e0e0e0`,\\n `rgba(0,0,0,0.2)`) are gone. Chrome now resolves from new option tokens —\\n checkbox `boxColor: 'surface'`; radio `ringColor: 'outline'` / `fillColor:\\n correctly on dark and brand themes.\\n- The checkbox's check/dash strokes wear the variant's paired on-color\\n (`on-primary`, `on-warn`, …) instead of assuming white; disabled states use the\\n `disabled`/`on-disabled` tokens; the toggle knob's shadow is the theme's\\n brand-tinted `raised` stack, and its hover uses the button convention's\\n brightness filter instead of a fixed grey.\",\n \"commit\": \"8953d59\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-stat` KPI tile\",\n \"body\": \"- Muted label + large headline value (numbers auto-compact via\\n `Intl.NumberFormat`: `48234` → \\\"48.2K\\\") set in a new `stat` type-scale role\\n (32px semibold, proportional figures).\\n- Optional signed `delta` whose ink is decided by direction × `upIsGood` — churn\\n going down reads green, tickets going up reads red — with the arrow glyph\\n accompanied by screen-reader \\\"up\\\"/\\\"down\\\" text so state never rides color alone;\\n `caption` names the comparison period.\\n- Optional decorative 12-point sparkline (`trend` input): stroke in the outline hue,\\n endpoint dotted in the accent, `aria-hidden`.\\n- Fully token-driven via `stat.options`: card-recipe frame (`color`/`border`/\\n `borderRadius`), `labelTypeface`/`valueTypeface`, `positiveColor`/`negativeColor`\\n (the semantic inks, AA-guaranteed on surface), `trendColor`/`trendAccent`, spacing.\",\n \"commit\": \"7a6da4f\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Fix invisible icons; icons become first-class theme primitives\",\n \"body\": \"- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\\n `icons: {}` — the icon record was never wired in, so all icons (dialog close, button\\n spinner, search/clear affordances) rendered nothing.\\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it — themes\\n can override or add icons under any name (inline SVG data URIs, masked with\\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\\n `BaseIcons` (deprecated).\\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\\n broken `url(\\\"undefined\\\")`.\\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\\n `generate-uni-theme` guidance instructs agents: never inline SVG in components —\\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.\",\n \"commit\": \"fea0b2e\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-avatar` and `uni-avatar-group` components\",\n \"body\": \"- Graceful fallback chain: image → initials derived from `name` (first + last) →\\n themed symbol. Accessible by default: `role=\\\"img\\\"` + `aria-label` from the name,\\n `aria-hidden` when purely decorative.\\n- Fully token-driven: variants color from the role's `*-container` tokens, sizes from\\n the theme's `avatar` size records, corner radius from `options.borderRadius`\\n (`max` = circles; a `sharp` theme gets square avatars), initials typeface from\\n `options.typeface`, fallback symbol from `options.fallbackSymbol`.\\n- `uni-avatar-group` stacks avatars with a token-driven overlap (spacing token) and\\n separator ring (`ringColor`/`ringWidth` options); `max` collapses the overflow into\\n a themed \\\"+N\\\" chip that is itself a `uni-avatar` (verbatim `text` input).\",\n \"commit\": \"1f5ee1d\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-breadcrumb` component\",\n \"body\": \"- WAI-ARIA breadcrumb: labelled `nav` landmark wrapping an ordered list, the last item\\n marked `aria-current=\\\"page\\\"`, separators decorative (`aria-hidden`).\\n- Data-driven `items` (root first). Items with `href` render as real anchors; without\\n one they render as link-styled buttons emitting `itemClicked` for SPA routing.\\n- Token-driven via `breadcrumb.options`: `typeface`, link `color`, `currentColor`,\\n `separatorSymbol` (material symbol), and `gap` spacing.\",\n \"commit\": \"dca84b1\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Button corner rounding and typography conform to component-options tokens\",\n \"body\": \"- `button` and `iconButton` themes gain `options: { borderRadius: 'max' }`; the hardcoded\\n per-size pixel radii (11/13/18/24) and the icon button's inline `borderRadius: 999` are\\n removed. Components resolve the token through `theme.radius()`, so the theme's radii\\n scale — shape languages (`sharp` → square, `playful` → pill) and custom radii\\n primitives — now restyles buttons like every other tokened component.\\n- Back-compat: the options radius is applied before theme `sizes`/`fixed` styles, so\\n hand-authored themes that still set a size-level `borderRadius` keep winning; icon\\n buttons fall back to the legacy circle when a theme predates iconButton options.\\n- `button` themes also gain `options: { typeface: 'button' }`: the hardcoded\\n `fontFamily: 'Euphemia'` (a font no theme loads) is removed from `fixed` and the sizes;\\n labels now render the type scale's `button` role (Red Hat Display, medium, capitalize),\\n with per-size `fontSize` still applied by `sizes`. Point the token at any typography\\n role — including custom ones — to restyle every button label.\\n- New `UniButtonOptions` interface (`borderRadius`, `typeface`) exported from the button\\n model.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Card frame conforms to token primitives\",\n \"body\": \"- The card theme's hardcoded frame (`borderStyle`/`borderWidth`/`borderRadius: '8px'` in\\n `fixed`, `borderColor` per variant) is replaced by tokens: the card resolves its border\\n from the **border primitive named by its variant** (`borders.primary` …\\n `borders.success`), its corner radius from the radii scale (`options.borderRadius:\\n- `UniCardOptions` gains `border` (pin every card to one primitive — including a custom\\n one — instead of variant-following) and documents the existing `borderRadius`/\\n `elevation`; redefining a border primitive in a theme now restyles cards and every\\n other component sharing that token.\\n- Token styles apply under the merged theme style, so hand-authored themes that still\\n set card `fixed`/`variants` frame styles keep winning. No visual change for default\\n themes — this is pure tokenization.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-drawer` and `uni-app-bar` — the dashboard shell\",\n \"body\": \"- **`uni-drawer`** has two modes sharing one content slot: `side` renders an in-flow\\n `<aside>` that pushes content (width-animated open/close, divider border primitive at\\n its edge, `aria-hidden` while closed); `over` renders a native `<dialog>` in the top\\n layer — focus trap, Escape, and scrim backdrop come from the platform, sliding in\\n from `position` (`start`/`end`). `open` is a two-way `model()`; Escape and backdrop\\n clicks keep it in sync. Tokens: `drawer.options` (`color`, `width`, `divider`,\\n `elevation`, `padding`, `backdrop`).\\n- **`uni-app-bar`**: leading/trailing content projection slots around a `title` (or\\n custom center content), trailing pushed to the far edge; optional `sticky`. Tokens:\\n `appBar.options` (`color`, `height`, `divider`, `typeface`, `padding`, `gap`,\\n optional `elevation`).\\n- The Drawer \\\"DashboardShell\\\" story documents the composition recipe: app bar with a\\n menu toggle + side drawer + content.\",\n \"commit\": \"17cf662\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Progress gauge derives from the palette instead of hardcoded pastels\",\n \"body\": \"The gauge's track colors were fixed pastel hexes (`#b3d4ea`, `#b3e7c2`, …) that ignored\\nthe active theme entirely — secondary and success even shared the same green. Tracks now\\nuse the role's `*-container` token (the palette's soft tint of that role) and arcs the\\nrole base, so gauges follow any brand palette, in both light and dark modes.\",\n \"commit\": \"7844dde\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-skeleton` loading placeholder\",\n \"body\": \"- Three shapes: `text` (multi-line, ending on a short line like real copy), `rect`,\\n and `circle`; explicit `width`/`height` accept CSS strings or px numbers.\\n- Painted with surface tokens (`skeleton.options`: `color`, `highlightColor`,\\n `borderRadius`, `gap`) so placeholders sit naturally on light and dark themes; the\\n shimmer sweep (`animation`/`duration` options) only runs when the user allows motion\\n and degrades to static blocks under `prefers-reduced-motion`.\\n- `aria-hidden` — placeholders are invisible to assistive tech by design.\",\n \"commit\": \"4ccf18b\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-slider` component — clears the declared-but-unbuilt `ComponentName` entry\",\n \"body\": \"- Native `<input type=\\\"range\\\">` under the hood: platform keyboard interaction\\n (arrows, Home/End, Page Up/Down) and ARIA slider semantics for free; Signal Forms\\n contract (`FormValueControl<number>`) matching Input/Textarea.\\n- `min`/`max`/`step` inputs (fractional steps supported), required accessible `label`.\\n- Token-driven via `slider.options`: fill/thumb `color`, `trackColor`, `borderRadius`,\\n and geometry (`trackHeight`, `thumbSize`). The fill level rides a CSS custom\\n property, so dragging never regenerates Emotion styles; Firefox uses the native\\n `::-moz-range-progress`, WebKit a gradient stop.\",\n \"commit\": \"5d9062a\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-tabs` / `uni-tab` components\",\n \"body\": \"- Full WAI-ARIA tabs pattern: `tablist`/`tab`/`tabpanel` roles with wired\\n `aria-selected`/`aria-controls`/`aria-labelledby`, roving tabindex, automatic\\n activation on ArrowLeft/ArrowRight (wrapping, disabled tabs skipped), Home/End,\\n and motion-safe transitions.\\n- `selectedIndex` is a two-way `model()`; selection snaps to the nearest enabled tab.\\n Panel content is captured per-tab and only the selected panel is instantiated.\\n- Every visual knob is a theme option token (`tabs.options`): `typeface`, `textColor`,\\n `activeTextColor`, `indicatorColor`, `indicatorThickness` (thickness token),\\n `divider` (border primitive), `gap`/`padding` (spacing tokens), `borderRadius`, and\\n optional `activeColor` — the defaults render underline tabs; `borderRadius: 'max'` +\\n `activeColor` turns them into segmented pills with no component changes.\",\n \"commit\": \"15a8f73\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"New `uni-textarea` component\",\n \"body\": \"- Multi-line text field with the same Signal Forms contract as `uni-input`\\n (`FormValueControl<string>`: `value` model, `disabled`/`invalid`/`dirty`/`required`,\\n touched-aware error styling, `aria-*` wiring).\\n- Reuses `uni-input-box` for its chrome, so it inherits the input's themed color,\\n border, typeface, focus outline, and disabled treatment automatically; the box's\\n field selectors now cover `textarea` (with auto height and vertical padding), and\\n the box accepts a `height` override.\\n- Theme options follow the token pattern: `textarea: { options: { rows: 3, resize:\\n instance.\",\n \"commit\": \"b04b97b\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"Theme Builder becomes the full playground (PRD §5.2)\",\n \"body\": \"- **Light & dark side by side**: both palettes generate on every input change,\\n independent of the storybook-wide mode toggle, each rendered in its own panel.\\n- **Contrast report panel**: live pass/fail matrix over all checked pairs (summary +\\n failing rows always visible, full detail on demand). Failures only occur with hard\\n brand pins; the panel says so and points at soft targets.\\n- **Shape language input** (`sharp`/`modern`/`playful`): applies `ShapeRadii` live via\\n the new `radii` pass-through on `BrandPaletteConfig`/`createThemeFromPalette`.\\n- **Export paths**: copy the static `uni-theme.ts` (via `emitThemeFile`), copy a\\n pre-encoded `ng add` command, or copy W3C DTCG JSON for both modes via the new\\n `emitDtcgTokens()` interop emitter in uni-core (Style Dictionary compatible).\",\n \"commit\": \"8f55b4c\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Brand-tinted, theme-scoped elevation shadows (PRD §3.5.C)\",\n \"body\": \"- New `generateShadows(colors, mode)`: light themes replace the dead-neutral\\n `rgba(0,0,0,…)` stacks with a shadow ink pulled toward the brand hue; dark themes go\\n near-zero (`raised: none`) with only a faint veil on floating overlays — elevation\\n reads from the surface lightness steps instead. The `warn` glow is tinted with the\\n theme's own error color in both modes.\\n- `generateThemes` now returns `lightShadows`/`darkShadows`; `generateUniThemes`,\\n `createThemeFromPalette` (Theme Builder), the emitted `uni-theme.ts`, and the shipped\\n stock Light/Dark themes all carry them.\",\n \"commit\": \"c1dc853\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Fix `ng add` against real published packages (found by fresh `ng new` e2e):\",\n \"body\": \"- The schematic bundle is CJS, but ng-packagr stamps `\\\"type\\\": \\\"module\\\"` into the\\n published package.json, so Node loaded it as ESM and the CLI reported \\\"no ng add\\n actions\\\". A nested `schematics/package.json` (`\\\"type\\\": \\\"commonjs\\\"`) scopes the\\n bundle back to CJS.\\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\\n signature), failing under `ng new`'s strict `noPropertyAccessFromIndexSignature`.\\n The emitter (and the MCP tool's guidance) now uses bracket access throughout.\\n- `uni-angular`'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\\n instead of `workspace:*` (published as an exact pin). Alongside changesets'\\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\\n inflated to majors by the peer-dependents rule — the cause of the 4.0.0 and 5.0.0\\n version jumps.\",\n \"commit\": \"f2951db\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"OKLCH theme generation engine (`concepts/generation`)\",\n \"body\": \"- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\\n (110 checked pairs per theme pair). Pure and deterministic.\\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\\n (C ≤ 0.16), and a contrast guard-rail that adjusts lightness only — never hue.\\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\\n- Semantic inks re-tuned per role: error 27°/C 0.20, warn 55°/C 0.18 (rotated off amber —\\n dark yellow reads brown), success 152°/C 0.16.\\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\\n derived defaults — themes can define custom named primitives and rewire per-component\\n options without restating untouched sections.\\n- New `emitThemeFile()` renders a static `uni-theme.ts` — literal colors, visible border\\n primitives, sparse component overrides — the editable source of truth; the engine\\n never ships to the browser.\\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\\n links, scaffolds a themed smoke test, and prints the contrast summary.\\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\\n snippet, and contrast report, with agent guidance to edit the file for restyling.\\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.\",\n \"commit\": \"f7f0bdd\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Porting Components\",\n \"body\": \"\",\n \"commit\": \"ef9b3b5\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"3.0.2\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"3.0.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"3.0.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"2.0.4\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"2.0.3\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"2.0.2\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"2.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix: switch to bundled dual-package distribution via Vite to resolve strict ESM relative path failures\",\n \"body\": \"\",\n \"commit\": \"e2cad74\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Setting Fixed Versioning for all packages.\",\n \"body\": \"\",\n \"commit\": \"be0fb26\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"1.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Adding cjs support\",\n \"body\": \"\",\n \"commit\": \"4a049de\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"1.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"init release\",\n \"body\": \"\",\n \"commit\": \"7d18157\"\n }\n ],\n \"dependencyBumps\": []\n }\n ]\n },\n {\n \"package\": \"@uni-design-system/uni-react\",\n \"releases\": [\n {\n \"version\": \"10.4.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.3.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.0.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"9.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"`uni-react`'s Switch reads the `success` color token instead of hand-rolling an\",\n \"body\": \"HSL string from a color-generation internal, and both packages now typecheck as\\npart of their build.\\n\\nThe Switch built its \\\"on\\\" color as `hsl(${RoleHues.success.default}, 32%, 50%)`\\n— a fixed green assembled from the HSL generation tables rather than the theme,\\nso it never recolored with the theme and broke when those tables were removed.\\nIt now reads `useTheme().colors.success`.\\n\\nThe reason that reached a deploy is the build. `vite build` transpiles with\\nesbuild, which strips types without checking them, and it treats\\n`@uni-design-system/uni-core` as an external — so neither the type layer nor the\\nmodule graph ever verified that an imported core export exists. `pnpm turbo run\\n- `core` and `react` now run `tsc --noEmit` as the first half of `build`, so a\\n removed or renamed core export fails the consumer's build.\\n- A `type-check` turbo task exists for running that pass alone.\\n- CI builds **both** Storybooks, not just Angular's. These bundle uni-core\\n instead of externalizing it, so they are the step that resolves its exports\\n against real consumer source.\\n\\nThis also cleared four pre-existing type errors in `IconTextRow`, which did\\narithmetic on `fontSize` / `lineHeight` — typed `CssLength` (`number | string`)\\n— and passed the result to props typed `number`. They are coerced through one\\ndocumented helper now.\",\n \"commit\": \"f926cd5\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"9.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"Every deprecated API is removed. The library now carries no `@deprecated`\",\n \"body\": \"symbols at all.\\n\\n**Per-component duration options → the `motion` scale.** Six components carried\\ntheir own duration knob that predated the motion scale and _won over_ it:\\n`expand.transitionSpeed`, `callout.transitionMs`, `radio.transitionSpeed`,\\n`menuItem.transitionSpeed`, `alert.transitionSpeed` and\\n`snackbar.transitionDelay`. All are gone, along with the precedence branch each\\none required — timing now comes from the token, full stop.\\n\\nRetime the token instead; one edit covers every component pointing at it. To\\nretime a single component, define a token of your own and point that\\ncomponent's `motion` option at it:\\n\\n```ts\\ncreateTheme({\\n …,\\n motion: { productive: { duration: 110, easing: 'ease' } },\\n components: { menuItem: { options: { motion: 'productive' } } },\\n});\\n```\\n\\nA `duration: 0` token is how a theme opts out of motion — that is what\\n`transitionSpeed: 0` used to mean. Both showcase themes are migrated this way\\n(Carbon to a 110ms `productive` token, Wellsourced to an `instant` one).\\n\\n**Options that never did anything.** `card.transitionSpeed` and\\n`inputBox.transitionSpeed` were read by nothing and never had been. Delete them\\nfrom your theme; nothing replaces them.\\n\\n**Renames and obsolete APIs**\\n- `inputBox.typeFace` → `typeface` (the casing every other component uses).\\n- `uni-tooltip`'s `appendToBody` input — inert since the tooltip moved to the\\n native top layer, which escapes any overflow context by itself.\\n- Box's `elevation` input → `shadow`, in both the Angular and React packages.\\n It was a second name for the same thing.\\n- The Angular `icons` re-export → import `BaseIcons` from\\n `@uni-design-system/uni-core`. The default set ships with every theme.\\n\\n**The HSL color legacy is gone from uni-core.** `uniColor`, `randomRangeValue`,\\n`CategorySaturation` and `CategoryLightness` are removed, superseded by the\\ndeterministic OKLCH engine (`generateThemes` / `generatePalette`) — same input,\\nsame theme, WCAG-checked. `RoleHues` and the `UniColor` type go with them: they\\nwere reachable only through `uniColor`, and `RoleHues` had gone stale enough to\\nhold saturation values in a table of hues.\\n\\n**Deferred output renames.** Three outputs were held back because renaming is\\nbreaking; this is that release. Each also drops an eslint escape it needed for\\nshadowing a native event name or using an `on` prefix.\\n\\n| Component | Before | After |\\n| -------------------- | ----------------- | ---------------- |\\n| `uni-debounce-input` | `(change)` | `(valueChange)` |\\n| `uni-search-input` | `(change)` | `(searchChange)` |\\n| `uni-search-input` | `(search)` | `(searchSubmit)` |\\n| `dragAndDrop` | `(onFileDropped)` | `(fileDropped)` |\\n\\n**`uni-dropdown`'s `color` input → `containerColor`,** completing the rule the\\nlayout directives set: every container-pair input in the library is now\\n`containerColor`, and plain `color` always means the CSS property.\\n\\n**`ThemeService.getSpacing('none')` now returns `0`, not the string `'none'`.**\\n`'none'` is not a valid length, so it was silently dropped wherever it landed —\\n`uni-menu` carried a comment working around exactly that, which is now deleted.\",\n \"commit\": \"8250162\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"React layout primitives, at parity with Angular: `Box`, `Stack`, `Row`, `Center`, `Wrap`, `Grid` and `GridArea`. Angular applies layout as an attribute so the element's semantics stay the author's (`<main box-layout>`); React's equivalent is the polymorphic `as` prop — `<Box as=\\\"main\\\" padding=\\\"md\\\">` — with refs and DOM props forwarded to whatever element it renders.\",\n \"body\": \"Props, defaults and resolution order are ported one-for-one from `UniBoxComponent`, so the same tokens produce the same CSS in both frameworks: token-driven color pairs, padding, radius, border, shadow, gap and z-index; a number is px and a string is a CSS length for every sizing prop; `dashBorder` draws the SVG dashed outline; `ignoreDir` (default on) still flips flex direction under `dir=\\\"rtl\\\"`. `Stack` keeps its `minHeight: fit-content` guard and `Row` its `minWidth: fit-content` — set `minHeight={0}` / `minWidth={0}` to shrink inside a constrained flex parent.\\n\\nSupporting this: `createThemeStyles`/`useThemeStyles` — the React port of the Angular `ThemeService` token → CSS resolvers, method-for-method — and `@emotion/css` (new peer dependency, matching the Angular package) so pseudo-selectors like `:dir(rtl)` resolve in a real class rather than an inline style. A Box that paints a container color now also provides that token to its descendants, so `Text` inside it picks up the matching on-color.\",\n \"commit\": \"82d1341\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.3.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.2.0\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.\",\n \"body\": \"\",\n \"commit\": \"e706e38\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"8.0.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.3.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.2.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"7.0.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.1\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"6.0.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.2.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.1.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"5.0.0\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@5.0.0\"\n ]\n },\n {\n \"version\": \"4.0.0\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@4.0.0\"\n ]\n },\n {\n \"version\": \"3.0.2\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.2\"\n ]\n },\n {\n \"version\": \"3.0.1\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.1\"\n ]\n },\n {\n \"version\": \"3.0.0\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@3.0.0\"\n ]\n },\n {\n \"version\": \"2.0.4\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.4\"\n ]\n },\n {\n \"version\": \"2.0.3\",\n \"entries\": [],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.3\"\n ]\n },\n {\n \"version\": \"2.0.2\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix: switch React package distribution to bundled multi-format outputs via Vite to resolve strict ESM runtime and source compilation issues inside consumers.\",\n \"body\": \"\",\n \"commit\": \"c5c552a\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.2\"\n ]\n },\n {\n \"version\": \"2.0.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Setting Fixed Versioning for all packages.\",\n \"body\": \"\",\n \"commit\": \"be0fb26\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@2.0.1\"\n ]\n },\n {\n \"version\": \"2.0.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Adding cjs support\",\n \"body\": \"\",\n \"commit\": \"4a049de\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@1.1.0\"\n ]\n },\n {\n \"version\": \"1.0.0\",\n \"entries\": [\n {\n \"bump\": \"major\",\n \"title\": \"init release\",\n \"body\": \"\",\n \"commit\": \"7d18157\"\n }\n ],\n \"dependencyBumps\": [\n \"@uni-design-system/uni-core@1.0.0\"\n ]\n }\n ]\n },\n {\n \"package\": \"@uni-design-system/uni-mcp\",\n \"releases\": [\n {\n \"version\": \"10.4.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.3.0\",\n \"entries\": [],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"The published MCP server carries the index for its own release.\",\n \"body\": \"`uni-mcp@10.2.0` shipped a bundle whose index was stamped `meta.version:\\ncheck which release the server describes said the previous one — the same drift\\nthe version alignment had just been made to end.\\n\\nThe cause was ordering, not data. `tsup` **inlines** `uni-index.json` into the\\nbundle, so the dist built during the verify step was stamped before\\n`changeset version` ran; publishing then shipped that stale bundle even though\\nthe regenerated index was correctly committed to the repo. `version-packages`\\nnow rebuilds `uni-mcp` after regenerating the index, so the artifact and its\\nsource agree.\\n\\nThe general rule, for anything added later: a package whose dist embeds\\nrelease-time data has to be rebuilt _after_ the version bump, not before.\",\n \"commit\": \"704e79b\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"10.2.0\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"The MCP server now shares the library's version number.\",\n \"body\": \"It used to release on its own `4.x` line while the library was on `10.x`, which\\nhad two consequences. Pinning was impossible: the README told you to match the\\nserver to your installed `@uni-design-system/uni-angular` version, but\\n`uni-mcp@10.1.0` did not exist. And staleness was silent — the index is\\nregenerated on every release, stamped with that release's version and **inlined\\ninto the published bundle**, yet the package only republished when someone\\nremembered a changeset for it. Miss one and the server keeps describing the\\nprevious release while reporting a version that gives no hint of it.\\n\\n`uni-mcp` joins `uni-core`, `uni-react` and `uni-angular` in the changesets\\n`fixed` group, so it always shares their version and always republishes. The\\nversion therefore jumps from `4.7.3` to match the current release. Nothing about\\nthe server's behaviour, transport or tools changes.\\n\\n`uni-mcp@<version>` now describes `uni-angular@<version>`, so pinning them\\ntogether does what the docs always claimed it did.\",\n \"commit\": \"2b8d80f\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.7.3\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"`get-component` lists inherited inputs, and each story gets its own example.\",\n \"body\": \"**`variant` and `size` were missing from almost every component.** 49 components\\nextend `BaseComponent`, which declares both as real bindable inputs — but the\\nadapter is a regex over a single file with no `extends` handling, and\\n`BaseComponent` has no `selector`, so it is discarded before it can be parsed.\\nThe two inputs survived only for the handful of components that redeclare them\\nlocally. An agent reading `get-component toggle` saw no `variant`, which is the\\none knob that made a consumer's migration viable. They are now appended to every\\n`BaseComponent` subclass, deduped so a local `override` still wins.\\n\\n**Every story of a component shared one example.** `extractTemplate` matched the\\nfirst `template:` in a stories file and the result was cached per file, so a\\ncomponent whose meta declares a generic `render` had all of its examples collapse\\ninto that stub — `uni-toggle` shipped six identical `<uni-toggle></uni-toggle>`\\nsnippets, and its richest story documented as its poorest. Each story's own\\ntemplate is now located by brace-balancing its object literal, falling back to\\nthe file-level template for the args-only stories that legitimately share the\\nmeta render.\\n\\nAlso raises the theme payload ceiling from 20 KB to 24 KB. That guard exists to\\ncatch the ~50 KB icon set creeping back into the wire form, and ordinary token\\ngrowth had reached the old limit; it is sized to catch the icons, not to freeze\\nthe token set.\",\n \"commit\": \"67e17ea\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.7.2\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix three miscategorized components in the index.\",\n \"body\": \"Categories come from an ordered list of substring regexes, so a name that merely\\ncontains an earlier row's keyword lands in the wrong bucket — and a\\nmiscategorized component is invisible to `list-components --category`, which is\\nhow agents and humans find things.\\n- `textarea` → **forms** (was `primitives`: `/text/` matches inside \\\"textarea\\\"\\n and wins before the forms row is tried)\\n- `combobox` → **forms** (was `layout`: `/box/` matches inside \\\"combobox\\\")\\n- `expand-toggle` → **layout** (was `forms`: `/toggle/` beat `/expand/`)\\n\\nKnown ids now go through an explicit override map consulted before the keyword\\npass, so a fix is a one-line entry rather than a regex that has to be reasoned\\nabout globally.\\n\\nAlso: MDX pages are matched to their source by basename, stripping only\\n`.component.ts`. With the layout primitives and `uni-text` becoming directives,\\n`.directive.ts` is stripped too, so their docs keep attaching by name instead of\\nfalling through to the same-directory fallback.\",\n \"commit\": \"c0c6056\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.7.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"README: the hosted (Render) endpoint is marked dormant — no deployment is currently running; stdio via `npx -y @uni-design-system/uni-mcp` is the canonical path (pin the package to your installed Uni version for version-locked answers). The HTTP mode stays documented and deployable for when a browser-based consumer needs it. The `get-changelog` and `export-dtcg-tokens` tools are now listed in the tools table.\",\n \"body\": \"\",\n \"commit\": \"b160b3c\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.7.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"`get-changelog`: release notes as a first-class MCP tool, plus a `uni://changelog/{package}` resource.\",\n \"body\": \"The index now ingests every published package's changesets `CHANGELOG.md` (a new build adapter parses them into structured releases — bump level, headline, full body, commit, dependency bumps). The tool answers \\\"what changed in X?\\\" and \\\"what do I get by upgrading?\\\": `version` returns one release's full notes (`\\\"8.1\\\"` matches every 8.1.x), `since` returns the full notes of every release after an installed version, and no scope returns a compact release digest. `package` accepts npm or short names (`uni-angular` is the default).\",\n \"commit\": \"e706e38\"\n },\n {\n \"bump\": \"minor\",\n \"title\": \"`export-dtcg-tokens`: W3C DTCG JSON (Style Dictionary compatible) for a built-in theme's color, radius, and spacing scales, named with Uni token ids — exposing core's existing `emitDtcgTokens` as an MCP tool for external token pipelines. The `UniTheme` JSON from the theme tools remains the lossless primary format.\",\n \"body\": \"\",\n \"commit\": \"57a8c4c\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Ship `CHANGELOG.md` in the published packages. The release notes existed only in the repo; an installed package carried no record of what changed, so upgrade questions couldn't be answered from `node_modules`. uni-angular copies it into the ng-packagr `dist` via `assets`; the rest add it to `files`.\",\n \"body\": \"\",\n \"commit\": \"e706e38\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.6.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Runtime theme JSON: `generate-runtime-theme`, `get-runtime-theme`, and a theme registry endpoint\",\n \"body\": \"`generate-uni-theme` returns `uni-theme.ts` **source** — codegen by design, and\\nthe right answer for branding an app permanently. It is the wrong answer when a\\ntheme needs to apply _now_: an agent had to write a file and rebuild. These tools\\nclose that gap (ROADMAP Track 1 item 4).\\n- **`generate-runtime-theme`** — brand hex color(s) in, a WCAG-AA light+dark pair\\n out as validated JSON, ready for `ThemeService.registerTheme(theme, { select:\\n- **`get-runtime-theme`** — a theme that ships with Uni as a registerable\\n `UniTheme`. Distinct from `get-theme-template`, which returns a flat read-only\\n projection of token values rather than the theme object itself.\\n- **Both validate before returning.** Every theme is run through uni-core's\\n `parseTheme`, so \\\"validated\\\" is checked rather than claimed; a failure comes\\n back as a tool error listing every reason.\\n- **First tools with an MCP `outputSchema`**, so agents get a machine-readable\\n contract instead of parsing prose (opens ROADMAP Track 1 item 6). The theme\\n itself is typed as an opaque validated object on purpose — uni-core's\\n `parseTheme` stays the single source of truth for theme shape, and a mirrored\\n schema here would drift from it.\\n- **Payloads elide the built-in icon set** (`dehydrateTheme`), taking a\\n light+dark result from ~100 KB to ~30 KB — roughly 7.6k tokens instead of 25k\\n per call. Consumers restore them on registration.\\n- **New registry endpoint on the HTTP server**: `GET /themes` lists the ids and\\n `GET /themes/{id}.json` returns one registerable theme, for apps that fetch a\\n theme without speaking MCP. These routes are public, read-only and\\n CORS-enabled so a browser can fetch them directly; `/mcp` stays token-guarded\\n and same-origin.\\n- The server's instructions now carry a routing rule for the four theme tools\\n (brand permanently / apply now / inspect values), and the README tool table\\n lists `create-icon-tokens`, which shipped undocumented.\",\n \"commit\": \"5414517\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.5.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Expand `BaseIcons` to 59 icons and add `uni-icon` sizing\",\n \"body\": \"The 34-icon set shipped in 7.0.0 covered the library's own components but not a\\nreal application — an app migrating off inline `<svg>` (or off `uni-symbol`, in\\nAngular) ran out of names almost immediately. Everything here is additive; all\\n34 existing names are unchanged.\\n- **25 new icons**, same Material Symbols Outlined 300 source and the same\\n `0 -960 960 960` grid as the rest of the set: navigation (`link`, `expand`,\\n `gridView`, `listView`), actions (`moreHorizontal`, `copy`, `send`,\\n `refresh`, `dragHandle`, `qrCode`), feedback (`star`, `verified`) and\\n user/system (`group`, `shieldPerson`, `clock`, `mail`, `chat`, `image`,\\n `document`, `payment`, `bank`, `trendingUp`, `extension`, `webhook`,\\n `logout`).\\n - `moreHorizontal` ships alongside `more` because that one is `more_vert` and\\n row-aligned menus need the horizontal kebab.\\n - `star` is separate from `favorite`, which is the heart.\\n- **`uni-icon` gains an optional `size` input** (`CssLength` — bare numbers are\\n px, strings pass through, so `20` and `'1.25rem'` both work). Left unset,\\n behaviour is unchanged: the icon fills its container, which is what lets a\\n themed control size its own glyph through padding. Set, it applies\\n width/height as inline styles, so an explicit size wins over the\\n fill-the-container rule regardless of style injection order. This removes the\\n per-call-site `width`/`height` CSS rule that replacing an inline `<svg>` with\\n `<uni-icon>` would otherwise need.\\n- The MCP `create-icon-tokens` tool now lists the built-in icon names above the\\n token map it returns. Apps routinely hand-draw their own `close`, `check` or\\n `plus`; encoding those into theme tokens works but adds redundant artwork on a\\n foreign grid when the theme already ships the glyph. The tool cannot recognise\\n a shape, so it hands the caller the list to check against before adding\\n anything.\",\n \"commit\": \"c2421c0\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.4.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Replace `BaseIcons` with a normalized 34-icon Material Symbols set\",\n \"body\": \"The built-in icon set was 11 glyphs drawn from four different grids\\n(`0 0 24 24`, `0 0 50 50`, `0 0 64 64`, `0 -960 960 960`), so `checkCircle` and\\n`xCircle` rendered as solid filled discs next to a hairline `alertCircle` and an\\noversized `close` — three optical weights in one set.\\n- `BaseIcons` is now Material Symbols Outlined at weight 300, every glyph on a\\n single `0 -960 960 960` grid, grouped by intent: navigation (`menu`,\\n `chevronUp/Down/Left/Right`, `arrowLeft/Right`, `home`, `externalLink`),\\n actions (`search`, `close`, `plus`, `minus`, `more`, `delete`, `edit`,\\n `download`, `upload`, `share`, `filter`), feedback (`check`, `checkCircle`,\\n `xCircle`, `alertCircle`, `info`, `warning`, `lock`) and user/system\\n (`profile`, `settings`, `notification`, `favorite`, `help`, `calendar`).\\n- All 11 previously shipped names are preserved, so existing `<uni-icon>` call\\n sites and theme overrides keep working. Their **appearance changes**: the\\n filled `checkCircle`/`xCircle` are now outlined, and the set reads lighter\\n overall. `spinner` is carried over verbatim, keyframes intact.\\n- New `IconName` and `BaseIconName` types. `IconName` is\\n `BaseIconName | (string & {})`, so built-ins autocomplete and typos surface\\n while themes can still register arbitrary names via `createTheme({ icons })`.\\n `uni-icon`'s `name` input is typed with it instead of `keyof Icons`.\\n- **Breaking**: removes the unused `IconToken`, `IconStyle`, `ToggleableIcon`\\n and `IconConfig` exports. Nothing in the library referenced them and\\n `IconToken`'s 60-name union contradicted the actual `BaseIcons` keys. Use\\n `IconName` instead.\\n- New exported `svgToIconUri(svg, options?)` — the supported way to bring your\\n own icons (a brand set, a designer handoff) into a theme. It normalizes the\\n source (drops the xml declaration, comments and fixed `width`/`height` so the\\n mask scales), percent-encodes it, and **rejects artwork that cannot survive\\n masking**: no `viewBox`, an embedded raster `<image>`, an external reference,\\n a gradient/pattern fill, or more than one paint color. That last one is the\\n trap worth naming — masks use the alpha channel, so a multi-color logo\\n flattens to a silhouette in `currentColor`; pass `{ allowMultiColor: true }`\\n when that is intended. `createTheme({ icons })` merges the result over\\n `BaseIcons` per name, so a built-in name reskins and a new name is added.\\n- New MCP tool `create-icon-tokens`, the agent-facing front end to\\n `svgToIconUri`: hand it a project's inline `<svg>` (or a brand set) and it\\n returns a paste-ready `icons` map for `uni-theme.ts`. It encodes via the same\\n helper, so tokens are byte-identical to the built-in set, and adds the\\n set-level checks a per-icon helper cannot make — which names override\\n built-ins, and whether the artwork mixes viewBox grids. Bad artwork is\\n reported per icon rather than failing the batch, and re-running is safe\\n (already-encoded URIs pass through). The server instructions now point agents\\n at it whenever they encounter inline SVG.\\n- `BaseIcons` is generated by `scripts/generate-icons.mjs` (`pnpm icons:generate`),\\n which fetches from the canonical Material Symbols source and validates every\\n glyph before writing — a malformed path, an off-grid viewBox or geometry\\n outside the grid aborts the run. `pnpm icons:check` verifies the committed\\n file without writing. Add or change icons in that script's manifest and\\n regenerate; the file is not hand-edited. `icon.records.spec.ts` asserts the\\n same invariants against the committed output.\",\n \"commit\": \"f7727aa\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.3.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"MDX guidelines adapter — authored docs now reach AI agents\",\n \"body\": \"- New build adapter parses each component's co-located `.mdx` docs page into the\\n index's previously-empty `guidelines` field: the `## Overview` prose becomes\\n `whenToUse`, and optional `## Do` / `## Don't` / `## Accessibility` bullet sections\\n map to their fields — so guidelines are authored in the same file the Storybook\\n sidebar shows, with JSX/import scaffolding stripped.\\n- 48 components gain guidelines immediately; `get-guidelines` and `uni://guidelines/*`\\n now answer with real when-to-use guidance (including the canonical selector forms\\n from the 6.0 unification).\\n- MDX↔component matching: shared basename first (`tabs.mdx` → `tabs.component.ts`),\\n same-directory fallback for group docs.\",\n \"commit\": \"076202d\"\n },\n {\n \"bump\": \"patch\",\n \"title\": \"Canonical MDX docs structure across the entire library\",\n \"body\": \"- Component docs pages now follow one flow (spec in AGENTS.md): imports → Overview →\\n Usage (the compact playground: story + source + knobs) → named variation examples →\\n **Theme options** → Accessibility → Do/Don't. Property/API/Methods/Events tables are\\n retired — the playground's controls are the API reference.\\n- New `ThemeOptions` docs block renders a component's per-theme option tokens live from\\n the active Storybook theme (with color swatches), distinguishing per-theme options\\n from per-instance inputs; data-table's raw `ThemeDataBlock` dump is replaced.\\n- All ~55 component pages conform: the 7 form-control pages (200–390 lines of legacy\\n API tables) rewritten; empty Overviews authored (card, tag, icon-button, scroll-area,\\n expand-area, data-table); accessibility bullets added across navigation, feedback,\\n and form components.\\n- The MCP index now carries when-to-use guidance for 55 of 70 components (was 41) and\\n accessibility guidance for 36 (was 21) — the remainder are subcomponents documented\\n on their parent pages and internal directives.\",\n \"commit\": \"4bfb057\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.2.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"Fix invisible icons; icons become first-class theme primitives\",\n \"body\": \"- **Bug**: `uni-icon` resolves icons from `theme.icons`, but every theme shipped\\n `icons: {}` — the icon record was never wired in, so all icons (dialog close, button\\n spinner, search/clear affordances) rendered nothing.\\n- **Fix + pattern**: the default icon set now lives in core (`BaseIcons`, in\\n `concepts/iconography`) and `createTheme` merges a theme's `icons` over it — themes\\n can override or add icons under any name (inline SVG data URIs, masked with\\n `currentColor` so they recolor with the theme). The angular `icons` record re-exports\\n `BaseIcons` (deprecated).\\n- `uni-icon` also sets the standard `mask-image` (was webkit-only, so icons were\\n invisible in Firefox regardless) and renders nothing for unknown names instead of a\\n broken `url(\\\"undefined\\\")`.\\n- The emitted `uni-theme.ts` gains an editable `icons` section, and the MCP's\\n `generate-uni-theme` guidance instructs agents: never inline SVG in components —\\n define an icon once in the theme's `icons` map and render it via `<uni-icon>`.\",\n \"commit\": \"fea0b2e\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.1.2\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix published index losing its Storybook examples, and keep the index in sync\",\n \"body\": \"- `uni-mcp@4.1.x` shipped with **0 examples**: the package build regenerated the index in\\n CI, where `storybook-static` (gitignored) doesn't exist, silently overwriting the\\n committed 107-example index before bundling. `build` is now `tsup` only — the committed\\n `uni-index.json` is the single source of truth and is bundled as-is.\\n- The index is regenerated once per release instead: the changesets `version` step\\n (`pnpm version-packages`) builds Storybook and reruns `build-index` after the version\\n bump, so the refreshed index lands reviewably in the Version Packages PR.\\n- `build-index` now fails loudly when it finds zero examples, so an example-less index\\n can never ship silently again.\\n- Index refreshed to v5.1.0: includes the new component option tokens\\n (`button.behavior.borderRadius`/`typeface`, `card.behavior.borderRadius`), the nine\\n Theme Builder presets' generation updates, and all 107 examples.\",\n \"commit\": \"ffb9692\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.1.1\",\n \"entries\": [\n {\n \"bump\": \"patch\",\n \"title\": \"Fix `ng add` against real published packages (found by fresh `ng new` e2e):\",\n \"body\": \"- The schematic bundle is CJS, but ng-packagr stamps `\\\"type\\\": \\\"module\\\"` into the\\n published package.json, so Node loaded it as ESM and the CLI reported \\\"no ng add\\n actions\\\". A nested `schematics/package.json` (`\\\"type\\\": \\\"commonjs\\\"`) scopes the\\n bundle back to CJS.\\n- The emitted `uni-theme.ts` used dot access on `Colors` (which has an index\\n signature), failing under `ng new`'s strict `noPropertyAccessFromIndexSignature`.\\n The emitter (and the MCP tool's guidance) now uses bracket access throughout.\\n- `uni-angular`'s peer range on `uni-core` is now `workspace:^` (publishes as `^5.x`)\\n instead of `workspace:*` (published as an exact pin). Alongside changesets'\\n `onlyUpdatePeerDependentsWhenOutOfRange`, this stops minor releases from being\\n inflated to majors by the peer-dependents rule — the cause of the 4.0.0 and 5.0.0\\n version jumps.\",\n \"commit\": \"f2951db\"\n }\n ],\n \"dependencyBumps\": []\n },\n {\n \"version\": \"4.1.0\",\n \"entries\": [\n {\n \"bump\": \"minor\",\n \"title\": \"OKLCH theme generation engine (`concepts/generation`)\",\n \"body\": \"- New `generateThemes(input)` / `generateUniThemes(input)`: brand seed(s) in, complete\\n WCAG-AA light+dark `Colors` pair out, with a machine-readable `ContrastReport`\\n (110 checked pairs per theme pair). Pure and deterministic.\\n- All palette math moved from HSL to perceptual OKLCH: uniform lightness slots across\\n hues, per-category chroma model (`CategoryChroma`), dark-mode accent chroma decoupling\\n (C ≤ 0.16), and a contrast guard-rail that adjusts lightness only — never hue.\\n- Brand colors ride as soft `targets` (kept verbatim when already AA, lightness-adjusted\\n when not) alongside the existing hard `brand` pins; accepted by `generatePalette`,\\n `createThemeFromPalette`, and Angular's `BrandPaletteConfig`.\\n- Semantic inks re-tuned per role: error 27°/C 0.20, warn 55°/C 0.18 (rotated off amber —\\n dark yellow reads brown), success 152°/C 0.16.\\n- `createTheme` accepts optional `radii`/`shadows` overrides; `ShapeRadii` presets\\n (`sharp` / `modern` / `playful`) emitted via the `shape` generation input.\\n- Theme Builder ships nine curated AA-clean presets built on soft targets.\\n- Deprecated (thin wrappers/tables retained): `uniColor`, `randomRangeValue`,\\n `CategorySaturation`, `CategoryLightness`. `schemeHues` moved to `color.utils`.\\n- `createTheme` deep-merges optional `borders` and `components` overrides over its\\n derived defaults — themes can define custom named primitives and rewire per-component\\n options without restating untouched sections.\\n- New `emitThemeFile()` renders a static `uni-theme.ts` — literal colors, visible border\\n primitives, sparse component overrides — the editable source of truth; the engine\\n never ships to the browser.\\n- New `ng add @uni-design-system/uni-angular` schematic: installs the peer set, writes\\n the generated theme file, registers `UNI_THEMES` in `app.config.ts`, adds typeface\\n links, scaffolds a themed smoke test, and prints the contrast summary.\\n- New MCP tool `generate-uni-theme`: returns the static theme file content, provider\\n snippet, and contrast report, with agent guidance to edit the file for restyling.\\n- `uni-core` gains its first Vitest suite, including a 1,080-seed contrast property\\n corpus with zero tolerance in both modes; the schematic gets its own spec suite.\",\n \"commit\": \"f7f0bdd\"\n }\n ],\n \"dependencyBumps\": []\n }\n ]\n }\n ]\n}","/**\n * Runtime store - loads the built `uni-index.json` (inlined into the bundle)\n * and exposes typed queries plus AI-optimized markdown formatters. The server\n * layer only calls into here; it never touches raw index shapes.\n */\nimport indexData from '../data/uni-index.json' with { type: 'json' };\nimport type {\n ComponentModel,\n Framework,\n PackageChangelogModel,\n ReleaseModel,\n ThemeTemplateModel,\n TokenModel,\n UniIndex,\n} from '../schema.js';\n\nconst index = indexData as unknown as UniIndex;\n\nexport type ComponentFilter = { framework?: Framework; category?: string; status?: string };\nexport type TokenFilter = { type?: string; theme?: string; kind?: string };\n\nexport const meta = index.meta;\n\nexport function frameworksFor(c: ComponentModel): Framework[] {\n return Object.keys(c.bindings) as Framework[];\n}\n\nexport function listComponents(filter: ComponentFilter = {}): ComponentModel[] {\n return index.components.filter((c) => {\n if (filter.framework && !c.bindings[filter.framework]) return false;\n if (filter.category && c.category !== filter.category) return false;\n if (filter.status && c.status !== filter.status) return false;\n return true;\n });\n}\n\nexport function getComponent(id: string): ComponentModel | undefined {\n return index.components.find((c) => c.id === id);\n}\n\nexport function listTokens(filter: TokenFilter = {}): TokenModel[] {\n return index.tokens.filter((t) => {\n if (filter.type && t.type !== filter.type) return false;\n if (filter.kind && t.kind !== filter.kind) return false;\n if (filter.theme && !(t.themeValues && filter.theme in t.themeValues)) return false;\n return true;\n });\n}\n\nexport function getToken(id: string): TokenModel | undefined {\n return index.tokens.find((t) => t.id === id);\n}\n\nexport function listThemes(): ThemeTemplateModel[] {\n return index.themes;\n}\n\nexport function getTheme(id: string): ThemeTemplateModel | undefined {\n return index.themes.find((t) => t.id === id);\n}\n\nexport function listChangelogs(): PackageChangelogModel[] {\n return index.changelogs ?? [];\n}\n\n/** Resolve a package by npm name or any short form (\"uni-angular\", \"angular\"). */\nexport function getChangelog(pkg = 'uni-angular'): PackageChangelogModel | undefined {\n const q = pkg.trim().toLowerCase();\n return listChangelogs().find((c) => {\n const name = c.package.toLowerCase();\n const short = name.split('/').pop() ?? name;\n return name === q || short === q || short.replace(/^uni-/, '') === q;\n });\n}\n\n/** Numeric compare over dotted segments; non-numeric segments count as 0. */\nexport function compareVersions(a: string, b: string): number {\n const nums = (v: string) => v.trim().replace(/^v/, '').split('.').map((s) => parseInt(s, 10) || 0);\n const [pa, pb] = [nums(a), nums(b)];\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d) return d;\n }\n return 0;\n}\n\n/** `\"8.1\"` matches every 8.1.x release; `\"8.1.0\"` matches exactly. */\nexport function matchesVersion(version: string, query: string): boolean {\n const v = version.split('.');\n const q = query.trim().replace(/^v/, '').split('.');\n return q.every((seg, i) => v[i] === seg);\n}\n\nexport type ChangelogScope = { version?: string; since?: string };\n\nexport function selectReleases(cl: PackageChangelogModel, scope: ChangelogScope): ReleaseModel[] {\n if (scope.version) return cl.releases.filter((r) => matchesVersion(r.version, scope.version!));\n if (scope.since) return cl.releases.filter((r) => compareVersions(r.version, scope.since!) > 0);\n return cl.releases;\n}\n\nexport type SearchKind = 'component' | 'token' | 'theme' | 'guideline';\nexport type SearchHit = { kind: SearchKind; id: string; label: string; snippet: string };\n\n/** Keyword/substring search across the index (semantic is a later drop-in). */\nexport function search(query: string, kind?: SearchKind): SearchHit[] {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n const hits: SearchHit[] = [];\n const match = (...fields: (string | undefined)[]) =>\n fields.some((f) => f?.toLowerCase().includes(q));\n\n if (!kind || kind === 'component') {\n for (const c of index.components) {\n const apiNames = frameworksFor(c).flatMap((f) => c.bindings[f]!.api.map((a) => a.name));\n if (match(c.id, c.name, c.summary, c.description, c.category, ...apiNames)) {\n hits.push({ kind: 'component', id: c.id, label: c.name, snippet: c.summary || c.description.slice(0, 120) });\n }\n }\n }\n if (!kind || kind === 'token') {\n for (const t of index.tokens) {\n if (match(t.id, t.type, t.description, String(t.value))) {\n hits.push({ kind: 'token', id: t.id, label: t.id, snippet: `${t.type} = ${t.value}` });\n }\n }\n }\n if (!kind || kind === 'theme') {\n for (const t of index.themes) {\n if (match(t.id, t.name, t.description)) {\n hits.push({ kind: 'theme', id: t.id, label: t.name, snippet: t.description });\n }\n }\n }\n if (!kind || kind === 'guideline') {\n for (const c of index.components) {\n const g = c.guidelines;\n if (match(g.whenToUse, ...g.dos, ...g.donts, ...g.accessibility)) {\n hits.push({ kind: 'guideline', id: c.id, label: `${c.name} guidelines`, snippet: g.whenToUse.slice(0, 120) });\n }\n }\n }\n return hits;\n}\n\n// ---------------------------------------------------------------------------\n// Markdown formatters - tight cards, not raw dumps, to keep token usage low.\n// ---------------------------------------------------------------------------\n\nexport function formatComponentList(components: ComponentModel[]): string {\n if (!components.length) return 'No components match that filter.';\n const rows = components.map((c) => {\n const fw = frameworksFor(c).join(', ');\n return `- **${c.name}** \\`${c.id}\\` - ${c.summary || '(no summary)'} _(${c.category}; ${fw})_`;\n });\n return `# Uni components (${components.length})\\n\\n${rows.join('\\n')}`;\n}\n\nfunction formatApiTable(members: ComponentModel['bindings'][Framework]): string {\n const api = members?.api ?? [];\n if (!api.length) return '_No documented inputs/props._';\n return api\n .map((m) => {\n const req = m.required ? ' **(required)**' : '';\n const def = m.default ? ` = \\`${m.default}\\`` : '';\n const dep = m.deprecated ? ` (deprecated: ${m.deprecated})` : '';\n const doc = m.description ? ` - ${m.description}` : '';\n return `- \\`${m.name}: ${m.type}\\`${req}${def} _(${m.kind})_${doc}${dep}`;\n })\n .join('\\n');\n}\n\nexport function formatComponent(c: ComponentModel, framework?: Framework): string {\n const frameworks = framework ? [framework] : frameworksFor(c);\n const out: string[] = [`# ${c.name} \\`${c.id}\\``];\n out.push(`_${c.category} · status: ${c.status} · Uni v${c.version}_`);\n if (c.description) out.push(`\\n${c.description}`);\n\n for (const f of frameworks) {\n const b = c.bindings[f];\n if (!b) {\n out.push(`\\n## ${f}\\n_Not yet available for ${f}._`);\n continue;\n }\n out.push(`\\n## ${f}`);\n out.push(`- import: \\`${b.importPath}\\``);\n out.push(`- selector/tag: \\`${b.selectorOrTag}\\``);\n out.push(`\\n**API**\\n${formatApiTable(b)}`);\n }\n\n if (c.relatedTokens.length) out.push(`\\n**Related tokens:** ${c.relatedTokens.map((t) => `\\`${t}\\``).join(', ')}`);\n if (c.examples.length) {\n const ex = c.examples[0];\n out.push(`\\n**Example - ${ex.title} (${ex.framework})**\\n\\`\\`\\`html\\n${ex.code}\\n\\`\\`\\``);\n if (c.examples.length > 1) out.push(`_+${c.examples.length - 1} more via get-component-examples._`);\n }\n return out.join('\\n');\n}\n\nexport function formatExamples(c: ComponentModel, framework?: Framework): string {\n const examples = framework ? c.examples.filter((e) => e.framework === framework) : c.examples;\n if (!examples.length) return `No examples found for \\`${c.id}\\`${framework ? ` (${framework})` : ''}.`;\n const blocks = examples.map((e) => {\n const link = e.storybookUrl ? `\\n[Open in Storybook](${e.storybookUrl})` : '';\n return `### ${e.title} _(${e.framework})_\\n\\`\\`\\`html\\n${e.code}\\n\\`\\`\\`${link}`;\n });\n return `# ${c.name} - examples (${examples.length})\\n\\n${blocks.join('\\n\\n')}`;\n}\n\nexport function formatToken(t: TokenModel): string {\n const out: string[] = [`# Token \\`${t.id}\\``];\n out.push(`- value: \\`${t.value}\\``);\n out.push(`- type: ${t.type}`);\n out.push(`- kind: **${t.kind}** (${t.target})`);\n if (t.appliesTo) out.push(`- applies to component: \\`${t.appliesTo}\\``);\n if (t.aliasOf) out.push(`- alias of: \\`${t.aliasOf}\\``);\n if (t.description) out.push(`\\n${t.description}`);\n if (t.themeValues && Object.keys(t.themeValues).length) {\n out.push('\\n**Per-theme values**');\n for (const [theme, val] of Object.entries(t.themeValues)) out.push(`- ${theme}: \\`${val}\\``);\n }\n const hint =\n t.kind === 'style'\n ? '\\n_Style token - consumed by Emotion to generate CSS. Reference via the theme, not a raw value._'\n : '\\n_Behavioral token - set as a component input/prop, not as CSS._';\n out.push(hint);\n return out.join('\\n');\n}\n\nexport function formatTokenList(tokens: TokenModel[]): string {\n if (!tokens.length) return 'No tokens match that filter.';\n const rows = tokens.map((t) => `- \\`${t.id}\\` - ${t.type} = \\`${t.value}\\` _(${t.kind})_`);\n return `# Uni tokens (${tokens.length})\\n\\n${rows.join('\\n')}`;\n}\n\nexport function formatThemeList(themes: ThemeTemplateModel[]): string {\n if (!themes.length) return 'No theme templates available.';\n const rows = themes.map((t) => `- **${t.name}** \\`${t.id}\\` - ${t.description}`);\n return `# Uni theme templates (${themes.length})\\n\\n${rows.join('\\n')}`;\n}\n\nexport function formatTheme(t: ThemeTemplateModel): string {\n const out: string[] = [`# Theme \\`${t.id}\\` - ${t.name}`];\n if (t.description) out.push(t.description);\n out.push('\\n## Style overrides (-> Emotion CSS)');\n out.push('_Apply through the theme provider. These become CSS._');\n const styleKeys = Object.entries(t.styleOverrides);\n out.push(styleKeys.map(([k, v]) => `- \\`${k}\\`: \\`${v}\\``).join('\\n'));\n\n out.push('\\n## Component options (-> component inputs/props)');\n out.push('_Behavioral preferences. Pass as inputs/props, not CSS._');\n for (const [component, opts] of Object.entries(t.componentOptions)) {\n out.push(`- **${component}**: ${Object.entries(opts).map(([k, v]) => `\\`${k}=${v}\\``).join(', ')}`);\n }\n if (t.usage) out.push(`\\n## How to apply\\n${t.usage}`);\n return out.join('\\n');\n}\n\nexport function formatGuidelines(c: ComponentModel): string {\n const g = c.guidelines;\n const has = g.whenToUse || g.dos.length || g.donts.length || g.accessibility.length;\n if (!has) return `No authored guidelines yet for \\`${c.id}\\`. (Author them in the component's MDX.)`;\n const out: string[] = [`# ${c.name} - guidelines`];\n if (g.whenToUse) out.push(`\\n**When to use**\\n${g.whenToUse}`);\n if (g.dos.length) out.push(`\\n**Do**\\n${g.dos.map((d) => `- ${d}`).join('\\n')}`);\n if (g.donts.length) out.push(`\\n**Don't**\\n${g.donts.map((d) => `- ${d}`).join('\\n')}`);\n if (g.accessibility.length) out.push(`\\n**Accessibility**\\n${g.accessibility.map((a) => `- ${a}`).join('\\n')}`);\n return out.join('\\n');\n}\n\nfunction formatRelease(r: ReleaseModel, full: boolean): string {\n const out = [`## ${r.version}`];\n for (const bump of ['major', 'minor', 'patch'] as const) {\n const entries = r.entries.filter((e) => e.bump === bump);\n if (!entries.length) continue;\n out.push(`\\n### ${bump[0].toUpperCase()}${bump.slice(1)} changes`);\n for (const e of entries) {\n const commit = e.commit ? ` _(${e.commit.slice(0, 7)})_` : '';\n if (full && e.body) out.push(`\\n**${e.title}**${commit}\\n\\n${e.body}`);\n else out.push(`- ${e.title}${commit}`);\n }\n }\n if (r.dependencyBumps.length) {\n out.push(`\\n_Dependency bumps: ${r.dependencyBumps.map((d) => `\\`${d}\\``).join(', ')}_`);\n }\n if (!r.entries.length && !r.dependencyBumps.length) out.push('_No entries._');\n return out.join('\\n');\n}\n\n/** Scoped calls get full entry bodies; the unscoped list stays a compact digest. */\nexport function formatChangelog(cl: PackageChangelogModel, scope: ChangelogScope = {}): string {\n const releases = selectReleases(cl, scope);\n if (!releases.length) {\n const wanted = scope.version ? `release matching \\`${scope.version}\\`` : `releases after \\`${scope.since}\\``;\n return `No ${wanted} found for ${cl.package}. Latest release: ${cl.releases[0]?.version ?? 'none'}.`;\n }\n const full = Boolean(scope.version || scope.since);\n const shown = full ? releases : releases.slice(0, 15);\n const out = [`# ${cl.package} — release notes`, ...shown.map((r) => formatRelease(r, full))];\n if (shown.length < releases.length) {\n out.push(`_...and ${releases.length - shown.length} older releases. Pass \\`version\\` or \\`since\\` to scope._`);\n }\n return out.join('\\n\\n');\n}\n\nexport function formatSearch(query: string, hits: SearchHit[]): string {\n if (!hits.length) return `No results for \"${query}\".`;\n const rows = hits.slice(0, 40).map((h) => `- _[${h.kind}]_ **${h.label}** \\`${h.id}\\` - ${h.snippet}`);\n const more = hits.length > 40 ? `\\n\\n_...and ${hits.length - 40} more. Narrow with \\`kind\\`._` : '';\n return `# Search: \"${query}\" (${hits.length})\\n\\n${rows.join('\\n')}${more}`;\n}\n","/** Duration (seconds) the default theme assigns `expand`'s `transitionSpeed`. */\nexport const EXPAND_DEFAULT_SPEED = 0.35;\n\n/**\n * Content height (px) at which a reveal runs at exactly its `transitionSpeed`.\n * Roughly a few lines of card content — the size the default 0.35s was tuned on.\n */\nexport const EXPAND_REFERENCE_HEIGHT = 240;\n\n/**\n * Duration envelope at the default speed. A tiny region never blinks past\n * faster than the min; a full-page region never drags longer than the max.\n * Expressed at `EXPAND_DEFAULT_SPEED` and applied as scale-factor clamps, so a\n * theme that slows `transitionSpeed` down widens its envelope proportionally\n * instead of being capped back to the stock feel.\n */\nexport const EXPAND_MIN_DURATION = 0.15;\nexport const EXPAND_MAX_DURATION = 0.6;\n\nconst MIN_SCALE = EXPAND_MIN_DURATION / EXPAND_DEFAULT_SPEED;\nconst MAX_SCALE = EXPAND_MAX_DURATION / EXPAND_DEFAULT_SPEED;\n\n/**\n * Size-aware reveal duration: `speed × √(height ÷ reference)`, clamped.\n *\n * A fixed duration reads as sluggish on a short region and rushed on a tall\n * one; scaling by the square root of height keeps perceived speed steady —\n * bigger reveals get more time, but sublinearly.\n */\nexport const expandDuration = (\n contentHeight: number,\n speed: number = EXPAND_DEFAULT_SPEED,\n): number => {\n const height = Number.isFinite(contentHeight) ? Math.max(contentHeight, 0) : 0;\n const scale = Math.sqrt(height / EXPAND_REFERENCE_HEIGHT);\n return speed * Math.min(Math.max(scale, MIN_SCALE), MAX_SCALE);\n};\n","import type { StyleExpression } from '../style/style.types';\n\nexport type PercentageString = `${number}%`;\nexport type KeyframesExpression = Record<PercentageString, StyleExpression>;\n\nexport const fadeIn: KeyframesExpression = {\n '0%': {\n opacity: 0,\n },\n '100%': {\n opacity: 1,\n },\n};\n\nexport const fadeOut: KeyframesExpression = {\n '0%': {\n opacity: 1,\n },\n '100%': {\n opacity: 0,\n },\n};\n\nexport const expandFadeIn = {\n '0%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n '100%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n};\n\nexport const collapseFadeOut = {\n '0%': {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n '100%': {\n gridTemplateRows: '0fr',\n opacity: 0,\n },\n};\n","import { HSL, HSLA, RGB } from './color.model';\n\nexport function HSLAToString({ hue, saturation, lightness, alpha = 1 }: HSLA): string {\n return `hsla(${hue}, ${saturation}%, ${lightness}%, ${alpha})`;\n}\n\nexport function RGBToString({ red, green, blue }: RGB): string {\n return `rgb(${red}, ${green}, ${blue})`;\n}\n\nexport const RGBToHSL = ({ red, green, blue }: RGB): HSL => {\n red /= 255;\n green /= 255;\n blue /= 255;\n const l = Math.max(red, green, blue);\n const s = l - Math.min(red, green, blue);\n const h = s\n ? l === red\n ? (green - blue) / s\n : l === green\n ? 2 + (blue - red) / s\n : 4 + (red - green) / s\n : 0;\n return {\n hue: 60 * h < 0 ? 60 * h + 360 : 60 * h,\n saturation: 100 * (s ? (l <= 0.5 ? s / (2 * l - s) : s / (2 - (2 * l - s))) : 0),\n lightness: (100 * (2 * l - s)) / 2,\n };\n};\n\n// ── Conversions & contrast (used by the palette factory) ────────────────────\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst toHex2 = (value: number): string => clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0');\n\nexport const rgbToHex = ({ red, green, blue }: RGB): string =>\n `#${toHex2(red)}${toHex2(green)}${toHex2(blue)}`.toUpperCase();\n\nexport const hexToRgb = (hex: string): RGB => {\n let h = hex.replace('#', '').trim();\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n const int = parseInt(h, 16);\n return { red: (int >> 16) & 255, green: (int >> 8) & 255, blue: int & 255 };\n};\n\nexport const HSLToRGB = ({ hue = 0, saturation = 0, lightness = 0 }: HSL): RGB => {\n const s = clamp(saturation, 0, 100) / 100;\n const l = clamp(lightness, 0, 100) / 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = (((hue % 360) + 360) % 360) / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n const [r1, g1, b1] =\n hp < 1\n ? [c, x, 0]\n : hp < 2\n ? [x, c, 0]\n : hp < 3\n ? [0, c, x]\n : hp < 4\n ? [0, x, c]\n : hp < 5\n ? [x, 0, c]\n : [c, 0, x];\n const m = l - c / 2;\n return {\n red: (r1 + m) * 255,\n green: (g1 + m) * 255,\n blue: (b1 + m) * 255,\n };\n};\n\n/** Build an sRGB hex string straight from HSL channel values. */\nexport const HSLToHex = (hsl: HSL): string => rgbToHex(HSLToRGB(hsl));\n\nexport const hexToHSL = (hex: string): HSL => RGBToHSL(hexToRgb(hex));\n\n/** WCAG relative luminance of an sRGB color (0 = black, 1 = white). */\nexport const relativeLuminance = ({ red, green, blue }: RGB): number => {\n const channel = (value: number): number => {\n const v = value / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n return 0.2126 * channel(red) + 0.7152 * channel(green) + 0.0722 * channel(blue);\n};\n\n/** WCAG contrast ratio between two colors (1:1 – 21:1). Accepts RGB or hex. */\nexport const contrastRatio = (a: RGB | string, b: RGB | string): number => {\n const la = relativeLuminance(typeof a === 'string' ? hexToRgb(a) : a);\n const lb = relativeLuminance(typeof b === 'string' ? hexToRgb(b) : b);\n const [hi, lo] = la > lb ? [la, lb] : [lb, la];\n return (hi + 0.05) / (lo + 0.05);\n};\n\n// Future Methods - https://codepen.io/jkantner/pen/VVEMRK\n","import type { ColorScheme } from './color.types';\n\nexport const cycle = (angle: number): number => {\n if (angle > 360) return angle - 360;\n if (angle < 0) return angle + 360;\n return angle;\n};\n\nexport const getAnalogousHues = (hue: number): number[] => [cycle(hue + 30), cycle(hue + 60)];\nexport const getComplimentaryHue = (hue: number): number => cycle(hue + 180);\nexport const getTriadicHues = (hue: number): number[] => [cycle(hue + 120), cycle(hue - 120)];\nexport const getSplitComplimentaryHues = (hue: number): number[] => [\n cycle(hue + 150),\n cycle(hue - 150),\n];\n\nexport interface RoleHueSet {\n primary: number;\n secondary: number;\n tertiary: number;\n}\n\n/**\n * Derive the primary/secondary/tertiary hues from a seed hue using the color\n * wheel relationships in {@link ColorScheme}. Pure angle math — works in any\n * hue space (HSL historically, OKLCH in the generation engine).\n */\nexport const schemeHues = (hue: number, scheme: ColorScheme): RoleHueSet => {\n switch (scheme) {\n case 'monochromatic':\n return { primary: hue, secondary: hue, tertiary: hue };\n case 'analogous': {\n const [a, b] = getAnalogousHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'complimentary': {\n const [a] = getAnalogousHues(hue);\n return { primary: hue, secondary: getComplimentaryHue(hue), tertiary: a };\n }\n case 'splitComplimentary': {\n const [a, b] = getSplitComplimentaryHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n case 'triadic': {\n const [a, b] = getTriadicHues(hue);\n return { primary: hue, secondary: a, tertiary: b };\n }\n }\n};\n","import type { RGB } from '../color/color.model';\nimport { hexToRgb, rgbToHex } from '../color/color.helper';\n\n/**\n * A color in OKLCH: perceptual lightness `l` (0–1), chroma `c` (0 = grey,\n * ~0.37 = max sRGB vividness) and hue angle `h` in degrees (0–360).\n *\n * Unlike HSL lightness, OKLCH `l` is perceptually uniform — a blue and a\n * yellow at the same `l` *look* equally light — which is what makes derived\n * tonal scales consistent across hues.\n */\nexport interface Oklch {\n l: number;\n c: number;\n h: number;\n}\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n// sRGB transfer function and its inverse (gamma ↔ linear light).\nconst srgbToLinear = (channel: number): number =>\n channel <= 0.04045 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n\nconst linearToSrgb = (channel: number): number =>\n channel <= 0.0031308 ? 12.92 * channel : 1.055 * Math.pow(channel, 1 / 2.4) - 0.055;\n\ninterface LinearRGB {\n r: number;\n g: number;\n b: number;\n}\n\n// OKLab ↔ linear sRGB matrices (Björn Ottosson's reference constants).\nconst linearRgbToOklab = ({ r, g, b }: LinearRGB): { l: number; a: number; b: number } => {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n};\n\nconst oklabToLinearRgb = (l: number, a: number, b: number): LinearRGB => {\n const l_ = Math.pow(l + 0.3963377774 * a + 0.2158037573 * b, 3);\n const m_ = Math.pow(l - 0.1055613458 * a - 0.0638541728 * b, 3);\n const s_ = Math.pow(l - 0.0894841775 * a - 1.291485548 * b, 3);\n return {\n r: 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n g: -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n b: -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n };\n};\n\nconst oklchToLinearRgb = ({ l, c, h }: Oklch): LinearRGB => {\n const rad = (h * Math.PI) / 180;\n return oklabToLinearRgb(l, c * Math.cos(rad), c * Math.sin(rad));\n};\n\nconst GAMUT_EPSILON = 1e-4;\n\nconst inSrgbGamut = ({ r, g, b }: LinearRGB): boolean =>\n r >= -GAMUT_EPSILON &&\n r <= 1 + GAMUT_EPSILON &&\n g >= -GAMUT_EPSILON &&\n g <= 1 + GAMUT_EPSILON &&\n b >= -GAMUT_EPSILON &&\n b <= 1 + GAMUT_EPSILON;\n\n/** Parse a hex color (`#RGB` or `#RRGGBB`) into OKLCH. */\nexport const hexToOklch = (hex: string): Oklch => {\n const { red, green, blue } = hexToRgb(hex);\n const { l, a, b } = linearRgbToOklab({\n r: srgbToLinear(red / 255),\n g: srgbToLinear(green / 255),\n b: srgbToLinear(blue / 255),\n });\n const c = Math.hypot(a, b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) * 180) / Math.PI;\n return { l, c, h: h < 0 ? h + 360 : h };\n};\n\n/**\n * Render OKLCH as an sRGB hex string. Out-of-gamut colors are mapped back\n * into sRGB by reducing chroma only — lightness and hue are preserved, so\n * vivid seeds desaturate gracefully instead of shifting hue or clipping.\n */\nexport const oklchToHex = (color: Oklch): string => {\n const target: Oklch = { l: clamp(color.l, 0, 1), c: Math.max(color.c, 0), h: color.h };\n let rgb = oklchToLinearRgb(target);\n if (!inSrgbGamut(rgb)) {\n let low = 0;\n let high = target.c;\n for (let i = 0; i < 24; i++) {\n const mid = (low + high) / 2;\n if (inSrgbGamut(oklchToLinearRgb({ ...target, c: mid }))) low = mid;\n else high = mid;\n }\n rgb = oklchToLinearRgb({ ...target, c: low });\n }\n // Scale *after* the transfer function: 255 × transfer(channel), rounded once\n // inside rgbToHex. Rounding before scaling collapses every channel to 0/1.\n return rgbToHex(toSrgb255(rgb));\n};\n\nconst toSrgb255 = ({ r, g, b }: LinearRGB): RGB => ({\n red: 255 * linearToSrgb(clamp(r, 0, 1)),\n green: 255 * linearToSrgb(clamp(g, 0, 1)),\n blue: 255 * linearToSrgb(clamp(b, 0, 1)),\n});\n","import type { Colors } from '../theme/theme.model';\nimport type { BrandRole, PaletteConfig } from '../color/color.factory';\nimport type { ColorCategory } from '../color/color.types';\nimport { contrastRatio, hexToRgb, relativeLuminance } from '../color/color.helper';\nimport { schemeHues } from '../color/color.utils';\nimport { hexToOklch, oklchToHex, type Oklch } from './oklch.helper';\nimport type { ContrastCheck } from './generation.types';\n\nexport interface GenerateColorsConfig extends PaletteConfig {\n /**\n * Soft brand anchors, per role: the palette starts from these exact colors\n * but the WCAG guard-rail may adjust lightness (never hue) to reach AA.\n * Contrast-safe counterpart to the hard `brand` pins, which are emitted\n * verbatim even when they fail.\n */\n targets?: Partial<Record<BrandRole, string>>;\n /** Sink for the contrast checks performed while building this palette. */\n checks?: ContrastCheck[];\n}\n\n// ── Tonal architecture ──────────────────────────────────────────────────────\n// Every token maps onto one of these OKLCH lightness slots. Because OKLCH L\n// is perceptually uniform, a slot renders equally light for every hue — the\n// property HSL lacked, and the root fix for muddy derived palettes.\nconst toneMap = (dark: boolean) =>\n dark\n ? {\n accent: 0.78,\n container: 0.42,\n roleSurface: 0.26,\n background: 0.18,\n surface: 0.21,\n surfaceVariant: 0.32,\n outline: 0.66,\n onSurface: 0.93,\n mutedText: 0.76,\n inverse: 0.93,\n onInverse: 0.25,\n onDeep: 0.2,\n onLight: 0.985,\n grey: 0.72,\n disabledContainer: 0.3,\n }\n : {\n accent: 0.55,\n container: 0.9,\n roleSurface: 0.97,\n background: 0.995,\n surface: 0.985,\n surfaceVariant: 0.94,\n outline: 0.6,\n onSurface: 0.25,\n mutedText: 0.48,\n inverse: 0.3,\n onInverse: 0.97,\n onDeep: 0.24,\n onLight: 0.985,\n grey: 0.5,\n disabledContainer: 0.96,\n };\n\n// OKLCH chroma per tonal category — the perceptual successor to the HSL\n// `CategorySaturation` table. Values are accent-level chroma; container and\n// surface chroma are derived fractions.\nexport const CategoryChroma: Record<ColorCategory, number> = {\n jewel: 0.17,\n pastel: 0.055,\n earth: 0.08,\n neutral: 0.03,\n florescent: 0.26,\n shades: 0,\n};\n\n/** Dark-mode accents cap chroma so they don't vibrate on dark surfaces. */\nconst DARK_ACCENT_CHROMA_CAP = 0.16;\n\n// Semantic feedback roles in OKLCH: hue + chroma per role. Chroma differs per\n// role because sRGB gamut room differs by hue at the AA-dark lightness light\n// mode forces on ink tokens: red holds 0.20; amber sits at 55° (not 70° —\n// dark yellow reads brown, dark orange stays lively) with 0.18; green 0.16.\nconst SemanticColors = {\n error: { hue: 27, chroma: 0.2 },\n warn: { hue: 55, chroma: 0.18 },\n success: { hue: 152, chroma: 0.16 },\n} as const;\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\n/**\n * Generate a complete {@link Colors} token set in OKLCH. Same contract as\n * `generatePalette` (which delegates here), plus soft brand targets and a\n * contrast-check sink for {@link ContrastReport} consumers.\n */\nexport const generateColors = (config: GenerateColorsConfig): Colors => {\n const {\n seed,\n scheme,\n category,\n mode = 'light',\n accentSaturationFloor = 18,\n brand = {},\n targets = {},\n checks,\n } = config;\n const dark = mode === 'dark';\n const t = toneMap(dark);\n\n // The primary anchor (hard pin > soft target > seed) sets the neutral hue.\n const anchor = hexToOklch(brand.primary ?? targets.primary ?? seed);\n const hues = schemeHues(anchor.h, scheme);\n\n // Chroma model. The floor keeps the brand hue perceptible even for the\n // near-grey `neutral` category (0–100 legacy scale → OKLCH chroma).\n const chromaFloor = (accentSaturationFloor / 100) * 0.28;\n let accentC = Math.max(CategoryChroma[category], chromaFloor);\n if (dark) accentC = Math.min(accentC, DARK_ACCENT_CHROMA_CAP);\n const containerC = Math.max(CategoryChroma[category] * 0.45, accentC * 0.35);\n const surfaceC = Math.min(CategoryChroma[category], 0.012);\n\n const tone = (hue: number, c: number, l: number): string => oklchToHex({ l, c, h: hue });\n\n /**\n * The WCAG guard-rail: walk the foreground's OKLCH lightness away from the\n * background until the pair meets `target` (≤ 50 steps). Hue is never\n * touched; chroma only shrinks as a last resort when L runs out of room.\n */\n const ensureContrast = (fg: Oklch, bg: string, target: number): Oklch => {\n const out: Oklch = { ...fg };\n let hex = oklchToHex(out);\n if (contrastRatio(hex, bg) >= target) return out;\n // Pick the direction that can actually reach the target: each side has a\n // hard ceiling — black tops out at (Ybg + 0.05) / 0.05, white at\n // 1.05 / (Ybg + 0.05) — so staying on the foreground's current side is\n // only right when that side has enough headroom.\n const bgY = relativeLuminance(hexToRgb(bg));\n const darkCeiling = (bgY + 0.05) / 0.05;\n const lightCeiling = 1.05 / (bgY + 0.05);\n let lighten = relativeLuminance(hexToRgb(hex)) >= bgY;\n if (lighten && lightCeiling < target && darkCeiling >= target) lighten = false;\n if (!lighten && darkCeiling < target && lightCeiling >= target) lighten = true;\n const step = lighten ? 0.015 : -0.015;\n for (let i = 0; i < 50 && contrastRatio(hex, bg) < target; i++) {\n if ((step > 0 && out.l < 0.995) || (step < 0 && out.l > 0.02)) {\n out.l = clamp(out.l + step, 0, 1);\n } else {\n out.c = Math.max(0, out.c - 0.02);\n }\n hex = oklchToHex(out);\n }\n return out;\n };\n\n /** Guard-railed token: adjust toward `target` contrast, then record the pair. */\n const contrasted = (fg: Oklch, bgHex: string, target: number): string =>\n oklchToHex(ensureContrast(fg, bgHex, target));\n\n const record = (\n foreground: string,\n background: string,\n foregroundColor: string,\n backgroundColor: string,\n required: number\n ): void => {\n if (!checks) return;\n const ratio = contrastRatio(foregroundColor, backgroundColor);\n checks.push({\n mode,\n foreground,\n background,\n foregroundColor,\n backgroundColor,\n ratio: Math.round(ratio * 100) / 100,\n required,\n pass: ratio >= required,\n level: ratio < required ? 'fail' : ratio >= 7 ? 'AAA' : 'AA',\n });\n };\n\n const background = tone(anchor.h, surfaceC, t.background);\n const surface = tone(anchor.h, surfaceC, t.surface);\n const surfaceVariant = tone(anchor.h, surfaceC, t.surfaceVariant);\n\n // Legible foreground for a given ground: whichever of the tonal near-black /\n // near-white starts closer to AA, then guard-railed the rest of the way.\n const onColor = (hue: number, bg: string, c: number): string => {\n const deep: Oklch = { l: t.onDeep, c: Math.min(c, 0.05), h: hue };\n const light: Oklch = { l: t.onLight, c: Math.min(c, 0.02), h: hue };\n const pick =\n contrastRatio(oklchToHex(deep), bg) >= contrastRatio(oklchToHex(light), bg) ? deep : light;\n return contrasted(pick, bg, 4.5);\n };\n\n // Dark-mode counterpart of a *hard-pinned* brand color: lift lightness only\n // (hue and chroma preserved) until it clears 3:1 on the dark ground.\n const adaptPinForDark = (hex: string): string => {\n const pin = hexToOklch(hex);\n pin.l = Math.max(pin.l, 0.6);\n return oklchToHex(ensureContrast(pin, background, 3));\n };\n\n /**\n * Resolve a role's base color: hard pins are verbatim in light mode and\n * lightness-lifted in dark; soft targets and generated tones are pulled to\n * ≥ 4.5:1 as standalone ink on `background` and `surface` (§3.6).\n */\n const baseFor = (name: BrandRole, hue: number, c: number): string => {\n const pinned = brand[name];\n if (pinned) return dark ? adaptPinForDark(pinned) : pinned;\n const target = targets[name];\n let base: Oklch;\n if (target) {\n // Soft targets keep their own chroma — brand fidelity beats category.\n // Callers that want a vibe cap applied clamp the target before passing\n // it in (see `generateThemes`). Dark mode still decouples chroma.\n base = hexToOklch(target);\n if (dark) {\n base.c = Math.min(base.c, DARK_ACCENT_CHROMA_CAP);\n base.l = Math.max(base.l, t.accent - 0.08);\n }\n } else {\n base = { l: t.accent, c, h: hue };\n }\n return oklchToHex(ensureContrast(ensureContrast(base, background, 4.5), surface, 4.5));\n };\n\n const disabled = dark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.12)';\n const onDisabled = dark ? 'rgba(255,255,255,0.38)' : 'rgba(0,0,0,0.38)';\n\n // An accent role's base drives its container/surface/on satellites. Every\n // content satellite passes through the guard-rail and is recorded.\n const role = (name: string, base: string, cC: number = containerC) => {\n const { h, c } = hexToOklch(base);\n const container = tone(h, cC, t.container);\n const roleSurface = tone(h, surfaceC, t.roleSurface);\n const onBase = onColor(h, base, c);\n const onContainer = onColor(h, container, c);\n const onContainerVariant = contrasted({ l: t.mutedText, c: Math.min(cC, 0.06), h }, container, 4.5);\n const border = ensureContrast(ensureContrast(hexToOklch(base), container, 3), surface, 3);\n const borderHex = oklchToHex(border);\n const onRoleSurface = onColor(h, roleSurface, surfaceC);\n const onRoleSurfaceVariant = contrasted(hexToOklch(base), roleSurface, 4.5);\n\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(`on-${name}-container-variant`, `${name}-container`, onContainerVariant, container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, borderHex, container, 3);\n record(`on-${name}-container-border`, 'surface', borderHex, surface, 3);\n record(`on-${name}-surface`, `${name}-surface`, onRoleSurface, roleSurface, 4.5);\n record(`on-${name}-surface-variant`, `${name}-surface`, onRoleSurfaceVariant, roleSurface, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n\n return {\n [name]: base,\n [`on-${name}`]: onBase,\n [`${name}-container`]: container,\n [`on-${name}-container`]: onContainer,\n [`on-${name}-container-variant`]: onContainerVariant,\n [`on-${name}-container-border`]: borderHex,\n [`${name}-surface`]: roleSurface,\n [`on-${name}-surface`]: onRoleSurface,\n [`on-${name}-surface-variant`]: onRoleSurfaceVariant,\n };\n };\n\n const primaryBase = baseFor('primary', hues.primary, accentC);\n const secondaryBase = baseFor('secondary', hues.secondary, accentC);\n const tertiaryBase = baseFor('tertiary', hues.tertiary, accentC);\n\n // Quaternary is a neutral, near-grey accent tied to the brand hue.\n const quaternaryGrey = brand.quaternary\n ? dark\n ? adaptPinForDark(brand.quaternary)\n : brand.quaternary\n : oklchToHex(ensureContrast({ l: t.grey, c: surfaceC, h: anchor.h }, surface, 3));\n const quaternarySurface = tone(anchor.h, surfaceC, t.roleSurface);\n const onQuaternary = onColor(anchor.h, quaternaryGrey, surfaceC);\n const onQuaternarySurface = onColor(anchor.h, quaternarySurface, surfaceC);\n const onQuaternarySurfaceVariant = contrasted(hexToOklch(primaryBase), quaternarySurface, 4.5);\n const onQuaternaryContainerVariant = contrasted(\n { l: t.mutedText, c: Math.min(containerC, 0.06), h: anchor.h },\n quaternarySurface,\n 4.5\n );\n record('on-quaternary', 'quaternary', onQuaternary, quaternaryGrey, 4.5);\n record('on-quaternary-surface', 'quaternary-surface', onQuaternarySurface, quaternarySurface, 4.5);\n record(\n 'on-quaternary-surface-variant',\n 'quaternary-surface',\n onQuaternarySurfaceVariant,\n quaternarySurface,\n 4.5\n );\n\n // Semantic feedback roles keep colorful, recognizable hues in every category.\n const semantic = (name: 'error' | 'warn' | 'success') => {\n const { hue, chroma } = SemanticColors[name];\n const base = baseFor(name, hue, dark ? Math.min(chroma, DARK_ACCENT_CHROMA_CAP) : chroma);\n const { h } = hexToOklch(base);\n const container = tone(h, containerC + 0.04, t.container);\n const onBase = onColor(h, base, chroma);\n const onContainer = onColor(h, container, chroma);\n record(`on-${name}`, name, onBase, base, 4.5);\n record(`on-${name}-container`, `${name}-container`, onContainer, container, 4.5);\n record(name, 'background', base, background, 4.5);\n record(name, 'surface', base, surface, 4.5);\n return { base, container, onBase, onContainer, h };\n };\n\n const error = semantic('error');\n const warn = semantic('warn');\n const success = semantic('success');\n\n const semanticExtras = (name: 'warn' | 'success', s: ReturnType<typeof semantic>) => {\n const variant = contrasted({ l: t.mutedText, c: 0.06, h: s.h }, s.container, 4.5);\n const border = oklchToHex(\n ensureContrast(ensureContrast(hexToOklch(s.base), s.container, 3), surface, 3)\n );\n record(`on-${name}-container-variant`, `${name}-container`, variant, s.container, 4.5);\n record(`on-${name}-container-border`, `${name}-container`, border, s.container, 3);\n return { variant, border };\n };\n const warnExtras = semanticExtras('warn', warn);\n const successExtras = semanticExtras('success', success);\n\n // Neutral text tokens.\n const onBackground = tone(anchor.h, surfaceC, t.onSurface);\n const onBackgroundVariant = contrasted({ l: t.mutedText, c: surfaceC, h: anchor.h }, background, 4.5);\n const onSurface = tone(anchor.h, surfaceC, t.onSurface);\n const onSurfaceVariant = contrasted(\n { l: dark ? t.mutedText : t.mutedText - 0.14, c: surfaceC, h: anchor.h },\n surfaceVariant,\n 4.5\n );\n record('on-background', 'background', onBackground, background, 4.5);\n record('on-background-variant', 'background', onBackgroundVariant, background, 4.5);\n record('on-surface', 'surface', onSurface, surface, 4.5);\n record('on-surface-variant', 'surface-variant', onSurfaceVariant, surfaceVariant, 4.5);\n\n // Inverse surfaces flip the ground; their accents must stay legible there.\n const inverseSurface = tone(anchor.h, surfaceC, t.inverse);\n const onInverse = tone(anchor.h, surfaceC, t.onInverse);\n const inversePrimary = contrasted(hexToOklch(primaryBase), inverseSurface, 4.5);\n record('on-inverse-surface', 'inverse-surface', onInverse, inverseSurface, 4.5);\n record('on-inverse-surface-primary', 'inverse-surface', inversePrimary, inverseSurface, 4.5);\n record('on-inverse-container', 'inverse-container', onInverse, inverseSurface, 4.5);\n\n const outline = oklchToHex(\n ensureContrast(\n ensureContrast({ l: t.outline, c: Math.min(surfaceC, 0.02), h: hues.primary }, surface, 3),\n background,\n 3\n )\n );\n record('outline', 'surface', outline, surface, 3);\n record('outline', 'background', outline, background, 3);\n\n return {\n ...role('primary', primaryBase),\n ...role('secondary', secondaryBase),\n ...role('tertiary', tertiaryBase),\n\n quaternary: quaternaryGrey,\n 'on-quaternary': onQuaternary,\n 'quaternary-surface': quaternarySurface,\n 'on-quaternary-surface': onQuaternarySurface,\n 'on-quaternary-surface-variant': onQuaternarySurfaceVariant,\n 'on-quaternary-container-variant': onQuaternaryContainerVariant,\n 'on-quaternary-container-border': quaternaryGrey,\n\n // Semantic\n error: error.base,\n 'on-error': error.onBase,\n 'error-container': error.container,\n 'on-error-container': error.onContainer,\n\n warn: warn.base,\n 'on-warn': warn.onBase,\n 'warn-container': warn.container,\n 'on-warn-container': warn.onContainer,\n 'on-warn-container-variant': warnExtras.variant,\n 'on-warn-container-border': warnExtras.border,\n\n success: success.base,\n 'on-success': success.onBase,\n 'success-container': success.container,\n 'on-success-container': success.onContainer,\n 'on-success-container-variant': successExtras.variant,\n 'on-success-container-border': successExtras.border,\n\n // Neutral surfaces\n background,\n 'on-background': onBackground,\n 'on-background-variant': onBackgroundVariant,\n surface,\n 'on-surface': onSurface,\n 'surface-variant': surfaceVariant,\n 'on-surface-variant': onSurfaceVariant,\n\n // Inverse\n 'inverse-surface': inverseSurface,\n 'on-inverse-surface': onInverse,\n 'on-inverse-surface-primary': inversePrimary,\n 'on-inverse-surface-variant': inversePrimary,\n 'inverse-container': inverseSurface,\n 'on-inverse-container': onInverse,\n\n // Utility\n outline,\n shadow: '#000000',\n scrim: '#000000',\n 'surface-tint': primaryBase,\n transparent: 'rgba(0,0,0,0)',\n ghost: 'rgba(0,0,0,0)',\n\n // Disabled (deliberate alpha overlays — excluded from the contrast report)\n disabled,\n 'on-disabled': onDisabled,\n 'disabled-container': tone(hues.primary, surfaceC, t.disabledContainer),\n 'on-disabled-container': onDisabled,\n 'disabled-surface': disabled,\n 'on-disabled-surface': dark ? 'rgba(255,255,255,0.5)' : 'rgba(0,0,0,0.5)',\n 'on-disabled-surface-variant': dark ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.4)',\n };\n};\n","import type { Colors } from '../theme';\nimport { generateColors, type GenerateColorsConfig } from '../generation/palette.factory';\nimport type { ColorCategory, ColorScheme } from './color.types';\n\n/** Roles whose base color can be pinned to an exact brand hex. */\nexport type BrandRole =\n | 'primary'\n | 'secondary'\n | 'tertiary'\n | 'quaternary'\n | 'error'\n | 'warn'\n | 'success';\n\nexport interface PaletteConfig {\n /**\n * Seed brand color as a hex string, e.g. '#4F46E5'. Anchors the neutral\n * hue and every role you don't pin via `brand`. When `brand.primary` is\n * set, that color anchors instead.\n */\n seed: string;\n /** How secondary/tertiary hues relate to the anchor, for unpinned roles. */\n scheme: ColorScheme;\n /** Saturation / tonal character of the generated (unpinned) colors. */\n category: ColorCategory;\n /** Light or dark rendering of the same palette. Defaults to 'light'. */\n mode?: 'light' | 'dark';\n /**\n * Minimum accent saturation (0–100 scale) so the brand hue stays perceptible\n * even for the `neutral` category (which is otherwise near-grey). Set to 0\n * to honor the category saturation exactly.\n */\n accentSaturationFloor?: number;\n /**\n * Exact brand colors, pinned per role. A pinned color is emitted verbatim as\n * that role's base token in **light** mode (\"cannot shift\"); in **dark** mode\n * it is lifted in lightness only — hue and chroma preserved — so it stays\n * legible on a dark ground. Its on/container/surface satellites are derived\n * from it. Unpinned roles are generated from the seed + scheme as usual, so an\n * arbitrary brand pair (e.g. forest green + ochre) can be reproduced exactly.\n */\n brand?: Partial<Record<BrandRole, string>>;\n}\n\n/**\n * Generate a complete {@link Colors} token set from a single seed color, a\n * {@link ColorScheme} and a {@link ColorCategory}. Produces a light or dark\n * variant of the same palette; `on-*` colors are driven to WCAG AA contrast\n * so text stays legible for any seed.\n *\n * Delegates to the OKLCH engine in `concepts/generation` — all lightness and\n * chroma math is perceptual, and every derived pair passes through the WCAG\n * guard-rail. Accepts the engine's extended config, so callers may also pass\n * soft `targets` (brand-faithful but guard-railed) and a `checks` sink. Use\n * `generateThemes()` for the light+dark pair plus a {@link ContrastReport}.\n */\nexport const generatePalette = (config: GenerateColorsConfig): Colors => generateColors(config);\n","export type ZIndexableElements =\n | 'dropdown'\n | 'sticky'\n | 'fixed'\n | 'backdrop'\n | 'dialog'\n | 'popover'\n | 'tooltip'\n | 'overlay';\n\nexport const Z_INDEX: Record<ZIndexableElements, number> = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n backdrop: 1040,\n dialog: 1050,\n popover: 1060,\n tooltip: 1070,\n overlay: 1080,\n};\n","import type { Colors, Radii, Spacing } from '../theme/theme.model';\n\n/** A single W3C DTCG design token. */\nexport interface DtcgToken {\n $value: string;\n $type: 'color' | 'dimension';\n}\n\n/** DTCG-format token document (Style Dictionary compatible), per PRD §6. */\nexport interface DtcgTokens {\n color: Record<string, DtcgToken>;\n size: {\n radius: Record<string, DtcgToken>;\n spacing: Record<string, DtcgToken>;\n };\n}\n\nconst dimensionEntries = (record: Radii | Spacing | undefined): Record<string, DtcgToken> =>\n Object.fromEntries(\n Object.entries(record ?? {})\n .filter(([, value]) => value !== undefined && value !== 'none')\n .map(([key, value]) => [key, { $value: String(value), $type: 'dimension' as const }])\n );\n\n/**\n * Render one theme mode's tokens as W3C DTCG JSON for external pipelines\n * (Style Dictionary etc.). Token names are exactly Uni's `ColorToken` strings —\n * one vocabulary everywhere. The native `UniTheme` object remains the primary,\n * lossless output; this is the interop layer.\n */\nexport const emitDtcgTokens = (input: {\n colors: Colors;\n radii?: Radii;\n spacing?: Spacing;\n}): DtcgTokens => ({\n color: Object.fromEntries(\n Object.entries(input.colors)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, { $value: value as string, $type: 'color' as const }])\n ),\n size: {\n radius: dimensionEntries(input.radii),\n spacing: dimensionEntries(input.spacing),\n },\n});\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { hexToRgb } from '../color/color.helper';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\n\nconst rgba = (hex: string, alpha: number): string => {\n const { red, green, blue } = hexToRgb(hex);\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n};\n\n/**\n * Brand-tinted, theme-scoped elevation shadows (PRD §3.5.C).\n *\n * Light mode replaces the dead-neutral black stacks with a shadow ink pulled\n * toward the brand hue — dark and low-chroma enough to read as shadow, tinted\n * enough to kill the grey \"mud\" where shadows meet brand surfaces. Dark mode\n * goes near-zero: elevation is carried by the surface lightness steps, with\n * only a faint veil kept on floating overlays (menus/dialogs genuinely need\n * separation) and the `warn` glow tinted by the theme's own error color.\n */\nexport const generateShadows = (colors: Colors, mode: 'light' | 'dark' = 'light'): Shadows => {\n const error = colors['error'] ?? '#CC2827';\n\n if (mode === 'dark') {\n return {\n raised: 'none',\n menu: `0px 4px 12px ${rgba('#000000', 0.45)}`,\n dialog: `0px 8px 28px ${rgba('#000000', 0.55)}`,\n warn: `0 0 5px ${rgba(error, 0.55)}, inset 0 0 5px ${rgba(error, 0.35)}`,\n };\n }\n\n // Shadow ink: near-black carrying ~6–8% of the brand hue's chroma.\n const { h } = hexToOklch(colors['primary'] ?? '#000000');\n const ink = oklchToHex({ l: 0.22, c: 0.035, h });\n return {\n raised: `${rgba(ink, 0.2)} 0px 2px 1px -1px, ${rgba(ink, 0.14)} 0px 1px 1px 0px, ${rgba(ink, 0.12)} 0px 1px 3px 0px`,\n menu: `${rgba(ink, 0.2)} 0px 3px 3px -2px, ${rgba(ink, 0.14)} 0px 3px 4px 0px, ${rgba(ink, 0.12)} 0px 1px 8px 0px`,\n dialog: `${rgba(ink, 0.2)} 0px 3px 5px -1px, ${rgba(ink, 0.14)} 0px 6px 10px 0px, ${rgba(ink, 0.12)} 0px 1px 18px 0px`,\n warn: `0 0 5px ${rgba(error, 0.5)}, inset 0 0 5px ${rgba(error, 0.3)}`,\n };\n};\n","import type { Icons } from '../theme/theme.model';\n\n/**\n * Default icon primitives shipped with every theme. Each icon is an inline\n * SVG data URI rendered as a CSS mask over `currentColor`, so icons recolor\n * with the theme automatically. `createTheme` merges a theme's own `icons`\n * over this set — add or override under any name; components render them by\n * token via `uni-icon`, never by inlining SVG.\n *\n * The set is Material Symbols Outlined at weight 300, normalized to a\n * single `0 -960 960 960` grid so every glyph shares one optical weight.\n *\n * Generated by scripts/generate-icons.mjs (pnpm icons:generate). Do not edit\n * by hand — add or change icons in that script's manifest and regenerate.\n */\nexport const BaseIcons = {\n // Navigation & layout\n menu: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-254.62v-59.99h680v59.99H140ZM140-450v-60h680v60H140Zm0-195.39v-59.99h680v59.99H140Z'/%3e%3c/svg%3e\",\n chevronUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-541.85-184 184L253.85-400 480-626.15 706.15-400 664-357.85l-184-184Z'/%3e%3c/svg%3e\",\n chevronDown:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-357.85 253.85-584 296-626.15l184 184 184-184L706.15-584 480-357.85Z'/%3e%3c/svg%3e\",\n chevronLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M560-253.85 333.85-480 560-706.15 602.15-664l-184 184 184 184L560-253.85Z'/%3e%3c/svg%3e\",\n chevronRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m517.85-480-184-184L376-706.15 602.15-480 376-253.85 333.85-296l184-184Z'/%3e%3c/svg%3e\",\n arrowLeft:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m294.92-450 227.85 227.85L480-180 180-480l300-300 42.77 42.15L294.92-510H780v60H294.92Z'/%3e%3c/svg%3e\",\n arrowRight:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M665.08-450H180v-60h485.08L437.23-737.85 480-780l300 300-300 300-42.77-42.15L665.08-450Z'/%3e%3c/svg%3e\",\n home: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M240-200h133.85v-237.69h212.3V-200H720v-360L480-740.77 240-560v360Zm-60 60v-450l300-225.77L780-590v450H526.15v-237.69h-92.3V-140H180Zm300-330.38Z'/%3e%3c/svg%3e\",\n building:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M130-136.92v-540h160v-160h380v320h160v380H530v-160H430v160H130Zm60-60h100v-100H190v100Zm0-160h100v-100H190v100Zm0-160h100v-100H190v100Zm160 160h100v-100H350v100Zm0-160h100v-100H350v100Zm0-160h100v-100H350v100Zm160 320h100v-100H510v100Zm0-160h100v-100H510v100Zm0-160h100v-100H510v100Zm160 480h100v-100H670v100Zm0-160h100v-100H670v100Z'/%3e%3c/svg%3e\",\n externalLink:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h252.3v60h-252.3q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-252.3h60v252.3Q820-182 799-161q-21 21-51.31 21H212.31Zm176.46-206.62-42.15-42.15L717.85-760H560v-60h260v260h-60v-157.85L388.77-346.62Z'/%3e%3c/svg%3e\",\n link: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M432.31-298.46H281.54q-75.34 0-128.44-53.1Q100-404.65 100-479.98q0-75.33 53.1-128.44 53.1-53.12 128.44-53.12h150.77v60H281.54q-50.39 0-85.96 35.58Q160-530.38 160-480q0 50.38 35.58 85.96 35.57 35.58 85.96 35.58h150.77v60ZM330-450v-60h300v60H330Zm197.69 151.54v-60h150.77q50.39 0 85.96-35.58Q800-429.62 800-480q0-50.38-35.58-85.96-35.57-35.58-85.96-35.58H527.69v-60h150.77q75.34 0 128.44 53.1Q860-555.35 860-480.02q0 75.33-53.1 128.44-53.1 53.12-128.44 53.12H527.69Z'/%3e%3c/svg%3e\",\n expand:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-140v-300h60v198.23L718.23-760H520v-60h300v300h-60v-198.23L241.77-200H440v60H140Z'/%3e%3c/svg%3e\",\n gridView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm0 380v-300h300v300H140Zm380-380v-300h300v300H520Zm0 380v-300h300v300H520ZM200-580h180v-180H200v180Zm380 0h180v-180H580v180Zm0 380h180v-180H580v180Zm-380 0h180v-180H200v180Zm380-380Zm0 200Zm-200 0Zm0-200Z'/%3e%3c/svg%3e\",\n listView:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M293.08-597.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08Zm0 147.69v-60H820v60H293.08ZM172.31-595.38q-13.73 0-23.02-9.4t-9.29-23.3q0-13.56 9.29-22.74 9.29-9.18 23.02-9.18t23.02 9.18q9.29 9.18 9.29 22.74 0 13.9-9.29 23.3t-23.02 9.4Zm0 147.3q-13.73 0-23.02-9.18Q140-466.43 140-480q0-14.31 9.29-23.5t23.02-9.19q13.73 0 23.02 9.19t9.29 23.5q0 13.57-9.29 22.74-9.29 9.18-23.02 9.18Zm0 148.08q-13.73 0-23.02-9.4T140-332.69q0-13.57 9.29-22.75t23.02-9.18q13.73 0 23.02 9.18t9.29 22.75q0 13.89-9.29 23.29-9.29 9.4-23.02 9.4Z'/%3e%3c/svg%3e\",\n\n // Actions & controls\n search:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M781.69-136.92 530.46-388.16q-30 24.77-69 38.77-39 14-80.69 14-102.46 0-173.54-71.07-71.07-71.08-71.07-173.54t71.07-173.54q71.08-71.07 173.54-71.07t173.54 71.07q71.07 71.08 71.07 173.54 0 42.85-14.38 81.85-14.39 39-38.39 67.84l251.23 251.23-42.15 42.16ZM380.77-395.38q77.31 0 130.96-53.66 53.66-53.65 53.66-130.96t-53.66-130.96q-53.65-53.66-130.96-53.66t-130.96 53.66Q196.15-657.31 196.15-580t53.66 130.96q53.65 53.66 130.96 53.66Z'/%3e%3c/svg%3e\",\n close:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M256-213.85 213.85-256l224-224-224-224L256-746.15l224 224 224-224L746.15-704l-224 224 224 224L704-213.85l-224-224-224 224Z'/%3e%3c/svg%3e\",\n plus: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-450H220v-60h230v-230h60v230h230v60H510v230h-60v-230Z'/%3e%3c/svg%3e\",\n minus:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M220-450v-60h520v60H220Z'/%3e%3c/svg%3e\",\n more: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-189.23q-24.75 0-42.37-17.63Q420-224.48 420-249.23q0-24.75 17.63-42.38 17.62-17.62 42.37-17.62 24.75 0 42.37 17.62Q540-273.98 540-249.23q0 24.75-17.63 42.37-17.62 17.63-42.37 17.63ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm0-230.77q-24.75 0-42.37-17.62Q420-686.02 420-710.77q0-24.75 17.63-42.37 17.62-17.63 42.37-17.63 24.75 0 42.37 17.63Q540-735.52 540-710.77q0 24.75-17.63 42.38-17.62 17.62-42.37 17.62Z'/%3e%3c/svg%3e\",\n moreHorizontal:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M249.23-420q-24.75 0-42.37-17.63-17.63-17.62-17.63-42.37 0-24.75 17.63-42.37Q224.48-540 249.23-540q24.75 0 42.38 17.63 17.62 17.62 17.62 42.37 0 24.75-17.62 42.37Q273.98-420 249.23-420ZM480-420q-24.75 0-42.37-17.63Q420-455.25 420-480q0-24.75 17.63-42.37Q455.25-540 480-540q24.75 0 42.37 17.63Q540-504.75 540-480q0 24.75-17.63 42.37Q504.75-420 480-420Zm230.77 0q-24.75 0-42.38-17.63-17.62-17.62-17.62-42.37 0-24.75 17.62-42.37Q686.02-540 710.77-540q24.75 0 42.37 17.63 17.63 17.62 17.63 42.37 0 24.75-17.63 42.37Q735.52-420 710.77-420Z'/%3e%3c/svg%3e\",\n delete:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M292.31-140q-29.92 0-51.12-21.19Q220-182.39 220-212.31V-720h-40v-60h180v-35.38h240V-780h180v60h-40v507.69Q740-182 719-161q-21 21-51.31 21H292.31ZM680-720H280v507.69q0 5.39 3.46 8.85t8.85 3.46h375.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-720ZM376.16-280h59.99v-360h-59.99v360Zm147.69 0h59.99v-360h-59.99v360ZM280-720v520-520Z'/%3e%3c/svg%3e\",\n edit: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M200-200h50.46l409.46-409.46-50.46-50.46L200-250.46V-200Zm-60 60v-135.38l527.62-527.39q9.07-8.24 20.03-12.73 10.97-4.5 23-4.5t23.3 4.27q11.28 4.27 19.97 13.58l48.85 49.46q9.31 8.69 13.27 20 3.96 11.31 3.96 22.62 0 12.07-4.12 23.03-4.12 10.97-13.11 20.04L275.38-140H140Zm620.38-570.15-50.23-50.23 50.23 50.23Zm-126.13 75.9-24.79-25.67 50.46 50.46-25.67-24.79Z'/%3e%3c/svg%3e\",\n copy: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M362.31-260Q332-260 311-281q-21-21-21-51.31v-455.38Q290-818 311-839q21-21 51.31-21h335.38Q728-860 749-839q21 21 21 51.31v455.38Q770-302 749-281q-21 21-51.31 21H362.31Zm0-60h335.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H362.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v455.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85Zm-140 200Q192-120 171-141q-21-21-21-51.31v-515.38h60v515.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h395.38v60H222.31ZM350-320v-480 480Z'/%3e%3c/svg%3e\",\n download:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M480-328.46 309.23-499.23l42.16-43.38L450-444v-336h60v336l98.61-98.61 42.16 43.38L480-328.46ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n upload:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-328.46v-336l-98.61 98.61-42.16-43.38L480-780l170.77 170.77-42.16 43.38L510-664.46v336h-60ZM252.31-180Q222-180 201-201q-21-21-21-51.31v-108.46h60v108.46q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-108.46h60v108.46Q780-222 759-201q-21 21-51.31 21H252.31Z'/%3e%3c/svg%3e\",\n share:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M672.22-100q-44.91 0-76.26-31.41-31.34-31.41-31.34-76.28 0-6 4.15-29.16L284.31-404.31q-14.46 15-34.36 23.5t-42.64 8.5q-44.71 0-76.01-31.54Q100-435.39 100-480q0-44.61 31.3-76.15 31.3-31.54 76.01-31.54 22.74 0 42.64 8.5 19.9 8.5 34.36 23.5l284.46-167.08q-2.38-7.38-3.27-14.46-.88-7.08-.88-15.08 0-44.87 31.43-76.28Q627.49-860 672.4-860t76.25 31.44Q780-797.13 780-752.22q0 44.91-31.41 76.26-31.41 31.34-76.28 31.34-22.85 0-42.5-8.69Q610.15-662 595.69-677L311.23-509.54q2.38 7.39 3.27 14.46.88 7.08.88 15.08t-.88 15.08q-.89 7.07-3.27 14.46L595.69-283q14.46-15 34.12-23.69 19.65-8.69 42.5-8.69 44.87 0 76.28 31.43Q780-252.51 780-207.6t-31.44 76.25Q717.13-100 672.22-100Zm.09-60q20.27 0 33.98-13.71Q720-187.42 720-207.69q0-20.27-13.71-33.98-13.71-13.72-33.98-13.72-20.27 0-33.98 13.72-13.72 13.71-13.72 33.98 0 20.27 13.72 33.98Q652.04-160 672.31-160Zm-465-272.31q20.43 0 34.25-13.8 13.83-13.81 13.83-33.89t-13.83-33.89q-13.82-13.8-34.25-13.8-20.11 0-33.71 13.8Q160-500.08 160-480t13.6 33.89q13.6 13.8 33.71 13.8Zm498.88-286.02Q720-732.04 720-752.31q0-20.27-13.71-33.98Q692.58-800 672.31-800q-20.27 0-33.98 13.71-13.72 13.71-13.72 33.98 0 20.27 13.81 33.98 13.81 13.72 33.89 13.72 20.07 0 33.88-13.72Zm-33.88 510.64ZM207.69-480Zm464.62-272.31Z'/%3e%3c/svg%3e\",\n send: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-190v-580l688.46 290L140-190Zm60-90 474-200-474-200v147.69L416.92-480 200-427.69V-280Zm0 0v-400 400Z'/%3e%3c/svg%3e\",\n filter:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M411.15-260v-60h137.31v60H411.15ZM256.16-450v-60h447.3v60h-447.3ZM140-640v-60h680v60H140Z'/%3e%3c/svg%3e\",\n funnel:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M455.39-180q-15.08 0-25.23-10.16Q420-200.31 420-215.39v-231.53L196.08-731.38q-11.54-15.39-3.35-32 8.2-16.62 27.66-16.62h519.22q19.46 0 27.66 16.62 8.19 16.61-3.35 32L540-446.92v231.53q0 15.08-10.16 25.23Q519.69-180 504.61-180h-49.22ZM480-468l198-252H282l198 252Zm0 0Z'/%3e%3c/svg%3e\",\n refresh:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M481.54-180q-125.63 0-212.81-87.17-87.19-87.17-87.19-212.77 0-125.6 87.19-212.83Q355.91-780 481.54-780q70.15 0 132.77 31.19 62.61 31.2 104.15 88.04V-780h60v244.61H533.85v-59.99h158q-31.62-57.93-87.7-91.27Q548.08-720 481.54-720q-100 0-170 70t-70 170q0 100 70 170t170 70q77 0 139-44t87-116h63.23q-27.23 97.92-107.27 158.96Q583.46-180 481.54-180Z'/%3e%3c/svg%3e\",\n dragHandle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M360-175.39q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm-240-240q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Zm240 0q-26.65 0-45.63-18.98-18.98-18.98-18.98-45.63 0-26.65 18.98-45.63 18.98-18.98 45.63-18.98 26.65 0 45.63 18.98 18.98 18.98 18.98 45.63 0 26.65-18.98 45.63-18.98 18.98-45.63 18.98Z'/%3e%3c/svg%3e\",\n qrCode:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M140-520v-300h300v300H140Zm60-60h180v-180H200v180Zm-60 440v-300h300v300H140Zm60-60h180v-180H200v180Zm320-320v-300h300v300H520Zm60-60h180v-180H580v180Zm165 440v-75h75v75h-75ZM520-365v-75h75v75h-75Zm75 75v-75h75v75h-75Zm-75 75v-75h75v75h-75Zm75 75v-75h75v75h-75Zm75-75v-75h75v75h-75Zm0-150v-75h75v75h-75Zm75 75v-75h75v75h-75Z'/%3e%3c/svg%3e\",\n\n // Status & feedback\n check:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M382-253.85 168.62-467.23 211.38-510 382-339.38 748.62-706l42.76 42.77L382-253.85Z'/%3e%3c/svg%3e\",\n checkCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m423.23-309.85 268.92-268.92L650-620.92 423.23-394.15l-114-114L267.08-466l156.15 156.15ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n xCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m336-293.85 144-144 144 144L666.15-336l-144-144 144-144L624-666.15l-144 144-144-144L293.85-624l144 144-144 144L336-293.85ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n alertCircle:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M502.92-300.15q9.39-9.39 9.39-22.93T502.92-346q-9.38-9.38-22.92-9.38-13.54 0-22.92 9.38-9.39 9.38-9.39 22.92 0 13.54 9.39 22.93 9.38 9.38 22.92 9.38 13.54 0 22.92-9.38ZM450-436.92h60v-240h-60v240ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n info: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M450-290h60v-230h-60v230Zm52.92-307.75q9.39-9.29 9.39-23.02t-9.29-23.02q-9.29-9.28-23.02-9.28t-23.02 9.28q-9.29 9.29-9.29 23.02t9.39 23.02q9.38 9.29 22.92 9.29 13.54 0 22.92-9.29ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n warning:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M74.62-140 480-840l405.38 700H74.62ZM178-200h604L480-720 178-200Zm324.92-57.08q9.39-9.38 9.39-22.92 0-13.54-9.39-22.92-9.38-9.39-22.92-9.39-13.54 0-22.92 9.39-9.39 9.38-9.39 22.92 0 13.54 9.39 22.92 9.38 9.39 22.92 9.39 13.54 0 22.92-9.39ZM450-352.31h60v-200h-60v200ZM480-460Z'/%3e%3c/svg%3e\",\n lock: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M252.31-100q-29.92 0-51.12-21.19Q180-142.39 180-172.31v-375.38q0-29.92 21.19-51.12Q222.39-620 252.31-620H300v-80q0-74.92 52.54-127.46Q405.08-880 480-880q74.92 0 127.46 52.54Q660-774.92 660-700v80h47.69q29.92 0 51.12 21.19Q780-577.61 780-547.69v375.38q0 29.92-21.19 51.12Q737.61-100 707.69-100H252.31Zm0-60h455.38q5.39 0 8.85-3.46t3.46-8.85v-375.38q0-5.39-3.46-8.85t-8.85-3.46H252.31q-5.39 0-8.85 3.46t-3.46 8.85v375.38q0 5.39 3.46 8.85t8.85 3.46Zm277.27-150.42Q550-330.85 550-360t-20.42-49.58Q509.15-430 480-430t-49.58 20.42Q410-389.15 410-360t20.42 49.58Q450.85-290 480-290t49.58-20.42ZM360-620h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM240-160v-400 400Z'/%3e%3c/svg%3e\",\n star: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143Zm-91 125.46 57.31-246.77-191.46-165.92 252.61-21.92L480-828.84l98.54 232.69 252.61 21.92-191.46 165.92L697-161.54 480-292.46 263-161.54ZM480-470Z'/%3e%3c/svg%3e\",\n verified:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m352.46-85.39-71.38-120.3-135.54-29.7 13.23-139.53L66.93-480l91.84-105.08-13.23-139.53 135.54-29.7 71.38-120.3L480-820.46l127.54-54.15 71.38 120.3 135.54 29.7-13.23 139.53L893.07-480l-91.84 105.08 13.23 139.53-135.54 29.7-71.38 120.3L480-139.54 352.46-85.39ZM378-162l102-43.23L583.23-162 640-258l110-25.23L740-396l74-84-74-85.23L750-678l-110-24-58-96-102 43.23L376.77-798 320-702l-110 24 10 112.77L146-480l74 84-10 114 110 24 58 96Zm102-318Zm-42 128.15L650.15-564 608-607.38l-170 170-86-84.77L309.85-480 438-351.85Z'/%3e%3c/svg%3e\",\n\n // User & system\n profile:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M381.04-533.35Q340-574.38 340-632.31q0-57.92 41.04-98.96 41.04-41.04 98.96-41.04 57.92 0 98.96 41.04Q620-690.23 620-632.31q0 57.93-41.04 98.96-41.04 41.04-98.96 41.04-57.92 0-98.96-41.04ZM180-187.69v-88.93q0-29.38 15.96-54.42 15.96-25.04 42.66-38.5 59.3-29.07 119.65-43.61 60.35-14.54 121.73-14.54t121.73 14.54q60.35 14.54 119.65 43.61 26.7 13.46 42.66 38.5Q780-306 780-276.62v88.93H180Zm60-60h480v-28.93q0-12.15-7.04-22.5-7.04-10.34-19.11-16.88-51.7-25.46-105.42-38.58Q534.7-367.69 480-367.69q-54.7 0-108.43 13.11-53.72 13.12-105.42 38.58-12.07 6.54-19.11 16.88-7.04 10.35-7.04 22.5v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5-56.5Zm0 384.62Z'/%3e%3c/svg%3e\",\n group:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M71.93-187.69v-88.93q0-30.92 15.96-55.19 15.96-24.27 42.63-37.76 57.02-27.89 114.67-43.01 57.66-15.11 126.73-15.11 69.08 0 126.73 15.11 57.66 15.12 114.68 43.01 26.67 13.49 42.63 37.76 15.96 24.27 15.96 55.19v88.93H71.93Zm679.99 0v-93.85q0-39.38-19.28-75.07-19.29-35.68-54.72-61.23 40.23 6 76.39 18.57 36.15 12.58 69 29.73 31 16.54 47.88 38.99 16.88 22.44 16.88 49.01v93.85H751.92ZM272.96-533.35q-41.03-41.03-41.03-98.96 0-57.92 41.03-98.96 41.04-41.04 98.96-41.04 57.93 0 98.96 41.04 41.04 41.04 41.04 98.96 0 57.93-41.04 98.96-41.03 41.04-98.96 41.04-57.92 0-98.96-41.04Zm403.22 0q-41.12 41.04-98.87 41.04-6.77 0-17.23-1.54-10.47-1.54-17.23-3.38 23.66-28.45 36.37-63.12 12.7-34.67 12.7-72 0-37.34-12.96-71.73-12.96-34.38-36.11-63.3 8.61-3.08 17.23-4 8.61-.93 17.23-.93 57.75 0 98.87 41.04 41.12 41.04 41.12 98.96 0 57.93-41.12 98.96ZM131.92-247.69h480v-28.93q0-12.53-6.27-22.3-6.26-9.77-19.88-17.08-49.38-25.46-101.69-38.58-52.31-13.11-112.16-13.11-59.84 0-112.15 13.11-52.31 13.12-101.69 38.58-13.62 7.31-19.89 17.08-6.27 9.77-6.27 22.3v28.93Zm296.5-328.12q23.5-23.5 23.5-56.5t-23.5-56.5q-23.5-23.5-56.5-23.5t-56.5 23.5q-23.5 23.5-23.5 56.5t23.5 56.5q23.5 23.5 56.5 23.5t56.5-23.5Zm-56.5 328.12Zm0-384.62Z'/%3e%3c/svg%3e\",\n shieldPerson:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M387.62-487.62Q350-525.23 350-580q0-54.77 37.62-92.38Q425.23-710 480-710q54.77 0 92.38 37.62Q610-634.77 610-580q0 54.77-37.62 92.38Q534.77-450 480-450q-54.77 0-92.38-37.62Zm142.3-42.46Q550-550.15 550-580t-20.08-49.92Q509.85-650 480-650t-49.92 20.08Q410-609.85 410-580t20.08 49.92Q450.15-510 480-510t49.92-20.08ZM480-100.77q-129.77-35.39-214.88-152.77Q180-370.92 180-516v-230.15l300-112.31 300 112.31V-516q0 145.08-85.12 262.46Q609.77-136.16 480-100.77Zm0-378.85Zm0-315L240-705v189q0 57.08 16.35 110.39 16.34 53.3 45.42 99.46 40.46-20.62 84.73-32.23Q430.77-350 480-350t93.5 11.62q44.27 11.61 84.73 32.23 29.08-46.16 45.42-99.46Q720-458.92 720-516v-189l-240-89.62Zm-74.42 513q-35.73 8.39-67.5 23.54 29.77 33.08 65.5 57.2Q439.31-176.77 480-164q40.69-12.77 76.23-36.88 35.54-24.12 65.31-57.2-31.77-15.15-67.31-23.54Q518.69-290 480-290q-38.69 0-74.42 8.38Z'/%3e%3c/svg%3e\",\n settings:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m387.69-100-15.23-121.85q-16.07-5.38-32.96-15.07-16.88-9.7-30.19-20.77L196.46-210l-92.3-160 97.61-73.77q-1.38-8.92-1.96-17.92-.58-9-.58-17.93 0-8.53.58-17.34t1.96-19.27L104.16-590l92.3-159.23 112.46 47.31q14.47-11.46 30.89-20.96t32.27-15.27L387.69-860h184.62l15.23 122.23q18 6.54 32.57 15.27 14.58 8.73 29.43 20.58l114-47.31L855.84-590l-99.15 74.92q2.15 9.69 2.35 18.12.19 8.42.19 16.96 0 8.15-.39 16.58-.38 8.42-2.76 19.27L854.46-370l-92.31 160-112.61-48.08q-14.85 11.85-30.31 20.96-15.46 9.12-31.69 14.89L572.31-100H387.69ZM440-160h78.62L533-267.15q30.62-8 55.96-22.73 25.35-14.74 48.89-37.89L737.23-286l39.39-68-86.77-65.38q5-15.54 6.8-30.47 1.81-14.92 1.81-30.15 0-15.62-1.81-30.15-1.8-14.54-6.8-29.7L777.38-606 738-674l-100.54 42.38q-20.08-21.46-48.11-37.92-28.04-16.46-56.73-23.31L520-800h-79.38l-13.24 106.77q-30.61 7.23-56.53 22.15-25.93 14.93-49.47 38.46L222-674l-39.38 68L269-541.62q-5 14.24-7 29.62t-2 32.38q0 15.62 2 30.62 2 15 6.62 29.62l-86 65.38L222-286l99-42q22.77 23.38 48.69 38.31 25.93 14.92 57.31 22.92L440-160Zm40.46-200q49.92 0 84.96-35.04 35.04-35.04 35.04-84.96 0-49.92-35.04-84.96Q530.38-600 480.46-600q-50.54 0-85.27 35.04T360.46-480q0 49.92 34.73 84.96Q429.92-360 480.46-360ZM480-480Z'/%3e%3c/svg%3e\",\n notification:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M180-204.62v-59.99h72.31v-298.47q0-80.69 49.81-142.69 49.8-62 127.88-79.31V-810q0-20.83 14.57-35.42Q459.14-860 479.95-860q20.82 0 35.43 14.58Q530-830.83 530-810v24.92q78.08 17.31 127.88 79.31 49.81 62 49.81 142.69v298.47H780v59.99H180Zm300-293.07Zm-.07 405.38q-29.85 0-51.04-21.24-21.2-21.24-21.2-51.07h144.62q0 29.93-21.26 51.12-21.26 21.19-51.12 21.19Zm-167.62-172.3h335.38v-298.47q0-69.46-49.11-118.57-49.12-49.12-118.58-49.12-69.46 0-118.58 49.12-49.11 49.11-49.11 118.57v298.47Z'/%3e%3c/svg%3e\",\n favorite:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m480-146.93-44.15-39.69q-99.46-90.23-164.5-155.07-65.04-64.85-103.08-115.43-38.04-50.57-53.15-92.27Q100-591.08 100-634q0-85.15 57.42-142.58Q214.85-834 300-834q52.38 0 99 24.5t81 70.27q34.38-45.77 81-70.27 46.62-24.5 99-24.5 85.15 0 142.58 57.42Q860-719.15 860-634q0 42.92-15.12 84.61-15.11 41.7-53.15 92.27-38.04 50.58-102.89 115.43Q624-276.85 524.15-186.62L480-146.93Zm0-81.07q96-86.38 158-148.08 62-61.69 98-107.19t50-80.81q14-35.3 14-69.92 0-60-40-100t-100-40q-47.38 0-87.58 26.88-40.19 26.89-63.65 74.81h-57.54q-23.85-48.31-63.85-75Q347.38-774 300-774q-59.62 0-99.81 40Q160-694 160-634q0 34.62 14 69.92 14 35.31 50 80.81t98 107q62 61.5 158 148.27Zm0-273Z'/%3e%3c/svg%3e\",\n help: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M508.5-267.21q11.81-11.83 11.81-28.97 0-17.13-11.83-28.94-11.83-11.8-28.96-11.8-17.13 0-28.94 11.83-11.81 11.83-11.81 28.96 0 17.13 11.83 28.94 11.83 11.8 28.96 11.8 17.13 0 28.94-11.82Zm-57.27-131.41h56.31q.77-29.53 8.65-47.19 7.89-17.65 38.27-46.8 26.39-26.39 40.42-48.74 14.04-22.34 14.04-52.77 0-51.65-37.11-80.69-37.12-29.03-87.81-29.03-50.08 0-82.88 26.73-32.81 26.73-46.81 62.96l51.38 20.61q7.31-19.92 25-38.81 17.69-18.88 52.54-18.88 35.46 0 52.42 19.42 16.97 19.43 16.97 42.73 0 20.39-11.62 37.31-11.61 16.92-29.61 32.69-39.39 35.54-49.77 56.7-10.39 21.15-10.39 63.76ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100Zm-.07-60q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3e%3c/svg%3e\",\n calendar:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-100Q182-100 161-121q-21-21-21-51.31v-535.38Q140-738 161-759q21-21 51.31-21h55.38v-84.61h61.54V-780h303.08v-84.61h60V-780h55.38Q778-780 799-759q21 21 21 51.31v535.38Q820-142 799-121q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-375.38H200v375.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM200-607.69h560v-100q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v100Zm0 0V-720v112.31Zm280 210.77q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35Zm-185.04-10.35q-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35t-25.04-10.35ZM640-396.92q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.04 0-14.69 10.34-25.04 10.35-10.34 25.04-10.34t25.04 10.34q10.34 10.35 10.34 25.04 0 14.7-10.34 25.04-10.35 10.35-25.04 10.35ZM480-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q494.69-240 480-240Zm-185.04-10.35q-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q334.69-240 320-240t-25.04-10.35ZM640-240q-14.69 0-25.04-10.35-10.34-10.34-10.34-25.03 0-14.7 10.34-25.04 10.35-10.35 25.04-10.35t25.04 10.35q10.34 10.34 10.34 25.04 0 14.69-10.34 25.03Q654.69-240 640-240Z'/%3e%3c/svg%3e\",\n clock:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='m618.92-298.92 42.16-42.16L510-492.16V-680h-60v212.15l168.92 168.93ZM480.07-100q-78.84 0-148.21-29.92t-120.68-81.21q-51.31-51.29-81.25-120.63Q100-401.1 100-479.93q0-78.84 29.92-148.21t81.21-120.68q51.29-51.31 120.63-81.25Q401.1-860 479.93-860q78.84 0 148.21 29.92t120.68 81.21q51.31 51.29 81.25 120.63Q860-558.9 860-480.07q0 78.84-29.92 148.21t-81.21 120.68q-51.29 51.31-120.63 81.25Q558.9-100 480.07-100ZM480-480Zm0 320q133 0 226.5-93.5T800-480q0-133-93.5-226.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160Z'/%3e%3c/svg%3e\",\n mail: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M172.31-180Q142-180 121-201q-21-21-21-51.31v-455.38Q100-738 121-759q21-21 51.31-21h615.38Q818-780 839-759q21 21 21 51.31v455.38Q860-222 839-201q-21 21-51.31 21H172.31ZM480-457.69 160-662.31v410q0 5.39 3.46 8.85t8.85 3.46h615.38q5.39 0 8.85-3.46t3.46-8.85v-410L480-457.69Zm0-62.31 313.85-200h-627.7L480-520ZM160-662.31V-720v467.69q0 5.39 3.46 8.85t8.85 3.46H160v-422.31Z'/%3e%3c/svg%3e\",\n chat: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M250-410h300v-60H250v60Zm0-120h460v-60H250v60Zm0-120h460v-60H250v60ZM100-118.46v-669.23Q100-818 121-839q21-21 51.31-21h615.38Q818-860 839-839q21 21 21 51.31v455.38Q860-302 839-281q-21 21-51.31 21H241.54L100-118.46ZM216-320h571.69q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-455.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H172.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v523.08L216-320Zm-56 0v-480 480Z'/%3e%3c/svg%3e\",\n image:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h535.38Q778-820 799-799q21 21 21 51.31v535.38Q820-182 799-161q-21 21-51.31 21H212.31Zm0-60h535.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46v-535.38q0-4.62-3.85-8.46-3.84-3.85-8.46-3.85H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85ZM270-290h423.07L561.54-465.38 449.23-319.23l-80-102.31L270-290Zm-70 90v-560 560Z'/%3e%3c/svg%3e\",\n document:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M330-250h300v-60H330v60Zm0-160h300v-60H330v60Zm-77.69 310Q222-100 201-121q-21-21-21-51.31v-615.38Q180-818 201-839q21-21 51.31-21H570l210 210v477.69Q780-142 759-121q-21 21-51.31 21H252.31ZM540-620v-180H252.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v615.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h455.38q4.62 0 8.46-3.85 3.85-3.84 3.85-8.46V-620H540ZM240-800v180-180V-160v-640Z'/%3e%3c/svg%3e\",\n payment:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M550-451.54q-41.92 0-70.96-29.04Q450-509.62 450-551.54q0-41.92 29.04-70.96 29.04-29.04 70.96-29.04 41.92 0 70.96 29.04Q650-593.46 650-551.54q0 41.92-29.04 70.96-29.04 29.04-70.96 29.04ZM286.15-327.69q-29.82 0-51.06-21.24-21.24-21.24-21.24-51.07v-303.08q0-29.82 21.24-51.06 21.24-21.24 51.06-21.24h527.69q29.83 0 51.07 21.24 21.24 21.24 21.24 51.06V-400q0 29.83-21.24 51.07-21.24 21.24-51.07 21.24H286.15Zm60-60h407.7q0-29.92 21.24-51.12Q796.33-460 826.15-460v-183.08q-29.92 0-51.11-21.24-21.19-21.24-21.19-51.06h-407.7q0 29.92-21.24 51.11-21.24 21.19-51.06 21.19V-460q29.92 0 51.11 21.24 21.19 21.24 21.19 51.07Zm420.77 200H146.16q-29.83 0-51.07-21.24Q73.85-230.17 73.85-260v-396.15h60V-260q0 4.61 3.84 8.46 3.85 3.85 8.47 3.85h620.76v60Zm-480.77-200h-12.3V-715.38h12.3q-5 0-8.65 3.65-3.65 3.65-3.65 8.65V-400q0 5 3.65 8.65 3.65 3.66 8.65 3.66Z'/%3e%3c/svg%3e\",\n bank: \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M230-280v-300h60v300h-60Zm220 0v-300h60v300h-60ZM110.77-140v-60h738.46v60H110.77ZM670-280v-300h60v300h-60ZM110.77-660v-56.92L480-897.69l369.23 180.77V-660H110.77Zm141.84-60h454.78-454.78Zm0 0h454.78L480-830 252.61-720Z'/%3e%3c/svg%3e\",\n trendingUp:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M142.15-258.08 100-300.23l274.08-276.08 160 160 224.54-221.77H640v-60h220v220h-60v-117.84L534.08-330l-160-160-231.93 231.92Z'/%3e%3c/svg%3e\",\n extension:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M208.85-197.69h504.61q3.85 0 6.35-2.69 2.5-2.7 2.5-6.54v-176.31l36.92-15.85q18.31-6.84 29.54-23.53Q800-439.31 800-461.15q0-21.62-11.23-38.43t-29.54-24.04l-36.92-15.23v-176.53q0-4.24-2.5-6.74t-6.35-2.5H534.92l-7.3-51.07q-3.77-25.85-22.39-43.92-18.61-18.08-44.08-18.08-26.07 0-44.69 18.08-18.61 18.07-22.38 43.92l-7.31 51.07H208.46q-3.46 0-5.96 2.5t-2.5 6.74V-624q51.77 17.15 84.15 62.04 32.39 44.88 32.39 100.81 0 57.3-32.19 102.19-32.2 44.88-84.35 61.27v90.77q0 3.84 2.5 6.54 2.5 2.69 6.35 2.69Zm0 60q-29 0-48.93-20.12Q140-177.92 140-206.92V-347q48-1.54 82.27-33.58 34.27-32.04 34.27-80.57 0-45.62-34.46-78.12-34.46-32.5-82.08-36.42v-139.69q0-28.77 20.04-49t48.42-20.23h126.23q6.62-47.93 42.16-80.5 35.54-32.58 84.3-32.58 48.16 0 83.7 32.58 35.53 32.57 42.76 80.5h125.85q28.39 0 48.62 20.23 20.23 20.23 20.23 49v136.69q34.84 14.15 56.27 46.23Q860-500.38 860-461.15q0 39.07-21.42 70.96-21.43 31.88-56.27 46.57v136.7q0 29-20.23 49.11-20.23 20.12-48.62 20.12H208.85ZM500-461.15Z'/%3e%3c/svg%3e\",\n webhook:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M280-130q-78.77 0-134.38-55.62Q90-241.23 90-320q0-66.08 39.54-116.35 39.54-50.26 100.46-66.19v63q-35 14.31-57.5 46.85T150-320q0 53.85 38.08 91.92Q226.15-190 280-190t91.92-38.08Q410-266.15 410-320v-30h225.38q6.85-10.92 18.54-17.77 11.7-6.84 26.08-6.84 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96-14.77 0-26.27-6.65T635.38-290H467.54q-11.69 71.31-65.04 115.65Q349.15-130 280-130Zm400 0q-49.08 0-89.96-22.89-40.88-22.88-67.27-61.72h81.61q15.16 11.53 34.85 18.07Q658.92-190 680-190q53.85 0 91.92-38.08Q810-266.15 810-320t-38.08-91.92Q733.85-450 680-450q-18.85 0-34.88 4.73-16.04 4.73-30.66 13.81l-117-194.93q-21-.53-36.54-15.57Q445.39-657 445.39-680q0-22.69 15.96-38.65 15.96-15.96 38.65-15.96 22.69 0 38.65 15.96 15.96 15.96 15.96 38.65 0 6.15-1.15 11.38-1.15 5.24-4.31 10.24L640-505.85q9.15-2 19.12-3.07Q669.08-510 680-510q78.77 0 134.38 55.62Q870-398.77 870-320t-55.62 134.38Q758.77-130 680-130ZM280-265.39q-22.69 0-38.65-15.96-15.96-15.96-15.96-38.65 0-21.23 14.57-36.85 14.58-15.61 36.89-16.76l98.23-163.31q-31.31-26.62-48.19-63.73Q310-637.77 310-680q0-78.77 55.62-134.38Q421.23-870 500-870t134.38 55.62Q690-758.77 690-680h-60q0-53.85-38.08-91.92Q553.85-810 500-810t-91.92 38.08Q370-733.85 370-680q0 42.62 24.08 75.5 24.07 32.88 63.3 46.89L328.54-342.62q3.15 5.39 4.61 10.93 1.46 5.54 1.46 11.69 0 22.69-15.96 38.65-15.96 15.96-38.65 15.96Z'/%3e%3c/svg%3e\",\n logout:\n \"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3e%3cpath d='M212.31-140Q182-140 161-161q-21-21-21-51.31v-535.38Q140-778 161-799q21-21 51.31-21h268.07v60H212.31q-4.62 0-8.46 3.85-3.85 3.84-3.85 8.46v535.38q0 4.62 3.85 8.46 3.84 3.85 8.46 3.85h268.07v60H212.31Zm436.92-169.23-41.54-43.39L705.08-450H363.85v-60h341.23l-97.39-97.38 41.54-43.39L820-480 649.23-309.23Z'/%3e%3c/svg%3e\",\n\n // Hand-authored: animated, no Material Symbols equivalent\n spinner:\n \"data:image/svg+xml;charset=UTF-8,%3csvg stroke='%23000' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3e%3cstyle%3e .oui_spinner %7b transform-origin: center; animation: rotate_360 2s linear infinite;%7d .oui_spinner circle %7b stroke-linecap: round; animation: dash 1.5s ease-in-out infinite;%7d %40keyframes rotate_360 %7b 100%25 %7b transform: rotate(360deg);%7d %7d %40keyframes dash %7b 0%25 %7b stroke-dasharray: 0 150; stroke-dashoffset: 0;%7d 47.5%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -16;%7d 95%25, 100%25 %7b stroke-dasharray: 42 150; stroke-dashoffset: -59;%7d %7d %3c/style%3e%3cg class='oui_spinner'%3e%3ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3'%3e%3c/circle%3e%3c/g%3e%3c/svg%3e \",\n} satisfies Icons;\n\n/** Names guaranteed present on every theme. */\nexport type BaseIconName = keyof typeof BaseIcons;\n\n/**\n * An icon name. Autocompletes the built-in set while still allowing any name a\n * theme registers through `createTheme({ icons })`.\n */\nexport type IconName = BaseIconName | (string & {});\n","/**\n * The highlight state for roving-focus composites (menus, and any other widget\n * that moves focus programmatically): pointer hover, or focus the user drove\n * from the keyboard.\n *\n * Why not plain `:focus` — a roving-focus composite calls `.focus()` on an item\n * every time it opens, including pointer opens, and `:focus` would paint that\n * as a highlight the mouse user never asked for, reading as a preselected\n * item. `:focus-visible` excludes programmatic focus that follows a click while\n * still matching keyboard navigation.\n *\n * Shared as a constant because Emotion merges styles by **exact selector\n * text**: a component's base rule and any theme variant restyling that rule\n * must key both with this value, or the variant silently fails to override and\n * reintroduces the phantom highlight.\n */\nexport const HOVER_OR_KEYBOARD_FOCUS = '&:hover, &:focus-visible';\n","import type { ComponentThemes } from '../../component';\nimport { generatePalette, type PaletteConfig } from '../../color';\nimport type { GenerateColorsConfig } from '../../generation/palette.factory';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BaseIcons } from '../../iconography/icon.records';\nimport { HOVER_OR_KEYBOARD_FOCUS } from '../../style/selectors.constants';\nimport type { TextRole, TextStyle } from '../../typography';\nimport type {\n Backdrops,\n Borders,\n Colors,\n Icons,\n Motions,\n Radii,\n Shadows,\n Spacing,\n Thicknesses,\n Typography,\n UniTheme,\n} from '../theme.model';\n\n// ==========================================\n// Type scale — the single source of type truth.\n// CSS-ready `typefaces` are derived from this on read (toTypefaces).\n// ==========================================\nconst BaseTypography: Typography = {\n 'display-large': {\n fontFamily: 'Red Hat Display',\n fontSize: 57,\n lineHeight: 64,\n fontWeight: 'normal',\n letterSpacing: -0.25,\n },\n 'display-medium': {\n fontFamily: 'Red Hat Display',\n fontSize: 45,\n lineHeight: 52,\n fontWeight: 'normal',\n },\n 'display-small': {\n fontFamily: 'Red Hat Display',\n fontSize: 36,\n lineHeight: 44,\n fontWeight: 'normal',\n },\n 'headline-large': {\n fontFamily: 'Red Hat Display',\n fontSize: 32,\n lineHeight: 40,\n fontWeight: 'normal',\n },\n 'headline-medium': {\n fontFamily: 'Red Hat Display',\n fontSize: 28,\n lineHeight: 36,\n fontWeight: 'normal',\n },\n 'headline-small': {\n fontFamily: 'Red Hat Display',\n fontSize: 24,\n lineHeight: 32,\n fontWeight: 'normal',\n },\n 'title-large': {\n fontFamily: 'Red Hat Display',\n fontSize: 22,\n lineHeight: 28,\n fontWeight: 'normal',\n },\n 'title-medium': {\n fontFamily: 'Red Hat Display',\n fontSize: 16,\n lineHeight: 24,\n fontWeight: 'medium',\n letterSpacing: 0.15,\n },\n 'title-small': {\n fontFamily: 'Red Hat Display',\n fontWeight: 'medium',\n fontSize: 14,\n lineHeight: 20,\n letterSpacing: 0.1,\n },\n 'body-1-long': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 22 },\n 'body-1-short': { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n 'body-2-long': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 18 },\n 'body-2-short': { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n 'subtitle-1': {\n fontFamily: 'Red Hat Display',\n fontSize: 16,\n lineHeight: 24,\n letterSpacing: 0.15,\n },\n 'subtitle-2': {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n letterSpacing: 0.1,\n },\n label: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 20 },\n button: {\n fontFamily: 'Red Hat Display',\n fontSize: 14,\n lineHeight: 20,\n fontWeight: 'medium',\n textTransform: 'capitalize',\n },\n caption: { fontFamily: 'Roboto', fontSize: 12, lineHeight: 18, letterSpacing: 0.4 },\n overline: {\n fontFamily: 'Red Hat Display',\n fontSize: 10,\n lineHeight: 18,\n letterSpacing: 1.5,\n textTransform: 'uppercase',\n },\n paragraph: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n quote: { fontFamily: 'Roboto', fontSize: 16, lineHeight: 24 },\n note: { fontFamily: 'Roboto', fontSize: 14, lineHeight: 22, fontStyle: 'italic' },\n // Product-specific extras (were duplicated into `typefaces` before).\n badge: { fontFamily: 'Red Hat Display', fontSize: 16, lineHeight: 24 },\n // Stat-tile value: large, semibold, slightly tightened. Proportional\n // figures on purpose — tabular-nums is for columns, not display numbers.\n stat: {\n fontFamily: 'Red Hat Display',\n fontSize: 32,\n lineHeight: 38,\n fontWeight: 600,\n letterSpacing: -0.32,\n },\n tag: { fontFamily: 'Red Hat Display', fontSize: 15, lineHeight: 20, fontWeight: 600 },\n input: { fontFamily: 'Red Hat Display', fontSize: 14, lineHeight: 24 },\n} as Record<TextRole, TextStyle> & Record<string, TextStyle>;\n\n// ==========================================\n// Shared token scales — theme-agnostic.\n// ==========================================\nconst BaseShadows: Shadows = {\n raised:\n 'rgba(0, 0, 0, 0.2) 0px 2px 1px -1px, rgba(0, 0, 0, 0.14) 0px 1px 1px 0px, rgba(0, 0, 0, 0.12) 0px 1px 3px 0px',\n menu: 'rgba(0, 0, 0, 0.2) 0px 3px 3px -2px, rgba(0, 0, 0, 0.14) 0px 3px 4px 0px, rgba(0, 0, 0, 0.12) 0px 1px 8px 0px;',\n dialog:\n 'rgba(0, 0, 0, 0.2) 0px 3px 5px -1px, rgba(0, 0, 0, 0.14) 0px 6px 10px 0px, rgba(0, 0, 0, 0.12) 0px 1px 18px 0px',\n warn: '0 0 5px rgba(255, 0, 0, 0.5), inset 0 0 5px rgba(255, 0, 0, 0.3)',\n};\n\nconst BaseSpacing: Spacing = {\n // 0, not 'none': `padding: none` is invalid CSS and gets dropped, which let\n // user-agent defaults (e.g. <dialog>'s 1em padding) leak through the token.\n none: 0,\n xxs: '2px',\n xs: '4px',\n sm: '8px',\n md: '16px',\n lg: '32px',\n xl: '64px',\n // Completes the doubling. It was in the `Size` union but absent from every\n // base theme, so `padding=\"xxl\"` type-checked and silently rendered nothing.\n xxl: '128px',\n};\n\nconst BaseThicknesses: Thicknesses = { thin: 1, standard: 2, thick: 4 };\n\n/**\n * Shared motion timing, named by what moves rather than by how fast:\n * a small panel attached to a control snaps (`popup`), a larger free-floating\n * surface settles (`panel`), content growing in place eases at both ends\n * (`reveal`), a transient message arrives and leaves under its own steam\n * (`notification`), and a control answering a pointer should feel immediate\n * (`control`).\n *\n * Fast and linear is deliberate for `popup`. It is the timing every\n * trigger-anchored panel in the library uses — dropdown, menu, multi-select\n * and the combobox-style listboxes — so a form full of them opens uniformly;\n * at 100ms an easing curve is imperceptible anyway, and linear avoids the\n * lag a slow-in curve adds to something the user is waiting on.\n */\nconst BaseMotion: Motions = {\n popup: { duration: 100, easing: 'linear', scale: 0.8 },\n panel: { duration: 250, easing: 'ease' },\n // The base speed for a reveal, not its final duration: uni-expand scales\n // this by content height (see `expandDuration`) so perceived speed stays\n // even across short and tall regions.\n reveal: { duration: 350, easing: 'ease-in-out' },\n notification: { duration: 350, easing: 'ease-in-out' },\n // Feedback, not choreography: hover fills and check marks answer the\n // pointer, so this is the fastest token that still reads as a transition.\n control: { duration: 300, easing: 'ease' },\n};\n\n/**\n * The one wash every modal surface lays over the page it covers. Dialog and\n * drawer both point at `scrim` by name, so a theme redresses them together —\n * before this they owned a `backdrop` blob each and had drifted apart, the\n * dialog washing the page white and blurred while the drawer dimmed it dark.\n */\nconst BaseBackdrops: Backdrops = {\n scrim: { background: 'rgba(255, 255, 255, 0.6)', backdropFilter: 'blur(2px)' },\n};\n\nconst BaseRadii: Radii = {\n none: 'none',\n xxs: '4px',\n xs: '8px',\n sm: '16px',\n md: '24px',\n lg: '32px',\n max: '999px',\n};\n\n// ==========================================\n// Color-derived token builders — the reason a custom theme\n// only has to supply `colors`.\n// ==========================================\nconst buildBorders = (c: Colors): Borders => ({\n primary: `1px solid ${c.primary}`,\n secondary: `1px solid ${c.secondary}`,\n tertiary: `1px solid ${c.tertiary}`,\n quaternary: `1px solid ${c.quaternary}`,\n warn: `1px solid ${c.warn}`,\n success: `1px solid ${c.success}`,\n light: `1px solid ${c.outline}`,\n dark: `1px solid ${c['on-background']}`,\n dotted: `1px dotted ${c['on-background']}`,\n});\n\n/**\n * One tag colour role across all three tones. `soft` is the resting look (the\n * container pair), `solid` fills with the role itself, `outline` keeps the\n * surface and draws the edge — so every role stays consistent and a theme can\n * still override any single cell.\n */\n/**\n * Accent roles for the selection controls (checkbox, radio, toggle).\n *\n * A variant names the intent; this says which colour token draws it, and the\n * component decides where it lands — the box fill, the ring, the dot, the\n * track, the focus ring. Keeping it as a role rather than a `variants`\n * StyleExpression is what stops interior class names like `.checkbox-check`\n * becoming public theme contract.\n *\n * The same seven names `button` and `iconButton` theme, so the library is\n * consistent about which intents exist by default.\n */\nconst SELECTION_ACCENTS = {\n primary: { accent: 'primary' },\n secondary: { accent: 'secondary' },\n tertiary: { accent: 'tertiary' },\n warn: { accent: 'warn' },\n success: { accent: 'success' },\n disabled: { accent: 'disabled' },\n // `ghost` is transparent, so the glyph cannot take a paired on-colour from\n // it — there is no `on-ghost`. It keeps the primary on-colour instead, which\n // is what the old variant-name lookup fell back to anyway.\n ghost: { accent: 'ghost', onAccent: 'on-primary' },\n} as const;\n\nconst tagVariant = (\n c: Colors,\n role: 'primary' | 'secondary' | 'tertiary' | 'warn' | 'success'\n) => ({\n [role]: {\n backgroundColor: c[`${role}-container`],\n color: c[`on-${role}-container`],\n '&.tone-solid': { backgroundColor: c[role], color: c[`on-${role}`] },\n '&.tone-outline': {\n backgroundColor: 'transparent',\n color: c[role],\n borderColor: c[`on-${role}-container-border`] ?? c[role],\n },\n },\n});\n\nconst buildComponents = (c: Colors): ComponentThemes => ({\n alert: {\n options: { topPosition: 40, borderRadius: 'sm', motion: 'notification', elevation: 'md' },\n },\n // Trail typography, link/current colors, separator symbol and spacing are\n // tokens; the current page reads in the stronger ink.\n breadcrumb: {\n options: {\n typeface: 'label',\n color: 'on-background-variant',\n currentColor: 'on-background',\n separatorSymbol: 'chevron_right',\n gap: 'xs',\n },\n },\n // App shell: bar surface, divider, title type and spacing are all tokens.\n appBar: {\n options: {\n color: 'surface',\n height: 56,\n divider: 'light',\n typeface: 'title-large',\n padding: 'md',\n gap: 'md',\n elevation: undefined,\n },\n },\n // Navigation drawer: shares the dialog's native-<dialog> machinery in\n // 'over' mode (elevation + scrim backdrop); 'side' mode is an in-flow\n // aside separated by the divider border primitive.\n //\n // `padding` is the *body* row's padding, not the panel's. The panel is a\n // three-row flex column whose header and footer pin while only the body\n // scrolls, so padding on the panel itself would scroll away with the\n // content and make a pinned row impossible.\n drawer: {\n options: {\n color: 'surface',\n width: 280,\n divider: 'light',\n // Overlay mode only: a side drawer is separated by `divider` instead,\n // so raising it off the page would double the separation.\n elevation: 'menu',\n padding: 'md',\n // The shared `scrim` primitive, so the drawer dims the page exactly as\n // the dialog does. `scrim: false` opts out of dimming entirely.\n backdrop: 'scrim',\n scrim: true,\n background: 'solid',\n // A larger free-floating surface settles: the same token the callout,\n // tour and popover panels use. Drives the slide, the scrim's fade and\n // the side panel's width transition together.\n motion: 'panel',\n },\n },\n // Pinned header row for a drawer used as an editor panel. Left-aligned\n // rather than the dialog header's centered title: a panel headline reads as\n // a section label beside the page, where a dialog's reads as an annoucement.\n drawerHeader: {\n options: {\n color: undefined,\n height: 56,\n padding: 'md',\n textRole: 'title-medium',\n textAlign: 'left',\n divider: 'light',\n closeButtonIcon: 'close',\n closeButtonSize: 'md',\n },\n },\n // Pinned footer action row. Justified to the end and unstretched — a panel\n // save bar trails its actions, where a dialog centers them.\n drawerButtons: {\n options: {\n gap: 'sm',\n padding: 'md',\n justifyContent: 'flex-end',\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'quaternary',\n buttonSize: 'md',\n divider: 'light',\n stretch: false,\n reverseOrder: false,\n },\n },\n // Initials/icon avatars color from the role's container tokens; the radius\n // token makes them circles by default and squares under a 'sharp' theme.\n avatar: {\n options: { borderRadius: 'max', typeface: 'subtitle-2', fallbackSymbol: 'person' },\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c['on-primary-container'] },\n secondary: { backgroundColor: c['secondary-container'], color: c['on-secondary-container'] },\n tertiary: { backgroundColor: c['tertiary-container'], color: c['on-tertiary-container'] },\n quaternary: { backgroundColor: c['surface-variant'], color: c['on-surface-variant'] },\n warn: { backgroundColor: c['warn-container'], color: c['on-warn-container'] },\n success: { backgroundColor: c['success-container'], color: c['on-success-container'] },\n },\n sizes: {\n sm: { height: 24, width: 24, fontSize: 10 },\n md: { height: 32, width: 32, fontSize: 13 },\n lg: { height: 40, width: 40, fontSize: 16 },\n xl: { height: 56, width: 56, fontSize: 22 },\n },\n },\n // Overlap is a spacing token; the ring separates stacked avatars using the\n // surface color so groups read on any background.\n avatarGroup: { options: { overlap: 'sm', ringColor: 'surface', ringWidth: 2 } },\n // Search field: chrome comes from the shared `input` options via\n // uni-input-box; these tokens style the affordances and suggestion list.\n searchInput: {\n options: {\n searchSymbol: 'search',\n clearSymbol: 'close',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n activeColor: 'primary-container',\n maxSuggestions: 8,\n },\n },\n // Selection controls: chrome colors are tokens (accent fill/ring follows the\n // component's variant; its on-color pairs are derived in the component).\n checkbox: {\n options: {\n size: 20,\n boxColor: 'surface',\n borderRadius: 2,\n focusRingGap: 2,\n },\n variantOptions: SELECTION_ACCENTS,\n },\n radio: {\n options: { size: 20, ringColor: 'outline', fillColor: 'surface', motion: 'control' },\n variantOptions: SELECTION_ACCENTS,\n },\n // Three-row surface: the header and buttons pin while only the body scrolls,\n // and the surface is content-sized until it reaches `inset` from the\n // viewport edge.\n //\n // `padding` insets all three rows — which is what makes the header below\n // read as a pill floating inside the surface. It is safe here, unlike on the\n // drawer, because the dialog is `overflow: clip` and never the scroller.\n // `bodyPadding` pads the scrolling row alone.\n dialog: {\n options: {\n borderRadius: 'lg',\n color: 'primary-surface',\n border: 'quaternary',\n padding: 'sm',\n bodyPadding: undefined,\n inset: 'lg',\n elevation: 'dialog',\n backdrop: 'scrim',\n // The same token the drawer's slide reads: a larger free-floating\n // surface settles. Replaces a hardcoded 350ms fade.\n motion: 'panel',\n },\n },\n // Footer action row: every layout knob is a token so a theme can move from\n // the default centered pill pair to e.g. Carbon-style full-bleed halves\n // (stretch + reverseOrder + 'none' spacing) without touching the component.\n dialogButtons: {\n options: {\n gap: 'md',\n padding: 'md',\n paddingBottom: 'lg',\n justifyContent: 'center',\n // No divider by default: the pill header and the surface padding already\n // set the rows apart. A flush-header theme is the one that wants it.\n divider: undefined,\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'warn',\n buttonSize: 'lg',\n stretch: false,\n reverseOrder: false,\n },\n },\n dialogHeader: {\n options: {\n borderRadius: 'max',\n color: 'primary',\n height: 48,\n textRole: 'title-large',\n textAlign: 'center',\n divider: undefined,\n closeButtonIcon: 'close',\n closeButtonSize: 'md',\n },\n },\n dropdown: {\n options: {\n border: 'none',\n borderRadius: 'xxs',\n color: 'primary-surface',\n shadow: 'menu',\n motion: 'popup',\n },\n },\n // Menu panel chrome. The undefined color/border/borderRadius/shadow fall\n // back to the `dropdown` options above, so menus follow generic popovers\n // until a theme deliberately splits them. Panel padding + item borderRadius\n // together select the archetype: full-bleed rows (padding none) vs. the\n // inset \"hover pill\" look (padding xs + menuItem borderRadius).\n menu: {\n options: {\n minWidth: 184,\n color: undefined,\n border: undefined,\n borderRadius: undefined,\n shadow: undefined,\n paddingVertical: 'xs',\n paddingHorizontal: 'none',\n dividerBorder: 'light',\n dividerSpacing: 'xs',\n },\n },\n // Item anatomy: every density/shape/type knob is a token, and `variants`\n // carry tones — an item declares `variant: 'warn'` and the theme decides\n // what a destructive action looks like. `activeSymbol` marks the selected\n // item; set it to undefined to drop the trailing symbol entirely.\n menuItem: {\n options: {\n height: 38,\n paddingHorizontal: 'md',\n gap: 'md',\n borderRadius: 'none',\n typeface: 'label',\n textColor: undefined,\n hoverColor: 'primary-container',\n activeSymbol: 'check',\n motion: 'control',\n },\n variants: {\n // The default variant, deliberately empty: a menu item's ordinary\n // appearance is its `fixed` style, and `warn` below is the only role that\n // changes it. Present so the unthemed-variant warning stays quiet on the\n // default path — spreading `{}` contributes nothing.\n primary: {},\n warn: {\n color: c.warn,\n // Must key the highlight with the shared constant — see its doc.\n [HOVER_OR_KEYBOARD_FOCUS]: {\n backgroundColor: c['warn-container'],\n color: c['on-warn-container'],\n },\n },\n },\n },\n // Defaults reproduce the pre-theme hardcoded popover look exactly, except\n // `maxWidth` (new — long content previously never wrapped). The tooltip*\n // options apply only in `mode=\"tooltip\"`.\n popover: {\n options: {\n color: 'primary-surface',\n border: 'quaternary',\n borderRadius: 'xs',\n shadow: 'raised',\n typeface: 'label',\n padding: '6px 12px',\n maxWidth: '38ch',\n offset: 7,\n arrowSize: 8,\n closeSymbol: 'close',\n headerTypeface: 'title-small',\n tooltipPadding: '4px 8px',\n tooltipOpenDelay: 500,\n tooltipCloseDelay: 150,\n motion: 'panel',\n },\n },\n // The `reveal` token's duration is the base speed at a 240px-tall region;\n // the actual duration scales with content height (√-of-height, clamped\n // ~0.15–0.6s at this speed — see `expandDuration`). The toggle's chevron\n // rotation shares the clock.\n expand: { options: { motion: 'reveal' } },\n footer: { options: { height: 52, color: 'primary', logoHeight: 18.6, logoPadding: 'md' } },\n input: {\n options: {\n typeface: 'input',\n color: 'primary-surface',\n textColor: 'on-primary-surface',\n disabledColor: 'disabled-surface',\n disabledTextColor: 'on-disabled-surface',\n border: 'light',\n borderRadius: 'xs',\n errorShadow: 'warn',\n errorBorder: 'warn',\n height: 32,\n paddingLeft: 'sm',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n // Field chrome (color/border/typeface/focus) comes from the shared `input`\n // options via uni-input-box; these are the textarea-specific behaviors.\n textarea: { options: { rows: 3, resize: 'vertical' } },\n // Numeric field. Chrome again comes from `input` via uni-input-box, so a\n // number field restyles with every other field; these are the numeric\n // specifics. `tabularNumerals` earns its place — with proportional figures a\n // held-down stepper makes the number visibly jitter as 1 and 8 swap widths,\n // and a column of prices stops lining up.\n numberInput: {\n options: {\n stepperLayout: 'stacked',\n incrementIcon: 'plus',\n decrementIcon: 'minus',\n stepUpIcon: 'chevronUp',\n stepDownIcon: 'chevronDown',\n stepperWidth: 32,\n // WCAG 2.2 SC 2.5.8 floor, honoured by the `split` and `trailing`\n // layouts. Two `stacked` arrows share the field height (16px each in a\n // 32px field) because 2 × 24 does not fit — so a coarse pointer, where\n // target size actually decides whether a tap lands, gets `split`.\n minTouchTarget: 24,\n affixColor: 'on-primary-surface-variant',\n affixGap: 'xs',\n align: 'start',\n tabularNumerals: true,\n repeatDelayMs: 500,\n repeatIntervalMs: 100,\n repeatFastIntervalMs: 25,\n repeatRampMs: 2000,\n },\n },\n // Two linked numeric fields in one chrome — price filters, thresholds,\n // tolerances. Field chrome again comes from `input` via uni-input-box; these\n // are the composer's own bits. `dividerText` is literal text rather than an\n // icon token: an en dash between two numbers is punctuation, not a glyph.\n numberRangeInput: {\n options: {\n partGap: 'sm',\n dividerText: '–',\n dividerColor: 'outline',\n // Each end carries its own adornment — the spec's `$ 50 – $ 500`.\n affixColor: 'on-primary-surface-variant',\n affixGap: 'xs',\n },\n },\n // The cart line, the table cell, the seat count: the numeric core with no\n // field chrome and no room for a label. It does need a container, so it gets\n // its own colour/border/radius rather than reaching into `input` — a cart\n // stepper and a form field are styled together by default (same token\n // values) but a theme can part them without touching every field.\n quantityStepper: {\n options: {\n // `color`, `border` and `borderRadius` are deliberately unset: the\n // container takes the shared `input` chrome, so a theme that restyles its\n // fields carries the stepper beside them. Set one only to part them.\n // `dividerColor` is deliberately unset: the rules either side of the\n // value take the `border` token above, so the frame reads as one weight\n // and follows the focus border. Set it only for a deliberately distinct\n // divider.\n incrementIcon: 'plus',\n decrementIcon: 'minus',\n // At `min` with `deleteAtMin`, the − becomes a remove affordance.\n deleteIcon: 'delete',\n tabularNumerals: true,\n // Grows with the digits, so stepping never reflows the row it sits in.\n valueWidth: '3ch',\n },\n // Outer height; the buttons are square at it. `md` (the default) and `lg`\n // clear the 24×24 pointer target of WCAG 2.2 SC 2.5.8; `sm` cannot — a\n // 24px bordered box leaves 22px inside — so it is the dense desktop\n // option and touch surfaces should stay on `md` or larger.\n sizes: {\n sm: { height: 24 },\n md: { height: 32 },\n lg: { height: 40 },\n },\n },\n // Every visual knob is a token, so a theme can turn the default underline\n // tabs into pills (borderRadius 'max' + activeColor) or restyle the\n // indicator without touching component code.\n tabs: {\n options: {\n typeface: 'title-small',\n textColor: 'on-surface-variant',\n activeTextColor: 'primary',\n indicatorColor: 'primary',\n indicatorThickness: 'standard',\n divider: 'light',\n gap: 'sm',\n borderRadius: 'none',\n padding: 'md',\n activeColor: undefined,\n },\n },\n multiSelectDropdown: {\n options: {\n textRole: 'input',\n textColor: 'on-primary-surface',\n dividerBorder: 'light',\n searchInputBorder: 'light',\n searchInputBorderRadius: 'xxs',\n focusOutline: `2px solid ${c.primary}`,\n focusOutlineOffset: 2,\n },\n },\n badge: { options: { borderRadius: 'xxs' } },\n\n // Chips. Two orthogonal axes: `variant` picks the colour role, `tone` picks\n // the archetype (soft fill / solid fill / outline). Tones are nested\n // `&.tone-*` selectors inside each variant so a theme author restyles both\n // axes in one place — the same trick `button` uses for `&:hover` — rather\n // than hunting for colour decisions inside `options`.\n tag: {\n options: {\n borderRadius: 'max', // 'xs' switches the whole set to rectangular labels\n typeface: 'tag',\n gap: 'xs',\n // Icon primitives, not Material ligatures: they mask `currentColor`, so\n // they recolour with the chip's tone and a theme can swap the artwork.\n removeIcon: 'close',\n selectedIcon: 'check',\n },\n fixed: {\n display: 'inline-flex',\n alignItems: 'center',\n maxWidth: '100%',\n border: '1px solid transparent',\n transition: 'background-color .2s ease, color .2s ease',\n },\n variants: {\n ...tagVariant(c, 'primary'),\n ...tagVariant(c, 'secondary'),\n ...tagVariant(c, 'tertiary'),\n ...tagVariant(c, 'warn'),\n ...tagVariant(c, 'success'),\n ghost: {\n backgroundColor: 'transparent',\n color: c['on-background'],\n '&.tone-solid': { backgroundColor: c['surface-variant'], color: c['on-surface-variant'] },\n '&.tone-outline': { backgroundColor: 'transparent', borderColor: c.outline },\n },\n disabled: {\n backgroundColor: c['disabled-container'],\n color: c['on-disabled'],\n '&.tone-solid': { backgroundColor: c.disabled, color: c['on-disabled'] },\n '&.tone-outline': { backgroundColor: 'transparent', borderColor: c.disabled },\n },\n },\n // Geometry only — family and weight come from the `typeface` option.\n sizes: {\n sm: { height: 20, fontSize: 12, padding: '0 8px' },\n md: { height: 24, fontSize: 13, padding: '0 10px' },\n lg: { height: 32, fontSize: 15, padding: '0 12px' },\n },\n },\n // Chip field. Field chrome (colour, border, radius, focus outline) is NOT\n // duplicated here — it comes from `input` via uni-input-box, so a tag input\n // restyles with every other field. These are the chip-field specifics.\n tagInput: {\n options: {\n chipGap: 'xs',\n chipSize: 'md',\n // The text input never collapses to a sliver next to wrapped chips.\n minInputWidth: '12ch',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n activeColor: 'primary-container',\n maxSuggestions: 8,\n },\n },\n\n // Month grid. Selection/range/today colours are deliberately NOT options —\n // they are the `primary` role pair, so a theme restyles them by restyling\n // its palette, the same rule every other component follows.\n calendar: {\n options: {\n dayBorderRadius: 'max', // 'xxs' gives the square/GitHub-contributions look\n typeface: 'label',\n gap: 'xxs', // grid gutter\n navPrevSymbol: 'chevron_left',\n navNextSymbol: 'chevron_right',\n weekdayFormat: 'short', // Intl weekday: 'narrow' | 'short'\n showOutsideDays: false,\n todayStyle: 'outline', // 'outline' | 'dot'\n },\n fixed: {\n display: 'inline-block',\n userSelect: 'none',\n },\n // Geometry only, like tag: day cell square + font size per size token.\n sizes: {\n sm: { width: 28, height: 28, fontSize: 12 },\n md: { width: 34, height: 34, fontSize: 13 },\n lg: { width: 40, height: 40, fontSize: 15 },\n },\n },\n // Closed-set single-select autocomplete. Field chrome comes from `input` via\n // uni-input-box; `maxVisibleOptions` is a scroll height — the list scrolls\n // past it, never truncates (contrast searchInput's `maxSuggestions`).\n combobox: {\n options: {\n // Icon primitives (BaseIcons names), rendered by uni-icon — not\n // Material Symbol ligatures. Themes re-point or register their own\n // through createTheme({ icons }).\n toggleIcon: 'chevronDown',\n clearIcon: 'close',\n selectedIcon: 'check',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n activeColor: 'primary-container',\n maxVisibleOptions: 8,\n descriptionColor: 'on-primary-surface-variant',\n },\n },\n // Date field. Field chrome comes from `input` via uni-input-box; these\n // style the popup-calendar affordance and panel only.\n dateInput: {\n options: {\n toggleSymbol: 'calendar_month',\n popupShadow: 'menu',\n popupBorderRadius: 'xs',\n popupColor: 'primary-surface',\n },\n },\n // Time field. Same listbox trio as tagInput/searchInput.\n timeInput: {\n options: {\n toggleSymbol: 'schedule',\n listColor: 'primary-surface',\n listShadow: 'menu',\n listBorderRadius: 'xs',\n activeColor: 'primary-container',\n maxVisibleOptions: 7,\n },\n },\n // Composer seating a date + time part in one field chrome.\n dateTimeInput: {\n options: { partGap: 'sm', dividerColor: 'outline' },\n },\n\n // ---- Buttons: variants are structural archetypes with interaction states ----\n button: {\n // Radius and typeface are tokens, not baked values: `max` renders the\n // classic pill and the type scale's `button` role carries the label\n // typography, so shape languages, custom radii, and typography edits\n // restyle every button by re-pointing or redefining a token.\n options: { borderRadius: 'max', typeface: 'button' },\n fixed: {\n position: 'relative',\n overflow: 'hidden',\n outline: '0',\n border: '0',\n cursor: 'pointer',\n transition: 'all 0.28s ease',\n },\n // The keyboard-focus ring's colour per intent. It is named here rather than\n // derived from the fill because the ring is drawn *outside* the button, so\n // it has to read against the page, not against the variant.\n //\n // Each entry below reproduces the colour the ring already had, back when it\n // was resolved from the variant's name. `ghost` is the exception and the\n // fix: its token is `transparent`, so its ring was invisible.\n variantOptions: {\n primary: { focusColor: 'primary' },\n secondary: { focusColor: 'secondary' },\n tertiary: { focusColor: 'tertiary' },\n warn: { focusColor: 'warn' },\n success: { focusColor: 'success' },\n disabled: { focusColor: 'disabled' },\n ghost: { focusColor: 'primary' },\n },\n variants: {\n ghost: {\n backgroundColor: 'transparent',\n color: 'currentcolor',\n '&:hover': { backgroundColor: 'rgba(0,0,0,0.06)' },\n },\n // Solid\n primary: {\n backgroundColor: c.primary,\n color: c['on-primary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n // Hollow\n secondary: {\n backgroundColor: 'transparent',\n color: c.secondary,\n border: `1px solid ${c.secondary}`,\n '&:hover': { backgroundColor: c.secondary, color: c['on-secondary'] },\n },\n // Solid\n tertiary: {\n backgroundColor: c.tertiary,\n color: c['on-tertiary'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n warn: {\n backgroundColor: c.warn,\n color: c['on-warn'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n success: {\n backgroundColor: c.success,\n color: c['on-success'],\n border: '0',\n '&:hover': { filter: 'brightness(0.92)' },\n },\n disabled: {\n backgroundColor: `${c.disabled} !important`,\n color: `${c['on-disabled']} !important`,\n border: '0',\n },\n },\n // Sizes are geometry only (height/padding/fontSize); families, weights and\n // transforms come from the `typeface` option's type-scale role.\n sizes: {\n sm: { height: 22, fontSize: 12, padding: '0 12px', fontWeight: 600 },\n md: { height: 26, fontSize: 16, padding: '0 16px' },\n lg: { height: 36, fontSize: 18, padding: '0 18px' },\n xl: { height: 48, fontSize: 24, padding: '0 22px' },\n },\n },\n iconButton: {\n options: { borderRadius: 'max' },\n // Focus ring colour per intent, as on `button`. The ring is drawn outside\n // the control, so it reads against the page rather than the fill — and it\n // is named here rather than derived from the variant, which is what left\n // the button's ring transparent on `ghost`.\n variantOptions: {\n primary: { focusColor: 'primary' },\n secondary: { focusColor: 'secondary' },\n tertiary: { focusColor: 'tertiary' },\n warn: { focusColor: 'warn' },\n success: { focusColor: 'success' },\n disabled: { focusColor: 'disabled' },\n ghost: { focusColor: 'primary' },\n },\n // Hover belongs to the variant, next to the colours it goes with. A filled\n // icon button lifts; the hollow one washes, because a shadow under a\n // transparent surface reads as a floating square. This used to be a\n // `variant === 'ghost'` branch inside the component, which meant no theme\n // could restyle either treatment and every consumer-registered intent was\n // classed with the filled ones by default.\n variants: {\n ghost: {\n backgroundColor: 'transparent',\n color: 'currentcolor',\n '&:hover': { backgroundColor: 'rgba(0,0,0,0.1)' },\n },\n primary: {\n backgroundColor: c.primary,\n color: c['on-primary'],\n '&:hover': { boxShadow: BaseShadows.raised },\n },\n secondary: {\n backgroundColor: c.secondary,\n color: c['on-secondary'],\n '&:hover': { boxShadow: BaseShadows.raised },\n },\n tertiary: {\n backgroundColor: c.tertiary,\n color: c['on-tertiary'],\n '&:hover': { boxShadow: BaseShadows.raised },\n },\n warn: {\n backgroundColor: c.warn,\n color: c['on-warn'],\n '&:hover': { boxShadow: BaseShadows.raised },\n },\n success: {\n backgroundColor: c.success,\n color: c['on-success'],\n '&:hover': { boxShadow: BaseShadows.raised },\n },\n // Deliberately no hover: this block is also spread into `&:disabled`, so\n // a hover here would give a disabled control a lift on pointer-over.\n disabled: {\n backgroundColor: 'transparent !important',\n color: `${c['on-disabled']} !important`,\n },\n },\n sizes: {\n sm: { height: 22, minHeight: 22, width: 22, minWidth: 22, fontSize: 18 },\n md: { height: 26, minHeight: 26, width: 26, minWidth: 26, fontSize: 22 },\n lg: { height: 36, minHeight: 36, width: 36, minWidth: 36, fontSize: 30 },\n xl: { height: 40, minHeight: 40, width: 40, minWidth: 40, fontSize: 34 },\n },\n },\n progressGauge: {\n fixed: { textFill: c['on-background'] },\n // Track = the role's container token (the palette's soft tint of that\n // role), arc = the role base — so gauges follow any brand palette instead\n // of the fixed pastels they used to hardcode.\n variants: {\n primary: { backgroundColor: c['primary-container'], color: c.primary },\n secondary: { backgroundColor: c['secondary-container'], color: c.secondary },\n tertiary: { backgroundColor: c['tertiary-container'], color: c.tertiary },\n warn: { backgroundColor: c['warn-container'], color: c.warn },\n success: { backgroundColor: c['success-container'], color: c.success },\n },\n sizes: {\n sm: { height: '54px' },\n md: { height: '68px' },\n lg: { height: '82px' },\n xl: { height: '104px' },\n },\n },\n card: {\n // The frame is tokens: the border primitive named by the active variant\n // (borders.primary … borders.success — override with `border` to pin all\n // cards to one primitive, e.g. a custom 'brush-stroke'), the radii scale\n // (`xs` = the classic 8px), and an optional elevation shadow.\n options: { borderRadius: 'xs' },\n fixed: { overflow: 'hidden', backgroundColor: c.background },\n },\n cardHeader: {\n fixed: { padding: '12px 24px' },\n variants: {\n primary: { backgroundColor: c.primary, color: c['on-primary'] },\n secondary: { backgroundColor: c.secondary, color: c['on-secondary'] },\n tertiary: { backgroundColor: c.tertiary, color: c['on-tertiary'] },\n warn: { backgroundColor: c.warn, color: c['on-warn'] },\n success: { backgroundColor: c.success, color: c['on-success'] },\n },\n },\n cardContent: { fixed: { padding: '12px 24px' } },\n dataSearch: {\n options: {\n border: 'light',\n borderRadius: 'xs',\n color: 'primary-surface',\n placeholderColor: 'disabled',\n },\n },\n dataTable: {\n options: {\n color: 'primary-surface',\n border: 'light',\n borderRadius: 'sm',\n elevation: undefined,\n headerPadding: 'sm',\n footerPadding: 'sm',\n thTextRole: 'headline-small',\n thColor: 'primary-container',\n thVerticalBorder: 'dotted',\n thHorizontalBorder: 'light',\n thPadding: 'sm',\n tdTextRole: 'title-small',\n tdColor: 'primary-surface',\n tdStickyColor: 'primary-container',\n tdPadding: 'sm',\n tdVerticalBorder: 'dotted',\n tdHorizontalBorder: 'light',\n rowHoverColor: 'primary-container',\n loadingOverlayColor: 'scrim',\n loadingSpinnerColor: 'primary',\n loadingSpinnerSize: 40,\n },\n },\n notificationBadge: { options: { borderRadius: 'sm', offset: -10 } },\n paginator: {\n options: {\n gap: 'xs',\n textRole: 'label',\n inputBorder: 'light',\n inputBorderRadius: 'xs',\n pageBorderRadius: 'xs',\n currentPageBorder: 'light',\n currentPageBorderRadius: 'xs',\n },\n },\n // KPI tile: card-recipe frame, muted label over a large `stat`-role value;\n // delta inks are the semantic success/error (direction × goodness decided\n // by the component); sparkline in the outline hue, endpoint in the accent.\n stat: {\n options: {\n labelTypeface: 'label',\n valueTypeface: 'stat',\n color: 'surface',\n border: 'light',\n borderRadius: 'xs',\n positiveColor: 'success',\n negativeColor: 'error',\n trendColor: 'outline',\n trendAccent: 'primary',\n padding: 'md',\n gap: 'xxs',\n },\n },\n // Bounded numeric input. Fill and thumb colour are deliberately NOT options\n // — they are the `variant` role pair, the rule every other component\n // follows, so `variant=\"warn\"` recolours a slider with no theme edit. The\n // track is a groove rather than an accent, so it stays a token. Geometry\n // knobs are plain px.\n slider: {\n options: {\n trackHeight: 4,\n trackColor: 'primary-container',\n borderRadius: 'max',\n thumbSize: 16,\n thumbBorderRadius: 'max',\n // WCAG 2.2 SC 2.5.8 floor. The visual dot stays `thumbSize`; the\n // transparent hit area around it grows to this.\n minTouchTarget: 24,\n markSize: 3,\n markColor: 'on-primary-container',\n labelTypeface: 'label',\n labelColor: 'on-surface-variant',\n tooltipColor: 'inverse-surface',\n tooltipTextColor: 'on-inverse-surface',\n tooltipShadow: 'menu',\n tooltipBorderRadius: 'xs',\n // Click-to-jump and keyboard only; a transition on a dragged thumb\n // reads as lag, so drag is deliberately unanimated.\n transitionMs: 120,\n },\n },\n // Loading placeholders paint with surface tokens so they sit naturally on\n // any theme; the shimmer highlight sweeps in the lighter surface color.\n skeleton: {\n options: {\n color: 'surface-variant',\n highlightColor: 'surface',\n borderRadius: 'xs',\n animation: 'shimmer',\n duration: 1.4,\n direction: 'ltr',\n highlightWidth: 40,\n gap: 'sm',\n },\n },\n snackbar: {\n options: { bottomPosition: 40, motion: 'notification', autoCloseDelay: 35000 },\n },\n symbol: { options: { fill: 0, weight: 400, grade: 0, opticalSize: 24 } },\n // Switch geometry, like tag and calendar, is enumerated per size token rather\n // than derived from one number — the track and knob proportions of a real\n // switch design are not a constant ratio across sizes.\n //\n // `padding` is the knob's inset, and everything else falls out of the three:\n // knob = height - 2 * padding, travel = width - height, radius = height / 2.\n // `lg` is BaseComponent's default size and reproduces the pre-`sizes`\n // geometry exactly (knob 16, travel 20), so no existing toggle moves.\n toggle: {\n options: { trackColor: 'surface-variant', knobColor: 'surface', motion: 'control' },\n variantOptions: SELECTION_ACCENTS,\n sizes: {\n sm: { width: 28, height: 16, padding: 3 },\n md: { width: 32, height: 18, padding: 3 },\n lg: { width: 40, height: 20, padding: 2 },\n },\n },\n tooltip: {\n options: {\n border: undefined,\n borderRadius: 'xs',\n shadow: 'raised',\n color: 'inverse-surface',\n typeface: 'label',\n },\n },\n // The spotlight ring color is deliberately not an option — it is the\n // callout's `variant` role. `scrimColor` is scheme-invariant, like\n // `::backdrop`.\n callout: {\n options: {\n color: 'primary-surface',\n borderRadius: 'xs',\n shadow: 'menu',\n width: '320px',\n padding: '16px',\n headerTypeface: 'title-small',\n typeface: 'label',\n closeSymbol: 'close',\n arrowSize: 8,\n offset: 12,\n scrimColor: 'rgba(0, 0, 0, 0.45)',\n spotlightPadding: 6,\n spotlightRadius: 'xs',\n ringWidth: 2,\n motion: 'panel',\n },\n },\n // Panel chrome, scrim and spotlight all come from the `callout` entry; the\n // tour deliberately has almost no skin of its own.\n tour: {\n options: {\n progressStyle: 'dots',\n footerGap: 'sm',\n },\n },\n});\n\n// ==========================================\n// Theme factory. A custom theme = a name + a `colors` map.\n// Everything color-dependent (borders, component variants) is derived;\n// `borders`/`components` overrides deep-merge over the derived defaults, so a\n// theme file can define its own named primitives and rewire per-component\n// options without restating anything it doesn't touch.\n// ==========================================\nexport interface ThemeConfig {\n id: string;\n name: string;\n colors: Colors;\n /**\n * Named icon primitives (inline SVG data URIs, masked with `currentColor`),\n * merged over {@link BaseIcons}. Add or override under any name; components\n * render them by token via the icon component, never by inlining SVG.\n */\n icons?: Icons;\n /** Override the radii scale, e.g. a generated shape-language preset. */\n radii?: Radii;\n /** Override the elevation shadows, e.g. brand-tinted generated stacks. */\n shadows?: Shadows;\n /**\n * Named motion primitives, merged over {@link BaseMotion}. Retime every\n * overlay at once by restating a token — components point at these by name\n * rather than carrying their own durations.\n */\n motion?: Motions;\n /**\n * Named backdrop primitives, merged over {@link BaseBackdrops}. Restate\n * `scrim` to redress every modal surface at once; add tokens under any name\n * and point a component's `backdrop` option at them.\n */\n backdrops?: Backdrops;\n /**\n * Sparse typography overrides, deep-merged over the base type scale:\n * restate only the roles — or the individual {@link TextStyle} fields\n * within a role — that change, and add product-specific roles under any\n * name. Untouched roles keep tracking the library defaults.\n */\n typography?: Record<TextRole | string, Partial<TextStyle>>;\n /**\n * Named border primitives, merged over the derived defaults. New tokens may\n * use any name — point component options (or `components` overrides) at\n * them and every consumer of the shared token picks up the change.\n */\n borders?: Borders;\n /**\n * Named thickness primitives, merged over the base scale (`thin`/`standard`/\n * `thick` stay unless restated). Extra tokens may use any name — e.g. a\n * `focusRing` thickness sets the shared focus ring's outline offset.\n */\n thicknesses?: Thicknesses;\n /**\n * Spacing steps, merged over the base scale (the named steps stay unless\n * restated). Extra tokens may use any name — `{ tight: '6px' }` is then a\n * valid `padding` / `gap` value everywhere — so an app's real rhythm does\n * not have to be forced onto a doubling scale.\n */\n spacing?: Spacing;\n /**\n * Sparse per-component overrides, deep-merged over the derived component\n * themes: only the sections you provide (fixed/variants/sizes/options keys)\n * are replaced; everything else keeps tracking the library defaults.\n */\n components?: ComponentThemes;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst deepMerge = <T>(base: T, override: Partial<T> | undefined): T => {\n if (!override) return base;\n const out = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override)) {\n out[key] = isRecord(value) && isRecord(out[key]) ? deepMerge(out[key], value) : value;\n }\n return out as T;\n};\n\nexport const createTheme = ({\n id,\n name,\n colors,\n icons = {},\n radii = BaseRadii,\n shadows = BaseShadows,\n motion,\n backdrops,\n typography,\n borders,\n thicknesses,\n spacing,\n components,\n}: ThemeConfig): UniTheme => ({\n id,\n name,\n colors,\n typography: deepMerge(BaseTypography, typography as Partial<Typography> | undefined),\n borders: deepMerge(buildBorders(colors), borders),\n radii,\n shadows,\n spacing: { ...BaseSpacing, ...spacing },\n motion: { ...BaseMotion, ...motion },\n backdrops: { ...BaseBackdrops, ...backdrops },\n thicknesses: { ...BaseThicknesses, ...thicknesses },\n icons: { ...BaseIcons, ...icons },\n components: deepMerge(buildComponents(colors), components),\n});\n\n/**\n * Re-attach the built-in icon set to a theme that traveled without it.\n *\n * A serialized theme is ~50 KB, ~71% of which is {@link BaseIcons} — bytes\n * every uni-core consumer already ships. Transports (MCP tool results, theme\n * JSON over HTTP) send the {@link dehydrateTheme} form and the receiver\n * hydrates, applying exactly the `{...BaseIcons, ...icons}` contract\n * {@link createTheme} applies at construction: the theme's own icons win,\n * built-ins fill the rest.\n */\nexport const hydrateTheme = (theme: UniTheme): UniTheme => ({\n ...theme,\n icons: { ...BaseIcons, ...theme.icons },\n});\n\n/**\n * The wire form of a theme: icons identical to the built-in set are dropped,\n * so only genuine overrides travel. Reverse with {@link hydrateTheme}.\n */\nexport const dehydrateTheme = (theme: UniTheme): UniTheme => ({\n ...theme,\n icons: Object.fromEntries(\n Object.entries(theme.icons).filter(([name, uri]) => BaseIcons[name as never] !== uri)\n ),\n});\n\n/**\n * Build a full {@link UniTheme} straight from a {@link PaletteConfig} — the\n * one-call path a theme builder uses to turn a brand color (or a seed +\n * scheme + category) into a complete, ready-to-apply theme.\n */\nexport const createThemeFromPalette = (\n config: GenerateColorsConfig & { id?: string; name?: string; icons?: Icons; radii?: Radii }\n): UniTheme => {\n const colors = generatePalette(config);\n return createTheme({\n id: config.id ?? 'CustomTheme',\n name: config.name ?? 'Custom Theme',\n colors,\n radii: config.radii,\n shadows: generateShadows(colors, config.mode ?? 'light'),\n icons: config.icons,\n });\n};\n\n/**\n * Seed for the shipped Light/Dark themes. Swap these three values (or call\n * `generatePalette` with your own) to reskin the entire system — every color\n * token is derived, so there is nothing else to hand-author.\n */\nexport const BASE_PALETTE_CONFIG: Pick<PaletteConfig, 'seed' | 'scheme' | 'category'> = {\n seed: '#4F46E5', // indigo\n scheme: 'triadic',\n category: 'neutral',\n};\n\nexport const lightColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'light' });\n\nexport const BaseTheme: UniTheme = createTheme({\n id: 'BaseTheme',\n name: 'Base Theme',\n colors: lightColors,\n});\n","import type { ColorCategory, ColorScheme } from '../color/color.types';\nimport type { Radii, UniTheme } from '../theme/theme.model';\nimport type { BrandRole } from '../color/color.factory';\nimport { createTheme } from '../theme/themes/base.theme';\nimport { hexToOklch, oklchToHex } from './oklch.helper';\nimport { CategoryChroma, generateColors } from './palette.factory';\nimport { generateShadows } from './shadow.generator';\nimport type {\n ContrastCheck,\n ContrastReport,\n GeneratedThemeConfig,\n GenerationInput,\n ThemeShape,\n} from './generation.types';\n\n/** Radii presets per shape language (PRD §3.5.A). Same keys as `BaseRadii`. */\nexport const ShapeRadii: Record<ThemeShape, Radii> = {\n sharp: { none: 'none', xxs: '0px', xs: '0px', sm: '0px', md: '0px', lg: '0px', max: '0px' },\n modern: { none: 'none', xxs: '4px', xs: '8px', sm: '16px', md: '24px', lg: '32px', max: '999px' },\n playful: { none: 'none', xxs: '8px', xs: '16px', sm: '24px', md: '32px', lg: '48px', max: '9999px' },\n};\n\n/** Shortest angular distance between two hue angles, in degrees (0–180). */\nconst hueDistance = (a: number, b: number): number => {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n};\n\n/**\n * Classify 2–3 brand hues against {@link ColorScheme} by their angular\n * distances from the primary hue. Heuristic bands, widest match wins.\n */\nexport const classifyScheme = (primaryHue: number, otherHues: number[]): ColorScheme => {\n const distances = otherHues.map((h) => hueDistance(primaryHue, h));\n if (distances.length === 0) return 'analogous';\n if (distances.every((d) => d < 15)) return 'monochromatic';\n if (distances.every((d) => d <= 65)) return 'analogous';\n if (distances.some((d) => d >= 165)) return 'complimentary';\n if (distances.length > 1 && distances.every((d) => d >= 130)) return 'splitComplimentary';\n return 'triadic';\n};\n\n/**\n * Infer a tonal category from the seed's own chroma, so an unstated \"vibe\"\n * preserves the brand's character — vivid stays vivid, muted stays muted.\n */\nexport const inferCategory = (seedHex: string): ColorCategory => {\n const { c } = hexToOklch(seedHex);\n if (c >= 0.13) return 'jewel';\n if (c >= 0.07) return 'earth';\n if (c >= 0.03) return 'pastel';\n return 'neutral';\n};\n\n/**\n * The theme generation engine (PRD §3.3): brand seed(s) in, complete WCAG-AA\n * light+dark {@link Colors} pair out, with a machine-readable contrast report.\n * Pure and deterministic — identical input yields identical output.\n */\nexport const generateThemes = (input: GenerationInput): GeneratedThemeConfig => {\n const seeds = (Array.isArray(input.seed) ? input.seed : [input.seed]).slice(0, 3);\n const [primary, secondary, tertiary] = seeds;\n const scheme =\n input.scheme ??\n (seeds.length > 1\n ? classifyScheme(hexToOklch(primary).h, seeds.slice(1).map((s) => hexToOklch(s).h))\n : 'analogous');\n const category = input.vibe ?? inferCategory(primary);\n\n // Seeds pass through as soft targets with their own chroma (brand fidelity).\n // Only an *explicit* vibe caps them to the category's chroma ceiling.\n const applyVibe = (hex: string): string => {\n if (!input.vibe) return hex;\n const color = hexToOklch(hex);\n return oklchToHex({ ...color, c: Math.min(color.c, CategoryChroma[input.vibe]) });\n };\n const targets: Partial<Record<BrandRole, string>> = { primary: applyVibe(primary) };\n if (secondary) targets.secondary = applyVibe(secondary);\n if (tertiary) targets.tertiary = applyVibe(tertiary);\n\n const checks: ContrastCheck[] = [];\n const base = { seed: primary, scheme, category, targets, checks };\n const lightColors = generateColors({ ...base, mode: 'light' });\n const darkColors = generateColors({ ...base, mode: 'dark' });\n\n const worstRatio = checks.reduce((worst, check) => Math.min(worst, check.ratio), 21);\n return {\n lightColors,\n darkColors,\n radii: input.shape ? ShapeRadii[input.shape] : undefined,\n lightShadows: generateShadows(lightColors, 'light'),\n darkShadows: generateShadows(darkColors, 'dark'),\n report: { checks, worstRatio, pass: checks.every((check) => check.pass) },\n };\n};\n\n/**\n * One-line human summary of a {@link ContrastReport}. Shared so the generated\n * theme file's header and the MCP's theme tools report identical wording.\n */\nexport const summarizeContrast = (report: ContrastReport): string =>\n `${report.checks.length} contrast pairs checked · worst ${report.worstRatio}:1 · ${\n report.pass ? 'all AA' : `${report.checks.filter((check) => !check.pass).length} failing`\n }`;\n\n/**\n * Convenience wrapper: {@link generateThemes} piped through `createTheme()`,\n * returning a registration-ready light/dark {@link UniTheme} pair alongside\n * the contrast report the colors were audited against.\n */\nexport const generateUniThemes = (\n input: GenerationInput\n): { light: UniTheme; dark: UniTheme; report: ContrastReport } => {\n const { lightColors, darkColors, radii, lightShadows, darkShadows, report } =\n generateThemes(input);\n const name = input.name ?? 'Brand';\n const id = name.replace(/\\W+/g, '') || 'Brand';\n return {\n light: createTheme({\n id: `${id}Light`,\n name: `${name} Light`,\n colors: lightColors,\n radii,\n shadows: lightShadows,\n }),\n dark: createTheme({\n id: `${id}Dark`,\n name: `${name} Dark`,\n colors: darkColors,\n radii,\n shadows: darkShadows,\n }),\n report,\n };\n};\n","import type { Colors, Shadows } from '../theme/theme.model';\nimport { generateThemes, summarizeContrast } from './theme.generator';\nimport type { ContrastReport, GenerationInput } from './generation.types';\n\nexport interface ThemeFileInput extends GenerationInput {\n /** Emit the dark theme alongside the light one. Defaults to true. */\n darkMode?: boolean;\n}\n\n/** A rendered static theme file plus everything a consumer needs to wire it. */\nexport interface EmittedThemeFile {\n /** TypeScript source for a static `uni-theme.ts` — plain, reviewable data. */\n content: string;\n /** Registration snippet for the consumer's `app.config.ts`. */\n providerSnippet: string;\n report: ContrastReport;\n /** One-line human summary of the contrast report. */\n reportSummary: string;\n}\n\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst asKey = (k: string): string => (IDENT.test(k) ? k : `'${k}'`);\n\nconst recordLiteral = (record: Record<string, string | undefined>, indent: string): string =>\n Object.entries(record)\n .map(([k, v]) => `${indent}${asKey(k)}: '${v}',`)\n .join('\\n');\n\n// The derived border primitives, spelled out as template literals over the\n// colors const — visible, editable, and edits to a color propagate. Access is\n// bracket-only: `Colors` carries an index signature, and consumer tsconfigs\n// with `noPropertyAccessFromIndexSignature` (ng new strict default) reject\n// dot access on it.\nconst bordersLiteral = (): string =>\n [\n '/**',\n ' * Named border primitives. These mirror the derived defaults — edit them, or',\n ' * add your own under any token name and point component options (or the',\n ' * `components` overrides below) at it. Every component deriving from a',\n ' * shared token picks up the change.',\n ' */',\n 'const borders = (colors: Colors): Borders => ({',\n \" primary: `1px solid ${colors['primary']}`,\",\n \" secondary: `1px solid ${colors['secondary']}`,\",\n \" tertiary: `1px solid ${colors['tertiary']}`,\",\n \" quaternary: `1px solid ${colors['quaternary']}`,\",\n \" warn: `1px solid ${colors['warn']}`,\",\n \" success: `1px solid ${colors['success']}`,\",\n \" light: `1px solid ${colors['outline']}`,\",\n \" dark: `1px solid ${colors['on-background']}`,\",\n \" dotted: `1px dotted ${colors['on-background']}`,\",\n '});',\n ].join('\\n');\n\nconst themeExport = (\n exportName: string,\n displayName: string,\n colorsConst: string,\n shadowsConst: string,\n radii: boolean\n): string =>\n [\n `export const ${exportName}: UniTheme = createTheme({`,\n ` id: '${exportName}',`,\n ` name: '${displayName}',`,\n ` colors: ${colorsConst},`,\n ` borders: borders(${colorsConst}),`,\n ` components: components(${colorsConst}),`,\n ` shadows: ${shadowsConst},`,\n ' icons,',\n ...(radii ? [' radii,'] : []),\n ' spacing,',\n '});',\n ].join('\\n');\n\n/**\n * Render a static `uni-theme.ts` from a brand seed — the file the `ng add`\n * schematic writes and the MCP `generate_uni_theme` tool returns.\n *\n * The file is the system's **source of truth**: literal colors, the border\n * primitives spelled out, and a sparse `components` override section — so a\n * human (or an AI agent) can retheme by editing tokens in place, with no\n * runtime generation. Deterministic: same input, same file.\n */\nexport const emitThemeFile = (input: ThemeFileInput): EmittedThemeFile => {\n const { darkMode = true, name = 'Brand' } = input;\n const { lightColors, darkColors, radii, lightShadows, darkShadows, report } =\n generateThemes(input);\n const id = (name.replace(/\\W+/g, '') || 'Brand') as string;\n\n const seeds = Array.isArray(input.seed) ? input.seed : [input.seed];\n const regenerate = [\n `--brand=${seeds.join(',')}`,\n input.vibe && `--vibe=${input.vibe}`,\n input.scheme && `--scheme=${input.scheme}`,\n input.shape && `--shape=${input.shape}`,\n !darkMode && '--dark-mode=false',\n ]\n .filter(Boolean)\n .join(' ');\n\n const reportSummary = summarizeContrast(report);\n\n const modes: {\n exportName: string;\n displayName: string;\n colorsConst: string;\n colors: Colors;\n shadowsConst: string;\n shadows: Shadows;\n }[] = [\n {\n exportName: `${id}Light`,\n displayName: `${name} Light`,\n colorsConst: 'lightColors',\n colors: lightColors,\n shadowsConst: 'lightShadows',\n shadows: lightShadows,\n },\n ...(darkMode\n ? [\n {\n exportName: `${id}Dark`,\n displayName: `${name} Dark`,\n colorsConst: 'darkColors',\n colors: darkColors,\n shadowsConst: 'darkShadows',\n shadows: darkShadows,\n },\n ]\n : []),\n ];\n\n const content = [\n '/**',\n ` * ${name} theme for Uni — generated data, yours to edit.`,\n ' *',\n ` * Regenerate colors: ng add @uni-design-system/uni-angular ${regenerate}`,\n ' * (or the `generate-uni-theme` MCP tool). Edits are never overwritten silently —',\n ' * regeneration rewrites this file, so commit before regenerating.',\n ` * ${reportSummary}.`,\n ' */',\n 'import {',\n ' createTheme,',\n ' type Borders,',\n ' type Colors,',\n ' type ComponentThemes,',\n ' type Icons,',\n ' type Shadows,',\n ' type Spacing,',\n ' type UniTheme,',\n \"} from '@uni-design-system/uni-core';\",\n '',\n ...modes.map(\n ({ colorsConst, colors }) =>\n `const ${colorsConst}: Colors = {\\n${recordLiteral(colors as Record<string, string>, ' ')}\\n};\\n`\n ),\n '/** Brand-tinted elevation shadows — theme-scoped, edit freely. */',\n ...modes.map(\n ({ shadowsConst, shadows }) =>\n `const ${shadowsConst}: Shadows = {\\n${recordLiteral(shadows as Record<string, string>, ' ')}\\n};\\n`\n ),\n bordersLiteral(),\n '',\n '/**',\n ' * Sparse component overrides, deep-merged over Uni component defaults: only',\n ' * what you write here changes. Point components at your own primitives, e.g.:',\n \" * button: { variants: { secondary: { border: `2px dashed ${colors['tertiary']}` } } },\",\n \" * input: { options: { borderRadius: 'max' } },\",\n ' */',\n 'const components = (colors: Colors): ComponentThemes => ({});',\n '',\n '/**',\n ' * Icon primitives, merged over the built-in 61-icon set per name: reuse a',\n ' * built-in name to reskin it, or add any new name. Define an icon ONCE here',\n \" * and render it anywhere via `<uni-icon name='…'/>` — never inline SVG in\",\n ' * components.',\n ' *',\n ' * Encode your own SVGs with `svgToIconUri` rather than by hand — it strips',\n ' * fixed width/height, escapes the URI and rejects artwork that cannot',\n ' * survive masking:',\n ' *',\n \" * import { svgToIconUri } from '@uni-design-system/uni-core';\",\n \" * const icons: Icons = { logo: svgToIconUri(readFileSync('logo.svg', 'utf8')) };\",\n ' *',\n ' * Icons are masked with currentColor, so they recolor with the theme — but',\n ' * that also means they are MONOCHROME: the mask uses the alpha channel, so a',\n ' * multi-color mark flattens to its silhouette. Keep one grid (viewBox) across',\n ' * your set, or the glyphs will not share an optical weight.',\n ' */',\n 'const icons: Icons = {};',\n '',\n '/**',\n ' * Spacing steps, merged over the base scale',\n \" * (none: 0, xxs: 2px, xs: 4px, sm: 8px, md: 16px, lg: 32px, xl: 64px, xxl: 128px).\",\n ' * Restate a named step to retune the rhythm, and add your own names for the',\n ' * gaps your design actually uses — every extra key is then a valid `padding`,',\n \" * `gap` or `marginInline` value: `<div stack-layout gap='tight'>`.\",\n ' */',\n 'const spacing: Spacing = {};',\n '',\n ...(radii\n ? [\n `/** Shape language: '${input.shape}'. */`,\n `const radii = {\\n${recordLiteral(radii as Record<string, string>, ' ')}\\n};`,\n '',\n ]\n : []),\n ...modes.map(\n ({ exportName, displayName, colorsConst, shadowsConst }) =>\n `${themeExport(exportName, displayName, colorsConst, shadowsConst, !!radii)}\\n`\n ),\n '/** First key wins as the default theme when registered via UNI_THEMES. */',\n `export const ${id}Themes = { ${modes.map((m) => m.exportName).join(', ')} };`,\n '',\n ].join('\\n');\n\n const providerSnippet = [\n `import { UNI_THEMES } from '@uni-design-system/uni-angular';`,\n `import { ${id}Themes } from './uni-theme';`,\n '',\n '// app.config.ts → providers:',\n `{ provide: UNI_THEMES, useValue: ${id}Themes },`,\n ].join('\\n');\n\n return { content, providerSnippet, report, reportSummary };\n};\n","import { Gradient } from './gradient.model';\n\nexport function gradient(config: Gradient): string {\n return ``;\n}\n","/**\n * Turns a raw SVG source string into an icon primitive — the inline data URI\n * form `uni-icon` renders as a CSS mask over `currentColor`.\n *\n * This is the path for bringing your own icons (a brand set, a designer\n * handoff) into a theme. The built-in `BaseIcons` are generated separately\n * from Material Symbols; everything you add goes through here:\n *\n * ```ts\n * const icons: Icons = {\n * acmeLogo: svgToIconUri(readFileSync('brand/logo.svg', 'utf8')),\n * search: svgToIconUri(readFileSync('brand/search.svg', 'utf8')),\n * };\n * createTheme({ id: 'Acme', name: 'Acme', colors, icons });\n * ```\n *\n * `createTheme` merges these over `BaseIcons` per name, so reusing a built-in\n * name reskins it and any new name is simply added.\n */\n\nexport interface SvgToIconUriOptions {\n /**\n * Accept an SVG that paints in more than one color. Masks are monochrome —\n * the artwork is flattened to its silhouette and takes `currentColor` — so\n * this is rejected by default to catch logos that were never going to\n * survive the pipeline. Set this when a silhouette is what you want.\n */\n allowMultiColor?: boolean;\n /** Name used in error messages, so a failing icon in a set is identifiable. */\n name?: string;\n}\n\n/** Paint values that produce no pixels, and so never count as a color. */\nconst BLANK_PAINT = new Set(['none', 'transparent', 'inherit', '']);\n\n/** Collect every distinct paint value the artwork actually renders with. */\nfunction paintValues(svg: string): string[] {\n const found = new Set<string>();\n\n for (const [, value] of svg.matchAll(/\\b(?:fill|stroke)\\s*=\\s*[\"']([^\"']*)[\"']/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n // `style=\"fill:#fff\"` — same meaning, different syntax.\n for (const [, , value] of svg.matchAll(/\\b(fill|stroke)\\s*:\\s*([^;\"'}]+)/g)) {\n const paint = value.trim().toLowerCase();\n if (!BLANK_PAINT.has(paint)) found.add(paint);\n }\n\n return [...found];\n}\n\n/**\n * Strip everything that stops an SVG scaling to the box it is masked into, and\n * collapse it to one line. Fixed `width`/`height` are removed rather than\n * rejected — designers export them by default and they carry no information\n * the `viewBox` doesn't already have.\n */\nfunction normalize(svg: string): string {\n return svg\n .replace(/<\\?xml[^>]*\\?>/g, '')\n .replace(/<!DOCTYPE[^>]*>/gi, '')\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/\\s(width|height)\\s*=\\s*[\"'][^\"']*[\"']/g, '')\n .replace(/\\s+/g, ' ')\n .replace(/>\\s+</g, '><')\n .trim();\n}\n\n/**\n * Percent-encode only what a data URI requires. SVG attributes are switched to\n * single quotes so the result drops straight into a double-quoted TypeScript\n * string with no escaping — and stays readable, unlike base64.\n */\nfunction encode(svg: string): string {\n return (\n 'data:image/svg+xml,' +\n svg\n .replace(/\"/g, \"'\")\n .replace(/%/g, '%25')\n .replace(/#/g, '%23')\n .replace(/</g, '%3c')\n .replace(/>/g, '%3e')\n );\n}\n\n/**\n * Encode an SVG string as a mask-ready icon data URI, validating that it will\n * actually survive the mask pipeline.\n *\n * Throws when the source is not a complete `<svg>` document, has no `viewBox`\n * (it could not scale), references an external or raster image, or paints in\n * more than one color (see {@link SvgToIconUriOptions.allowMultiColor}).\n */\nexport function svgToIconUri(svg: string, options: SvgToIconUriOptions = {}): string {\n const label = options.name ? `${options.name}: ` : '';\n const fail = (message: string): never => {\n throw new Error(`${label}${message}`);\n };\n\n if (typeof svg !== 'string' || !svg.trim()) fail('empty SVG source');\n\n const normalized = normalize(svg);\n\n if (!/^<svg[\\s>]/i.test(normalized) || !/<\\/svg>$/i.test(normalized)) {\n fail('not a complete <svg> document');\n }\n\n // Without a viewBox the mask has no intrinsic ratio to scale by, and\n // `uni-icon` sizes itself from its container.\n if (!/\\bviewBox\\s*=\\s*[\"'][^\"']+[\"']/i.test(normalized)) {\n fail('no viewBox — the icon could not scale to its container');\n }\n\n // A mask is rendered as an isolated image: it cannot fetch anything, so an\n // external reference silently renders nothing.\n if (/<image\\b/i.test(normalized)) {\n fail('contains a raster <image>; masks need vector artwork');\n }\n if (/\\b(?:xlink:)?href\\s*=\\s*[\"'](?!#)/i.test(normalized)) {\n fail('references an external resource, which a masked SVG cannot load');\n }\n\n if (!options.allowMultiColor) {\n const paints = paintValues(normalized);\n if (paints.some((p) => p.startsWith('url('))) {\n fail(\n 'paints with a gradient or pattern — masks use the alpha channel only, ' +\n 'so it would flatten to a silhouette. Pass { allowMultiColor: true } to accept that.'\n );\n }\n if (paints.length > 1) {\n fail(\n `paints in ${paints.length} colors (${paints.join(', ')}) — masks use the alpha ` +\n 'channel only, so it would flatten to a silhouette in currentColor. ' +\n 'Pass { allowMultiColor: true } to accept that.'\n );\n }\n }\n\n return encode(normalized);\n}\n","import { Size } from '../core.types';\nimport { DeviceOrientation } from './layout.types';\n\nexport function getDeviceSize(height: number, width: number): Size {\n if (!height || !width) return 'md';\n\n const max = Math.max(height, width);\n\n if (max <= 600)\n // Small Mobile\n return 'xs';\n\n if (max <= 960)\n // Large Mobile\n return 'sm';\n\n if (max <= 1264)\n // Tablets\n return 'md';\n\n if (max <= 1904)\n // Laptops & Monitors\n return 'lg';\n\n return 'xl'; // Large Monitors\n}\n\nexport function getDeviceOrientation(height: number, width: number): DeviceOrientation {\n if (!height || !width) return 'landscape';\n\n return height > width ? 'portrait' : 'landscape';\n}\n","import { BoxShadow, ShadowDefinition } from './shadow.model';\n\n// box-shadow: none|h-offset v-offset blur spread color\nexport const GetBoxShadow = ({ offset, blur, opacity }: BoxShadow): string => {\n return `0 ${offset}px ${blur}px rgba(0,0,0,0.${opacity})`;\n};\n\nexport const GetBoxShadows = ({ umbra, penumbra }: ShadowDefinition): string => {\n return GetBoxShadow(umbra) + ', ' + GetBoxShadow(penumbra);\n};\n","import { ShadowDefinition } from './shadow.model';\nimport { ShadowElevation } from './shadow.types';\nimport { GetBoxShadows } from './shadow.utils';\n\nexport const ShadowMap: Record<ShadowElevation, ShadowDefinition> = {\n pressed: {\n umbra: {\n offset: 1,\n blur: 2,\n opacity: 24,\n },\n penumbra: {\n offset: 1,\n blur: 3,\n opacity: 12,\n },\n },\n raised: {\n umbra: {\n offset: 3,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 3,\n blur: 6,\n opacity: 16,\n },\n },\n focussed: {\n umbra: {\n offset: 6,\n blur: 6,\n opacity: 23,\n },\n penumbra: {\n offset: 10,\n blur: 20,\n opacity: 19,\n },\n },\n navigation: {\n umbra: {\n offset: 10,\n blur: 10,\n opacity: 22,\n },\n penumbra: {\n offset: 14,\n blur: 28,\n opacity: 25,\n },\n },\n modal: {\n umbra: {\n offset: 15,\n blur: 12,\n opacity: 22,\n },\n penumbra: {\n offset: 19,\n blur: 38,\n opacity: 30,\n },\n },\n};\n\nexport const ShadowCssMap: Record<ShadowElevation, string> = {\n pressed: GetBoxShadows(ShadowMap['pressed']),\n raised: GetBoxShadows(ShadowMap['raised']),\n focussed: GetBoxShadows(ShadowMap['focussed']),\n navigation: GetBoxShadows(ShadowMap['navigation']),\n modal: GetBoxShadows(ShadowMap['modal']),\n};\n","import type { StyleExpression } from './style.types';\n\nexport const removeInputPlatformStyling: StyleExpression = {\n appearance: 'none' /* Removes default platform styling */,\n background: 'none' /* Removes default background */,\n border: 'none' /* Removes default gray border */,\n outline: 'none' /* Removes default focus ring */,\n boxShadow: 'none' /* Removes any inner shadows on iOS */,\n padding: 0 /* Resets default spacing */,\n width: '100%' /* Makes it fill the stylized div */,\n};\n","import type { Colors } from '../theme.model';\nimport { generatePalette } from '../../color';\nimport { generateShadows } from '../../generation/shadow.generator';\nimport { BASE_PALETTE_CONFIG, createTheme } from './base.theme';\n\nexport const darkColors: Colors = generatePalette({ ...BASE_PALETTE_CONFIG, mode: 'dark' });\n\nexport const DarkTheme = createTheme({\n id: 'DarkTheme',\n name: 'Dark Theme',\n colors: darkColors,\n shadows: generateShadows(darkColors, 'dark'),\n});\n","import { generateShadows } from '../../generation/shadow.generator';\nimport { createTheme, lightColors } from './base.theme';\n\nexport const LightTheme = createTheme({\n id: 'LightTheme',\n name: 'Light Theme',\n colors: lightColors,\n shadows: generateShadows(lightColors, 'light'),\n});\n","import { type UniTheme } from './theme.model';\nimport { DarkTheme } from './themes/dark.theme';\nimport { LightTheme } from './themes/light.theme';\n\nexport const UniThemes: Record<string, UniTheme> = {\n LightTheme,\n DarkTheme,\n};\n\n// First Theme is default.\nexport const DefaultThemeId = Object.keys(UniThemes)[0];\n","import type { UniTheme } from './theme.model';\nimport type { TextRole } from '../typography';\n\n/**\n * Dependency-free structural validation for {@link UniTheme}.\n *\n * Every theme scale is `Partial<Record<…>>`, so a malformed theme — hand\n * written, generated, or fetched as JSON — renders as silent `undefined` CSS.\n * `parseTheme` is the acceptance/rejection-with-reasons contract that every\n * theme write funnels through: the Angular `ThemeService`, the MCP theme\n * tools, and any future runtime registry all share these rules. It collects\n * every issue rather than failing fast, so a rejected theme comes back with\n * the complete repair list.\n */\n\n/** One reason a candidate theme was rejected, anchored to a dotted path. */\nexport interface ThemeIssue {\n /** Dotted location, e.g. `colors.primary` or `typography.label.fontSize`. */\n path: string;\n message: string;\n}\n\nexport type ThemeParseResult =\n | { success: true; theme: UniTheme; issues: [] }\n | { success: false; theme?: undefined; issues: ThemeIssue[] };\n\n/**\n * Color tokens components cannot render without: the default variant pairs,\n * the base surfaces, and the disabled/warn states. Themes may define any\n * further tokens; these must exist.\n */\nexport const REQUIRED_COLOR_TOKENS = [\n 'primary',\n 'on-primary',\n 'primary-container',\n 'on-primary-container',\n 'primary-surface',\n 'on-primary-surface',\n 'surface',\n 'on-surface',\n 'background',\n 'on-background',\n 'warn',\n 'on-warn',\n 'disabled',\n 'on-disabled',\n 'outline',\n 'transparent',\n] as const;\n\n/** The canonical type scale; every theme must style each role. */\nexport const REQUIRED_TEXT_ROLES: readonly TextRole[] = [\n 'display-large',\n 'display-medium',\n 'display-small',\n 'headline-large',\n 'headline-medium',\n 'headline-small',\n 'title-large',\n 'title-medium',\n 'title-small',\n 'body-1-long',\n 'body-1-short',\n 'body-2-long',\n 'body-2-short',\n 'subtitle-1',\n 'subtitle-2',\n 'label',\n 'button',\n 'caption',\n 'overline',\n 'paragraph',\n 'quote',\n 'note',\n] as const;\n\nexport const REQUIRED_SPACING_SIZES = ['none', 'xxs', 'xs', 'sm', 'md', 'lg', 'xl'] as const;\nexport const REQUIRED_RADII_SIZES = ['none', 'xxs', 'xs', 'sm', 'md', 'lg', 'max'] as const;\nexport const REQUIRED_SHADOWS = ['raised', 'menu', 'dialog', 'warn'] as const;\nexport const REQUIRED_THICKNESSES = ['thin', 'standard', 'thick'] as const;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isCssValue = (value: unknown): value is string | number =>\n typeof value === 'string' || typeof value === 'number';\n\n/** Nested style expression: string/number leaves, objects for selectors. */\nconst checkStyleExpression = (value: unknown, path: string, issues: ThemeIssue[]): void => {\n if (!isRecord(value)) {\n issues.push({ path, message: 'must be a style object' });\n return;\n }\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined || isCssValue(entry)) continue;\n if (isRecord(entry)) {\n checkStyleExpression(entry, `${path}.${key}`, issues);\n } else {\n issues.push({ path: `${path}.${key}`, message: 'must be a string, number, or nested style object' });\n }\n }\n};\n\nconst checkStringRecord = (\n value: unknown,\n path: string,\n issues: ThemeIssue[],\n required: readonly string[] = [],\n allowNumbers = false\n): void => {\n if (!isRecord(value)) {\n issues.push({ path, message: 'must be an object' });\n return;\n }\n for (const key of required) {\n if (!(key in value)) issues.push({ path: `${path}.${key}`, message: 'is required' });\n }\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined) continue;\n const ok = allowNumbers ? isCssValue(entry) : typeof entry === 'string';\n if (!ok) {\n issues.push({\n path: `${path}.${key}`,\n message: allowNumbers ? 'must be a string or number' : 'must be a string',\n });\n }\n }\n};\n\nconst checkTypography = (value: unknown, issues: ThemeIssue[]): void => {\n if (!isRecord(value)) {\n issues.push({ path: 'typography', message: 'must be an object' });\n return;\n }\n for (const role of REQUIRED_TEXT_ROLES) {\n if (!(role in value)) issues.push({ path: `typography.${role}`, message: 'is required' });\n }\n for (const [role, style] of Object.entries(value)) {\n if (!isRecord(style)) {\n issues.push({ path: `typography.${role}`, message: 'must be a TextStyle object' });\n continue;\n }\n if (typeof style['fontFamily'] !== 'string') {\n issues.push({ path: `typography.${role}.fontFamily`, message: 'must be a string' });\n }\n for (const field of ['fontSize', 'lineHeight']) {\n if (!isCssValue(style[field])) {\n issues.push({ path: `typography.${role}.${field}`, message: 'must be a string or number' });\n }\n }\n }\n};\n\nconst checkComponents = (value: unknown, issues: ThemeIssue[]): void => {\n if (!isRecord(value)) {\n issues.push({ path: 'components', message: 'must be an object' });\n return;\n }\n for (const [name, entry] of Object.entries(value)) {\n if (entry === undefined) continue;\n if (!isRecord(entry)) {\n issues.push({ path: `components.${name}`, message: 'must be a component theme object' });\n continue;\n }\n if (entry['fixed'] !== undefined) {\n checkStyleExpression(entry['fixed'], `components.${name}.fixed`, issues);\n }\n for (const section of ['variants', 'sizes']) {\n const styles = entry[section];\n if (styles === undefined) continue;\n if (!isRecord(styles)) {\n issues.push({ path: `components.${name}.${section}`, message: 'must be an object' });\n continue;\n }\n for (const [key, style] of Object.entries(styles)) {\n if (style !== undefined) {\n checkStyleExpression(style, `components.${name}.${section}.${key}`, issues);\n }\n }\n }\n // `variantOptions` is per-variant *data* the component reads, not CSS it\n // applies, so its entries get a shape check and deliberately not\n // `checkStyleExpression` — the keys are role names like `accent`.\n const variantOptions = entry['variantOptions'];\n if (variantOptions !== undefined) {\n if (!isRecord(variantOptions)) {\n issues.push({ path: `components.${name}.variantOptions`, message: 'must be an object' });\n } else {\n for (const [key, roles] of Object.entries(variantOptions)) {\n if (roles !== undefined && !isRecord(roles)) {\n issues.push({\n path: `components.${name}.variantOptions.${key}`,\n message: 'must be an object',\n });\n }\n }\n }\n }\n if (entry['options'] !== undefined && !isRecord(entry['options'])) {\n issues.push({ path: `components.${name}.options`, message: 'must be an object' });\n }\n }\n};\n\n/**\n * Validate a candidate theme, collecting every structural issue. Never\n * throws; a failed result carries the complete repair list.\n */\nexport const parseTheme = (input: unknown): ThemeParseResult => {\n const issues: ThemeIssue[] = [];\n\n if (!isRecord(input)) {\n return { success: false, issues: [{ path: '', message: 'theme must be an object' }] };\n }\n\n for (const field of ['id', 'name']) {\n if (typeof input[field] !== 'string' || input[field] === '') {\n issues.push({ path: field, message: 'must be a non-empty string' });\n }\n }\n\n checkStringRecord(input['colors'], 'colors', issues, REQUIRED_COLOR_TOKENS);\n checkTypography(input['typography'], issues);\n checkStringRecord(input['borders'], 'borders', issues);\n checkStringRecord(input['radii'], 'radii', issues, REQUIRED_RADII_SIZES);\n checkStringRecord(input['shadows'], 'shadows', issues, REQUIRED_SHADOWS);\n checkStringRecord(input['spacing'], 'spacing', issues, REQUIRED_SPACING_SIZES, true);\n checkStringRecord(input['thicknesses'], 'thicknesses', issues, REQUIRED_THICKNESSES, true);\n checkStringRecord(input['icons'], 'icons', issues);\n checkComponents(input['components'], issues);\n\n return issues.length === 0\n ? { success: true, theme: input as unknown as UniTheme, issues: [] }\n : { success: false, issues };\n};\n\n/** Format issues for logs and error messages. */\nexport const formatThemeIssues = (issues: ThemeIssue[]): string =>\n issues.map(({ path, message }) => (path ? `${path} ${message}` : message)).join('; ');\n\n/** Validate or throw, with every reason in the error message. */\nexport const assertTheme = (input: unknown): UniTheme => {\n const result = parseTheme(input);\n if (!result.success) {\n throw new Error(`Invalid UniTheme: ${formatThemeIssues(result.issues)}`);\n }\n return result.theme;\n};\n\nexport const isUniTheme = (input: unknown): input is UniTheme => parseTheme(input).success;\n","import { FontWeight } from './typography.types';\n\nexport const FontWeightMap: Record<FontWeight, number> = {\n thin: 100,\n 'extra-light': 200,\n light: 200,\n normal: 400,\n medium: 500,\n 'semi-bold': 600,\n bold: 700,\n 'extra-bold': 800,\n black: 900,\n 'extra-black': 950,\n};\n","import type { CssLength, TextStyle, TypeFaceDefinition } from './text.model';\nimport type { FontWeight } from './typography.types';\nimport { FontWeightMap } from './typography.records';\n\nconst px = (value: CssLength): string => (typeof value === 'number' ? `${value}px` : value);\n\n// Keyword weights ('medium', 'semi-bold', …) are design tokens, not valid CSS\n// font-weight values — resolve them to their numeric equivalents.\nconst weight = (value: FontWeight): number =>\n typeof value === 'number' ? value : FontWeightMap[value];\n\n/**\n * Converts a TextStyle (numeric, design-token oriented) into a\n * TypeFaceDefinition (CSS-ready) so a theme's `typefaces` map can be\n * derived from its `typography` block instead of being duplicated.\n */\nexport const toTypeface = (style: TextStyle): TypeFaceDefinition => ({\n fontFamily: style.fontFamily,\n fontSize: px(style.fontSize),\n lineHeight: px(style.lineHeight),\n ...(style.letterSpacing !== undefined && { letterSpacing: px(style.letterSpacing) }),\n ...(style.textTransform === 'uppercase' && { textTransform: 'uppercase' as const }),\n ...(style.fontWeight !== undefined && { fontWeight: weight(style.fontWeight) }),\n ...(style.fontStyle && { fontStyle: style.fontStyle }),\n});\n\nexport const toTypefaces = (\n typography: Record<string, TextStyle>\n): Record<string, TypeFaceDefinition> =>\n Object.fromEntries(Object.entries(typography).map(([role, style]) => [role, toTypeface(style)]));\n","import { GetFieldType } from './types';\n\nexport function getValue<TData, TPath extends string, TDefault = GetFieldType<TData, TPath>>(\n data: TData,\n path: TPath,\n defaultValue?: TDefault\n): GetFieldType<TData, TPath> | TDefault {\n const value = path\n .split(/[.[\\]]/)\n .filter(Boolean)\n .reduce<GetFieldType<TData, TPath>>((value, key) => (value as any)?.[key], data as any);\n\n return value !== undefined ? value : (defaultValue as TDefault);\n}\n","export const debounce = <T extends (...args: any[]) => ReturnType<T>>(\n callback: T,\n timeout: number\n): ((...args: Parameters<T>) => void) => {\n let timer: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n callback(...args);\n }, timeout);\n };\n};\n","/**\n * `generate-uni-theme` — runs the uni-core OKLCH engine at tool-call time and\n * renders the static `uni-theme.ts` source. The MCP returns *file content*;\n * the calling agent writes it to disk. Per the static-theme-file direction,\n * the generated file is the system's editable source of truth — retheming\n * later means editing that file's tokens, not calling this tool again\n * (regenerate only to re-derive colors from a new brand seed).\n */\nimport { emitThemeFile, type ThemeFileInput } from '@uni-design-system/uni-core';\n\nconst HEX = /^#[0-9a-fA-F]{6}$/;\n\nexport type GenerateThemeArgs = Omit<ThemeFileInput, 'seed'> & { brand: string | string[] };\n\n/**\n * Normalize brand input into the engine's `seed`, or explain what was wrong.\n * Shared by every theme tool so the file and runtime paths accept exactly the\n * same input and reject it with the same message.\n */\nexport type SeedResult =\n | { ok: true; seed: string | string[] }\n | { ok: false; error: string };\n\nexport function resolveSeed(brand: string | string[]): SeedResult {\n const seeds = (Array.isArray(brand) ? brand : [brand]).map((s) =>\n s.startsWith('#') ? s : `#${s}`\n );\n const invalid = seeds.filter((s) => !HEX.test(s));\n if (invalid.length) {\n return {\n ok: false,\n error: `Invalid brand color(s): ${invalid.join(', ')}. Pass 6-digit hex values, e.g. \"#0052FF\" (1–3 colors: primary, secondary, tertiary).`,\n };\n }\n return { ok: true, seed: seeds.length === 1 ? seeds[0] : seeds };\n}\n\nexport function formatGeneratedTheme(args: GenerateThemeArgs): string {\n const resolved = resolveSeed(args.brand);\n if (!resolved.ok) return resolved.error;\n\n const { content, providerSnippet, reportSummary, report } = emitThemeFile({\n ...args,\n seed: resolved.seed,\n });\n\n const failing = report.checks.filter((c) => !c.pass);\n const failLines = failing.length\n ? `\\n\\nFailing pairs:\\n${failing.map((f) => `- ${f.mode} \\`${f.foreground}\\` on \\`${f.background}\\`: ${f.ratio}:1 (needs ${f.required}:1)`).join('\\n')}`\n : '';\n\n return [\n `# ${args.name ?? 'Brand'} theme — generated`,\n '',\n 'Write this file to `src/app/uni-theme.ts`:',\n '',\n '```ts',\n content.trimEnd(),\n '```',\n '',\n '## Register it (app.config.ts)',\n '',\n '```ts',\n providerSnippet,\n '```',\n '',\n '## Contrast report',\n '',\n `${reportSummary}.${failLines}`,\n '',\n '## Retheming later — edit the file, do not regenerate',\n '',\n 'The file above is the source of truth for the whole look and feel:',\n '- **Colors**: edit any token in the `lightColors`/`darkColors` maps; borders and every',\n ' component deriving from that token update automatically.',\n '- **Borders**: add your own primitive under any name in `borders` (e.g.',\n \" `'brush-stroke': `3px dashed ${colors['tertiary']}``) and reference it from `components`\",\n ' overrides — one edit restyles every component sharing the token. Use bracket access',\n ' on `colors` — dot access fails under `noPropertyAccessFromIndexSignature`.',\n '- **Components**: the `components` function returns sparse overrides deep-merged over',\n ' Uni defaults — set only what you change, e.g.',\n \" `button: { variants: { secondary: { border: borders(colors)['brush-stroke'] } } }`.\",\n \"- **Icons**: never inline SVG in components. Define an icon ONCE in the theme file's\",\n ' `icons` map as an inline SVG data URI — it is masked with `currentColor`, so it',\n \" recolors with the theme — then render it anywhere with `<uni-icon name='…'/>`.\",\n ' A built-in set of 61 icons ships with every theme (navigation, actions, feedback,',\n ' user/system) — check `BaseIcons` before adding one; names are flat camelCase',\n ' (`chevronDown`, `checkCircle`, `externalLink`) and `IconName` autocompletes them.',\n ' To add your own, encode with `svgToIconUri` from uni-core rather than hand-writing',\n ' a data URI — it strips fixed width/height, escapes the URI, and throws on artwork',\n ' that cannot be masked. Icons are MONOCHROME (the mask uses the alpha channel), so a',\n ' multi-color logo flattens to a silhouette; keep one viewBox grid across the set.',\n '- Never hardcode hex values in application components: style through `ThemeService`',\n ' accessors and semantic token names so themes stay swappable.',\n ].join('\\n');\n}\n","/**\n * `create-icon-tokens` — turns a consuming project's raw SVGs into theme icon\n * tokens.\n *\n * This is the counterpart to the never-inline-SVG rule the server teaches: an\n * agent that finds inline `<svg>` in a component calls this, gets a paste-ready\n * `icons` map back, and moves the artwork into the theme where it belongs.\n *\n * Encoding is delegated to `svgToIconUri` in uni-core, so tokens produced here\n * are byte-identical to the built-in set. What this adds is the set-level view\n * a single-icon helper cannot have: which names collide with built-ins, and\n * whether the artwork shares one grid.\n */\nimport { BaseIcons, svgToIconUri } from '@uni-design-system/uni-core';\n\nexport interface IconTokenInput {\n /** Token name. Non-camelCase input is converted, and the change reported. */\n name: string;\n /** Raw SVG source, or an already-encoded `data:image/svg+xml,…` URI. */\n svg: string;\n /**\n * Accept artwork that paints in more than one color, knowing it flattens to\n * a silhouette. Off by default so multi-color logos are caught rather than\n * silently reduced.\n */\n allowMultiColor?: boolean;\n}\n\ninterface Encoded {\n name: string;\n originalName: string;\n uri: string;\n viewBox: string;\n}\n\ninterface Rejected {\n name: string;\n reason: string;\n}\n\nconst DATA_URI = /^data:image\\/svg\\+xml[^,]*,/;\n\n/** Flat camelCase is the set convention (`chevronDown`, `externalLink`). */\nfunction toCamelCase(name: string): string {\n const cleaned = name\n .trim()\n .replace(/\\.svg$/i, '')\n .replace(/[^A-Za-z0-9]+(.)?/g, (_, chr: string | undefined) => (chr ? chr.toUpperCase() : ''));\n return cleaned.charAt(0).toLowerCase() + cleaned.slice(1);\n}\n\nconst decode = (uri: string) => decodeURIComponent(uri.replace(DATA_URI, ''));\n\nconst viewBoxOf = (svg: string) => svg.match(/viewBox\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1] ?? 'unknown';\n\n/** The grid the built-in set is drawn on. */\nconst BASE_GRID = viewBoxOf(decode(BaseIcons.chevronDown));\n\nexport function formatIconTokens(icons: IconTokenInput[]): string {\n if (!icons.length) {\n return 'No icons supplied. Pass `icons: [{ name, svg }]` — `svg` may be raw SVG source or an already-encoded data URI.';\n }\n\n const encoded: Encoded[] = [];\n const rejected: Rejected[] = [];\n\n for (const { name, svg, allowMultiColor } of icons) {\n const tokenName = toCamelCase(name);\n // Accept an already-encoded URI so re-running the tool is harmless.\n const source = DATA_URI.test(svg.trim()) ? decode(svg.trim()) : svg;\n\n try {\n const uri = svgToIconUri(source, { name: tokenName, allowMultiColor });\n encoded.push({ name: tokenName, originalName: name, uri, viewBox: viewBoxOf(decode(uri)) });\n } catch (error) {\n const reason = (error as Error).message\n .replace(`${tokenName}: `, '')\n // The helper's advice names its own option; point at this tool's input\n // instead, so the caller can actually act on it.\n .replace(\n /Pass \\{ allowMultiColor: true \\} to accept that\\./,\n `Set \\`allowMultiColor: true\\` on \\`${tokenName}\\` and call again if a silhouette is intended.`\n );\n rejected.push({ name: tokenName, reason });\n }\n }\n\n const out: string[] = [];\n out.push(`# Icon tokens — ${encoded.length} of ${icons.length} encoded`);\n out.push('');\n\n if (encoded.length) {\n // Apps routinely hand-draw their own `close`, `check` or `plus`. Encoding\n // those into tokens works, but adds redundant artwork on a foreign grid\n // when the theme already ships the glyph. Names alone cannot detect it —\n // the caller has to recognise the shape — so list what is already there.\n out.push('## First: are any of these already built in?');\n out.push('');\n out.push('Every theme ships these icons. If a glyph below *depicts* one of them, do not');\n out.push('add a token — delete the inline `<svg>` and use `<uni-icon name=\"…\" />` with the');\n out.push('built-in name. Only genuinely app-specific artwork belongs in `icons`.');\n out.push('');\n out.push(`> ${Object.keys(BaseIcons).join(', ')}`);\n out.push('');\n\n out.push('## Add to `uni-theme.ts`');\n out.push('');\n out.push('Merge whatever survives that check into the `icons` const. They are merged over');\n out.push('the built-in set per name, then rendered anywhere with `<uni-icon name=\"…\" />` —');\n out.push('delete the inline `<svg>` from the component.');\n out.push('');\n out.push('```ts');\n out.push('const icons: Icons = {');\n for (const { name, uri } of encoded) out.push(` ${name}: \"${uri}\",`);\n out.push('};');\n out.push('```');\n out.push('');\n }\n\n if (rejected.length) {\n out.push('## Not encoded');\n out.push('');\n out.push('These cannot render as a mask. Fix the artwork and call again.');\n out.push('');\n for (const { name, reason } of rejected) out.push(`- \\`${name}\\` — ${reason}`);\n out.push('');\n }\n\n const notes: string[] = [];\n\n const renamed = encoded.filter((e) => e.name !== e.originalName);\n if (renamed.length) {\n notes.push(\n `Renamed to the set's flat camelCase convention: ${renamed\n .map((e) => `\\`${e.originalName}\\` → \\`${e.name}\\``)\n .join(', ')}.`\n );\n }\n\n const overrides = encoded.filter((e) => e.name in BaseIcons);\n if (overrides.length) {\n notes.push(\n `Overrides a built-in icon: ${overrides.map((e) => `\\`${e.name}\\``).join(', ')}. ` +\n 'Intentional for rebranding a standard glyph; rename if you meant to add a new one.'\n );\n }\n\n // The set-level check a per-icon helper cannot make — and the exact defect\n // that made the old built-in set look inconsistent.\n const grids = [...new Set(encoded.map((e) => e.viewBox))];\n if (grids.length > 1) {\n notes.push(\n `Mixed viewBox grids (${grids.map((g) => `\\`${g}\\``).join(', ')}). Icons drawn on ` +\n 'different grids will not share an optical weight or size. Re-export the set on one grid.'\n );\n } else if (grids.length === 1 && grids[0] !== BASE_GRID && overrides.length) {\n notes.push(\n `This set is drawn on \\`${grids[0]}\\` while the built-in set uses \\`${BASE_GRID}\\`. ` +\n 'That is fine on its own, but a glyph overriding a built-in will sit next to ' +\n 'un-overridden built-ins, so check they read at the same weight.'\n );\n }\n\n notes.push(\n 'Icons are masked with `currentColor`, so they are monochrome: the mask uses the ' +\n 'alpha channel and any fill colors in the source are discarded. Color them by ' +\n 'setting text color on the container, or with `<uni-icon color=\"…\" />`.'\n );\n\n out.push('## Notes');\n out.push('');\n for (const note of notes) out.push(`- ${note}`);\n\n return out.join('\\n');\n}\n","/**\n * `generate-runtime-theme` / `get-runtime-theme` — the runtime counterpart to\n * `generate-uni-theme`. Where that tool returns `uni-theme.ts` source for an\n * agent to write and compile (branding an app permanently), these return a\n * validated `UniTheme` as data, for an app or agent to register live:\n * `themeService.registerTheme(theme, { select: true })`.\n *\n * Two contracts make the payload affordable and trustworthy:\n *\n * - **Icons are elided.** A serialized theme is ~50 KB, ~71% of it the 61\n * built-in icon data URIs that every uni-core consumer already ships.\n * `dehydrateTheme` keeps genuine overrides and drops the rest (~14 KB);\n * the receiver restores them (`ThemeService` does it on register, others\n * call `hydrateTheme`).\n * - **Every theme is parsed before it leaves.** `parseTheme` is the same gate\n * the consumer applies, so \"validated\" is checked here rather than claimed.\n */\nimport {\n dehydrateTheme,\n emitDtcgTokens,\n generateUniThemes,\n parseTheme,\n summarizeContrast,\n UniThemes,\n formatThemeIssues,\n type ContrastReport,\n type UniTheme,\n} from '@uni-design-system/uni-core';\n\nimport { resolveSeed, type GenerateThemeArgs } from './generate.js';\n\nexport interface RuntimeTheme {\n id: string;\n name: string;\n mode: 'light' | 'dark';\n /** A validated `UniTheme` with the built-in icon set elided. */\n theme: UniTheme;\n}\n\nexport interface RuntimeThemeEnvelope {\n themes: RuntimeTheme[];\n /** Present when the themes were generated in this call and audited. */\n contrast?: {\n summary: string;\n pass: boolean;\n worstRatio: number;\n /** Token pairs below their WCAG target; named, never hex. */\n failing: {\n mode: string;\n foreground: string;\n background: string;\n ratio: number;\n required: number;\n }[];\n };\n apply: { snippet: string; note: string };\n /** Always true: base icons travel out-of-band. See the module note. */\n iconsElided: true;\n}\n\nexport type BuildResult =\n | { ok: true; envelope: RuntimeThemeEnvelope }\n | { ok: false; error: string };\n\nconst APPLY_SNIPPET = [\n '// Angular — ThemeService from @uni-design-system/uni-angular',\n 'const result = themeService.registerTheme(theme, { select: true });',\n 'if (!result.success) console.warn(result.issues);',\n].join('\\n');\n\nconst APPLY_NOTE =\n 'Each `theme` is a complete, validated UniTheme with the built-in icon set elided. ' +\n \"ThemeService restores it on register (the theme's own icons win). Outside Angular, \" +\n 'call `hydrateTheme(theme)` from @uni-design-system/uni-core before use, and ' +\n '`parseTheme` if the payload crossed a trust boundary.';\n\n/** Validate and package themes, or report why they were rejected. */\nfunction envelope(themes: RuntimeTheme[], report?: ContrastReport): BuildResult {\n for (const { id, theme } of themes) {\n const result = parseTheme(theme);\n if (!result.success) {\n return { ok: false, error: `Generated theme \\`${id}\\` failed validation: ${formatThemeIssues(result.issues)}` };\n }\n }\n\n return {\n ok: true,\n envelope: {\n themes,\n ...(report\n ? {\n contrast: {\n summary: summarizeContrast(report),\n pass: report.pass,\n worstRatio: report.worstRatio,\n failing: report.checks\n .filter((check) => !check.pass)\n .map(({ mode, foreground, background, ratio, required }) => ({\n mode,\n foreground,\n background,\n ratio,\n required,\n })),\n },\n }\n : {}),\n apply: { snippet: APPLY_SNIPPET, note: APPLY_NOTE },\n iconsElided: true,\n },\n };\n}\n\n/** Generate a light(+dark) theme pair from brand seed(s), ready to register. */\nexport function buildGeneratedTheme(args: GenerateThemeArgs): BuildResult {\n const resolved = resolveSeed(args.brand);\n if (!resolved.ok) return resolved;\n\n const { light, dark, report } = generateUniThemes({ ...args, seed: resolved.seed });\n\n const themes: RuntimeTheme[] = [\n { id: light.id, name: light.name, mode: 'light', theme: dehydrateTheme(light) },\n ];\n if (args.darkMode !== false) {\n themes.push({ id: dark.id, name: dark.name, mode: 'dark', theme: dehydrateTheme(dark) });\n }\n\n return envelope(themes, report);\n}\n\n/** The ids `get-runtime-theme` and `GET /themes` serve. */\nexport function listRuntimeThemes(): { id: string; name: string; mode: 'light' | 'dark' }[] {\n return Object.entries(UniThemes).map(([id, theme]) => ({\n id,\n name: theme.name,\n mode: modeOf(id),\n }));\n}\n\nconst modeOf = (id: string): 'light' | 'dark' => (/dark/i.test(id) ? 'dark' : 'light');\n\n/** Serve a theme that ships with Uni (`LightTheme`, `DarkTheme`) as runtime JSON. */\nexport function buildStoredTheme(id: string): BuildResult {\n const theme = (UniThemes as Record<string, UniTheme | undefined>)[id];\n if (!theme) {\n const ids = Object.keys(UniThemes).join(', ');\n return { ok: false, error: `No theme found with id \\`${id}\\`. Available: ${ids}.` };\n }\n\n return envelope([\n { id: theme.id, name: theme.name, mode: modeOf(id), theme: dehydrateTheme(theme) },\n ]);\n}\n\n/**\n * W3C DTCG (Style Dictionary compatible) export of a built-in theme's colors,\n * radius and spacing scales. The interop layer for external token pipelines;\n * the `UniTheme` JSON the runtime-theme tools serve stays the lossless\n * primary format.\n */\nexport function buildDtcgTokens(\n id: string\n): { ok: true; json: string } | { ok: false; error: string } {\n const theme = (UniThemes as Record<string, UniTheme | undefined>)[id];\n if (!theme) {\n const ids = Object.keys(UniThemes).join(', ');\n return { ok: false, error: `No theme found with id \\`${id}\\`. Available: ${ids}.` };\n }\n\n const tokens = emitDtcgTokens({\n colors: theme.colors,\n radii: theme.radii,\n spacing: theme.spacing,\n });\n return { ok: true, json: JSON.stringify(tokens, null, 2) };\n}\n\n/**\n * The text block accompanying `structuredContent`: a compact orientation, not\n * a second copy of the payload — duplicating ~14 KB of JSON per theme would\n * double the cost of every call for clients that read the structured result.\n */\nexport function summarizeEnvelope(env: RuntimeThemeEnvelope): string {\n const list = env.themes.map((t) => `\\`${t.id}\\` (${t.mode})`).join(', ');\n const failing = env.contrast?.failing.length\n ? `\\n\\nFailing pairs:\\n${env.contrast.failing\n .map((f) => `- ${f.mode} \\`${f.foreground}\\` on \\`${f.background}\\`: ${f.ratio}:1 (needs ${f.required}:1)`)\n .join('\\n')}`\n : '';\n\n return [\n `# Runtime theme JSON — ${env.themes.length} theme${env.themes.length === 1 ? '' : 's'}`,\n '',\n `${list}. The full validated theme data is in this result's structured content.`,\n ...(env.contrast ? ['', `${env.contrast.summary}.${failing}`] : []),\n '',\n '## Apply',\n '',\n '```ts',\n env.apply.snippet,\n '```',\n '',\n env.apply.note,\n '',\n 'To brand an app permanently instead, use `generate-uni-theme` — it returns an ' +\n 'editable `uni-theme.ts` that becomes the source of truth. Use this tool when the ' +\n 'theme should apply immediately without a build step.',\n ].join('\\n');\n}\n"],"mappings":"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,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,SAAW;AAAA,cACX,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aAAe;AAAA,YACjB;AAAA,YACA;AAAA,cACE,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,MAAQ;AAAA,cACR,UAAY;AAAA,cACZ,aA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","names":["background","lightColors","darkColors"]}
|