[
  {
    "tag": "kai-agent-card",
    "className": "KaiAgentCardElement",
    "displayName": "AgentCard",
    "props": [
      {
        "name": "name",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The agent's name — the primary label. Attribute: `name`.",
        "displayType": "undefined | string"
      },
      {
        "name": "active",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Selected / focused state: highlighted border + surface. Attribute: `active`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "needsAttention",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Raise a prominent \"Needs you\" pill plus a glowing amber edge — the attention-routing signal that pulls focus to this agent. Attribute: `needs-attention`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "status",
        "type": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }",
        "optional": true,
        "scalar": false,
        "description": "Run status — a JS PROPERTY (object), not an attribute. Shape: `{ tone, label?, pulse? }`, where `tone` is one of `working` | `idle` | `done` | `error` | `blocked` (maps to the kit's tool hues), `label` is an optional short string beside the dot, and `pulse` animates the dot. Set it with `el.status = { tone: 'working', label: 'Working', pulse: true }`.",
        "displayType": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
      }
    ],
    "events": [
      {
        "name": "kai-activate",
        "detail": null,
        "description": "The card was activated — clicked, or Enter / Space while focused. Promote this agent back to focus.",
        "displayDetail": null
      },
      {
        "name": "kai-menu",
        "detail": null,
        "description": "The trailing \"...\" kebab was clicked. The consumer opens its own menu; the card only surfaces the affordance (the click does not also activate the card).",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "AgentCard",
        "group": "UI",
        "storyId": "solid-advanced-primitives-agentcard--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "status",
        "doc": "The leading tone-colored status dot.",
        "recipe": "kai-agent-card::part(status) { width: 0.625rem; height: 0.625rem }"
      },
      {
        "name": "menu",
        "doc": "The trailing overflow (\"...\") menu button.",
        "recipe": "kai-agent-card::part(menu) { opacity: 1 }"
      }
    ]
  },
  {
    "tag": "kai-artifact",
    "className": "KaiArtifactElement",
    "displayName": "Artifact",
    "props": [
      {
        "name": "src",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "URL the preview iframe frames. Consumer-controlled.",
        "displayType": "undefined | string"
      },
      {
        "name": "files",
        "type": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
        "optional": false,
        "scalar": false,
        "description": "Files for the Code tab tree + each file's preview `url`. Set as a JS property (array).",
        "typeName": "FileTreeFile[]",
        "typeShape": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
        "default": "[]",
        "typeImport": "FileTreeFile",
        "displayType": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
      },
      {
        "name": "tab",
        "type": "undefined | \"preview\" | \"code\"",
        "optional": true,
        "scalar": true,
        "description": "Controlled active tab: `preview` or `code`. When set, the artifact follows it (re-asserted on change). Leave unset for an uncontrolled tab (see `defaultTab`).",
        "displayType": "undefined | \"preview\" | \"code\""
      },
      {
        "name": "defaultTab",
        "type": "undefined | \"preview\" | \"code\"",
        "optional": true,
        "scalar": true,
        "description": "Uncontrolled INITIAL tab (used only when `tab` is unset). Default `preview`. Seeds the starting tab; the user can then switch freely without the consumer re-asserting a controlled `tab`.",
        "displayType": "undefined | \"preview\" | \"code\""
      },
      {
        "name": "activeFile",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Selected file path — syncs the tree highlight, Code source, and preview.",
        "displayType": "undefined | string"
      },
      {
        "name": "sandbox",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "iframe `sandbox` override. Secure default `allow-scripts allow-forms` (NOT `allow-same-origin`).",
        "default": "'allow-scripts allow-forms'",
        "displayType": "undefined | string"
      },
      {
        "name": "iframeTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Accessible title for the preview iframe.",
        "displayType": "undefined | string"
      },
      {
        "name": "maximized",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Reflects the artifact's own maximized view-state (usually driven by the protocol).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "expandable",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the expand-to-fill button (OPT-IN).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "openInTab",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the open-in-new-tab button (OPT-IN).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noNav",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide back/forward.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noReload",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide reload.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noHome",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide home.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noPathField",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide the address field.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noTabs",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide the Preview|Code toggle.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "standalone",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Standalone chrome: rounded corners + border (else square, borderless in-panel).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "readonlyPath",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the address but make it read-only (visible, nav-tracking, non-editable).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "displayUrl",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Friendly address shown in the path field instead of the real current url (read-only, non-navigable). Use when the framed url is not consumer-facing (e.g. a `data:` blob) so a clean address shows instead of leaking it. Scalar string: set as the `display-url` attribute or the `displayUrl` property.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-file-select",
        "detail": "{ path: string }",
        "description": "Fired when a file is selected. `detail.path`.",
        "displayDetail": "{ path: string }"
      },
      {
        "name": "kai-maximize-change",
        "detail": "{ maximized: false | true }",
        "description": "Artifact's own maximize button toggled (consumer-observable; non-bubbling).",
        "displayDetail": "{ maximized: false | true }"
      },
      {
        "name": "kai-navigate",
        "detail": "{ url: string }",
        "description": "Fired when the preview navigates. `detail.url` = the new location.",
        "displayDetail": "{ url: string }"
      },
      {
        "name": "kai-tab-change",
        "detail": "{ tab: \"preview\" | \"code\" }",
        "description": "Fired when the Preview|Code tab changes. `detail.tab`.",
        "displayDetail": "{ tab: \"preview\" | \"code\" }"
      }
    ],
    "methods": [
      {
        "name": "back",
        "params": "",
        "returns": "void",
        "description": "Go back in the artifact's own history stack (no-op when there's no prior entry)."
      },
      {
        "name": "forward",
        "params": "",
        "returns": "void",
        "description": "Go forward in the history stack (no-op when there's no forward entry)."
      },
      {
        "name": "reload",
        "params": "",
        "returns": "void",
        "description": "Force-reload the current preview url (also re-renders an inline PDF)."
      },
      {
        "name": "home",
        "params": "",
        "returns": "void",
        "description": "Navigate to the `src` home url (no-op when there's no `src`)."
      },
      {
        "name": "navigate",
        "params": "url: string",
        "returns": "void",
        "description": "Push + load a url in the preview — the path-field submit path (fires kai-navigate)."
      },
      {
        "name": "selectFile",
        "params": "path: string",
        "returns": "void",
        "description": "Select a file by path: highlights the tree, shows its source, navigates the preview (fires kai-file-select + kai-navigate). Named selectFile to avoid the `activeFile` prop."
      },
      {
        "name": "openExternal",
        "params": "",
        "returns": "void",
        "description": "Open the current url in a new browser tab (no-op when there's no concrete url). Named openExternal, NOT openInTab — that's a prop (toolbar button visibility)."
      },
      {
        "name": "maximize",
        "params": "",
        "returns": "void",
        "description": "Enter the maximized view-state (fires kai-maximize-change{maximized:true}). Named maximize, NOT maximized — that's a prop."
      },
      {
        "name": "restore",
        "params": "",
        "returns": "void",
        "description": "Exit the maximized view-state (fires kai-maximize-change{maximized:false})."
      }
    ],
    "composedFrom": [
      {
        "name": "Artifact",
        "group": "Components",
        "storyId": "solid-advanced-elements-artifact--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-attachments",
    "className": "KaiAttachmentsElement",
    "displayName": "Attachments",
    "props": [
      {
        "name": "items",
        "type": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "The attachments to render. Set as a JS property (array).",
        "typeName": "AttachmentData[]",
        "typeShape": "{ id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
        "default": "[]",
        "typeImport": "AttachmentData",
        "displayType": "AttachmentData[]"
      },
      {
        "name": "variant",
        "type": "undefined | \"grid\" | \"inline\" | \"list\"",
        "optional": true,
        "scalar": true,
        "description": "Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows.",
        "default": "'grid'",
        "displayType": "undefined | \"grid\" | \"inline\" | \"list\""
      },
      {
        "name": "hoverCard",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Wrap each item in a hover card that previews its details.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "removable",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a remove button per item; clicking it fires a `kai-remove` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "showMediaType",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Also show the media type beneath the filename (non-grid variants).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "emptyText",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Text shown when `items` is empty.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-remove",
        "detail": "{ id: string }",
        "description": "A remove button was clicked.",
        "displayDetail": "{ id: string }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Attachments",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachments--docs"
      },
      {
        "name": "Attachment",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachment--docs"
      },
      {
        "name": "AttachmentPreview",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmentpreview--docs"
      },
      {
        "name": "AttachmentInfo",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmentinfo--docs"
      },
      {
        "name": "AttachmentRemove",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmentremove--docs"
      },
      {
        "name": "AttachmentHoverCard",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmenthovercard--docs"
      },
      {
        "name": "AttachmentHoverCardTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmenthovercardtrigger--docs"
      },
      {
        "name": "AttachmentHoverCardContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmenthovercardcontent--docs"
      },
      {
        "name": "AttachmentEmpty",
        "group": "Components",
        "storyId": "solid-advanced-elements-attachmentempty--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "preview",
        "doc": "The image shown in an attachment’s hover-card preview. Bounded by default (max ~320×256, aspect preserved) so a large image never blows up the card — raise or lower the cap from outside.",
        "recipe": "kai-attachments::part(preview) { max-width: 32rem; max-height: 24rem }"
      }
    ]
  },
  {
    "tag": "kai-avatar",
    "className": "KaiAvatarElement",
    "displayName": "Avatar",
    "props": [
      {
        "name": "src",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Image URL/data-URI. When absent, the `fallback` initials show instead.",
        "displayType": "undefined | string"
      },
      {
        "name": "alt",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Alt text for the image. Defaults to `fallback`.",
        "displayType": "undefined | string"
      },
      {
        "name": "fallback",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Short text shown when there's no image — usually initials (e.g. \"JD\", \"AI\").",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\"",
        "optional": true,
        "scalar": true,
        "description": "Size token: `sm` | `md` (default) | `lg`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Avatar",
        "group": "UI",
        "storyId": "solid-advanced-primitives-avatar--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-badge",
    "className": "KaiBadgeElement",
    "displayName": "Badge",
    "props": [
      {
        "name": "variant",
        "type": "undefined | \"default\" | \"count\" | \"citation\"",
        "optional": true,
        "scalar": true,
        "description": "`default` (muted pill) · `count` (compact number badge) · `citation` (filled primary, for inline citation markers). Defaults to `default`.",
        "default": "'default'",
        "displayType": "undefined | \"default\" | \"count\" | \"citation\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Badge",
        "group": "UI",
        "storyId": "solid-advanced-primitives-badge--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "badge",
        "doc": "The badge pill. Restyle its background, color, or shape; the `variant` prop (default/count/citation) sets the defaults.",
        "recipe": "kai-badge::part(badge) { background: var(--color-primary); color: var(--color-primary-foreground) }"
      }
    ]
  },
  {
    "tag": "kai-button",
    "className": "KaiButtonElement",
    "displayName": "Button",
    "props": [
      {
        "name": "variant",
        "type": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\"",
        "optional": true,
        "scalar": true,
        "description": "Visual style. `default` (filled), `subtle` (muted text, hover tint — the toolbar icon look), `ghost` (transparent, hover fill), `outline`, or `destructive`. Defaults to `default`.",
        "default": "'default'",
        "displayType": "undefined | \"default\" | \"subtle\" | \"ghost\" | \"outline\" | \"destructive\""
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\"",
        "optional": true,
        "scalar": true,
        "description": "Size token. `icon` / `icon-sm` are square (for icon-only buttons); `sm` / `md` / `lg` size text buttons. Defaults to `md`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
      },
      {
        "name": "icon",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Leading icon: a named icon (e.g. `\"mic\"`, `\"plus\"`), an image URL/data-URI, or plain text. Renders before any slotted label.",
        "displayType": "undefined | string"
      },
      {
        "name": "iconTrailing",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Trailing icon, after the label (e.g. `\"chevron-down\"` for a menu affordance).",
        "displayType": "undefined | string"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Accessible name. REQUIRED for icon-only buttons (no visible text); ignored when you slot visible text, which already names the button.",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the button (non-interactive, dimmed).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "full",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Stretch the button to the full width of its container (a block button) — e.g. a card CTA or a stacked action. Attribute: `full`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "align",
        "type": "undefined | \"start\" | \"center\" | \"end\"",
        "optional": true,
        "scalar": true,
        "description": "Justify the button's content: `start`, `center` (default), or `end`. Combine with `full` for a full-width, left-aligned button.",
        "default": "'center'",
        "displayType": "undefined | \"start\" | \"center\" | \"end\""
      },
      {
        "name": "type",
        "type": "undefined | \"button\" | \"submit\" | \"reset\"",
        "optional": true,
        "scalar": true,
        "description": "Native button `type`. Defaults to `button` (so it never submits a form).",
        "default": "'button'",
        "displayType": "undefined | \"button\" | \"submit\" | \"reset\""
      }
    ],
    "events": [
      {
        "name": "kai-click",
        "detail": null,
        "description": "The button was activated (pointer or keyboard). Carries no detail. The native `click` also bubbles (composed) for consumers who prefer it.",
        "displayDetail": null
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the inner `<button>` (host.focus() would focus the wrapper)."
      },
      {
        "name": "blur",
        "params": "",
        "returns": "void",
        "description": "Blur the inner `<button>`."
      },
      {
        "name": "click",
        "params": "",
        "returns": "void",
        "description": "Programmatically activate the button — runs the same path as a user click and fires kai-click. Forwarding to the inner button means `disabled` is respected automatically."
      }
    ],
    "composedFrom": [
      {
        "name": "Button",
        "group": "UI",
        "storyId": "solid-advanced-primitives-button--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "icon",
        "mode": "replace",
        "doc": "A custom leading icon (any inline SVG, inherits `currentColor`). Wins over the `icon` prop."
      }
    ],
    "parts": [
      {
        "name": "button",
        "doc": "The button element. Restyle radius, padding, colors, or weight from outside; the `variant`/`size` props set the defaults.",
        "recipe": "kai-button::part(button) { border-radius: 9999px; font-weight: 600 }"
      }
    ]
  },
  {
    "tag": "kai-card",
    "className": "KaiCardElement",
    "displayName": "Card",
    "props": [
      {
        "name": "appearance",
        "type": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"accent\"",
        "optional": true,
        "scalar": true,
        "description": "Surface treatment: `outlined` (default) | `filled` | `plain` | `accent`. Attribute: `appearance`.",
        "default": "'outlined'",
        "displayType": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"accent\""
      },
      {
        "name": "orientation",
        "type": "undefined | \"vertical\" | \"horizontal\" | \"responsive\"",
        "optional": true,
        "scalar": true,
        "description": "`vertical` (default, media on top) | `horizontal` (media at the start) | `responsive` (horizontal when the card's container is wide enough, else vertical — a container query on the card's own width). Attribute: `orientation`.",
        "default": "'vertical'",
        "displayType": "undefined | \"vertical\" | \"horizontal\" | \"responsive\""
      },
      {
        "name": "collapse",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The card width below which a `responsive` card collapses to vertical and the footer actions stack. A CSS length; default `28rem`. Attribute: `collapse`.",
        "default": "'28rem'",
        "displayType": "undefined | string"
      },
      {
        "name": "dense",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Tighter spacing for dense lists. Attribute: `dense`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "dismissible",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a close (×) that hides the card and emits `kai-dismiss`. Attribute: `dismissible`. Off by default.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "href",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Render the whole card as a link. Attribute: `href`. Wins over `clickable`.",
        "displayType": "undefined | string"
      },
      {
        "name": "target",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "`target` for the `href` anchor. Attribute: `target`.",
        "displayType": "undefined | string"
      },
      {
        "name": "rel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "`rel` for the `href` anchor. Attribute: `rel`.",
        "displayType": "undefined | string"
      },
      {
        "name": "clickable",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Make the whole card a button (`role=\"button\"`, Enter/Space, hover affordance) that emits `kai-card-click`. Attribute: `clickable`. Ignored when `href` is set.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-card-click",
        "detail": null,
        "description": "A `clickable`/`href` card was activated (click, or Enter/Space).",
        "displayDetail": null
      },
      {
        "name": "kai-dismiss",
        "detail": null,
        "description": "The card was dismissed via its × (it also hides itself).",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Card",
        "group": "UI",
        "storyId": "solid-advanced-primitives-card--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "media",
        "mode": "inject",
        "doc": "Full-bleed media (image/video/illustration) at the top (vertical) or start (horizontal). Clipped to the card corners."
      },
      {
        "name": "header",
        "mode": "inject",
        "doc": "Header content, e.g. a title. Rendered above the body."
      },
      {
        "name": "header-actions",
        "mode": "inject",
        "doc": "An actions cluster pinned to the end of the header row."
      },
      {
        "name": "footer",
        "mode": "inject",
        "doc": "Footer content rendered below the body."
      },
      {
        "name": "footer-actions",
        "mode": "inject",
        "doc": "Action buttons pinned to the end of the footer. Do NOT combine with a clickable/href card (nested interactive)."
      }
    ],
    "parts": [
      {
        "name": "card",
        "doc": "The card root (a div, or an a when href is set). Restyle its radius, border, or background; set --kai-card-spacing for padding/gaps (the dense prop sets the compact default).",
        "recipe": "kai-card::part(card) { border-radius: 1rem; --kai-card-spacing: 1.5rem }"
      },
      {
        "name": "media",
        "doc": "The full-bleed media region. Cap or crop it from outside (e.g. a fixed height with object-fit).",
        "recipe": "kai-card::part(media) { max-height: 12rem }"
      },
      {
        "name": "header",
        "doc": "The header row (header content + header-actions). Add a divider or adjust its alignment.",
        "recipe": "kai-card::part(header) { border-bottom: 1px solid var(--color-border) }"
      },
      {
        "name": "body",
        "doc": "The default-slot body region.",
        "recipe": "kai-card::part(body) { font-size: 0.9375rem }"
      },
      {
        "name": "footer",
        "doc": "The footer row (footer content + footer-actions).",
        "recipe": "kai-card::part(footer) { border-top: 1px solid var(--color-border) }"
      },
      {
        "name": "dismiss",
        "doc": "The dismiss (×) button shown when dismissible. Recolor or reposition it from outside.",
        "recipe": "kai-card::part(dismiss) { color: var(--color-muted-foreground) }"
      }
    ]
  },
  {
    "tag": "kai-cards",
    "className": "KaiCardsElement",
    "displayName": "Cards",
    "props": [
      {
        "name": "cards",
        "type": "undefined | { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]",
        "optional": true,
        "scalar": false,
        "description": "The stream of card envelopes to render. Set as a JS PROPERTY: `el.cards = [...]`.",
        "displayType": "undefined | { type: string; id: string; data: unknown; title?: undefined | string; resolution?: undefined | { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }[]"
      },
      {
        "name": "types",
        "type": "undefined | Record<string, string>",
        "optional": true,
        "scalar": false,
        "description": "Optional type→tag overrides/additions (merged over the built-ins). Property: `el.types`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type.",
        "displayType": "undefined | Record<string, string>"
      },
      {
        "name": "policy",
        "type": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }",
        "optional": true,
        "scalar": false,
        "description": "Optional CardPolicy handling child events. Property: `el.policy`.",
        "displayType": "undefined | { onSubmit?: undefined | (cardId: string, data: unknown) => void; onAction?: undefined | (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: undefined | (text: string, opts: { mode: \"compose\" | \"send\"; context?: unknown; }) => void; onOpen?: undefined | (url: string, target: \"tab\" | \"artifact\") => void; onState?: undefined | (cardId: string, patch: unknown) => void; onDismiss?: undefined | (cardId: string) => void; onReopen?: undefined | (cardId: string) => void; onError?: undefined | (cardId: string, message: string) => void; maxSendPromptMode?: undefined | \"compose\" | \"send\" }"
      }
    ],
    "events": [
      {
        "name": "kai-card-resolved",
        "detail": "{ cardId: string; resolution: { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }",
        "description": "A child card transitioned to a resolved/deferred state (an action was chosen, a form/tasks submission landed, or it was dismissed) — re-emitted off the host as a non-bubbling convenience event so a consumer can observe resolution centrally without diffing the cards array. `detail` = `{ cardId, resolution }`. (A `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire this — observe reopen via the underlying bubbling `kai-card` event.)",
        "displayDetail": "{ cardId: string; resolution: { kind: \"action\"; action: string; payload?: unknown; at?: undefined | string } | { kind: \"submit\"; data: unknown; at?: undefined | string } | { kind: \"dismissed\"; at?: undefined | string } | { kind: \"expired\"; reason?: undefined | string; at?: undefined | string } }"
      }
    ],
    "methods": [
      {
        "name": "resolve",
        "params": "cardId: string, resolution: CardResolution",
        "returns": "void",
        "description": "Programmatically resolve a child card by id: set that envelope's `resolution` so the child re-renders into its read-only/resolved view — the imperative twin of the consumer mutating the cards array. No-op for an unknown id."
      },
      {
        "name": "dismiss",
        "params": "cardId: string",
        "returns": "void",
        "description": "Collapse a card to its re-openable stub from the host side — convenience for `resolve(cardId, { kind: 'dismissed' })`."
      },
      {
        "name": "getCard",
        "params": "cardId: string",
        "returns": "HTMLElement | null",
        "description": "Return the live child element node for a card id (or null) so consumers can call that card's own methods (focus/expand/…) without a shadow-DOM query."
      }
    ],
    "composedFrom": [
      {
        "name": "CardFallback",
        "group": "Components",
        "storyId": "solid-advanced-elements-cardfallback--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-chain-of-thought",
    "className": "KaiChainOfThoughtElement",
    "displayName": "ChainOfThought",
    "props": [
      {
        "name": "steps",
        "type": "{ label: string; content?: undefined | string; id?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "The reasoning steps. Set as a JS property. Compound sub-parts collapse to this one data model (Route 1). Each `{ label, content?, id? }`.",
        "typeName": "ChainOfThoughtStepData[]",
        "typeShape": "{ label: string; content?: undefined | string; id?: undefined | string }[]",
        "default": "[]",
        "displayType": "{ label: string; content?: undefined | string; id?: undefined | string }[]"
      },
      {
        "name": "type",
        "type": "undefined | \"single\" | \"multiple\"",
        "optional": true,
        "scalar": true,
        "description": "Open mode: `'multiple'` (default — any number of steps open at once) or `'single'` (at most one open; opening a step closes the others).",
        "displayType": "undefined | \"single\" | \"multiple\""
      },
      {
        "name": "value",
        "type": "undefined | string | string[]",
        "optional": true,
        "scalar": false,
        "description": "Controlled open step key(s). When set, it WINS over user interaction (the consumer owns the open set). String in `single` mode, string[] in `multiple` mode. Set as a JS property.",
        "displayType": "undefined | string | string[]"
      },
      {
        "name": "defaultValue",
        "type": "undefined | string | string[]",
        "optional": true,
        "scalar": false,
        "description": "Uncontrolled INITIAL open step key(s) — seeds which steps render expanded. Ignored once `value` is provided. Set as a JS property.",
        "displayType": "undefined | string | string[]"
      }
    ],
    "events": [
      {
        "name": "kai-value-change",
        "detail": "{ value: string | string[] }",
        "description": "The open set changed — by user click OR an expand()/collapse()/toggle() call. `value` is a string in `single` mode, a string[] in `multiple` mode. (Maps Radix Accordion's onValueChange.)",
        "displayDetail": "{ value: string | string[] }"
      }
    ],
    "methods": [
      {
        "name": "expand",
        "params": "index?: number",
        "returns": "void",
        "description": "Open one step's detail by index, or — with no arg — ALL steps. In `single` mode opening one step closes the others (expand-all keeps the last)."
      },
      {
        "name": "collapse",
        "params": "index?: number",
        "returns": "void",
        "description": "Close one step's detail by index, or — with no arg — ALL steps."
      },
      {
        "name": "toggle",
        "params": "index?: number",
        "returns": "void",
        "description": "Flip one step's open state by index."
      }
    ],
    "composedFrom": [
      {
        "name": "ChainOfThoughtAccordion",
        "group": "Components",
        "storyId": "solid-advanced-elements-chainofthoughtaccordion--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-chat",
    "className": "KaiChatElement",
    "displayName": "Chat",
    "props": [
      {
        "name": "messages",
        "type": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
        "optional": false,
        "scalar": false,
        "description": "The full message thread to render, newest last. Each entry carries its role, content, and optional reasoning/tools/attachments/actions. Set as a JS property (`el.messages = [...]`).",
        "typeName": "ChatMessage[]",
        "typeShape": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
        "default": "[]",
        "typeImport": "ChatMessage",
        "displayType": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
      },
      {
        "name": "value",
        "type": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]",
        "optional": true,
        "scalar": false,
        "description": "Value of the input. A **string** is controlled (the host owns the text and updates it on `kai-value-change`). A **ComposerDoc** is a one-time seed that pre-populates pills; the user then edits freely. Leave unset for uncontrolled.",
        "displayType": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder text shown in the empty input.",
        "default": "'Send a message...'",
        "displayType": "undefined | string"
      },
      {
        "name": "loading",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When true, shows the loading/streaming state and disables submit (use while awaiting the assistant's reply).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "suggestions",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Starter prompts shown above the input when the thread is empty. Clicking one follows `suggestionMode`. Set as a JS property.",
        "displayType": "undefined | string[]"
      },
      {
        "name": "suggestionMode",
        "type": "undefined | \"submit\" | \"fill\"",
        "optional": true,
        "scalar": true,
        "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input.",
        "default": "'submit'",
        "displayType": "undefined | \"submit\" | \"fill\""
      },
      {
        "name": "persistSuggestions",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Keep suggestions visible after the conversation starts. By default suggestions are conversation starters and hide once `messages` is non-empty; set this to keep them always shown. Default false.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`). Defaults to `'sm'`.",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shiki theme name for syntax-highlighted code blocks (e.g. `'github-dark-dimmed'`).",
        "default": "'github-dark-dimmed'",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true.",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "chatTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional header title shown on the left of the header.",
        "displayType": "undefined | string"
      },
      {
        "name": "models",
        "type": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
        "optional": true,
        "scalar": false,
        "description": "Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection.",
        "displayType": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
      },
      {
        "name": "currentModel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The currently selected model id (pairs with `models`).",
        "displayType": "undefined | string"
      },
      {
        "name": "context",
        "type": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }",
        "optional": true,
        "scalar": false,
        "description": "Optional context-window token usage. When set, a Context token meter is shown in the header.",
        "displayType": "ContextData | undefined"
      },
      {
        "name": "scrollButton",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the scroll-to-bottom button inside the scroll area. Default true.",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "headerStart",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Whether the host has `slot=\"header-start\"` content (left of the title) — set by the `<kai-chat>` facade so a custom control forces the header open.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "headerEnd",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Whether the host has `slot=\"header-end\"` content (right of the controls).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "headerFull",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "REPLACE — full custom header in place of the built-in title/model/context bar.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "sidebar",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "INJECT — left sidebar column (e.g. a conversation list / your own nav).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "empty",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "REPLACE — custom zero-state rendered in the message area while the thread is empty (replaces the empty message list only; the composer and its suggestions still render).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "composer",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "REPLACE — full custom composer in place of the built-in prompt input. The projected content wires its own submit (the data-flow boundary).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "composerActions",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "INJECT — accessory row just above the composer (e.g. extra actions).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "footer",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "INJECT — footer row below the composer (disclaimers, token meter, …).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "search",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a Search (Globe) button in the input toolbar; fires a `search` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "voice",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a Voice (Mic) button in the input toolbar; fires a `voice` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "triggers",
        "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
        "optional": true,
        "scalar": false,
        "description": "Rich entity triggers — each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input.",
        "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
      },
      {
        "name": "kindIcons",
        "type": "undefined | Record<string, string>",
        "optional": true,
        "scalar": false,
        "description": "Default icon per entity kind (kind → image src) for pills/menu items.",
        "displayType": "undefined | Record<string, string>"
      },
      {
        "name": "actionsReveal",
        "type": "undefined | \"always\" | \"hover\"",
        "optional": true,
        "scalar": true,
        "description": "Whether each message's action bar is always visible (`'always'`, default) or only revealed on hover of that message row (`'hover'`).",
        "default": "'always'",
        "displayType": "undefined | \"always\" | \"hover\""
      }
    ],
    "events": [
      {
        "name": "kai-attachments-change",
        "detail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
        "description": "The staged attachments changed (file added or removed). Carries the full current list so a consumer can react in real time.",
        "displayDetail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
      },
      {
        "name": "kai-message-action",
        "detail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }",
        "description": "An action button on a message was clicked. `action` is the built-in name or custom id. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear.",
        "displayDetail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }"
      },
      {
        "name": "kai-model-change",
        "detail": "{ modelId: string }",
        "description": "The header model switcher changed.",
        "displayDetail": "{ modelId: string }"
      },
      {
        "name": "kai-search",
        "detail": "Record<string, never>",
        "description": "The Search button was clicked.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-submit",
        "detail": "{ value: string; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
        "description": "User submitted a message.",
        "displayDetail": "{ value: string; attachments: AttachmentData[] }"
      },
      {
        "name": "kai-suggestion-click",
        "detail": "{ value: string }",
        "description": "A suggestion chip was clicked (only in `suggestion-mode=\"fill\"`).",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-value-change",
        "detail": "{ value: string }",
        "description": "Fired on every input change.",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-voice",
        "detail": "Record<string, never>",
        "description": "The Mic / voice button was clicked.",
        "displayDetail": "Record<string, never>"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": ""
      },
      {
        "name": "blur",
        "params": "",
        "returns": "void",
        "description": ""
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": ""
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": ""
      },
      {
        "name": "scrollToBottom",
        "params": "behavior?: ScrollBehavior",
        "returns": "void",
        "description": ""
      }
    ],
    "composedFrom": [
      {
        "name": "ChatThread",
        "group": "Components",
        "storyId": "solid-advanced-elements-chatthread--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "header-start",
        "mode": "inject",
        "doc": "Leading header controls, left of the title."
      },
      {
        "name": "header-end",
        "mode": "inject",
        "doc": "Trailing header controls."
      },
      {
        "name": "header",
        "mode": "replace",
        "part": true,
        "doc": "Full custom header; replaces the built-in title/model/context bar."
      },
      {
        "name": "sidebar",
        "mode": "inject",
        "part": true,
        "doc": "Left column (your nav / conversation list). Fixed width; use compose-your-own for resizable."
      },
      {
        "name": "empty",
        "mode": "replace",
        "doc": "Custom zero-state rendered in the message area while the thread is empty. Replaces the empty message list only — the composer and any suggestions still render."
      },
      {
        "name": "composer",
        "mode": "replace",
        "doc": "Full custom composer; you own submit + loading, drive the thread via messages."
      },
      {
        "name": "composer-actions",
        "mode": "inject",
        "doc": "Accessory row above the composer."
      },
      {
        "name": "footer",
        "mode": "inject",
        "part": true,
        "doc": "Row below the composer (disclaimers, token meter)."
      }
    ],
    "parts": [
      {
        "name": "header-bar",
        "doc": "The built-in header bar (the title / model-switcher / context row that hosts the header-start/header-end inject slots). Restyle its height, padding, or gap from outside without replacing the whole header via the `header` slot.",
        "recipe": "kai-chat::part(header-bar) { height: 3.5rem; padding-inline: 1rem; gap: 0.5rem }"
      },
      {
        "name": "header",
        "doc": "Full custom header; replaces the built-in title/model/context bar."
      },
      {
        "name": "sidebar",
        "doc": "Left column (your nav / conversation list). Fixed width; use compose-your-own for resizable."
      },
      {
        "name": "footer",
        "doc": "Row below the composer (disclaimers, token meter)."
      }
    ]
  },
  {
    "tag": "kai-checkpoint",
    "className": "KaiCheckpointElement",
    "displayName": "Checkpoint",
    "props": [
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional text beside the icon.",
        "displayType": "undefined | string"
      },
      {
        "name": "tooltip",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Tooltip on hover.",
        "displayType": "undefined | string"
      },
      {
        "name": "variant",
        "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
        "optional": true,
        "scalar": true,
        "description": "Visual button style.",
        "default": "'ghost'",
        "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\"",
        "optional": true,
        "scalar": true,
        "description": "Button size (use an `icon*` size for an icon-only checkpoint).",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
      }
    ],
    "events": [
      {
        "name": "kai-select",
        "detail": null,
        "description": "The checkpoint was clicked.",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Checkpoint",
        "group": "Components",
        "storyId": "solid-advanced-elements-checkpoint--docs"
      },
      {
        "name": "CheckpointIcon",
        "group": "Components",
        "storyId": "solid-advanced-elements-checkpointicon--docs"
      },
      {
        "name": "CheckpointTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-checkpointtrigger--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-choice",
    "className": "KaiChoiceElement",
    "displayName": "Choice",
    "props": [
      {
        "name": "data",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The choice definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import `ChoiceCardData` from `@kitn.ai/ui` for the full shape.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
        "displayType": "undefined | string"
      },
      {
        "name": "heading",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
        "displayType": "undefined | string"
      },
      {
        "name": "resolution",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Controlled selection — the selected option id. When set, the consumer owns the current pick (RadioGroup `value`). Attribute: `value`.",
        "displayType": "undefined | string"
      },
      {
        "name": "defaultValue",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`.",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the whole radiogroup + Submit (e.g. while the agent is busy). Attribute: `disabled`.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-value-change",
        "detail": "{ value: string }",
        "description": "The selection changed BEFORE submit (a row click or the `select()` method). Distinct from the terminal `action` verb on the `kai-card` contract event.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the radiogroup roving tab stop (or the Other input when selected)."
      },
      {
        "name": "select",
        "params": "optionId: string",
        "returns": "void",
        "description": "Select an option by id locally — no emit, fires kai-value-change (same as a row click). Lets a consumer pre-highlight or drive selection externally."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Submit the current selection — emits the `action` verb on kai-card and resolves the card (single-shot). Named `send`, not `submit`, per the shared vocabulary."
      },
      {
        "name": "dismiss",
        "params": "",
        "returns": "void",
        "description": "Trigger the dismiss path — emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
      },
      {
        "name": "reopen",
        "params": "",
        "returns": "void",
        "description": "Re-open a dismissed card from its stub — emits `reopen` on kai-card."
      }
    ],
    "composedFrom": [
      {
        "name": "ChoiceCard",
        "group": "Components",
        "storyId": "solid-advanced-elements-choicecard--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-coachmark",
    "className": "KaiCoachmarkElement",
    "displayName": "Coachmark",
    "props": [
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-coachmark open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "headline",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The bold title. Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration).",
        "displayType": "undefined | string"
      },
      {
        "name": "badge",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "A small badge pill beside the headline (e.g. \"New\").",
        "displayType": "undefined | string"
      },
      {
        "name": "placement",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Floating placement relative to the anchor (default `bottom`).",
        "displayType": "undefined | string"
      },
      {
        "name": "tone",
        "type": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\"",
        "optional": true,
        "scalar": true,
        "description": "Color tone: `primary` (default, theme accent), `info` (blue), `success` (green), `warning` (amber), or `error` (red) — reusing the kit's tool hues.",
        "displayType": "undefined | \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\""
      },
      {
        "name": "arrow",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Render the arrow that points at the anchor (default `true`). Set `arrow=\"false\"` for a plain bubble with no pointer.",
        "default": "true",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-dismiss",
        "detail": "Record<string, never>",
        "description": "The × dismiss button was pressed. The consumer records that this hint was seen so it won't show again.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The coachmark opened or closed (a method, the ×, or a driven `open`).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Coachmark",
        "group": "Components",
        "storyId": "solid-advanced-elements-coachmark--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "content",
        "mode": "replace",
        "doc": "The bubble body text shown under the headline."
      }
    ],
    "parts": [
      {
        "name": "bubble",
        "doc": "The hint bubble panel. Restyle its background, radius, or padding from outside; the default is bg-primary.",
        "recipe": "kai-coachmark::part(bubble) { border-radius: 1rem }"
      },
      {
        "name": "arrow",
        "doc": "The arrow pointing at the anchor. Inherits the bubble color; recolor it alongside the bubble.",
        "recipe": "kai-coachmark::part(arrow) { background: var(--color-accent) }"
      },
      {
        "name": "badge",
        "doc": "The small badge pill beside the headline (e.g. \"New\").",
        "recipe": "kai-coachmark::part(badge) { text-transform: none }"
      },
      {
        "name": "title",
        "doc": "The bold headline text.",
        "recipe": "kai-coachmark::part(title) { font-size: 0.9375rem }"
      },
      {
        "name": "dismiss",
        "doc": "The dismiss button. Recolor or reposition it from outside.",
        "recipe": "kai-coachmark::part(dismiss) { color: var(--color-primary-foreground) }"
      }
    ]
  },
  {
    "tag": "kai-code-block",
    "className": "KaiCodeBlockElement",
    "displayName": "CodeBlock",
    "props": [
      {
        "name": "code",
        "type": "string",
        "optional": false,
        "scalar": true,
        "description": "The source code to render.",
        "default": "''",
        "displayType": "string"
      },
      {
        "name": "language",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Language grammar (e.g. `js`, `python`). Defaults to `tsx`.",
        "displayType": "undefined | string"
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shiki theme name.",
        "default": "'github-dark-dimmed'",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable syntax highlighting (renders plain text, no Shiki).",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "Code text sizing.",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "CodeBlock",
        "group": "Components",
        "storyId": "solid-advanced-elements-codeblock--docs"
      },
      {
        "name": "CodeBlockCode",
        "group": "Components",
        "storyId": "solid-advanced-elements-codeblockcode--docs"
      }
    ],
    "tokens": [
      "--color-code-foreground"
    ]
  },
  {
    "tag": "kai-command",
    "className": "KaiCommandElement",
    "displayName": "Command",
    "props": [
      {
        "name": "items",
        "type": "undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]",
        "optional": true,
        "scalar": false,
        "description": "Flat list of items. Set as a JS property — not an HTML attribute.",
        "displayType": "undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; shortcut?: undefined | string; group?: undefined | string }[]"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder text for the search input.",
        "displayType": "undefined | string"
      },
      {
        "name": "emptyLabel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Label shown when no items match the current query.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-active-change",
        "detail": "{ id: undefined | string }",
        "description": "Fired when the highlighted/active item changes — via Arrow keys or when filtering re-clamps the active row. `id` is the newly active item's id, or `undefined` when no item is active (e.g. the filtered list is empty). Lets a host preview the active item without committing a selection.",
        "displayDetail": "{ id: undefined | string }"
      },
      {
        "name": "kai-query-change",
        "detail": "{ value: string }",
        "description": "Fired on every keystroke in the search input.",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-select",
        "detail": "{ id: string }",
        "description": "Fired when the user selects an item (click or Enter).",
        "displayDetail": "{ id: string }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the search combobox input inside the shadow root so the palette is type-ready on demand (Shadow-DOM autofocus is unreliable, so hosts call this after opening the palette)."
      },
      {
        "name": "blur",
        "params": "",
        "returns": "void",
        "description": "Blur the focused search input."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Reset the search query to empty — re-showing all items — and fire `kai-query-change` with `''`. Mirrors the Escape-key behavior."
      }
    ],
    "composedFrom": [
      {
        "name": "CommandList",
        "group": "UI",
        "storyId": "solid-advanced-primitives-commandlist--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "shortcut",
        "doc": "The right-aligned per-row keyboard shortcut, rendered as kai-kbd key caps. Shown only when a row carries a `shortcut`.",
        "recipe": "kai-command::part(shortcut) { opacity: 0.8 }"
      }
    ]
  },
  {
    "tag": "kai-compare",
    "className": "KaiCompareElement",
    "displayName": "Compare",
    "props": [
      {
        "name": "data",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The compare definition (prompt + the two candidates). Set as a JS PROPERTY: `el.data = { prompt, candidates: [A, B], collapse? }`. Import `ResponseCompareData` from `@kitn.ai/ui` for the full shape.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "compareId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable id correlating every emitted event. Attribute: `compare-id`.",
        "displayType": "undefined | string"
      },
      {
        "name": "selection",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Re-hydrate / control the user's pick. Set as a JS PROPERTY: `el.selection = { chosenId, rejectedIds }`. Renders the collapsed winner.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "layout",
        "type": "undefined | \"auto\" | \"columns\" | \"tabs\"",
        "optional": true,
        "scalar": true,
        "description": "Layout: `'auto'` (default — columns when wide, tabs when narrow, by CONTAINER width) | `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`.",
        "default": "'auto'",
        "displayType": "undefined | \"auto\" | \"columns\" | \"tabs\""
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "Prose/text size for the rendered candidates. Attribute: `prose-size`.",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shiki theme for code blocks in the candidates. Attribute: `code-theme`.",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Whether code blocks are syntax-highlighted. Attribute: `code-highlight`.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-compare-select",
        "detail": "{ chosenId: string; rejectedIds: string[]; at?: undefined | number }",
        "description": "The user committed a pick. `detail` = `{ chosenId, rejectedIds, at }`.",
        "displayDetail": "{ chosenId: string; rejectedIds: string[]; at?: undefined | number }"
      },
      {
        "name": "kai-error",
        "detail": "{ compareId: string; message: string }",
        "description": "The definition was unusable.",
        "displayDetail": "{ compareId: string; message: string }"
      },
      {
        "name": "kai-ready",
        "detail": "{ compareId: string }",
        "description": "Both candidates have settled and the pick is live.",
        "displayDetail": "{ compareId: string }"
      }
    ],
    "methods": [
      {
        "name": "select",
        "params": "candidateId: string",
        "returns": "void",
        "description": "Programmatically commit a pick by candidate id — same path as the \"Pick this\" button: fires kai-compare-select and optimistically collapses (single-shot; inert while streaming or already resolved). `select` does NOT collide with the `selection` prop (distinct identifier)."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the current roving tab stop (the focused candidate's \"Pick this\" radio) so a consumer can move keyboard focus into the radiogroup."
      }
    ],
    "composedFrom": [
      {
        "name": "ResponseCompare",
        "group": "Components",
        "storyId": "solid-advanced-elements-responsecompare--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-composer",
    "className": "KaiComposerElement",
    "displayName": "Composer",
    "props": [
      {
        "name": "value",
        "type": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]",
        "optional": true,
        "scalar": false,
        "description": "Controlled value — string or a full ComposerDoc (set as JS property).",
        "displayType": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder text shown when the composer is empty.",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the composer entirely (non-interactive).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "loading",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a loading/streaming state and block submit.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "maxHeight",
        "type": "undefined | string | number",
        "optional": true,
        "scalar": true,
        "description": "Maximum height in px before the content scrolls. Default 240.",
        "default": "240",
        "displayType": "undefined | string | number"
      },
      {
        "name": "submitOnEnter",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Whether pressing Enter (without Shift) submits. Default true.",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "triggers",
        "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
        "optional": true,
        "scalar": false,
        "description": "Trigger definitions — set as a JS property.",
        "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
      },
      {
        "name": "highlights",
        "type": "undefined | (string | { pattern: string; flags?: undefined | string; class?: undefined | string })[]",
        "optional": true,
        "scalar": false,
        "description": "Keyword highlight rules — set as a JS property.",
        "displayType": "undefined | (string | { pattern: string; flags?: undefined | string; class?: undefined | string })[]"
      },
      {
        "name": "kindIcons",
        "type": "undefined | Record<string, string>",
        "optional": true,
        "scalar": false,
        "description": "Default icon per entity kind (kind → image URL/data-URI) for items without their own `icon`. Overrides the built-in agent/plugin glyphs. JS property.",
        "displayType": "undefined | Record<string, string>"
      }
    ],
    "events": [
      {
        "name": "kai-blur",
        "detail": "{ originalEvent: FocusEvent }",
        "description": "The composer lost focus.",
        "displayDetail": "{ originalEvent: FocusEvent }"
      },
      {
        "name": "kai-entity-add",
        "detail": "{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }",
        "description": "An entity pill was inserted into the composer.",
        "displayDetail": "{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }"
      },
      {
        "name": "kai-entity-remove",
        "detail": "{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }",
        "description": "An entity pill was deleted from the composer.",
        "displayDetail": "{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }"
      },
      {
        "name": "kai-focus",
        "detail": "{ originalEvent: FocusEvent }",
        "description": "The composer gained focus. `focus`/`blur` are NOT composed natively, so they don't escape the shadow root — these re-expose them on the host. (For `keydown`/`paste`/`focusin`/`focusout`, listen NATIVELY on `<kai-composer>`: they're composed and already cross the shadow boundary.)",
        "displayDetail": "{ originalEvent: FocusEvent }"
      },
      {
        "name": "kai-submit",
        "detail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }",
        "description": "The user submitted the composer (Enter or programmatic submit).",
        "displayDetail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }"
      },
      {
        "name": "kai-trigger",
        "detail": "{ char: string; query: string; rect: DOMRect }",
        "description": "A trigger character was detected at the caret (e.g. `/` or `@`).",
        "displayDetail": "{ char: string; query: string; rect: DOMRect }"
      },
      {
        "name": "kai-trigger-close",
        "detail": "Record<string, never>",
        "description": "The active trigger was dismissed (Escape, space, or outside click).",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-value-change",
        "detail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }",
        "description": "The content changed (fires on every input event).",
        "displayDetail": "{ doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; text: string; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the editable element. `focus`/`blur` are NOT composed natively, so a host-level focus() can't reach the editable inside the shadow root — this is the only way to focus the composer programmatically."
      },
      {
        "name": "blur",
        "params": "",
        "returns": "void",
        "description": "Blur the editable element."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Empty the composer to a blank doc (resets the internal value + history baseline; fires kai-value-change)."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Submit the current content programmatically — same path as Enter (fires kai-submit). Named `send`, not `submit`, to match the shared vocabulary and avoid any submit collision."
      },
      {
        "name": "insertEntity",
        "params": "entity: EntityRef",
        "returns": "void",
        "description": "Insert an atomic entity pill (skill/agent/plugin) at the caret without typing a trigger (fires kai-entity-add)."
      }
    ],
    "composedFrom": [
      {
        "name": "Composer",
        "group": "Components",
        "storyId": "solid-advanced-elements-composer--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-confirm",
    "className": "KaiConfirmElement",
    "displayName": "Confirm",
    "props": [
      {
        "name": "data",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The confirm definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { body, tone, actions:[…] }`. Import `ConfirmCardData` from `@kitn.ai/ui` for the full shape.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
        "displayType": "undefined | string"
      },
      {
        "name": "heading",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
        "displayType": "undefined | string"
      },
      {
        "name": "autofocus",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Focus the default action on mount (off by default — no focus-stealing). Attribute: `autofocus`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "resolution",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'action', action:'…' }`.",
        "displayType": "undefined | Record<string, unknown>"
      }
    ],
    "events": [],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the default action button (or the first action if none is default) — the same target `autofocus` focuses on mount, but on demand."
      },
      {
        "name": "confirm",
        "params": "actionId?: string",
        "returns": "void",
        "description": "Activate an action by id — emits the `action` verb on kai-card and resolves the card (single-shot). With no id, invokes the default action."
      },
      {
        "name": "dismiss",
        "params": "",
        "returns": "void",
        "description": "Trigger the dismiss path — emits `dismiss` on kai-card and optimistically collapses the card to its re-openable stub."
      },
      {
        "name": "reopen",
        "params": "",
        "returns": "void",
        "description": "Re-open a dismissed card from its stub — emits `reopen` on kai-card."
      }
    ],
    "composedFrom": [
      {
        "name": "ConfirmCard",
        "group": "Components",
        "storyId": "solid-advanced-elements-confirmcard--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-context",
    "className": "KaiContextElement",
    "displayName": "Context",
    "props": [
      {
        "name": "context",
        "type": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; reasoningTokens?: undefined | number; cacheTokens?: undefined | number; estimatedCost?: undefined | number }",
        "optional": true,
        "scalar": false,
        "description": "Token-usage data. Set as a JS property.",
        "displayType": "ContextData | undefined"
      },
      {
        "name": "warnThreshold",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Fraction (0–1) above which the meter turns yellow. Defaults to `0.7` (70%).",
        "displayType": "undefined | number"
      },
      {
        "name": "dangerThreshold",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Fraction (0–1) above which the meter turns red. Defaults to `0.9` (90%).",
        "displayType": "undefined | number"
      }
    ],
    "events": [
      {
        "name": "kai-threshold-change",
        "detail": "{ level: \"ok\" | \"warn\" | \"danger\" }",
        "description": "Fires when the computed severity level changes (ok → warn → danger or back). `detail.level` is `'ok'`, `'warn'`, or `'danger'`.",
        "displayDetail": "{ level: \"ok\" | \"warn\" | \"danger\" }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Context",
        "group": "Components",
        "storyId": "solid-advanced-elements-context--docs"
      },
      {
        "name": "ContextTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-contexttrigger--docs"
      },
      {
        "name": "ContextContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextcontent--docs"
      },
      {
        "name": "ContextContentHeader",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextcontentheader--docs"
      },
      {
        "name": "ContextContentBody",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextcontentbody--docs"
      },
      {
        "name": "ContextContentFooter",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextcontentfooter--docs"
      },
      {
        "name": "ContextInputUsage",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextinputusage--docs"
      },
      {
        "name": "ContextOutputUsage",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextoutputusage--docs"
      },
      {
        "name": "ContextReasoningUsage",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextreasoningusage--docs"
      },
      {
        "name": "ContextCacheUsage",
        "group": "Components",
        "storyId": "solid-advanced-elements-contextcacheusage--docs"
      },
      {
        "name": "DEFAULT_WARN_THRESHOLD",
        "group": "Components",
        "storyId": "solid-advanced-elements-defaultwarnthreshold--docs"
      },
      {
        "name": "DEFAULT_DANGER_THRESHOLD",
        "group": "Components",
        "storyId": "solid-advanced-elements-defaultdangerthreshold--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-conversations",
    "className": "KaiConversationsElement",
    "displayName": "Conversations",
    "props": [
      {
        "name": "groups",
        "type": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
        "optional": false,
        "scalar": false,
        "description": "Pre-bucketed conversation groups (e.g. \"Today\", \"Yesterday\"), each with its own conversations. Use this when you want to control the grouping/headers yourself; otherwise pass a flat `conversations` array. Set as a JS property.",
        "typeName": "ConversationGroup[]",
        "typeShape": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
        "default": "[]",
        "typeImport": "ConversationGroup",
        "displayType": "ConversationGroup[]"
      },
      {
        "name": "conversations",
        "type": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "A flat list of conversation summaries; the component buckets them by recency for you. Ignored when `groups` is provided. Set as a JS property.",
        "typeName": "ConversationSummary[]",
        "typeShape": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
        "default": "[]",
        "typeImport": "ConversationSummary",
        "displayType": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
      },
      {
        "name": "activeId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The id of the currently-open conversation, highlighted in the list.",
        "displayType": "undefined | string"
      },
      {
        "name": "collapsed",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Controlled collapsed state. Set as a JS property (`el.collapsed = true`) to drive the rail from your app, updating it in response to `kai-collapse-toggle`. Omit for uncontrolled (the element manages it). Collapsed shrinks the rail to a floating reopen button.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultCollapsed",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-collapse-toggle",
        "detail": "{ collapsed: false | true }",
        "description": "The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call).",
        "displayDetail": "{ collapsed: false | true }"
      },
      {
        "name": "kai-conversation-select",
        "detail": "{ id: string }",
        "description": "A conversation was selected.",
        "displayDetail": "{ id: string }"
      },
      {
        "name": "kai-new-chat",
        "detail": "Record<string, never>",
        "description": "The \"New chat\" button was clicked.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-search",
        "detail": "{ query: string }",
        "description": "The built-in search box query changed (typing, or a programmatic `clear()` which fires it with `''`). Lets a consumer mirror or server-side the filter.",
        "displayDetail": "{ query: string }"
      },
      {
        "name": "kai-toggle-sidebar",
        "detail": "Record<string, never>",
        "description": "The sidebar toggle was clicked.",
        "displayDetail": "Record<string, never>"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the built-in search input inside the shadow root."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Clear the internal search query (resets the list filter) and fire kai-search with an empty string."
      },
      {
        "name": "select",
        "params": "id: string",
        "returns": "void",
        "description": "Programmatically select a conversation by id — mirror of the kai-conversation-select event (a convenience over driving `activeId`)."
      },
      {
        "name": "collapse",
        "params": "",
        "returns": "void",
        "description": "Collapse the rail to its floating reopen button (fires `kai-collapse-toggle`)."
      },
      {
        "name": "expand",
        "params": "",
        "returns": "void",
        "description": "Expand the rail back to the full list (fires `kai-collapse-toggle`)."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Toggle the rail collapsed/expanded (fires `kai-collapse-toggle`)."
      }
    ],
    "composedFrom": [
      {
        "name": "ConversationList",
        "group": "Components",
        "storyId": "solid-advanced-elements-conversationlist--docs"
      },
      {
        "name": "CollapsedRail",
        "group": "Components",
        "storyId": "solid-advanced-elements-collapsedrail--docs"
      }
    ],
    "tokens": [
      "--color-sidebar",
      "--color-scrollbar-thumb"
    ],
    "slots": [
      {
        "name": "header",
        "mode": "replace",
        "doc": "Full custom title bar; replaces the built-in toggle / \"Chats\" / New-chat row."
      },
      {
        "name": "empty",
        "mode": "replace",
        "doc": "Custom zero-state shown when there are no conversations; replaces the built-in \"No conversations yet\"."
      },
      {
        "name": "footer",
        "mode": "inject",
        "doc": "A row below the list — account, settings, or usage."
      }
    ],
    "parts": [
      {
        "name": "trailing",
        "doc": "The right-aligned trailing text on each conversation row (a count, status, or relative time). Set it per item via the `trailing` field; otherwise a short auto relative time is derived from `updatedAt`. Recolor or resize it from outside.",
        "recipe": "kai-conversations::part(trailing) { color: var(--color-primary); font-variant-numeric: tabular-nums }"
      }
    ]
  },
  {
    "tag": "kai-dialog",
    "className": "KaiDialogElement",
    "displayName": "Dialog",
    "props": [
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on Escape/backdrop). Set `el.open = true`, or `<kai-dialog open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The dialog opened or closed (Escape, backdrop click, a driven `open`, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Move focus to the dialog panel (no-op while closed)."
      }
    ],
    "composedFrom": [
      {
        "name": "Dialog",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dialog--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "header",
        "mode": "inject",
        "part": true,
        "doc": "Optional title region at the top of the panel."
      },
      {
        "name": "footer",
        "mode": "inject",
        "part": true,
        "doc": "Optional actions region at the bottom of the panel."
      }
    ],
    "parts": [
      {
        "name": "backdrop",
        "doc": "The full-area scrim behind the panel. Restyle its color/blur.",
        "recipe": "kai-dialog::part(backdrop) { background: rgb(0 0 0 / 0.6) }"
      },
      {
        "name": "panel",
        "doc": "The centered modal panel. Restyle width, radius, padding.",
        "recipe": "kai-dialog::part(panel) { max-width: 32rem }"
      },
      {
        "name": "body",
        "doc": "The scrolling content region (the default slot).",
        "recipe": "kai-dialog::part(body) { padding: 1.25rem }"
      },
      {
        "name": "header",
        "doc": "Optional title region at the top of the panel."
      },
      {
        "name": "footer",
        "doc": "Optional actions region at the bottom of the panel."
      }
    ]
  },
  {
    "tag": "kai-editable-label",
    "className": "KaiEditableLabelElement",
    "displayName": "EditableLabel",
    "props": [
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The label text — settable and reflected to the `value` attribute. Read `el.value` for live state.",
        "displayType": "undefined | string"
      },
      {
        "name": "editing",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Controlled edit state. `el.editing = true` opens the field; reflected to the `editing` attribute.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder shown while editing / when the value is empty.",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable entering edit mode.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-cancel",
        "detail": "Record<string, never>",
        "description": "Edit was cancelled (Esc); the text is restored.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-rename",
        "detail": "{ value: string }",
        "description": "Committed a changed value (Enter / blur).",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [
      {
        "name": "edit",
        "params": "",
        "returns": "void",
        "description": ""
      }
    ],
    "composedFrom": [
      {
        "name": "EditableLabel",
        "group": "UI",
        "storyId": "solid-advanced-primitives-editablelabel--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "text",
        "doc": "The read-mode label text. Restyle its typography; it swaps to the input on edit.",
        "recipe": "kai-editable-label::part(text) { font-weight: 600 }"
      },
      {
        "name": "input",
        "doc": "The edit-mode input (the composed kai-input field).",
        "recipe": "kai-editable-label::part(input) { font: inherit }"
      }
    ]
  },
  {
    "tag": "kai-embed",
    "className": "KaiEmbedElement",
    "displayName": "Embed",
    "props": [
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted event. Set as an attribute or property.",
        "displayType": "undefined | string"
      },
      {
        "name": "data",
        "type": "undefined | { provider: \"youtube\" | \"vimeo\" | \"generic\"; id?: undefined | string; url?: undefined | string; title?: undefined | string; poster?: undefined | string; start?: undefined | number; aspectRatio?: undefined | \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\" }",
        "optional": true,
        "scalar": false,
        "description": "The embed payload (provider + id/url + options). Set as a JS **property** (object).",
        "displayType": "undefined | { provider: \"youtube\" | \"vimeo\" | \"generic\"; id?: undefined | string; url?: undefined | string; title?: undefined | string; poster?: undefined | string; start?: undefined | number; aspectRatio?: undefined | \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\" }"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Embed",
        "group": "Components",
        "storyId": "solid-advanced-elements-embed--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-empty",
    "className": "KaiEmptyElement",
    "displayName": "Empty",
    "props": [
      {
        "name": "emptyTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Title text. Attribute: `empty-title` (`title` is a global HTML attribute).",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "description",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Description text.",
        "default": "''",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Empty",
        "group": "Components",
        "storyId": "solid-advanced-elements-empty--docs"
      },
      {
        "name": "EmptyHeader",
        "group": "Components",
        "storyId": "solid-advanced-elements-emptyheader--docs"
      },
      {
        "name": "EmptyMedia",
        "group": "Components",
        "storyId": "solid-advanced-elements-emptymedia--docs"
      },
      {
        "name": "EmptyTitle",
        "group": "Components",
        "storyId": "solid-advanced-elements-emptytitle--docs"
      },
      {
        "name": "EmptyDescription",
        "group": "Components",
        "storyId": "solid-advanced-elements-emptydescription--docs"
      },
      {
        "name": "EmptyContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-emptycontent--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-feedback-bar",
    "className": "KaiFeedbackBarElement",
    "displayName": "FeedbackBar",
    "props": [
      {
        "name": "barTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The banner label (e.g. \"Was this helpful?\"). Attribute: `bar-title` (`title` is avoided — it's a global HTML attribute).",
        "default": "'Was this helpful?'",
        "displayType": "undefined | string"
      },
      {
        "name": "collectDetail",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When set, a not-helpful vote opens an optional detail form before the thank-you confirmation. Attribute: `collect-detail`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "categories",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Optional category chips for the detail form. Set as a JS property (array).",
        "displayType": "undefined | string[]"
      },
      {
        "name": "detailTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Heading for the detail form. Attribute: `detail-title`.",
        "displayType": "undefined | string"
      },
      {
        "name": "detailPlaceholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder for the detail comment box. Attribute: `detail-placeholder`.",
        "displayType": "undefined | string"
      },
      {
        "name": "submitLabel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Submit button label in the detail form. Attribute: `submit-label`.",
        "displayType": "undefined | string"
      },
      {
        "name": "thanksMessage",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Confirmation copy shown after a vote/submit. Attribute: `thanks-message`.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-close",
        "detail": null,
        "description": "The user dismissed the banner.",
        "displayDetail": null
      },
      {
        "name": "kai-feedback",
        "detail": "{ value: \"helpful\" | \"not-helpful\" }",
        "description": "The user rated the response. `value` is `'helpful'` or `'not-helpful'`.",
        "displayDetail": "{ value: \"helpful\" | \"not-helpful\" }"
      },
      {
        "name": "kai-feedback-detail",
        "detail": "{ value: \"helpful\" | \"not-helpful\"; category?: undefined | string; comment?: undefined | string }",
        "description": "The user submitted the optional detail form (`collect-detail`).",
        "displayDetail": "{ value: \"helpful\" | \"not-helpful\"; category?: undefined | string; comment?: undefined | string }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "FeedbackBar",
        "group": "Components",
        "storyId": "solid-advanced-elements-feedbackbar--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-file-tree",
    "className": "KaiFileTreeElement",
    "displayName": "FileTree",
    "props": [
      {
        "name": "files",
        "type": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
        "optional": false,
        "scalar": false,
        "description": "The files to render. Set as a JS property (array of `{ path, url?, code?, language?, type?, additions?, deletions?, status? }`).",
        "typeName": "FileTreeFile[]",
        "typeShape": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]",
        "default": "[]",
        "typeImport": "FileTreeFile",
        "displayType": "{ path: string; url?: undefined | string; code?: undefined | string; language?: undefined | string; type?: undefined | \"html\" | \"pdf\" | \"image\" | \"other\"; additions?: undefined | number; deletions?: undefined | number; status?: undefined | \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\" }[]"
      },
      {
        "name": "activeFile",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Selected file path — highlighted in the tree.",
        "displayType": "undefined | string"
      },
      {
        "name": "defaultExpanded",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Folder paths expanded initially. Omit to start with all folders open.",
        "displayType": "undefined | string[]"
      },
      {
        "name": "summary",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a changed-files summary header (file count + summed `+/-` + Collapse-all). Attribute: `summary`. Off by default.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-select",
        "detail": "{ path: string }",
        "description": "Fired when a file is selected. `detail.path` = the file's path.",
        "displayDetail": "{ path: string }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "FileTree",
        "group": "Components",
        "storyId": "solid-advanced-elements-filetree--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "summary",
        "doc": "The changed-files summary header (the file count, the summed +additions/-deletions, and the Collapse-all/Expand-all toggle). Rendered only when the `summary` attribute is set; restyle or hide it from outside.",
        "recipe": "kai-file-tree::part(summary) { border-bottom: none; padding-block: 0.5rem }"
      },
      {
        "name": "status",
        "doc": "The per-row change-status letter (A/M/D/R/U), shown when a file carries a `status`. Colored with the conventional VCS tool hues; restyle from outside.",
        "recipe": "kai-file-tree::part(status) { font-weight: 700 }"
      },
      {
        "name": "stat-additions",
        "doc": "The trailing `+N` additions stat on a file row (success/green tool hue, tabular-nums). Shown only when a file carries `additions`.",
        "recipe": "kai-file-tree::part(stat-additions) { color: var(--color-tool-green) }"
      },
      {
        "name": "stat-deletions",
        "doc": "The trailing `-N` deletions stat on a file row (error/red tool hue, tabular-nums). Shown only when a file carries `deletions`.",
        "recipe": "kai-file-tree::part(stat-deletions) { color: var(--color-tool-red) }"
      }
    ]
  },
  {
    "tag": "kai-file-upload",
    "className": "KaiFileUploadElement",
    "displayName": "FileUpload",
    "props": [
      {
        "name": "multiple",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Allow selecting multiple files (default true).",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "accept",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "`accept` attribute for the file picker (e.g. `image/*`).",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the dropzone — no clicking, no drag-and-drop.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Default dropzone label (overridable via the default slot).",
        "default": "'Click or drop files to upload'",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-files-added",
        "detail": "{ files: File[] }",
        "description": "Files were picked or dropped.",
        "displayDetail": "{ files: File[] }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "FileUpload",
        "group": "Components",
        "storyId": "solid-advanced-elements-fileupload--docs"
      },
      {
        "name": "FileUploadTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-fileuploadtrigger--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-form",
    "className": "KaiFormElement",
    "displayName": "Form",
    "props": [
      {
        "name": "data",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The form definition — a JSON Schema (`type:'object'`) + `x-kai-*` UI hints (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { type:'object', properties:{…} }`. Import the `FormDefinition` type from `@kitn.ai/ui` for the full shape (it is self-referential, so the element types it loosely).",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
        "displayType": "undefined | string"
      },
      {
        "name": "heading",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
        "displayType": "undefined | string"
      },
      {
        "name": "resolution",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'submit', data:{…} }`.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "values",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Controlled field values (JS property). When set, it wins over local edits.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "defaultValues",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Initial values overlaying the schema defaults (uncontrolled seed; JS property).",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable all fields + submit. Attribute: `disabled`.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-values-change",
        "detail": "{ values: Record<string, unknown>; valid: false | true }",
        "description": "The form's values changed on input — current coerced values + validity.",
        "displayDetail": "{ values: Record<string, unknown>; valid: false | true }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the first control, or the first INVALID control after a failed validation."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Validate + submit programmatically — focus the first invalid field on failure, else emit the `submit` CardEvent and resolve. Named `send`, not `submit`."
      },
      {
        "name": "validate",
        "params": "",
        "returns": "void",
        "description": "Run client-side validation now and return `{ valid, errors? }` WITHOUT submitting."
      },
      {
        "name": "reset",
        "params": "",
        "returns": "void",
        "description": "Re-seed the form from each field's `default` and clear errors."
      },
      {
        "name": "dismiss",
        "params": "",
        "returns": "void",
        "description": "Trigger the dismiss path (emit `dismiss` + collapse to the re-openable stub)."
      },
      {
        "name": "reopen",
        "params": "",
        "returns": "void",
        "description": "Re-open a dismissed card from its stub (emit `reopen`)."
      }
    ],
    "composedFrom": [
      {
        "name": "Form",
        "group": "Components",
        "storyId": "solid-advanced-elements-form--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-hover-card",
    "className": "KaiHoverCardElement",
    "displayName": "HoverCard",
    "props": [
      {
        "name": "openDelay",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Delay (ms) before the card opens on hover. Defaults to 0 (focus opens it immediately too).",
        "displayType": "undefined | number"
      },
      {
        "name": "closeDelay",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Delay (ms) before it closes after the pointer leaves. Defaults to 300.",
        "displayType": "undefined | number"
      },
      {
        "name": "placement",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'bottom'`; flips to stay in view.",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover). Set `el.open = true`, or `<kai-hover-card open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Suppress the hover behavior entirely without unmounting.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The card opened or closed (by hover/focus, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "HoverCardRoot",
        "group": "UI",
        "storyId": "solid-advanced-primitives-hovercardroot--docs"
      },
      {
        "name": "HoverCardTrigger",
        "group": "UI",
        "storyId": "solid-advanced-primitives-hovercardtrigger--docs"
      },
      {
        "name": "HoverCardContent",
        "group": "UI",
        "storyId": "solid-advanced-primitives-hovercardcontent--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "card",
        "mode": "inject",
        "doc": "The rich content shown in the floating hover card."
      }
    ]
  },
  {
    "tag": "kai-icon",
    "className": "KaiIconElement",
    "displayName": "Icon",
    "props": [
      {
        "name": "name",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "A curated icon name (e.g. `\"mic\"`, `\"globe\"`), an image URL/data-URI, or plain text.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\"",
        "optional": true,
        "scalar": true,
        "description": "Size token: `sm` | `md` (default) | `lg`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [],
    "tokens": [],
    "parts": [
      {
        "name": "icon",
        "doc": "The icon wrapper. Inherits `currentColor` and the `size` prop by default; recolor or resize it from outside.",
        "recipe": "kai-icon::part(icon) { color: var(--color-primary) }"
      }
    ]
  },
  {
    "tag": "kai-image",
    "className": "KaiImageElement",
    "displayName": "Image",
    "props": [
      {
        "name": "base64",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Base64-encoded image data (pair with `media-type`).",
        "displayType": "undefined | string"
      },
      {
        "name": "bytes",
        "type": "undefined | Uint8Array<ArrayBufferLike>",
        "optional": true,
        "scalar": false,
        "description": "Raw image bytes (set as a JS property).",
        "displayType": "undefined | Uint8Array<ArrayBufferLike>"
      },
      {
        "name": "alt",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Alt text.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "mediaType",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "MIME type (default `image/png`).",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Image",
        "group": "Components",
        "storyId": "solid-advanced-elements-image--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-input",
    "className": "KaiInputElement",
    "displayName": "Input",
    "props": [
      {
        "name": "type",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only.",
        "default": "'text'",
        "displayType": "undefined | string"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Controlled value — settable and reflected to the `value` attribute. `el.value = 'hi'` drives it (no event); typing updates it and fires `kai-input`. Read `el.value` for live state.",
        "displayType": "undefined | string"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder shown when empty.",
        "displayType": "undefined | string"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Field label, linked to the input.",
        "displayType": "undefined | string"
      },
      {
        "name": "hint",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Helper text below the control.",
        "displayType": "undefined | string"
      },
      {
        "name": "error",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Error text; flips the field invalid (`aria-invalid` + destructive border).",
        "displayType": "undefined | string"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\"",
        "optional": true,
        "scalar": true,
        "description": "Control density: `sm` or `md`. Defaults to `md`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\""
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable interaction.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "readonly",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Make the input read-only.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "required",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Mark the input required.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "invalid",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Force the invalid state without an `error` string.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "name",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Form-control name.",
        "displayType": "undefined | string"
      },
      {
        "name": "autocomplete",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Autofill hint forwarded to the inner input (e.g. `email`, `current-password`).",
        "displayType": "undefined | string"
      },
      {
        "name": "inputmode",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`).",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "{ value: string }",
        "description": "The value was committed (blur).",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-input",
        "detail": "{ value: string }",
        "description": "The value changed per keystroke.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the inner input (the host can't reach into the shadow root)."
      },
      {
        "name": "select",
        "params": "",
        "returns": "void",
        "description": "Select the inner input's text."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Empty the value and fire `kai-change` with `''`."
      }
    ],
    "composedFrom": [
      {
        "name": "Input",
        "group": "UI",
        "storyId": "solid-advanced-primitives-input--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "leading",
        "mode": "inject",
        "doc": "A glyph, prefix, or affix at the start of the field, inside the border."
      },
      {
        "name": "trailing",
        "mode": "inject",
        "doc": "A button, unit, or affix at the end of the field, inside the border."
      }
    ],
    "parts": [
      {
        "name": "field",
        "doc": "The bordered control box (the row wrapping any affixes plus the input). Restyle its border, radius, surface, or focus ring.",
        "recipe": "kai-input::part(field) { border-radius: 0.75rem }"
      },
      {
        "name": "input",
        "doc": "The inner input element. Restyle its text, padding, or placeholder.",
        "recipe": "kai-input::part(input) { font-variant-numeric: tabular-nums }"
      },
      {
        "name": "label",
        "doc": "The field label above the control. Restyle its typography or spacing.",
        "recipe": "kai-input::part(label) { font-weight: 600 }"
      },
      {
        "name": "hint",
        "doc": "The hint or error line below the control. Restyle its typography.",
        "recipe": "kai-input::part(hint) { font-style: italic }"
      }
    ]
  },
  {
    "tag": "kai-kbd",
    "className": "KaiKbdElement",
    "displayName": "Kbd",
    "props": [
      {
        "name": "keys",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shortcut spec — tokens joined by `+` (e.g. `Mod+Shift+K`). Omit it to show default-slot content instead. Display only; the element does not bind keys.",
        "displayType": "undefined | string"
      },
      {
        "name": "platform",
        "type": "undefined | \"other\" | \"auto\" | \"mac\"",
        "optional": true,
        "scalar": true,
        "description": "`mac` uses ⌘/⌥, `other` uses Ctrl. `auto` (default) sniffs the OS.",
        "default": "'auto'",
        "displayType": "undefined | \"other\" | \"auto\" | \"mac\""
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\"",
        "optional": true,
        "scalar": true,
        "description": "Cap size: `sm` or `md`. Defaults to `md`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Kbd",
        "group": "UI",
        "storyId": "solid-advanced-primitives-kbd--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "key",
        "doc": "Each key cap. Restyle its surface, border, radius, or font.",
        "recipe": "kai-kbd::part(key) { border-radius: 0.375rem }"
      },
      {
        "name": "separator",
        "doc": "The gap between key caps. Inject a literal joiner (e.g. a plus sign) from outside.",
        "recipe": "kai-kbd::part(separator)::after { content: \"+\" }"
      }
    ]
  },
  {
    "tag": "kai-link-preview",
    "className": "KaiLinkPreviewElement",
    "displayName": "LinkPreview",
    "props": [
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted event. Set as an attribute or property.",
        "displayType": "undefined | string"
      },
      {
        "name": "data",
        "type": "undefined | { url: string; title?: undefined | string; description?: undefined | string; image?: undefined | string; imageAlt?: undefined | string; favicon?: undefined | string; domain?: undefined | string; siteName?: undefined | string }",
        "optional": true,
        "scalar": false,
        "description": "The link payload (OG metadata). Set as a JS **property** (object).",
        "displayType": "undefined | { url: string; title?: undefined | string; description?: undefined | string; image?: undefined | string; imageAlt?: undefined | string; favicon?: undefined | string; domain?: undefined | string; siteName?: undefined | string }"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "LinkPreview",
        "group": "Components",
        "storyId": "solid-advanced-elements-linkpreview--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-loader",
    "className": "KaiLoaderElement",
    "displayName": "Loader",
    "props": [
      {
        "name": "variant",
        "type": "undefined | \"circular\" | \"classic\" | \"pulse\" | \"pulse-dot\" | \"dots\" | \"typing\" | \"wave\" | \"bars\" | \"terminal\" | \"text-blink\" | \"text-shimmer\" | \"loading-dots\"",
        "optional": true,
        "scalar": true,
        "description": "The animation style: `'circular' | 'classic' | 'pulse' | 'pulse-dot' | 'dots' | 'typing' | 'wave' | 'bars' | 'terminal' | 'text-blink' | 'text-shimmer' | 'loading-dots'`. Defaults to `'circular'`.",
        "default": "'circular'",
        "displayType": "LoaderVariant | undefined"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\"",
        "optional": true,
        "scalar": true,
        "description": "Loader size: `'sm' | 'md' | 'lg'`. Defaults to `'md'`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\""
      },
      {
        "name": "text",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Label for the text-based variants.",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Loader",
        "group": "Components",
        "storyId": "solid-advanced-elements-loader--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-markdown",
    "className": "KaiMarkdownElement",
    "displayName": "Markdown",
    "props": [
      {
        "name": "content",
        "type": "string",
        "optional": false,
        "scalar": true,
        "description": "The markdown source to render.",
        "default": "''",
        "displayType": "string"
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "Text/markdown sizing.",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shiki theme for fenced code blocks.",
        "default": "'github-dark-dimmed'",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable syntax highlighting (no Shiki loads).",
        "default": "true",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Markdown",
        "group": "Components",
        "storyId": "solid-advanced-elements-markdown--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-menu",
    "className": "KaiMenuElement",
    "displayName": "Menu",
    "props": [
      {
        "name": "items",
        "type": "undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[]",
        "optional": true,
        "scalar": false,
        "description": "Tree of menu items. Set as a JS property — not an HTML attribute.",
        "displayType": "undefined | { id?: undefined | string; label?: undefined | string; icon?: undefined | string; shortcut?: undefined | string; checked?: undefined | false | true; radioGroup?: undefined | string; disabled?: undefined | false | true; separator?: undefined | false | true; heading?: undefined | false | true; items?: undefined | Record<string, unknown>[] }[]"
      },
      {
        "name": "placement",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional placement hint (unused by the underlying Dropdown which always positions bottom-start, kept for future extension).",
        "displayType": "undefined | string"
      },
      {
        "name": "triggerIcon",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Built-in trigger: leading icon (a named icon like `\"plus\"`, an image URL/data-URI, or text). Use this instead of slotting `slot=\"trigger\"` for the common case — a slotted trigger overrides it.",
        "displayType": "undefined | string"
      },
      {
        "name": "triggerLabel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Built-in trigger: a text label (e.g. `\"High\"`).",
        "displayType": "undefined | string"
      },
      {
        "name": "triggerIconTrailing",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Built-in trigger: a trailing icon (e.g. `\"chevron-down\"` for a select look).",
        "displayType": "undefined | string"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Accessible name for an icon-only trigger (no visible label).",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-menu open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the trigger — click/keyboard and `show()` no longer open the menu.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The menu opened or closed (by click, keyboard, Escape, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      },
      {
        "name": "kai-select",
        "detail": "{ id: string; checked?: undefined | false | true; radioGroup?: undefined | string }",
        "description": "Fired when the user selects a leaf item. - Plain items: `{ id }`. - Checkbox items: `{ id, checked }` where `checked` is the NEW state. - Radio items: `{ id, radioGroup }` — the consumer marks `id` as the selected one in `radioGroup` and clears the others.",
        "displayDetail": "{ id: string; checked?: undefined | false | true; radioGroup?: undefined | string }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Dropdown",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdown--docs"
      },
      {
        "name": "DropdownTrigger",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdowntrigger--docs"
      },
      {
        "name": "DropdownContent",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdowncontent--docs"
      },
      {
        "name": "DropdownItem",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownitem--docs"
      },
      {
        "name": "DropdownSeparator",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownseparator--docs"
      },
      {
        "name": "DropdownLabel",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownlabel--docs"
      },
      {
        "name": "DropdownCheckboxItem",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdowncheckboxitem--docs"
      },
      {
        "name": "DropdownRadioItem",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownradioitem--docs"
      },
      {
        "name": "DropdownSub",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownsub--docs"
      },
      {
        "name": "DropdownSubTrigger",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownsubtrigger--docs"
      },
      {
        "name": "DropdownSubContent",
        "group": "UI",
        "storyId": "solid-advanced-primitives-dropdownsubcontent--docs"
      },
      {
        "name": "Kbd",
        "group": "UI",
        "storyId": "solid-advanced-primitives-kbd--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "trigger",
        "mode": "replace",
        "doc": "Your own trigger element; replaces the built-in button driven by the `trigger-icon` / `trigger-label` props."
      }
    ],
    "parts": [
      {
        "name": "shortcut",
        "doc": "The right-aligned per-item keyboard shortcut, rendered as kai-kbd key caps. Shown only when an item carries a `shortcut`.",
        "recipe": "kai-menu::part(shortcut) { opacity: 0.8 }"
      }
    ]
  },
  {
    "tag": "kai-message",
    "className": "KaiMessageElement",
    "displayName": "Message",
    "props": [
      {
        "name": "message",
        "type": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }",
        "optional": true,
        "scalar": false,
        "description": "The full message object. Set as a JS property.",
        "displayType": "undefined | { id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }"
      },
      {
        "name": "role",
        "type": "undefined | \"user\" | \"assistant\"",
        "optional": true,
        "scalar": true,
        "description": "Convenience for simple cases when not passing a `message` object.",
        "default": "'assistant'",
        "displayType": "undefined | \"user\" | \"assistant\""
      },
      {
        "name": "content",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Convenience content (used when `message` is not set).",
        "displayType": "undefined | string"
      },
      {
        "name": "markdown",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Force markdown on/off. Defaults to on for assistant, off for user.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "Text/markdown sizing for the message body.",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Shiki theme name used for fenced code blocks in the content.",
        "default": "'github-dark-dimmed'",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable syntax highlighting for code blocks (no Shiki loads).",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "actionsReveal",
        "type": "undefined | \"always\" | \"hover\"",
        "optional": true,
        "scalar": true,
        "description": "Whether the action bar is always visible (`'always'`, default) or only revealed on hover of the message row (`'hover'`).",
        "default": "'always'",
        "displayType": "undefined | \"always\" | \"hover\""
      },
      {
        "name": "avatarSrc",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Convenience avatar image URL (used when `message.avatar` is not set).",
        "displayType": "undefined | string"
      },
      {
        "name": "avatarFallback",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Convenience avatar fallback text (used when `message.avatar` is not set).",
        "displayType": "undefined | string"
      },
      {
        "name": "avatar",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans the full row (predictable layout when you never show avatars). Any other value keeps the default behaviour: the built-in avatar when one resolves, or your `slot=\"avatar\"` content when projected (which REPLACES the built-in).",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-message-action",
        "detail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }",
        "description": "An action button was clicked. `action` is the built-in name or custom id. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear.",
        "displayDetail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }"
      }
    ],
    "methods": [
      {
        "name": "copy",
        "params": "",
        "returns": "void",
        "description": "Copy the message content to the clipboard and show the copied check."
      }
    ],
    "composedFrom": [
      {
        "name": "Message",
        "group": "Components",
        "storyId": "solid-advanced-elements-message--docs"
      },
      {
        "name": "MessageAvatar",
        "group": "Components",
        "storyId": "solid-advanced-elements-messageavatar--docs"
      },
      {
        "name": "MessageBody",
        "group": "Components",
        "storyId": "solid-advanced-elements-messagebody--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "before-body",
        "mode": "inject",
        "doc": "A per-message header at the TOP of the body, above reasoning/tools/content — a model-name label, a role + timestamp line."
      },
      {
        "name": "after-body",
        "mode": "inject",
        "doc": "A row at the BOTTOM of the body, below the action bar — a citation/sources row, a token-cost/latency line."
      },
      {
        "name": "avatar",
        "mode": "replace",
        "part": true,
        "doc": "Replaces the built-in avatar rail with your own node. Use `avatar=\"none\"` to omit the rail and let the body span the full row."
      }
    ],
    "parts": [
      {
        "name": "row",
        "doc": "The message row wrapper (avatar rail + body column). Restyle its gap or alignment from outside.",
        "recipe": "kai-message::part(row) { gap: 0.75rem }"
      },
      {
        "name": "bubble",
        "doc": "The content bubble wrapper. Restyle its background, radius, or padding; for a user message this is the rounded chat bubble.",
        "recipe": "kai-message::part(bubble) { background: var(--color-primary); color: var(--color-primary-foreground) }"
      },
      {
        "name": "content",
        "doc": "The rendered message text/markdown region (same node as `bubble`). Target it to tune typography from outside.",
        "recipe": "kai-message::part(content) { font-size: 0.9375rem }"
      },
      {
        "name": "actions",
        "doc": "The action-bar row (copy / like / regenerate …). Restyle its spacing or hide it entirely from outside.",
        "recipe": "kai-message::part(actions) { gap: 0.25rem }"
      },
      {
        "name": "avatar",
        "doc": "Replaces the built-in avatar rail with your own node. Use `avatar=\"none\"` to omit the rail and let the body span the full row."
      }
    ]
  },
  {
    "tag": "kai-model-switcher",
    "className": "KaiModelSwitcherElement",
    "displayName": "ModelSwitcher",
    "props": [
      {
        "name": "models",
        "type": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "The selectable models. Set as a JS property (array).",
        "typeName": "ModelOption[]",
        "typeShape": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
        "default": "[]",
        "typeImport": "ModelOption",
        "displayType": "{ id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
      },
      {
        "name": "currentModel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The currently-selected model id. Defaults to the first model.",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-model-switcher open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-model-change",
        "detail": "{ modelId: string }",
        "description": "A model was selected.",
        "displayDetail": "{ modelId: string }"
      },
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The model dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "ModelSwitcher",
        "group": "Components",
        "storyId": "solid-advanced-elements-modelswitcher--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-nav",
    "className": "KaiNavElement",
    "displayName": "Nav",
    "props": [
      {
        "name": "items",
        "type": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]",
        "optional": true,
        "scalar": false,
        "description": "The nav items. Set as a JS property (array, not an attribute). Each item may carry `children` (a collapsible group), a `status` dot, and trailing `meta` text.",
        "displayType": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; badge?: undefined | string; trailing?: undefined | string; disabled?: undefined | false | true; children?: undefined | Record<string, unknown>[]; status?: undefined | { tone: \"error\" | \"primary\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; label?: undefined | string; pulse?: undefined | false | true }; meta?: undefined | string; action?: undefined | { icon: string; label: string }; closable?: undefined | false | true }[]"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Active item id (controlled).",
        "displayType": "undefined | string"
      },
      {
        "name": "defaultValue",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Initial active id when uncontrolled.",
        "displayType": "undefined | string"
      },
      {
        "name": "defaultCollapsed",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Ids of group items collapsed on first render (groups default to expanded). Set as a JS property (array).",
        "displayType": "undefined | string[]"
      }
    ],
    "events": [
      {
        "name": "kai-nav-item-action",
        "detail": "{ value: string; action?: undefined | { icon: string; label: string } }",
        "description": "A row's trailing `action` button was activated (not a select). `value` is the item id; `action` echoes the item's `{ icon, label }`.",
        "displayDetail": "{ value: string; action?: undefined | { icon: string; label: string } }"
      },
      {
        "name": "kai-nav-item-close",
        "detail": "{ value: string }",
        "description": "A `closable` row's trailing close button was activated (not a select). `value` is the item id.",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-nav-select",
        "detail": "{ id: string }",
        "description": "A nav item was activated.",
        "displayDetail": "{ id: string }"
      }
    ],
    "methods": [
      {
        "name": "select",
        "params": "id: string",
        "returns": "void",
        "description": "Activate an item by id (fires kai-nav-select)."
      }
    ],
    "composedFrom": [
      {
        "name": "Nav",
        "group": "UI",
        "storyId": "solid-advanced-primitives-nav--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "nav",
        "doc": "The nav list container. Restyle its gap or padding from outside.",
        "recipe": "kai-nav::part(nav) { gap: 0.25rem }"
      },
      {
        "name": "item",
        "doc": "A nav item button (leaf or group parent). The active leaf carries aria-current=\"page\" and a group parent carries aria-expanded; target `::part(item)[aria-current]` for the selected look or `::part(item)[aria-expanded]` for a group row.",
        "recipe": "kai-nav::part(item)[aria-current] { background: var(--color-accent) }"
      },
      {
        "name": "group",
        "doc": "The nested child list rendered under an expanded group item. Add a left guide line or tune its indent from outside.",
        "recipe": "kai-nav::part(group) { border-left: 1px solid var(--color-border); margin-left: 1.1rem }"
      },
      {
        "name": "chevron",
        "doc": "The disclosure chevron on a group row (rotates when expanded). Recolor or resize it from outside.",
        "recipe": "kai-nav::part(chevron) { opacity: 1; color: var(--color-primary) }"
      },
      {
        "name": "status",
        "doc": "The per-item status cluster (a colored dot in the tone hue + an optional label). Shown only when an item carries a `status`; the `pulse` flag animates the dot. Restyle from outside.",
        "recipe": "kai-nav::part(status) { gap: 0.5rem }"
      },
      {
        "name": "meta",
        "doc": "The right-aligned muted trailing text on a row (e.g. a relative time). Shown only when an item carries `meta`; restyle from outside.",
        "recipe": "kai-nav::part(meta) { color: var(--color-foreground); font-variant-numeric: tabular-nums }"
      },
      {
        "name": "item-action",
        "doc": "The trailing per-item action / close button, a sibling of the item button. Shown only when an item carries `action` or `closable`; reveal it on hover or pin it visible from outside.",
        "recipe": "kai-nav::part(item-action) { opacity: 1 }"
      }
    ]
  },
  {
    "tag": "kai-notice",
    "className": "KaiNoticeElement",
    "displayName": "Notice",
    "props": [
      {
        "name": "severity",
        "type": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"",
        "optional": true,
        "scalar": true,
        "description": "`neutral` (default) · `info` · `warning` · `error` · `success`. Drives the leading icon's color and the a11y role (`alert` for errors, else `status`).",
        "default": "'neutral'",
        "displayType": "undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\""
      },
      {
        "name": "icon",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Leading icon: omit for the severity default, `\"none\"` to hide it, or a named icon to override.",
        "displayType": "undefined | string"
      },
      {
        "name": "dismissible",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a dismiss (×) that hides the notice and emits `kai-dismiss`.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-dismiss",
        "detail": null,
        "description": "The notice was dismissed via its × (it also hides itself).",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Notice",
        "group": "UI",
        "storyId": "solid-advanced-primitives-notice--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "action",
        "mode": "inject",
        "doc": "A trailing action beside the message — a link or button."
      },
      {
        "name": "icon",
        "mode": "replace",
        "doc": "A custom leading icon (any inline SVG, inherits `currentColor`). Overrides the severity default and the `icon` prop — the same escape hatch as `kai-button`."
      }
    ]
  },
  {
    "tag": "kai-pane",
    "className": "KaiPaneElement",
    "displayName": "Pane",
    "props": [
      {
        "name": "headline",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The pane title (the agent / window name). Named `headline` because `title` collides with the global `HTMLElement.title` attribute (it throws at registration). Attribute: `headline`.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "subtitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "A role / label shown under the title (e.g. \"Reviewer\", \"claude-sonnet\"). Attribute: `subtitle`.",
        "displayType": "undefined | string"
      },
      {
        "name": "maximized",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the restore glyph instead of maximize, and signal the maximized view-state. Drive it yourself in response to `kai-maximize`. Attribute: `maximized`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "focused",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Highlight the frame with a ring/border to mark the ACTIVE pane. Attribute: `focused`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "showSplit",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a split-pane window control that fires `kai-split`. Off by default. Attribute: `show-split`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "showDock",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a dock-to-side window control that fires `kai-dock`. Off by default. Attribute: `show-dock`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "status",
        "type": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }",
        "optional": true,
        "scalar": false,
        "description": "A tone-colored status dot (+ optional label) in the header. An object `{ tone, label?, pulse? }` set as a JS PROPERTY (not an attribute).",
        "displayType": "undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }"
      }
    ],
    "events": [
      {
        "name": "kai-close",
        "detail": null,
        "description": "The close (×) control was clicked.",
        "displayDetail": null
      },
      {
        "name": "kai-dock",
        "detail": null,
        "description": "The dock control was clicked (only present when `show-dock`).",
        "displayDetail": null
      },
      {
        "name": "kai-maximize",
        "detail": "{ maximized: false | true }",
        "description": "The maximize/restore control was clicked. `detail.maximized` is the intended NEXT state — drive the `maximized` prop yourself from it.",
        "displayDetail": "{ maximized: false | true }"
      },
      {
        "name": "kai-split",
        "detail": null,
        "description": "The split control was clicked (only present when `show-split`).",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Pane",
        "group": "UI",
        "storyId": "solid-advanced-primitives-pane--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "leading",
        "mode": "inject",
        "doc": "A glyph or avatar at the start of the pane header."
      },
      {
        "name": "actions",
        "mode": "inject",
        "doc": "Extra header controls, before the built-in window controls."
      },
      {
        "name": "footer",
        "mode": "inject",
        "part": true,
        "doc": "A pinned row below the body (e.g. a composer)."
      }
    ],
    "parts": [
      {
        "name": "header",
        "doc": "The pane header bar (leading + title/status + actions + window controls).",
        "recipe": "kai-pane::part(header) { padding-inline: 0.75rem }"
      },
      {
        "name": "body",
        "doc": "The scrolling body region (the default slot).",
        "recipe": "kai-pane::part(body) { padding: 1rem }"
      },
      {
        "name": "controls",
        "doc": "The window-control cluster (maximize/close, and split/dock when enabled).",
        "recipe": "kai-pane::part(controls) { gap: 0.25rem }"
      },
      {
        "name": "footer",
        "doc": "A pinned row below the body (e.g. a composer)."
      }
    ]
  },
  {
    "tag": "kai-pane-group",
    "className": "KaiPaneGroupElement",
    "displayName": "PaneGroup",
    "props": [
      {
        "name": "tabs",
        "type": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]",
        "optional": true,
        "scalar": false,
        "description": "The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute).",
        "displayType": "undefined | { id: string; name: string; status?: undefined | { tone: \"working\" | \"idle\" | \"done\" | \"error\" | \"blocked\"; label?: undefined | string; pulse?: undefined | false | true }; needsAttention?: undefined | false | true; number?: undefined | number }[]"
      },
      {
        "name": "active",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The active tab id (controlled, and reflected to the `active` ATTRIBUTE so `::part`/`[active]` selectors and the per-tab named slot follow it). Set it as the `active` attribute or drive it from `kai-tab-change`; omit for uncontrolled (the first tab).",
        "displayType": "undefined | string"
      },
      {
        "name": "focused",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Highlight the frame as the ACTIVE group in a multi-group layout. Attribute: `focused`.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-tab-change",
        "detail": "{ id: string }",
        "description": "A tab was selected (click, Enter/Space, or arrow-key move). `detail.id` is the tab's id.",
        "displayDetail": "{ id: string }"
      },
      {
        "name": "kai-tab-close",
        "detail": "{ id: string }",
        "description": "A tab's close (×) was clicked. Drop the tab from `tabs` yourself.",
        "displayDetail": "{ id: string }"
      },
      {
        "name": "kai-tab-menu",
        "detail": "{ id: string }",
        "description": "A tab's \"…\" overflow was clicked. Open your own menu from `detail.id`.",
        "displayDetail": "{ id: string }"
      }
    ],
    "methods": [
      {
        "name": "select",
        "params": "id: string",
        "returns": "void",
        "description": "Select a tab by id (fires `kai-tab-change`). Ignores unknown ids."
      },
      {
        "name": "focus",
        "params": "",
        "returns": "void",
        "description": "Focus the active tab in the strip."
      }
    ],
    "composedFrom": [
      {
        "name": "PaneGroup",
        "group": "UI",
        "storyId": "solid-advanced-primitives-panegroup--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "tabs",
        "doc": "The tab strip (role=\"tablist\"). Restyle its background, height, padding, or gap from outside.",
        "recipe": "kai-pane-group::part(tabs) { background: var(--color-card); gap: 0.25rem }"
      },
      {
        "name": "tab",
        "doc": "A single tab button. The active tab carries `[aria-selected=\"true\"]`; target `::part(tab)[aria-selected=\"true\"]` for the selected look.",
        "recipe": "kai-pane-group::part(tab)[aria-selected=\"true\"] { background: var(--color-accent) }"
      },
      {
        "name": "body",
        "doc": "The active tab's content region (the named/default slot host).",
        "recipe": "kai-pane-group::part(body) { padding: 0.75rem }"
      },
      {
        "name": "menu",
        "doc": "The per-tab \"…\" overflow button. Reveal it on hover or pin it visible from outside.",
        "recipe": "kai-pane-group::part(menu) { opacity: 1 }"
      },
      {
        "name": "close",
        "doc": "The per-tab close (\"×\") button. Recolor, resize, or hide it from outside.",
        "recipe": "kai-pane-group::part(close) { color: var(--color-muted-foreground) }"
      }
    ]
  },
  {
    "tag": "kai-popover",
    "className": "KaiPopoverElement",
    "displayName": "Popover",
    "props": [
      {
        "name": "placement",
        "type": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\"",
        "optional": true,
        "scalar": true,
        "description": "Floating placement relative to the trigger (floating-ui placement).",
        "default": "'bottom-start'",
        "displayType": "undefined | \"top\" | \"right\" | \"bottom\" | \"left\" | \"top-start\" | \"top-end\" | \"right-start\" | \"right-end\" | \"bottom-start\" | \"bottom-end\" | \"left-start\" | \"left-end\""
      },
      {
        "name": "gutter",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Gap in px between the trigger and the panel.",
        "default": "6",
        "displayType": "undefined | number"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on click). Set `el.open = true`, or `<kai-popover open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Turn the popover off while keeping the trigger mounted (clicks and `show()` no longer open it).",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The popover opened or closed (click, Escape, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Popover",
        "group": "UI",
        "storyId": "solid-advanced-primitives-popover--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-progress-bar",
    "className": "KaiProgressBarElement",
    "displayName": "ProgressBar",
    "props": [
      {
        "name": "value",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Current progress value (0..max). Attribute: `value`.",
        "displayType": "undefined | number"
      },
      {
        "name": "max",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "The value `value` runs to (default 100). Attribute: `max`.",
        "displayType": "undefined | number"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional caption above the track. Attribute: `label`.",
        "displayType": "undefined | string"
      },
      {
        "name": "tone",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Fill color: `primary` (default), `success`, `warning`, `error`, `info`. Attribute: `tone`.",
        "default": "'primary'",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "ProgressBar",
        "group": "UI",
        "storyId": "solid-advanced-primitives-progressbar--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "track",
        "doc": "The progress track (the background bar). Restyle its height, radius, or background from outside.",
        "recipe": "kai-progress-bar::part(track) { height: 0.5rem }"
      },
      {
        "name": "fill",
        "doc": "The filled portion; its width follows value/max. Recolor it from outside.",
        "recipe": "kai-progress-bar::part(fill) { background: var(--color-tool-green) }"
      }
    ]
  },
  {
    "tag": "kai-prompt-dock",
    "className": "KaiPromptDockElement",
    "displayName": "PromptDock",
    "props": [
      {
        "name": "frame",
        "type": "undefined | \"none\" | \"inset\" | \"edge\"",
        "optional": true,
        "scalar": true,
        "description": "How the tray frames the input — the SPATIAL inset axis: `inset` (default, the classic recessed frame on every side) | `edge` (top/bottom inset only; the input sits flush left/right so the lips span the full width) | `none` (no inset; the lips attach directly as a plain stack). Attribute: `frame`.",
        "default": "'inset'",
        "displayType": "undefined | \"none\" | \"inset\" | \"edge\""
      },
      {
        "name": "appearance",
        "type": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\"",
        "optional": true,
        "scalar": true,
        "description": "How the tray surface looks — the VISUAL axis, orthogonal to `frame`: `soft` (default, sunken surface + border + radius) | `outlined` (transparent + border + radius) | `filled` (sunken, no border, + radius) | `plain` (bare). Attribute: `appearance`.",
        "default": "'soft'",
        "displayType": "undefined | \"outlined\" | \"filled\" | \"plain\" | \"soft\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "PromptDock",
        "group": "UI",
        "storyId": "solid-advanced-primitives-promptdock--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "top",
        "mode": "inject",
        "part": true,
        "doc": "The top lip: a notice or banner above the input. Rendered only when filled."
      },
      {
        "name": "bottom",
        "mode": "inject",
        "part": true,
        "doc": "The bottom lip: a mode or controls row below the input. Rendered only when filled."
      }
    ],
    "parts": [
      {
        "name": "tray",
        "doc": "The recessed tray that frames the input. The `appearance`/`frame` props set the defaults; the --kai-prompt-dock-* tokens fine-tune surface/border/radius/inset.",
        "recipe": "kai-prompt-dock::part(tray) { --kai-prompt-dock-radius: 1rem }"
      },
      {
        "name": "top",
        "doc": "The top lip: a notice or banner above the input. Rendered only when filled."
      },
      {
        "name": "bottom",
        "doc": "The bottom lip: a mode or controls row below the input. Rendered only when filled."
      }
    ]
  },
  {
    "tag": "kai-prompt-input",
    "className": "KaiPromptInputElement",
    "displayName": "PromptInput",
    "props": [
      {
        "name": "value",
        "type": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]",
        "optional": true,
        "scalar": false,
        "description": "Value of the input, as a JS property. A **string** is the controlled text mirror (the host owns it and updates on `kai-value-change`). A **ComposerDoc** (array of text/entity segments) is a one-time **seed** that pre-populates pills (skills/agents/plugins); the user then edits freely. Leave unset for uncontrolled behavior. `kai-submit`/`kai-value-change` always emit `value` as the flattened string (back-compat) plus the structured `doc` + `entities`.",
        "displayType": "undefined | string | ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder text shown in the empty input.",
        "default": "'Send a message...'",
        "displayType": "undefined | string"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the input and submit button entirely (non-interactive).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "loading",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the loading/streaming state and block submit (use while awaiting a reply).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "suggestions",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Starter prompts shown above the input. Clicking one follows `suggestionMode`. Set as a JS property.",
        "displayType": "undefined | string[]"
      },
      {
        "name": "suggestionMode",
        "type": "undefined | \"submit\" | \"fill\"",
        "optional": true,
        "scalar": true,
        "description": "What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input.",
        "default": "'submit'",
        "displayType": "undefined | \"submit\" | \"fill\""
      },
      {
        "name": "search",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a Search (Globe) button in the left toolbar; clicking it fires a `search` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "voice",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "stoppable",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When set and `loading` is true, the send button is replaced by a Stop button (square icon, \"Stop\" aria-label). Clicking it fires `kai-stop`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "submit",
        "type": "undefined | \"always\" | \"auto\"",
        "optional": true,
        "scalar": true,
        "description": "Send-button visibility. `'always'` (default) always shows it; `'auto'` shows it only when there's text/attachments (an empty composer hides it — Enter still submits). To hide it entirely (Enter-only), it's pure CSS: `::part(send){display:none}` — no prop needed. Restyle via `::part(send)`. The Stop button (`stoppable` + `loading`) is unaffected.",
        "default": "'always'",
        "displayType": "undefined | \"always\" | \"auto\""
      },
      {
        "name": "attach",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When `false`, hides the built-in paperclip attach button even though the element otherwise supports attachments. Use this when a `+` menu in `toolbar-start` already exposes \"Add files\", to avoid a duplicate control. Defaults to `true`.",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "attachments",
        "type": "undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]",
        "optional": true,
        "scalar": false,
        "description": "Attachments to seed the input with (so a consumer can pre-populate staged files without an upload). Set as a JS property; the element then manages its own attachment state from there (add via the paperclip, remove per chip).",
        "displayType": "AttachmentData[] | undefined"
      },
      {
        "name": "triggers",
        "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
        "optional": true,
        "scalar": false,
        "description": "Rich entity triggers — each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins are the grouping/provenance of those items). Set as a JS property.",
        "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
      },
      {
        "name": "kindIcons",
        "type": "undefined | Record<string, string>",
        "optional": true,
        "scalar": false,
        "description": "Default icon per entity kind (kind → image URL/data-URI) for pills/menu items without their own `icon`. Overrides the built-in agent/plugin glyphs. JS property.",
        "displayType": "undefined | Record<string, string>"
      }
    ],
    "events": [
      {
        "name": "kai-attachments-change",
        "detail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
        "description": "The staged attachments changed — a file was added (via the paperclip) or removed (per-chip ×). Carries the full current list so a consumer can react in real time (validate, show upload progress, toggle the send button).",
        "displayDetail": "{ attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
      },
      {
        "name": "kai-search",
        "detail": "Record<string, never>",
        "description": "The Search (Globe) toolbar button was clicked.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-stop",
        "detail": "Record<string, never>",
        "description": "The Stop button was clicked while `stoppable` and `loading` are both true.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-submit",
        "detail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[]; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
        "description": "The user submitted the prompt (Enter or send button). `value` is the flattened text (back-compat); `doc` is the structured document and `entities` the inserted pills (skills/agents) for downstream expansion.",
        "displayDetail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[]; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }"
      },
      {
        "name": "kai-suggestion-click",
        "detail": "{ value: string }",
        "description": "A suggestion was clicked while `suggestion-mode=\"fill\"`.",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-toolbar-action",
        "detail": "{ action: string }",
        "description": "A custom `<kai-action>` toolbar button was clicked. `action` is the `id` of the `<kai-action>` element that was clicked.",
        "displayDetail": "{ action: string }"
      },
      {
        "name": "kai-value-change",
        "detail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }",
        "description": "The input changed (fires on every edit). Carries the flattened `value` plus the structured `doc` + `entities`.",
        "displayDetail": "{ value: string; doc: ({ type: \"text\"; text: string } | { type: \"entity\"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }"
      },
      {
        "name": "kai-voice",
        "detail": "Record<string, never>",
        "description": "The Voice (Mic) toolbar button was clicked.",
        "displayDetail": "Record<string, never>"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the text editor inside the shadow root (not the hidden file input)."
      },
      {
        "name": "blur",
        "params": "",
        "returns": "void",
        "description": "Blur the focused input control."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Clear the text and any staged attachments (fires kai-value-change / kai-attachments-change so a controlled consumer can react)."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Send the current value programmatically — same path as Enter / the send button (fires kai-submit, then clears staged attachments). Named `send`, not `submit`, to avoid colliding with the `submit` prop."
      }
    ],
    "composedFrom": [],
    "tokens": [],
    "slots": [
      {
        "name": "input-top",
        "mode": "inject",
        "doc": "Inside the card, above the textarea (e.g. an inline status strip). For content above/below the whole card, use your own layout — that is light DOM you control."
      },
      {
        "name": "toolbar-start",
        "mode": "inject",
        "doc": "Leading controls in the input toolbar — where a + menu goes."
      },
      {
        "name": "toolbar-end",
        "mode": "inject",
        "doc": "Trailing controls in the toolbar, before the Send button."
      }
    ],
    "parts": [
      {
        "name": "send",
        "doc": "The send button. Restyle from outside, or hide it entirely (Enter-only) — hiding is pure CSS, which is why there is no `submit=\"never\"`.",
        "recipe": "kai-prompt-input::part(send) { display: none } /* Enter-only; or restyle: background, border-radius, … */"
      }
    ]
  },
  {
    "tag": "kai-reasoning",
    "className": "KaiReasoningElement",
    "displayName": "Reasoning",
    "props": [
      {
        "name": "text",
        "type": "string",
        "optional": false,
        "scalar": true,
        "description": "The reasoning text to display.",
        "default": "''",
        "displayType": "string"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Trigger label.",
        "default": "'Reasoning'",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click + while streaming). Set `el.open = true`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "streaming",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "While true, auto-expands (and re-collapses when it flips false).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "markdown",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Render `text` as markdown.",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The reasoning block expanded or collapsed (via the trigger, streaming auto-open, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Reasoning",
        "group": "Components",
        "storyId": "solid-advanced-elements-reasoning--docs"
      },
      {
        "name": "ReasoningTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-reasoningtrigger--docs"
      },
      {
        "name": "ReasoningContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-reasoningcontent--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-remote",
    "className": "KaiRemoteElement",
    "displayName": "Remote",
    "props": [
      {
        "name": "src",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The remote card URL. Attribute: `src`.",
        "displayType": "undefined | string"
      },
      {
        "name": "providerOrigin",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Exact provider origin (https: or http://localhost for dev). Attribute: `provider-origin`.",
        "displayType": "undefined | string"
      },
      {
        "name": "envelope",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The card envelope to render. JS property only.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "policy",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Optional routing policy. JS property only.",
        "displayType": "undefined | Record<string, unknown>"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [],
    "tokens": []
  },
  {
    "tag": "kai-resizable",
    "className": "KaiResizableElement",
    "displayName": "Resizable",
    "props": [
      {
        "name": "orientation",
        "type": "undefined | \"vertical\" | \"horizontal\"",
        "optional": true,
        "scalar": true,
        "description": "Layout axis: `horizontal` (row, default) or `vertical` (column).",
        "default": "'horizontal'",
        "displayType": "undefined | \"vertical\" | \"horizontal\""
      },
      {
        "name": "maximizedIndex",
        "type": "undefined | null | number",
        "optional": true,
        "scalar": false,
        "description": "Which item index is maximized (null = none). Declarative source of truth.",
        "default": "null",
        "displayType": "undefined | null | number"
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "{ sizes: number[] }",
        "description": "Fired on drag-end / keyboard resize / visibility change. `detail.sizes` = panel sizes in percent.",
        "displayDetail": "{ sizes: number[] }"
      },
      {
        "name": "kai-maximize-change",
        "detail": "{ maximized: false | true; index: null | number }",
        "description": "Observe layout maximize state.",
        "displayDetail": "{ maximized: false | true; index: null | number }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "ResizableHandle",
        "group": "UI",
        "storyId": "solid-advanced-primitives-resizablehandle--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-resizable-item",
    "className": "KaiResizableItemElement",
    "displayName": "ResizableItem",
    "props": [
      {
        "name": "size",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Initial main-axis size: `\"280px\"` (fixed) or `\"25%\"`/`25` (percent). Omitted → flexible.",
        "displayType": "undefined | string"
      },
      {
        "name": "min",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Minimum size during resize (px or %).",
        "displayType": "undefined | string"
      },
      {
        "name": "max",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Maximum size during resize (px or %).",
        "displayType": "undefined | string"
      },
      {
        "name": "locked",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Fix this panel's size; adjacent dividers become non-draggable.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "hidden",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Hide this panel; its divider is dropped and the rest reflow.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "collapsed",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Collapse this panel — same layout effect as `hidden` (divider dropped, the rest reflow), but it WORKS as a bare boolean from framework JSX. A plain `<kai-resizable-item collapsed>` in React/Solid/Vue/Svelte collapses the panel at the first render; `hidden` does not, because a JSX boolean sets neither the `hidden` attribute nor the IDL property on a custom element, so the parent never sees it. The facade reflects `collapsed` to a `collapsed` attribute the parent reads. Prefer this over `hidden` for declarative collapse.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "unknown",
        "description": "",
        "displayDetail": "unknown"
      },
      {
        "name": "kai-maximize-change",
        "detail": "unknown",
        "description": "",
        "displayDetail": "unknown"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "ResizableHandle",
        "group": "UI",
        "storyId": "solid-advanced-primitives-resizablehandle--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-response-stream",
    "className": "KaiResponseStreamElement",
    "displayName": "ResponseStream",
    "props": [
      {
        "name": "text",
        "type": "undefined | string | AsyncIterable<string>",
        "optional": true,
        "scalar": false,
        "description": "Text to stream. A string, or an `AsyncIterable<string>` (set as a JS property — async iterables can't be HTML attributes).",
        "default": "''",
        "displayType": "undefined | string | AsyncIterable<string>"
      },
      {
        "name": "mode",
        "type": "undefined | \"typewriter\" | \"fade\"",
        "optional": true,
        "scalar": true,
        "description": "Reveal animation.",
        "default": "'typewriter'",
        "displayType": "undefined | \"typewriter\" | \"fade\""
      },
      {
        "name": "speed",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Characters/segments per tick.",
        "default": "20",
        "displayType": "undefined | number"
      },
      {
        "name": "as",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Element tag to render as.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-complete",
        "detail": null,
        "description": "Streaming finished.",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "ResponseStream",
        "group": "Components",
        "storyId": "solid-advanced-elements-responsestream--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-scope-picker",
    "className": "KaiScopePickerElement",
    "displayName": "ScopePicker",
    "props": [
      {
        "name": "availableAuthors",
        "type": "string[]",
        "optional": false,
        "scalar": false,
        "description": "Authors to offer as scope filters. Set as a JS property.",
        "default": "[]",
        "displayType": "string[]"
      },
      {
        "name": "availableTags",
        "type": "string[]",
        "optional": false,
        "scalar": false,
        "description": "Tags to offer as scope filters. Set as a JS property.",
        "default": "[]",
        "displayType": "string[]"
      },
      {
        "name": "currentLabel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The label shown on the trigger for the active scope.",
        "default": "'All Content'",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe the dropdown's open state (Shoelace-style: settable + reflected to the `open` attribute, the dropdown still self-manages on click/keyboard). Set `el.open = true`, or `<kai-scope-picker open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the trigger — click/keyboard and `show()` no longer open the dropdown.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The scope dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      },
      {
        "name": "kai-scope-change",
        "detail": "{ filters: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }",
        "description": "A scope was chosen (`undefined` filters = \"All Content\").",
        "displayDetail": "{ filters: SearchFilters | undefined }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "ChatScopePicker",
        "group": "Components",
        "storyId": "solid-advanced-elements-chatscopepicker--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-screen",
    "className": "KaiScreenElement",
    "displayName": "Screen",
    "props": [
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages). Set `el.open = true`, or `<kai-screen open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "headline",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Header title text. A projected `title` slot overrides it. (Named `headline` because `title` collides with the global `HTMLElement.title` attribute.)",
        "displayType": "undefined | string"
      },
      {
        "name": "back",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the back button (default true).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noInert",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Opt out of marking sibling elements inert/aria-hidden while open (for unusual layouts).",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-back",
        "detail": "Record<string, never>",
        "description": "Back navigation intent: the back button or Escape. The consumer flips their own routing in response (the screen knows nothing about the trigger).",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The screen opened or closed (a method, `Escape` close, or driven `open`).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Move focus to the screen surface (no-op while closed)."
      }
    ],
    "composedFrom": [
      {
        "name": "Screen",
        "group": "Components",
        "storyId": "solid-advanced-elements-screen--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "title",
        "mode": "replace",
        "part": true,
        "doc": "Rich header title; overrides the `headline` prop."
      },
      {
        "name": "actions",
        "mode": "inject",
        "doc": "Header trailing cluster (e.g. an avatar or overflow menu)."
      }
    ],
    "parts": [
      {
        "name": "header",
        "doc": "The back-header bar (back button + title + actions). Restyle its height, padding, or border from outside.",
        "recipe": "kai-screen::part(header) { height: 3.25rem; padding-inline: 1rem }"
      },
      {
        "name": "back",
        "doc": "The back button. Restyle or hide it from outside; `back=\"false\"` removes it entirely.",
        "recipe": "kai-screen::part(back) { border-radius: 9999px }"
      },
      {
        "name": "body",
        "doc": "The full-bleed surface that fills the mount point and scrolls its content. Tune padding or background from outside.",
        "recipe": "kai-screen::part(body) { background: var(--color-card) }"
      },
      {
        "name": "title",
        "doc": "Rich header title; overrides the `headline` prop."
      }
    ]
  },
  {
    "tag": "kai-scroll-area",
    "className": "KaiScrollAreaElement",
    "displayName": "ScrollArea",
    "props": [
      {
        "name": "orientation",
        "type": "undefined | \"vertical\" | \"horizontal\" | \"both\"",
        "optional": true,
        "scalar": true,
        "description": "Which axis scrolls. `vertical` (default) · `horizontal` · `both`. The cross axis is clamped so content can't overflow it.",
        "default": "'vertical'",
        "displayType": "undefined | \"vertical\" | \"horizontal\" | \"both\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "ScrollArea",
        "group": "UI",
        "storyId": "solid-advanced-primitives-scrollarea--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "viewport",
        "doc": "The scrolling container. Add padding or a max-height from outside; the thin scrollbar follows `--color-scrollbar-thumb`.",
        "recipe": "kai-scroll-area::part(viewport) { padding-right: 0.5rem }"
      }
    ]
  },
  {
    "tag": "kai-scroll-button",
    "className": "KaiScrollButtonElement",
    "displayName": "ScrollButton",
    "props": [
      {
        "name": "for",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "CSS id of the scroll container to control. When omitted the element walks up the DOM (outside its own shadow root) to find the nearest scrollable ancestor. Mirrors the `for` convention of `<label for=\"...\">`.",
        "displayType": "undefined | string"
      },
      {
        "name": "variant",
        "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
        "optional": true,
        "scalar": true,
        "description": "Button visual variant: `'outline' | 'ghost' | 'default'`. Defaults to `'outline'`.",
        "default": "'outline'",
        "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\"",
        "optional": true,
        "scalar": true,
        "description": "Button size token. Defaults to `'icon'` (square).",
        "default": "'icon'",
        "displayType": "undefined | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\""
      }
    ],
    "events": [
      {
        "name": "kai-scroll",
        "detail": null,
        "description": "Emitted when the user clicks the button and `scrollToBottom()` is called. Carries no detail — consumers use it to know a manual scroll occurred.",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Button",
        "group": "UI",
        "storyId": "solid-advanced-primitives-button--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-search",
    "className": "KaiSearchElement",
    "displayName": "Search",
    "props": [
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Controlled query — settable and reflected to the `value` attribute. Read `el.value` for live state.",
        "displayType": "undefined | string"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Placeholder. Defaults to `Search…`.",
        "default": "'Search…'",
        "displayType": "undefined | string"
      },
      {
        "name": "icon",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Leading icon-NAME string (a curated name, URL, or text), resolved to a glyph the same way `kai-button`'s `icon` is. Defaults to `search`.",
        "default": "'search'",
        "displayType": "undefined | string"
      },
      {
        "name": "debounce",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Debounce window for `kai-search`, in ms. Defaults to `200`.",
        "default": "200",
        "displayType": "undefined | number"
      },
      {
        "name": "loading",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show a spinner in place of the leading icon while results load.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "shortcut",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional shortcut hint shown (as a `kai-kbd`) while the field is empty, e.g. `Mod+K`. Display only; it does not bind the key.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "{ value: string }",
        "description": "The field committed (blur).",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-search",
        "detail": "{ value: string }",
        "description": "The query changed (debounced live, and on clear).",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-submit",
        "detail": "{ value: string }",
        "description": "Enter was pressed.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [
      {
        "name": "focus",
        "params": "",
        "returns": "void",
        "description": ""
      }
    ],
    "composedFrom": [
      {
        "name": "Input",
        "group": "UI",
        "storyId": "solid-advanced-primitives-input--docs"
      },
      {
        "name": "Kbd",
        "group": "UI",
        "storyId": "solid-advanced-primitives-kbd--docs"
      },
      {
        "name": "Loader",
        "group": "Components",
        "storyId": "solid-advanced-elements-loader--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "field",
        "doc": "The bordered control box (the row wrapping the search icon, input, and clear button).",
        "recipe": "kai-search::part(field) { border-radius: 9999px }"
      },
      {
        "name": "input",
        "doc": "The inner search input element.",
        "recipe": "kai-search::part(input) { font-size: 0.875rem }"
      },
      {
        "name": "clear",
        "doc": "The trailing clear (\"x\") button, shown when the field is non-empty.",
        "recipe": "kai-search::part(clear) { opacity: 1 }"
      }
    ]
  },
  {
    "tag": "kai-segmented",
    "className": "KaiSegmentedElement",
    "displayName": "Segmented",
    "props": [
      {
        "name": "options",
        "type": "{ value: string; label: string; icon?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "The selectable segments, left to right. Set as a JS property (array).",
        "typeName": "Option[]",
        "typeShape": "{ value: string; label: string; icon?: undefined | string }[]",
        "default": "[]",
        "displayType": "{ value: string; label: string; icon?: undefined | string }[]"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Controlled selected `value` — settable and reflected to the `value` attribute. `el.value = 'preview'` drives it; choosing a segment updates it and fires `kai-change`. Read `el.value` for live state.",
        "displayType": "undefined | string"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\"",
        "optional": true,
        "scalar": true,
        "description": "Control density: `sm` or `md`. Defaults to `md`.",
        "default": "'md'",
        "displayType": "undefined | \"sm\" | \"md\""
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "{ value: string }",
        "description": "A segment was chosen.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "Segmented",
        "group": "UI",
        "storyId": "solid-advanced-primitives-segmented--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "track",
        "doc": "The segmented track (the pill container holding the segments). Restyle its background, radius, or padding.",
        "recipe": "kai-segmented::part(track) { border-radius: 9999px }"
      },
      {
        "name": "segment",
        "doc": "Each segment button. Restyle padding, font weight, or the selected look.",
        "recipe": "kai-segmented::part(segment) { font-weight: 600 }"
      }
    ]
  },
  {
    "tag": "kai-separator",
    "className": "KaiSeparatorElement",
    "displayName": "Separator",
    "props": [
      {
        "name": "orientation",
        "type": "undefined | \"vertical\" | \"horizontal\"",
        "optional": true,
        "scalar": true,
        "description": "`horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row — it stretches to the row height).",
        "default": "'horizontal'",
        "displayType": "undefined | \"vertical\" | \"horizontal\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Separator",
        "group": "UI",
        "storyId": "solid-advanced-primitives-separator--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "separator",
        "doc": "The divider line. Restyle its color, thickness, or inset from outside.",
        "recipe": "kai-separator::part(separator) { background: var(--color-border) }"
      }
    ]
  },
  {
    "tag": "kai-setting-item",
    "className": "KaiSettingItemElement",
    "displayName": "SettingItem",
    "props": [
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Row label (primary text). Attribute: `label`.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "description",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional secondary description under the label. Attribute: `description`.",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "SettingItem",
        "group": "UI",
        "storyId": "solid-advanced-primitives-settingitem--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "control",
        "mode": "inject",
        "part": true,
        "doc": "The row control (a switch, segmented, select, etc.), right-aligned. Omit it for a label-only row."
      }
    ],
    "parts": [
      {
        "name": "label",
        "doc": "The label + description block on the left of the row. Restyle its typography or spacing.",
        "recipe": "kai-setting-item::part(label) { gap: 0.125rem }"
      },
      {
        "name": "control",
        "doc": "The row control (a switch, segmented, select, etc.), right-aligned. Omit it for a label-only row."
      }
    ]
  },
  {
    "tag": "kai-settings-group",
    "className": "KaiSettingsGroupElement",
    "displayName": "SettingsGroup",
    "props": [
      {
        "name": "heading",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Small section heading shown above the card. Attribute: `heading`.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "description",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Optional muted description under the heading. Attribute: `description`.",
        "displayType": "undefined | string"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "SettingsGroup",
        "group": "UI",
        "storyId": "solid-advanced-primitives-settingsgroup--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "header",
        "doc": "The group heading + description block. Restyle its spacing or typography.",
        "recipe": "kai-settings-group::part(header) { margin-bottom: 0.75rem }"
      },
      {
        "name": "body",
        "doc": "The bordered card holding the setting rows. Restyle its surface, border, or radius.",
        "recipe": "kai-settings-group::part(body) { border-radius: 1rem }"
      }
    ]
  },
  {
    "tag": "kai-skeleton",
    "className": "KaiSkeletonElement",
    "displayName": "Skeleton",
    "props": [
      {
        "name": "variant",
        "type": "undefined | \"text\" | \"rect\" | \"circle\"",
        "optional": true,
        "scalar": true,
        "description": "`text` (one or more lines), `rect` (a block), or `circle` (round). Defaults to `text`.",
        "default": "'text'",
        "displayType": "undefined | \"text\" | \"rect\" | \"circle\""
      },
      {
        "name": "width",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "CSS width (e.g. `'12rem'`, `'60%'`). Defaults to full width (responsive); for `circle` it is the diameter.",
        "displayType": "undefined | string"
      },
      {
        "name": "height",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "CSS height. Defaults per variant (a text line height; circle = width).",
        "displayType": "undefined | string"
      },
      {
        "name": "lines",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "`text` only: number of lines; the last is shorter. Defaults to 1.",
        "displayType": "undefined | number"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Skeleton",
        "group": "UI",
        "storyId": "solid-advanced-primitives-skeleton--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "skeleton",
        "doc": "The shimmer block(s). Recolor or change the opacity from outside; the default is a low-contrast foreground tint that reads in both light and dark.",
        "recipe": "kai-skeleton::part(skeleton) { background: var(--color-primary); opacity: 0.15 }"
      }
    ]
  },
  {
    "tag": "kai-skills",
    "className": "KaiSkillsElement",
    "displayName": "Skills",
    "props": [
      {
        "name": "skills",
        "type": "{ id: string; name: string }[]",
        "optional": false,
        "scalar": false,
        "description": "The active skills to badge. Set as a JS property.",
        "typeName": "Skill[]",
        "typeShape": "{ id: string; name: string }[]",
        "default": "[]",
        "displayType": "{ id: string; name: string }[]"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "MessageSkills",
        "group": "Components",
        "storyId": "solid-advanced-elements-messageskills--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-source",
    "className": "KaiSourceElement",
    "displayName": "Source",
    "props": [
      {
        "name": "href",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The URL this citation links to (the domain also seeds the default label/favicon).",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Trigger label (defaults to the domain).",
        "displayType": "undefined | string"
      },
      {
        "name": "headline",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Hover-card headline. Attribute: `headline` (`title` is avoided — it's a global HTML attribute that reflects in a CE constructor and breaks it).",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "description",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Hover-card body text describing the source.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "showFavicon",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show the source's favicon next to the trigger label.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Source",
        "group": "Components",
        "storyId": "solid-advanced-elements-source--docs"
      },
      {
        "name": "SourceTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcetrigger--docs"
      },
      {
        "name": "SourceContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcecontent--docs"
      },
      {
        "name": "SourceList",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcelist--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-sources",
    "className": "KaiSourcesElement",
    "displayName": "Sources",
    "props": [
      {
        "name": "sources",
        "type": "{ href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]",
        "optional": false,
        "scalar": false,
        "description": "The sources to render. Set as a JS property.",
        "typeName": "SourceItem[]",
        "typeShape": "{ href: string; title?: undefined | string; description?: undefined | string; label?: undefined | string; showFavicon?: undefined | false | true }[]",
        "default": "[]",
        "displayType": "SourceItem[]"
      },
      {
        "name": "showFavicon",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Show favicons on all items (per-item `showFavicon` overrides).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "numbered",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When true, each citation chip is labelled with its 1-based index in the merged (prop + declarative-children) list (`[1]`, `[2]`, …) instead of the per-item `label` or domain fallback. HTML attribute: `numbered` (boolean — bare attribute or `numbered=\"true\"`). JS property: `el.numbered = true`.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Source",
        "group": "Components",
        "storyId": "solid-advanced-elements-source--docs"
      },
      {
        "name": "SourceTrigger",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcetrigger--docs"
      },
      {
        "name": "SourceContent",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcecontent--docs"
      },
      {
        "name": "SourceList",
        "group": "Components",
        "storyId": "solid-advanced-elements-sourcelist--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-status",
    "className": "KaiStatusElement",
    "displayName": "Status",
    "props": [
      {
        "name": "status",
        "type": "undefined | \"new\" | \"online\" | \"busy\" | \"away\" | \"offline\"",
        "optional": true,
        "scalar": true,
        "description": "Presence/notification state → color. `new` (default) maps to the blue hue.",
        "default": "'new'",
        "displayType": "undefined | \"new\" | \"online\" | \"busy\" | \"away\" | \"offline\""
      },
      {
        "name": "pulse",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Animated ping ring (off by default; respects prefers-reduced-motion).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Accessible name. Without it the dot is decorative.",
        "displayType": "undefined | string"
      },
      {
        "name": "size",
        "type": "undefined | \"sm\" | \"md\"",
        "optional": true,
        "scalar": true,
        "description": "`sm` (default) or `md`.",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"md\""
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "Status",
        "group": "UI",
        "storyId": "solid-advanced-primitives-status--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "dot",
        "doc": "The status dot. Recolor or resize it from outside; the `status` prop sets the default hue.",
        "recipe": "kai-status::part(dot) { background: var(--color-tool-green) }"
      }
    ]
  },
  {
    "tag": "kai-suggestions",
    "className": "KaiSuggestionsElement",
    "displayName": "Suggestions",
    "props": [
      {
        "name": "suggestions",
        "type": "(string | { label: string; value?: undefined | string; icon?: undefined | string })[]",
        "optional": false,
        "scalar": false,
        "description": "The suggestions. Strings, or `{ label, value }` when the displayed text and the emitted value differ. Set as a JS property.",
        "default": "[]",
        "displayType": "(string | { label: string; value?: undefined | string; icon?: undefined | string })[]"
      },
      {
        "name": "variant",
        "type": "undefined | \"default\" | \"ghost\" | \"outline\"",
        "optional": true,
        "scalar": true,
        "description": "Chip style: `'outline'` (default), `'ghost'`, or `'default'` (filled).",
        "default": "'outline'",
        "displayType": "undefined | \"default\" | \"ghost\" | \"outline\""
      },
      {
        "name": "size",
        "type": "undefined | \"md\" | \"lg\"",
        "optional": true,
        "scalar": true,
        "description": "Row height for `layout=\"list\"`: `'md'` (default) or `'lg'` for taller rows. Chips are unaffected.",
        "default": "'md'",
        "displayType": "undefined | \"md\" | \"lg\""
      },
      {
        "name": "layout",
        "type": "undefined | \"list\" | \"chips\"",
        "optional": true,
        "scalar": true,
        "description": "Layout: `'chips'` (default) renders a wrapping row of rounded pills; `'list'` renders a vertical, full-width \"Ideas for you\" list — each row is left-aligned with a leading `icon`, a label, and a hover background.",
        "default": "'chips'",
        "displayType": "undefined | \"list\" | \"chips\""
      },
      {
        "name": "block",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Full-width left-aligned rows instead of pills.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "highlight",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Substring to highlight within each suggestion.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-select",
        "detail": "{ value: string }",
        "description": "A suggestion was clicked.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "PromptSuggestion",
        "group": "Components",
        "storyId": "solid-advanced-elements-promptsuggestion--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-switch",
    "className": "KaiSwitchElement",
    "displayName": "Switch",
    "props": [
      {
        "name": "checked",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Controlled checked state — settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-switch checked>`) drives it; the toggle UI updates it and fires `kai-change`. Read `el.checked` for live state.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultChecked",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-switch default-checked>`) turns it on.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable interaction.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "label",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Accessible label.",
        "displayType": "undefined | string"
      },
      {
        "name": "name",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Form-control name (paired with `value`).",
        "displayType": "undefined | string"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Submitted value when checked (paired with `name`). Defaults to `'on'`.",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-change",
        "detail": "{ checked: false | true }",
        "description": "The toggle changed.",
        "displayDetail": "{ checked: false | true }"
      }
    ],
    "methods": [
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the switch and fire `kai-change` (no-op while disabled)."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the inner `role=\"switch\"` button (the host element can't reach it)."
      }
    ],
    "composedFrom": [
      {
        "name": "Switch",
        "group": "UI",
        "storyId": "solid-advanced-primitives-switch--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-tabs",
    "className": "KaiTabsElement",
    "displayName": "Tabs",
    "props": [
      {
        "name": "items",
        "type": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]",
        "optional": true,
        "scalar": false,
        "description": "Tabs to render. Set as a JS property, not an HTML attribute.",
        "displayType": "undefined | { id: string; label?: undefined | string; icon?: undefined | string; disabled?: undefined | false | true }[]"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Controlled selected id. Set as a JS property (or the `value` attribute); drive it from your app in response to `kai-tab-change`. Omit for uncontrolled.",
        "displayType": "undefined | string"
      },
      {
        "name": "defaultValue",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Initial selected id when uncontrolled (use the `default-value` attribute in plain HTML).",
        "displayType": "undefined | string"
      },
      {
        "name": "variant",
        "type": "undefined | \"segmented\" | \"underline\"",
        "optional": true,
        "scalar": true,
        "description": "`segmented` (default, a pill group) or `underline` (an underlined row).",
        "default": "'segmented'",
        "displayType": "undefined | \"segmented\" | \"underline\""
      },
      {
        "name": "block",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Stretch the strip to full width, each tab sharing the space equally.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the whole strip.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-tab-change",
        "detail": "{ value: string }",
        "description": "A tab was selected (click, Enter/Space, or arrow-key move). `value` is the item's id.",
        "displayDetail": "{ value: string }"
      }
    ],
    "methods": [
      {
        "name": "select",
        "params": "id: string",
        "returns": "void",
        "description": "Select a tab by id (fires `kai-tab-change`). Ignores unknown/disabled ids."
      },
      {
        "name": "focus",
        "params": "",
        "returns": "void",
        "description": "Focus the active tab (or the first focusable tab)."
      }
    ],
    "composedFrom": [
      {
        "name": "Tabs",
        "group": "UI",
        "storyId": "solid-advanced-primitives-tabs--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "tablist",
        "doc": "The tab strip container (role=\"tablist\"). Restyle its gap, padding, background, or radius from outside; the `variant` prop sets the segmented/underline defaults.",
        "recipe": "kai-tabs::part(tablist) { gap: 0.5rem; background: var(--color-card) }"
      },
      {
        "name": "tab",
        "doc": "A single tab button. Restyle from outside; the active tab carries a `[data-active]` attribute, so target `::part(tab)[data-active]` for the selected look.",
        "recipe": "kai-tabs::part(tab)[data-active] { color: var(--color-primary); font-weight: 600 }"
      }
    ]
  },
  {
    "tag": "kai-tasks",
    "className": "KaiTasksElement",
    "displayName": "Tasks",
    "props": [
      {
        "name": "data",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "The tasks definition (the CardEnvelope.data). Set as a JS PROPERTY: `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import `TasksCardData` from `@kitn.ai/ui` for the full shape.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "cardId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Stable card id correlating every emitted CardEvent. Attribute: `card-id`.",
        "displayType": "undefined | string"
      },
      {
        "name": "heading",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`.",
        "displayType": "undefined | string"
      },
      {
        "name": "resolution",
        "type": "undefined | Record<string, unknown>",
        "optional": true,
        "scalar": false,
        "description": "Set when the user resolved this card; renders the read-only view. Property: `el.resolution = { kind:'submit', data:{ selected:[…] } }`.",
        "displayType": "undefined | Record<string, unknown>"
      },
      {
        "name": "value",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Controlled selection (task ids; JS property). When set, it wins over local state.",
        "displayType": "undefined | string[]"
      },
      {
        "name": "defaultValue",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "Uncontrolled initial selection (task ids; JS property), overlaying per-task `checked`.",
        "displayType": "undefined | string[]"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Freeze the whole list + Confirm. Attribute: `disabled`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "readonly",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Display-only: rows can't be toggled and show the default cursor (no pointer, hover, or focus affordances). Keeps the look as-is. Attribute: `readonly`.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-value-change",
        "detail": "{ value: string[] }",
        "description": "The selection changed on a toggle — the selected ids in input order.",
        "displayDetail": "{ value: string[] }"
      }
    ],
    "methods": [
      {
        "name": "select",
        "params": "taskIds?: string[]",
        "returns": "void",
        "description": "Set the checked task ids (local-only, no emit), respecting disabled/max. With no arg, select all toggleable rows."
      },
      {
        "name": "toggle",
        "params": "taskId: string, checked?: boolean",
        "returns": "void",
        "description": "Toggle one task by id, honoring the max gate (no `checked` = flip)."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Confirm the current selection — emits the `submit` CardEvent + resolves (only when the min/max gate passes). Named `send`, not `submit`."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the task group (select-all checkbox if shown, else the first row)."
      },
      {
        "name": "dismiss",
        "params": "",
        "returns": "void",
        "description": "Trigger the dismiss path (emit `dismiss` + collapse to the re-openable stub)."
      },
      {
        "name": "reopen",
        "params": "",
        "returns": "void",
        "description": "Re-open a dismissed card from its stub (emit `reopen`)."
      }
    ],
    "composedFrom": [
      {
        "name": "TasksCard",
        "group": "Components",
        "storyId": "solid-advanced-elements-taskscard--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-text-shimmer",
    "className": "KaiTextShimmerElement",
    "displayName": "TextShimmer",
    "props": [
      {
        "name": "text",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The text to shimmer.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "as",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Element tag to render as (default `span`).",
        "default": "'span'",
        "displayType": "undefined | string"
      },
      {
        "name": "duration",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Animation duration in seconds.",
        "default": "4",
        "displayType": "undefined | number"
      },
      {
        "name": "spread",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Gradient spread (5–45).",
        "default": "20",
        "displayType": "undefined | number"
      }
    ],
    "events": [],
    "methods": [],
    "composedFrom": [
      {
        "name": "TextShimmer",
        "group": "Components",
        "storyId": "solid-advanced-elements-textshimmer--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-thinking-bar",
    "className": "KaiThinkingBarElement",
    "displayName": "ThinkingBar",
    "props": [
      {
        "name": "text",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The shimmering label, e.g. \"Thinking…\".",
        "default": "'Thinking'",
        "displayType": "undefined | string"
      },
      {
        "name": "stoppable",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "When true, show a \"stop\" affordance that fires a `stop` event.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "stopLabel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Label for the stop affordance.",
        "default": "'Answer now'",
        "displayType": "undefined | string"
      }
    ],
    "events": [
      {
        "name": "kai-stop",
        "detail": null,
        "description": "The \"stop / answer now\" affordance was clicked.",
        "displayDetail": null
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "ThinkingBar",
        "group": "Components",
        "storyId": "solid-advanced-elements-thinkingbar--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-toast-region",
    "className": "KaiToastRegionElement",
    "displayName": "ToastRegion",
    "props": [
      {
        "name": "toasts",
        "type": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
        "optional": false,
        "scalar": false,
        "description": "The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update.",
        "typeName": "ToastItem[]",
        "typeShape": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]",
        "default": "[]",
        "typeImport": "ToastItem",
        "displayType": "{ id: string; message: string; variant?: undefined | \"error\" | \"info\" | \"success\" | \"warning\" | \"neutral\"; appearance?: undefined | \"pill\" | \"card\"; inverse?: undefined | false | true; description?: undefined | string; action?: undefined | { label: string; onAction: () => void | false }; duration?: undefined | number; dismissible?: undefined | false | true; target?: undefined | HTMLElement }[]"
      },
      {
        "name": "position",
        "type": "undefined | \"top-center\" | \"top-right\" | \"top-left\" | \"bottom-center\" | \"bottom-right\" | \"bottom-left\"",
        "optional": true,
        "scalar": true,
        "description": "Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, …",
        "default": "'top-center'",
        "displayType": "undefined | \"top-center\" | \"top-right\" | \"top-left\" | \"bottom-center\" | \"bottom-right\" | \"bottom-left\""
      },
      {
        "name": "max",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Max simultaneously-visible toasts; the rest queue. Defaults to `3`.",
        "default": "3",
        "displayType": "undefined | number"
      },
      {
        "name": "stack",
        "type": "undefined | \"expanded\" | \"collapsed\"",
        "optional": true,
        "scalar": true,
        "description": "Stacking: 'expanded' (default, full column) | 'collapsed' (Sonner-style pile that expands on hover/focus). Attribute: stack.",
        "default": "'expanded'",
        "displayType": "undefined | \"expanded\" | \"collapsed\""
      },
      {
        "name": "appearance",
        "type": "undefined | \"pill\" | \"card\"",
        "optional": true,
        "scalar": true,
        "description": "Default appearance for this region's toasts: `'pill'` (default, compact) | `'card'` (richer, with a description line). A per-toast `appearance` wins. Attribute: `appearance`.",
        "default": "'pill'",
        "displayType": "undefined | \"pill\" | \"card\""
      },
      {
        "name": "inverse",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Default high-contrast inverse treatment for this region's toasts. A per-toast `inverse` wins. Off by default. Attribute: `inverse`.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "target",
        "type": "undefined | HTMLElement",
        "optional": true,
        "scalar": false,
        "description": "Container element to anchor this region to (JS property). Set by the store for a scoped region; unset = the global viewport region.",
        "displayType": "undefined | HTMLElement"
      }
    ],
    "events": [
      {
        "name": "kai-action",
        "detail": "{ id: string; label: string }",
        "description": "A toast's action button was pressed.",
        "displayDetail": "{ id: string; label: string }"
      },
      {
        "name": "kai-dismiss",
        "detail": "{ id: string; reason: \"action\" | \"timeout\" | \"close\" }",
        "description": "A toast left the stack. `reason` is `'timeout' | 'close' | 'action'`.",
        "displayDetail": "{ id: string; reason: \"action\" | \"timeout\" | \"close\" }"
      }
    ],
    "methods": [],
    "composedFrom": [
      {
        "name": "ToastRegion",
        "group": "Components",
        "storyId": "solid-advanced-elements-toastregion--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-tool",
    "className": "KaiToolElement",
    "displayName": "Tool",
    "props": [
      {
        "name": "tool",
        "type": "undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }",
        "optional": true,
        "scalar": false,
        "description": "The tool-call to display. Set as a JS property.",
        "displayType": "ToolPart | undefined"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on trigger click). Set `el.open = true`, or `<kai-tool open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Gate the disclosure trigger — programmatic `show()/hide()/toggle()` still work, but the trigger click no longer toggles.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The panel expanded or collapsed (by trigger click or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Tool",
        "group": "Components",
        "storyId": "solid-advanced-elements-tool--docs"
      }
    ],
    "tokens": [
      "--color-tool-blue",
      "--color-tool-amber",
      "--color-tool-green",
      "--color-tool-red"
    ]
  },
  {
    "tag": "kai-tooltip",
    "className": "KaiTooltipElement",
    "displayName": "Tooltip",
    "props": [
      {
        "name": "content",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The hint text shown on hover/focus of the slotted trigger.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "openDelay",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Delay (ms) before the tooltip appears on hover. Defaults to 600. Focus shows it immediately regardless.",
        "displayType": "undefined | number"
      },
      {
        "name": "closeDelay",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Delay (ms) before it hides after the pointer leaves. Defaults to 0 (hides immediately).",
        "displayType": "undefined | number"
      },
      {
        "name": "placement",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional `-start`/`-end`). Defaults to `'top'`; flips to stay in view.",
        "displayType": "undefined | string"
      },
      {
        "name": "open",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the element still self-manages on hover/focus). Set `el.open = true`, or `<kai-tooltip open>`; listen for `kai-open-change`.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultOpen",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial open state on mount (uncontrolled seed).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Turn the tooltip off while keeping the trigger mounted (hover/focus and `show()` no longer open it).",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-open-change",
        "detail": "{ open: false | true }",
        "description": "The tooltip opened or closed (by hover/focus, outside-click, or a method).",
        "displayDetail": "{ open: false | true }"
      }
    ],
    "methods": [
      {
        "name": "show",
        "params": "",
        "returns": "void",
        "description": "Open it programmatically (no-op while disabled)."
      },
      {
        "name": "hide",
        "params": "",
        "returns": "void",
        "description": "Close it programmatically."
      },
      {
        "name": "toggle",
        "params": "",
        "returns": "void",
        "description": "Flip the open state (closes while disabled)."
      }
    ],
    "composedFrom": [
      {
        "name": "Tooltip",
        "group": "UI",
        "storyId": "solid-advanced-primitives-tooltip--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-voice-input",
    "className": "KaiVoiceInputElement",
    "displayName": "VoiceInput",
    "props": [
      {
        "name": "transcribe",
        "type": "undefined | (audio: Blob) => Promise<string>",
        "optional": true,
        "scalar": false,
        "description": "Transcriber the host supplies — records audio, returns the text. This is a **function-valued property** (`el.transcribe = async blob => '...'`) because a value-returning callback can't be modelled as a fire-and-forget event.",
        "displayType": "undefined | (audio: Blob) => Promise<string>"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the mic button (non-interactive).",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "recognitionLang",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "BCP-47 language tag for the native `SpeechRecognition` path (e.g. `en-US`). Attribute: `recognition-lang` (the plain `lang` attribute is reserved by `HTMLElement` and can't be a custom-element property). No effect when `transcribe` is set or the browser lacks SpeechRecognition.",
        "displayType": "undefined | string"
      },
      {
        "name": "interim",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Emit live partial transcripts (`kai-transcript-interim`) during native recognition. Attribute: `interim`. No-op on the transcribe/fallback paths.",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-audio-captured",
        "detail": "{ blob: Blob }",
        "description": "Raw audio captured (before transcription) — for hosts that prefer to handle transcription themselves instead of via the `transcribe` property. Also the unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only the blob is produced (no text).",
        "displayDetail": "{ blob: Blob }"
      },
      {
        "name": "kai-recording-change",
        "detail": "{ recording: false | true }",
        "description": "Recording started or stopped — lets the host drive its own UI (waveform, push-to-talk indicator) in sync with the mic. Fires on real transitions only (manual click and programmatic start()/stop()), never on mount.",
        "displayDetail": "{ recording: false | true }"
      },
      {
        "name": "kai-transcript-interim",
        "detail": "{ text: string }",
        "description": "Live partial transcript during native recognition (only when `interim` is set). Fires repeatedly before the final `kai-transcription`.",
        "displayDetail": "{ text: string }"
      },
      {
        "name": "kai-transcription",
        "detail": "{ text: string }",
        "description": "Final transcript — the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set).",
        "displayDetail": "{ text: string }"
      }
    ],
    "methods": [
      {
        "name": "start",
        "params": "",
        "returns": "void",
        "description": "Begin recording programmatically (e.g. push-to-talk bound to a global key). Runs the same getUserMedia path as clicking the mic; no-ops if already recording."
      },
      {
        "name": "stop",
        "params": "",
        "returns": "void",
        "description": "Stop the in-progress recording, producing the blob (→ kai-audio-captured) and running transcription. Pairs with start() for push-to-talk."
      }
    ],
    "composedFrom": [
      {
        "name": "VoiceInput",
        "group": "Components",
        "storyId": "solid-advanced-elements-voiceinput--docs"
      }
    ],
    "tokens": []
  },
  {
    "tag": "kai-voice-output",
    "className": "KaiVoiceOutputElement",
    "displayName": "VoiceOutput",
    "props": [
      {
        "name": "text",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "The utterance to read aloud.",
        "default": "''",
        "displayType": "undefined | string"
      },
      {
        "name": "autoplay",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Speak automatically when `text` is set/changed.",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "synthesize",
        "type": "undefined | (text: string) => Promise<Blob>",
        "optional": true,
        "scalar": false,
        "description": "TTS model seam the host supplies — given text, returns an audio `Blob` to play. This is a **function-valued property** (`el.synthesize = async text => blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be modelled as a fire-and-forget event, hence a property.",
        "displayType": "undefined | (text: string) => Promise<Blob>"
      },
      {
        "name": "disabled",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Disable the button (non-interactive).",
        "default": "false",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-speaking-change",
        "detail": "{ speaking: false | true }",
        "description": "Playback started or stopped — drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount.",
        "displayDetail": "{ speaking: false | true }"
      },
      {
        "name": "kai-synthesized",
        "detail": "{ blob: Blob }",
        "description": "The model path (`synthesize`) resolved audio — the raw `Blob` before playback.",
        "displayDetail": "{ blob: Blob }"
      }
    ],
    "methods": [
      {
        "name": "speak",
        "params": "",
        "returns": "void",
        "description": "Speak the current `text` (native, or via `synthesize` if set)."
      },
      {
        "name": "pause",
        "params": "",
        "returns": "void",
        "description": "Pause playback (resumable)."
      },
      {
        "name": "resume",
        "params": "",
        "returns": "void",
        "description": "Resume paused playback."
      },
      {
        "name": "stop",
        "params": "",
        "returns": "void",
        "description": "Stop playback and reset."
      }
    ],
    "composedFrom": [
      {
        "name": "VoiceOutput",
        "group": "Components",
        "storyId": "solid-advanced-elements-voiceoutput--docs"
      }
    ],
    "tokens": [],
    "parts": [
      {
        "name": "button",
        "doc": "The speaker/play button. Restyle radius, size, padding, or colors from outside; it is a ghost icon button by default.",
        "recipe": "kai-voice-output::part(button) { border-radius: 9999px; color: var(--color-primary) }"
      }
    ]
  },
  {
    "tag": "kai-workspace",
    "className": "KaiWorkspaceElement",
    "displayName": "Workspace",
    "props": [
      {
        "name": "groups",
        "type": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
        "optional": false,
        "scalar": false,
        "description": "Pre-bucketed conversation groups for the sidebar. Set as a JS property.",
        "typeName": "ConversationGroup[]",
        "typeShape": "{ id: string; userId?: undefined | string; teamId?: undefined | string; name: string; sortOrder: number; createdAt: string }[]",
        "default": "[]",
        "typeImport": "ConversationGroup",
        "displayType": "ConversationGroup[]"
      },
      {
        "name": "conversations",
        "type": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
        "optional": false,
        "scalar": false,
        "description": "Flat conversation list (auto-bucketed if `groups` is empty). Set as a JS property.",
        "typeName": "ConversationSummary[]",
        "typeShape": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]",
        "default": "[]",
        "typeImport": "ConversationSummary",
        "displayType": "{ id: string; title: string; groupId?: undefined | string; scope: { type: \"document\" | \"collection\"; documentId?: undefined | string; filters?: undefined | { tags?: undefined | string[]; authors?: undefined | string[]; contentType?: undefined | \"transcript\" | \"markdown\"; dateRange?: undefined | { from: string; to: string } } }; messageCount: number; lastMessageAt: string; updatedAt: string; trailing?: undefined | string }[]"
      },
      {
        "name": "activeId",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "Id of the open conversation, highlighted in the sidebar.",
        "displayType": "undefined | string"
      },
      {
        "name": "messages",
        "type": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
        "optional": false,
        "scalar": false,
        "description": "The active conversation's message thread, newest last. Set as a JS property.",
        "typeName": "ChatMessage[]",
        "typeShape": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]",
        "default": "[]",
        "typeImport": "ChatMessage",
        "displayType": "{ id: string; role: \"user\" | \"assistant\"; content: string; reasoning?: undefined | { text: string; label?: undefined | string }; tools?: undefined | { type: string; state: \"input-streaming\" | \"input-available\" | \"output-available\" | \"output-error\"; input?: undefined | Record<string, unknown>; output?: undefined | Record<string, unknown>; toolCallId?: undefined | string; errorText?: undefined | string }[]; attachments?: undefined | { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[]; actions?: undefined | (\"copy\" | \"like\" | \"dislike\" | \"regenerate\" | \"edit\" | { id: string; label: string; icon?: undefined | string; tooltip?: undefined | string })[]; avatar?: undefined | { src?: undefined | string; fallback?: undefined | string; alt?: undefined | string }; feedback?: undefined | \"like\" | \"dislike\" }[]"
      },
      {
        "name": "value",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "",
        "displayType": "undefined | string"
      },
      {
        "name": "placeholder",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "'Send a message...'",
        "displayType": "undefined | string"
      },
      {
        "name": "loading",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "suggestions",
        "type": "undefined | string[]",
        "optional": true,
        "scalar": false,
        "description": "",
        "displayType": "undefined | string[]"
      },
      {
        "name": "suggestionMode",
        "type": "undefined | \"submit\" | \"fill\"",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "'submit'",
        "displayType": "undefined | \"submit\" | \"fill\""
      },
      {
        "name": "proseSize",
        "type": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\"",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "'sm'",
        "displayType": "undefined | \"sm\" | \"lg\" | \"xs\" | \"base\""
      },
      {
        "name": "codeTheme",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "'github-dark-dimmed'",
        "displayType": "undefined | string"
      },
      {
        "name": "codeHighlight",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "chatTitle",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "",
        "displayType": "undefined | string"
      },
      {
        "name": "models",
        "type": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]",
        "optional": true,
        "scalar": false,
        "description": "",
        "displayType": "undefined | { id: string; name: string; provider?: undefined | string; description?: undefined | string; group?: undefined | string }[]"
      },
      {
        "name": "currentModel",
        "type": "undefined | string",
        "optional": true,
        "scalar": true,
        "description": "",
        "displayType": "undefined | string"
      },
      {
        "name": "context",
        "type": "undefined | { usedTokens: number; maxTokens: number; inputTokens?: undefined | number; outputTokens?: undefined | number; estimatedCost?: undefined | number }",
        "optional": true,
        "scalar": false,
        "description": "",
        "displayType": "ContextData | undefined"
      },
      {
        "name": "scrollButton",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "true",
        "displayType": "undefined | false | true"
      },
      {
        "name": "search",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "voice",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "",
        "default": "false",
        "displayType": "undefined | false | true"
      },
      {
        "name": "triggers",
        "type": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]",
        "optional": true,
        "scalar": false,
        "description": "Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input.",
        "displayType": "undefined | { char: string; kind: string; items?: undefined | { id: string; label: string; icon?: undefined | string; description?: undefined | string; group?: undefined | string; kind?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }[]"
      },
      {
        "name": "kindIcons",
        "type": "undefined | Record<string, string>",
        "optional": true,
        "scalar": false,
        "description": "Default icon per entity kind (kind → image src) forwarded to the input.",
        "displayType": "undefined | Record<string, string>"
      },
      {
        "name": "sidebarWidth",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Sidebar default width as a percent of the workspace (default 26).",
        "default": "26",
        "displayType": "undefined | number"
      },
      {
        "name": "sidebarMinWidth",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Sidebar min width in px (default 240).",
        "default": "240",
        "displayType": "undefined | number"
      },
      {
        "name": "sidebarMaxWidth",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Sidebar max width in px (default 420).",
        "default": "420",
        "displayType": "undefined | number"
      },
      {
        "name": "sidebarCollapsed",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Controlled collapsed state. Set this as a JS property (`el.sidebarCollapsed = true`) to drive the sidebar from your app, updating it in response to the `kai-sidebar-toggle` event. Omit for uncontrolled (the element manages it).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "defaultSidebarCollapsed",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML.",
        "displayType": "undefined | false | true"
      },
      {
        "name": "collapseBelow",
        "type": "undefined | number",
        "optional": true,
        "scalar": true,
        "description": "Auto-collapse the rail when the workspace's own width drops below this many px, and re-expand when it grows back above. Uncontrolled only (it never fights an app-driven `sidebarCollapsed`); omit to disable. Fires `kai-sidebar-toggle`. Attribute: `collapse-below`.",
        "displayType": "undefined | number"
      },
      {
        "name": "compact",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Render Recents as dense single-line rows (a leading dot + title, no count).",
        "displayType": "undefined | false | true"
      },
      {
        "name": "noConversations",
        "type": "undefined | false | true",
        "optional": true,
        "scalar": true,
        "description": "Suppress the built-in ConversationList so the `sidebar-header` slot owns the whole rail flex region (for apps that supply their own rail nav). Default false. Attribute: `no-conversations`.",
        "displayType": "undefined | false | true"
      }
    ],
    "events": [
      {
        "name": "kai-conversation-select",
        "detail": "{ id: string }",
        "description": "A conversation was selected in the sidebar.",
        "displayDetail": "{ id: string }"
      },
      {
        "name": "kai-message-action",
        "detail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }",
        "description": "An action button on a message was clicked. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear.",
        "displayDetail": "{ messageId: string; action: string; state?: undefined | \"on\" | \"off\" }"
      },
      {
        "name": "kai-model-change",
        "detail": "{ modelId: string }",
        "description": "The header model switcher changed.",
        "displayDetail": "{ modelId: string }"
      },
      {
        "name": "kai-new-chat",
        "detail": "Record<string, never>",
        "description": "The \"New chat\" button was clicked.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-search",
        "detail": "Record<string, never>",
        "description": "The Search button was clicked.",
        "displayDetail": "Record<string, never>"
      },
      {
        "name": "kai-sidebar-toggle",
        "detail": "{ collapsed: false | true }",
        "description": "The sidebar was collapsed or expanded.",
        "displayDetail": "{ collapsed: false | true }"
      },
      {
        "name": "kai-submit",
        "detail": "{ value: string; attachments: { id: string; type: \"file\" | \"source-document\"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }",
        "description": "User submitted a message.",
        "displayDetail": "{ value: string; attachments: AttachmentData[] }"
      },
      {
        "name": "kai-suggestion-click",
        "detail": "{ value: string }",
        "description": "A suggestion chip was clicked (only in `suggestion-mode=\"fill\"`).",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-value-change",
        "detail": "{ value: string }",
        "description": "Fired on every input change.",
        "displayDetail": "{ value: string }"
      },
      {
        "name": "kai-voice",
        "detail": "Record<string, never>",
        "description": "The Mic / voice button was clicked.",
        "displayDetail": "Record<string, never>"
      }
    ],
    "methods": [
      {
        "name": "toggleSidebar",
        "params": "",
        "returns": "void",
        "description": "Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`."
      },
      {
        "name": "collapseSidebar",
        "params": "",
        "returns": "void",
        "description": "Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`)."
      },
      {
        "name": "expandSidebar",
        "params": "",
        "returns": "void",
        "description": "Force the conversation sidebar expanded (fires `kai-sidebar-toggle`)."
      },
      {
        "name": "focus",
        "params": "options?: FocusOptions",
        "returns": "void",
        "description": "Focus the thread's composer."
      },
      {
        "name": "clear",
        "params": "",
        "returns": "void",
        "description": "Clear the thread draft + staged attachments."
      },
      {
        "name": "send",
        "params": "",
        "returns": "void",
        "description": "Submit the current thread draft programmatically (fires `kai-submit`)."
      },
      {
        "name": "scrollToBottom",
        "params": "behavior?: ScrollBehavior",
        "returns": "void",
        "description": "Scroll the thread to the newest message."
      }
    ],
    "composedFrom": [
      {
        "name": "ChatThread",
        "group": "Components",
        "storyId": "solid-advanced-elements-chatthread--docs"
      },
      {
        "name": "ConversationList",
        "group": "Components",
        "storyId": "solid-advanced-elements-conversationlist--docs"
      },
      {
        "name": "CollapsedRail",
        "group": "Components",
        "storyId": "solid-advanced-elements-collapsedrail--docs"
      },
      {
        "name": "ResizablePanelGroup",
        "group": "UI",
        "storyId": "solid-advanced-primitives-resizablepanelgroup--docs"
      },
      {
        "name": "ResizablePanel",
        "group": "UI",
        "storyId": "solid-advanced-primitives-resizablepanel--docs"
      },
      {
        "name": "ResizableHandle",
        "group": "UI",
        "storyId": "solid-advanced-primitives-resizablehandle--docs"
      }
    ],
    "tokens": [],
    "slots": [
      {
        "name": "sidebar-header",
        "mode": "inject",
        "doc": "Top of the conversation rail (brand, a kai-tabs strip)."
      },
      {
        "name": "sidebar-footer",
        "mode": "inject",
        "doc": "Bottom of the rail: an upgrade card, a Design trigger, a user-menu cluster."
      },
      {
        "name": "main-header",
        "mode": "inject",
        "doc": "Top of the main region (a top-placed banner or a corner action)."
      },
      {
        "name": "main",
        "mode": "replace",
        "doc": "Replace the built-in chat thread with your own main view (a home or dashboard screen). Omit to keep the thread."
      }
    ],
    "parts": [
      {
        "name": "sidebar",
        "doc": "The conversation rail. Carries a subtle, theme-aware default background (bg-surface); override its background, border, or width from outside. `sidebar-min-width` sets its min px width and `collapse-below` auto-collapses it under a width.",
        "recipe": "kai-workspace::part(sidebar) { background: var(--color-card); border-right: 1px solid var(--color-border) }"
      }
    ]
  }
]
