@kitn.ai/ui 0.25.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -6
- package/bin/mcp.js +16 -3
- package/bin/route.js +23 -0
- package/bin/route.test.js +58 -0
- package/dist/{elements/chunks/Icon-b5A8hlHs.js → Icon-BnFKqqtY.js} +1 -1
- package/dist/action-icons-CBskfBMz.js +1 -0
- package/dist/arrow-down-Br0qtpsz.js +1 -0
- package/dist/arrow-left-Dj7xgE12.js +1 -0
- package/dist/artifact-CvXEm1lS.js +1 -0
- package/dist/assets/dev-5XzXYR21.js +91 -0
- package/dist/attachments-C43ZegEq.js +1 -0
- package/dist/audio-visualizer-B-79y1Tj.js +1 -0
- package/dist/badge-BpUbq8c0.js +1 -0
- package/dist/bash-InADTalH.js +1 -6
- package/dist/bell-sn17Ip9v.js +1 -0
- package/dist/{elements/chunks/button-B9okqG73.js → button-BH6rN0U-.js} +1 -1
- package/dist/card-renderer-Cb1gQmth.js +1 -0
- package/dist/card-routing-DifQgS7n.js +1 -0
- package/dist/check-DPeeMUYx.js +1 -0
- package/dist/checkbox-Dc9Yov_B.js +1 -0
- package/dist/checkbox-group-B1kDLLYk.js +1 -0
- package/dist/chevron-down-CHSWk7ZT.js +1 -0
- package/dist/chevron-right-B7l_fMgx.js +1 -0
- package/dist/choice-card-BT3c1S8g.js +1 -0
- package/dist/circle-Bb0yOpqM.js +1 -0
- package/dist/circle-check-BGZpCiz7.js +1 -0
- package/dist/circle-x-wobWkoSx.js +1 -0
- package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
- package/dist/code-block-CUQ5mtv0.js +1 -0
- package/dist/collapsible-CPJbf6FM.js +1 -0
- package/dist/components/attachment-types.d.ts +53 -1
- package/dist/components/attachments.d.ts +31 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
- package/dist/components/audio-visualizer/index.d.ts +15 -1
- package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
- package/dist/components/card-renderer.d.ts +13 -0
- package/dist/components/card.d.ts +4 -0
- package/dist/components/chat-thread.d.ts +49 -42
- package/dist/components/code-block.d.ts +22 -0
- package/dist/components/conversation-item.d.ts +66 -1
- package/dist/components/conversation-list.d.ts +77 -0
- package/dist/components/form-widgets.d.ts +67 -2
- package/dist/components/form.d.ts +89 -0
- package/dist/components/message.d.ts +29 -0
- package/dist/components/reasoning.d.ts +6 -0
- package/dist/components/scroll-button.d.ts +11 -0
- package/dist/components/thread.d.ts +5 -0
- package/dist/components/toast.d.ts +2 -1
- package/dist/components/tool-types.d.ts +9 -0
- package/dist/components/voice-input.d.ts +8 -0
- package/dist/components/voice-output.d.ts +12 -1
- package/dist/components/workspace-shell.d.ts +87 -0
- package/dist/composer-CjngLzal.js +106 -0
- package/dist/confirm-card-DCx_A4bU.js +1 -0
- package/dist/construct-cli.es.js +1169 -0
- package/dist/context-BY8V-Nlp.js +1 -0
- package/dist/controllable-D43BKmtX.js +1 -0
- package/dist/conversation-list-D4lLU_yS.js +1 -0
- package/dist/copy-B6DO4PqB.js +1 -0
- package/dist/core-AYMC6_lb.js +12 -5874
- package/dist/{create-tween-CUzOlaMS.js → create-tween-BPzaefTp.js} +1 -1
- package/dist/{create-tween-B5Y4Im8G.js → create-tween-CnMHviKB.js} +1 -1
- package/dist/{create-tween-4z1XYLkR.js → create-tween-D1aiGZZh.js} +1 -1
- package/dist/{elements/chunks/create-tween-CUrM6D_o.js → create-tween-DUSQUKpr.js} +2 -2
- package/dist/css-M7EaDHN_.js +1 -6
- package/dist/custom-elements.json +3468 -1927
- package/dist/default-input-CucQEOqH.js +1 -0
- package/dist/define-CGGX-7Vg.js +1 -0
- package/dist/define.d.ts +4 -0
- package/dist/define.js +510 -0
- package/dist/define.server.d.ts +5 -0
- package/dist/define.server.js +506 -0
- package/dist/diagnostics/hook.d.ts +81 -0
- package/dist/diagnostics/index.d.ts +7 -0
- package/dist/diagnostics/report-request.d.ts +61 -0
- package/dist/diagnostics.d.ts +5 -0
- package/dist/diagnostics.js +209 -0
- package/dist/disclosure-CbLtajUQ.js +1 -0
- package/dist/dropdown-BwhViJFd.js +1 -0
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/autoloader.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.d.ts +1 -0
- package/dist/elements/checkbox-group.js +1 -0
- package/dist/elements/checkbox.d.ts +1 -0
- package/dist/elements/checkbox.js +1 -0
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.d.ts +1 -0
- package/dist/elements/conversation-item.js +1 -0
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/default-input.d.ts +3 -3
- package/dist/elements/define-entry.d.ts +12 -0
- package/dist/elements/define.d.ts +27 -0
- package/dist/elements/diagnostic-events.d.ts +74 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.d.ts +1 -0
- package/dist/elements/dock.js +243 -0
- package/dist/elements/dropdown.d.ts +1 -0
- package/dist/elements/dropdown.js +1 -0
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +37 -0
- package/dist/elements/element-diagnostics.d.ts +81 -0
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-grid.d.ts +1 -0
- package/dist/elements/pane-grid.js +1 -0
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/radio-group.d.ts +1 -0
- package/dist/elements/radio-group.js +1 -0
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/register.d.ts +2 -0
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +3 -3
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/select.d.ts +1 -0
- package/dist/elements/select.js +1 -0
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slider.d.ts +1 -0
- package/dist/elements/slider.js +1 -0
- package/dist/elements/slots.d.ts +36 -4
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +589 -167
- package/dist/{elements/chunks/ellipsis-CVxqfsDZ.js → ellipsis-DFr4Vqr3.js} +1 -1
- package/dist/embed-5s_vU4J0.js +1 -0
- package/dist/engine-javascript-vq0WuIJl.js +14 -2516
- package/dist/{elements/chunks/external-link-DG2sRdQL.js → external-link-u9d85ORQ.js} +1 -1
- package/dist/file-text-CX7_x42o.js +1 -0
- package/dist/{elements/chunks/file-tree-yGWNK0Js.js → file-tree-D3kBjXI5.js} +1 -1
- package/dist/folder-V-YdIL8f.js +1 -0
- package/dist/form-BRNUMCN2.js +1 -0
- package/dist/github-dark-dimmed-DUshB20C.js +1 -4
- package/dist/github-light-JYsPkUQd.js +1 -4
- package/dist/hover-card-DaeiYrTA.js +1 -0
- package/dist/html-CPZ3oZQ7.js +1 -10
- package/dist/icon-BpixdZNq.js +1 -0
- package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +8473 -6470
- package/dist/index.server.js +6495 -4958
- package/dist/info-8mFsIjS3.js +1 -0
- package/dist/input-d1Yuu-hz.js +1 -0
- package/dist/javascript-C25yR2R2.js +1 -6
- package/dist/json-DxJze_jm.js +1 -6
- package/dist/kai-provider.es.js +40 -40
- package/dist/kai.es.js +1 -1
- package/dist/kbd-961zMPFB.js +1 -0
- package/dist/link-DlZZBGaR.js +1 -0
- package/dist/{elements/chunks/link-preview-Cf5KOP-i.js → link-preview-DIIbV2Sd.js} +1 -1
- package/dist/loader-YQszHFaW.js +1 -0
- package/dist/{elements/chunks/markdown-DbozyYqa.js → markdown-CVk1MPsj.js} +1 -1
- package/dist/mcp.es.js +3873 -544
- package/dist/message-CwKVEdZg.js +1 -0
- package/dist/message-DS8lzHc1.js +1 -0
- package/dist/message-circle-Xf8Q-vZp.js +1 -0
- package/dist/message-square-Cxnwgkns.js +1 -0
- package/dist/{elements/chunks/minimize-2-SegJ_oku.js → minimize-2-UEZmP2QT.js} +1 -1
- package/dist/{elements/chunks/model-switcher-D7JrFFHp.js → model-switcher-Kk1jEQ5t.js} +1 -1
- package/dist/{elements/chunks/overlay-CV7z2YuX.js → overlay-C1od6LOz.js} +1 -1
- package/dist/panel-right-ryET0yyn.js +1 -0
- package/dist/paperclip-BDNoZFJP.js +1 -0
- package/dist/play-OFIvYXUQ.js +1 -0
- package/dist/primitives/card-data-types.d.ts +49 -0
- package/dist/primitives/card-routing.d.ts +1 -33
- package/dist/primitives/card-validate.d.ts +2 -2
- package/dist/primitives/chat-config.d.ts +29 -2
- package/dist/primitives/field-mask.d.ts +96 -0
- package/dist/primitives/field-semantics.d.ts +36 -0
- package/dist/primitives/input-mask.d.ts +46 -0
- package/dist/primitives/url-scheme-policy.d.ts +34 -0
- package/dist/primitives/use-resize-observer.d.ts +23 -0
- package/dist/primitives/use-speech-recognition.d.ts +8 -0
- package/dist/primitives/use-text-stream.d.ts +5 -0
- package/dist/progress-bar-BvYX0aoy.js +1 -0
- package/dist/prompt-suggestion-BRFu2lcu.js +1 -0
- package/dist/radio-DcL23cNJ.js +1 -0
- package/dist/react/index.d.ts +306 -283
- package/dist/react.js +309 -247
- package/dist/reasoning-Cackq4Rh.js +1 -0
- package/dist/register-impl-C7rENvPK.js +424 -0
- package/dist/{elements/chunks/resizable-Dpzjlvp4.js → resizable-Cp9HUYih.js} +1 -1
- package/dist/rotate-ccw-0DLRDHH5.js +1 -0
- package/dist/rotate-cw-DOB9IGcU.js +1 -0
- package/dist/schemas/form.schema.json +21 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/tool-defs.d.ts +45 -0
- package/dist/schemas.js +398 -305
- package/dist/scroll-area-emVmWP4K.js +1 -0
- package/dist/scroll-button-CeP_gv1x.js +1 -0
- package/dist/select-CWmu00tS.js +1 -0
- package/dist/{elements/chunks/separator-DH2r_ZSZ.js → separator-CE6vly6z.js} +1 -1
- package/dist/{elements/chunks/settings-BFMOd6yB.js → settings-CE-78SvZ.js} +1 -1
- package/dist/{elements/chunks/settings-group-B3VZKIcz.js → settings-group-ZFWNxFQR.js} +1 -1
- package/dist/{elements/chunks/skeleton-N8BuWYmf.js → skeleton-BebdP4mf.js} +1 -1
- package/dist/slider-BAKRYUlz.js +1 -0
- package/dist/slots-DaNjX0rc.js +1 -0
- package/dist/{solid-BMuDmFo_.js → solid-BE5ui6sy.js} +10672 -8116
- package/dist/{solid-CGYNdLRR.js → solid-DFhsce3O.js} +8137 -6056
- package/dist/solid.d.ts +15 -0
- package/dist/solid.js +248 -235
- package/dist/solid.server.js +248 -235
- package/dist/source-B0FlguSx.js +1 -0
- package/dist/star-CBMZvLuN.js +1 -0
- package/dist/state/index.d.ts +5 -1
- package/dist/state/mock.d.ts +32 -2
- package/dist/state/persistence.d.ts +51 -0
- package/dist/state/stream.d.ts +50 -0
- package/dist/state/threads.d.ts +71 -0
- package/dist/state.js +297 -172
- package/dist/store-7eoadydQ.js +1 -0
- package/dist/svelte--5p79yCD.js +1 -15
- package/dist/switch-CViARZCy.js +1 -0
- package/dist/tasks-card-MjCcOhR_.js +1 -0
- package/dist/text-shimmer-DKlwRF2G.js +1 -0
- package/dist/textarea-3ay2Me2-.js +1 -0
- package/dist/theme.tokens.css +82 -13
- package/dist/{elements/chunks/thumbs-up-DQe0hvkZ.js → thumbs-up-DQcu2HMO.js} +1 -1
- package/dist/toast-store-C6yKOhbk.js +1 -0
- package/dist/{elements/chunks/tool-C1YtxwPu.js → tool-BCYNlfKy.js} +1 -1
- package/dist/{elements/chunks/tooltip-BqwnFWhn.js → tooltip-05zI4hjs.js} +1 -1
- package/dist/trash-2-BR1RxGky.js +1 -0
- package/dist/{elements/chunks/triangle-alert-B6or7F5u.js → triangle-alert-DHohDOCy.js} +1 -1
- package/dist/tsx-B8rCNbgL.js +1 -6
- package/dist/types.d.ts +4 -2
- package/dist/typescript-RycA9KXf.js +1 -6
- package/dist/ui/checkbox-group.d.ts +83 -0
- package/dist/ui/checkbox.d.ts +40 -0
- package/dist/ui/dock.d.ts +131 -0
- package/dist/ui/hover-card.d.ts +44 -0
- package/dist/ui/icon.d.ts +3 -0
- package/dist/ui/input.d.ts +48 -2
- package/dist/ui/radio.d.ts +85 -0
- package/dist/ui/select.d.ts +71 -0
- package/dist/ui/slider.d.ts +65 -0
- package/dist/ui/switch.d.ts +9 -2
- package/dist/upload-BbGW6A_u.js +1 -0
- package/dist/url-scheme-policy-DHpoTJwB.js +1 -0
- package/dist/use-card-resolution-CJW4grFa.js +1 -0
- package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-BUOVgPOB.js} +27 -27
- package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CUsUJvFI.js} +28 -28
- package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CW2i4bfr.js} +2 -2
- package/dist/{elements/chunks/variant-aurora-QXTZPyST.js → variant-aurora-xiMPty8f.js} +2 -2
- package/dist/variant-custom-BQtOnmeO.js +1 -0
- package/dist/{variant-custom-BhS9wIpU.js → variant-custom-CAm9L-E5.js} +65 -65
- package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-CAnzzppW.js} +40 -40
- package/dist/variant-custom-D91HjAKz.js +1 -0
- package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-Ca1Ls4_y.js} +21 -21
- package/dist/{variant-wave-CbVsmgwT.js → variant-wave-CxX39DKd.js} +25 -25
- package/dist/{variant-wave-BwzrHD1s.js → variant-wave-DYyzIIZv.js} +2 -2
- package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-uY5crU_K.js} +2 -2
- package/dist/vue-BmIZj4XD.js +1 -33
- package/dist/wire/chunk.d.ts +47 -0
- package/dist/wire/diagnostics.d.ts +575 -0
- package/dist/wire/encode-probe.d.ts +70 -0
- package/dist/wire/encode.d.ts +24 -0
- package/dist/wire/index.d.ts +2 -0
- package/dist/wire/sse.d.ts +10 -2
- package/dist/wire.js +917 -480
- package/dist/x-C5m1JFgi.js +1 -0
- package/frameworks/react/index.tsx +325 -108
- package/llms-full.txt +1354 -82
- package/llms.txt +6 -3
- package/package.json +39 -6
- package/src/agent-tooling/archetypes.ts +41 -9
- package/src/agent-tooling/catalog/README.md +676 -0
- package/src/agent-tooling/catalog/catalog-types.ts +231 -0
- package/src/agent-tooling/catalog/fabrications.ts +96 -0
- package/src/agent-tooling/catalog/invariants.ts +284 -0
- package/src/agent-tooling/catalog/labs-titles.ts +114 -0
- package/src/agent-tooling/catalog/scenarios.ts +87 -0
- package/src/agent-tooling/catalog/surfaces.ts +347 -0
- package/src/agent-tooling/construct/cli-entry.ts +8 -0
- package/src/agent-tooling/construct/cli.ts +131 -0
- package/src/agent-tooling/construct/codegen.ts +1353 -0
- package/src/agent-tooling/construct/construct.v1.schema.json +250 -0
- package/src/agent-tooling/construct/dev.ts +148 -0
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +23 -0
- package/src/agent-tooling/construct/schema.ts +371 -0
- package/src/agent-tooling/integrations/anthropic.ts +7 -1
- package/src/agent-tooling/integrations/cloudflare.ts +43 -2
- package/src/agent-tooling/integrations/langgraph.ts +7 -1
- package/src/agent-tooling/integrations/mastra.ts +7 -1
- package/src/agent-tooling/integrations/mock.ts +92 -17
- package/src/agent-tooling/integrations/ollama.ts +7 -1
- package/src/agent-tooling/integrations/openai.ts +7 -1
- package/src/agent-tooling/integrations/openrouter.ts +7 -1
- package/src/agent-tooling/integrations/pi.ts +56 -1
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
- package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
- package/src/agent-tooling/mcp/manifest.ts +100 -1
- package/src/agent-tooling/mcp/server.ts +63 -6
- package/src/agent-tooling/mcp/tools/construct.ts +130 -0
- package/src/agent-tooling/mcp/tools/debug.ts +126 -4
- package/src/agent-tooling/mcp/tools/reference.ts +542 -5
- package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
- package/src/agent-tooling/mcp/tools/theme.ts +146 -30
- package/src/agent-tooling/mcp/validate-args.ts +141 -0
- package/src/agent-tooling/recipes/composed-thread.ts +714 -0
- package/src/agent-tooling/recipes/index.ts +22 -0
- package/src/agent-tooling/recipes/types.ts +32 -0
- package/src/agent-tooling/registry.ts +24 -7
- package/src/agent-tooling/route-emit.ts +26 -2
- package/src/components/attachment-types.ts +54 -1
- package/src/components/attachments.tsx +169 -22
- package/src/components/audio-visualizer/fit-scale.ts +112 -0
- package/src/components/audio-visualizer/index.tsx +80 -3
- package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
- package/src/components/audio-visualizer/variant-bar.tsx +38 -6
- package/src/components/audio-visualizer/variant-custom.tsx +8 -2
- package/src/components/audio-visualizer/variant-grid.tsx +16 -11
- package/src/components/audio-visualizer/variant-radial.tsx +15 -10
- package/src/components/audio-visualizer/variant-wave.tsx +7 -2
- package/src/components/card-renderer.tsx +39 -8
- package/src/components/card.tsx +10 -2
- package/src/components/chat-container.tsx +4 -1
- package/src/components/chat-scope-picker.tsx +2 -2
- package/src/components/chat-thread.tsx +105 -13
- package/src/components/choice-card.tsx +102 -37
- package/src/components/coachmark.tsx +1 -1
- package/src/components/code-block.tsx +81 -5
- package/src/components/composer.tsx +89 -8
- package/src/components/confirm-card.tsx +20 -4
- package/src/components/conversation-item.tsx +138 -4
- package/src/components/conversation-list.tsx +230 -15
- package/src/components/embed.tsx +4 -0
- package/src/components/empty.tsx +14 -3
- package/src/components/file-tree.tsx +5 -1
- package/src/components/form-widgets.tsx +257 -195
- package/src/components/form.tsx +336 -21
- package/src/components/loader.tsx +12 -5
- package/src/components/message-skills.tsx +1 -1
- package/src/components/message.tsx +142 -12
- package/src/components/prompt-input.tsx +7 -1
- package/src/components/prompt-suggestion.tsx +4 -1
- package/src/components/reasoning.tsx +30 -3
- package/src/components/response-compare.tsx +2 -2
- package/src/components/response-stream.tsx +13 -7
- package/src/components/screen.tsx +5 -0
- package/src/components/scroll-button.tsx +63 -4
- package/src/components/source.tsx +6 -1
- package/src/components/tasks-card.tsx +58 -16
- package/src/components/thread.tsx +10 -1
- package/src/components/toast.tsx +11 -5
- package/src/components/tool-types.ts +9 -0
- package/src/components/voice-input.tsx +35 -3
- package/src/components/voice-output.tsx +46 -6
- package/src/components/workspace-shell.tsx +285 -0
- package/src/diagnostics/hook.ts +352 -0
- package/src/diagnostics/index.ts +82 -0
- package/src/diagnostics/report-request.ts +296 -0
- package/src/elements/attachments.tsx +9 -8
- package/src/elements/audio-visualizer.tsx +48 -4
- package/src/elements/chat-workspace.tsx +159 -287
- package/src/elements/chat.tsx +31 -10
- package/src/elements/checkbox-group.tsx +164 -0
- package/src/elements/checkbox.tsx +134 -0
- package/src/elements/code-block.tsx +19 -1
- package/src/elements/command.tsx +4 -1
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +12 -1
- package/src/elements/conversation-item.tsx +120 -0
- package/src/elements/conversation-list.tsx +60 -11
- package/src/elements/default-input.tsx +5 -5
- package/src/elements/define-entry.ts +12 -0
- package/src/elements/define.tsx +168 -8
- package/src/elements/diagnostic-events.ts +114 -0
- package/src/elements/dialog.tsx +47 -0
- package/src/elements/disclosure.ts +34 -12
- package/src/elements/dock.tsx +215 -0
- package/src/elements/dropdown.tsx +123 -0
- package/src/elements/element-data-types.ts +40 -0
- package/src/elements/element-diagnostics.ts +392 -0
- package/src/elements/element-manifest.json +36 -0
- package/src/elements/element-meta.json +1483 -560
- package/src/elements/element-nonscalar.json +185 -0
- package/src/elements/element-types.d.ts +589 -167
- package/src/elements/feedback-bar.tsx +5 -0
- package/src/elements/icon-names.json +29 -0
- package/src/elements/input.tsx +312 -23
- package/src/elements/menu.tsx +13 -0
- package/src/elements/message.tsx +2 -0
- package/src/elements/pane-grid.tsx +111 -0
- package/src/elements/prompt-dock.tsx +2 -1
- package/src/elements/prompt-input.tsx +16 -10
- package/src/elements/radio-group.tsx +129 -0
- package/src/elements/register-impl.ts +52 -0
- package/src/elements/register.ts +28 -0
- package/src/elements/resizable.tsx +52 -25
- package/src/elements/scroll-button.tsx +59 -6
- package/src/elements/select.tsx +165 -0
- package/src/elements/slider.tsx +171 -0
- package/src/elements/slots.ts +108 -13
- package/src/elements/styles.css +119 -9
- package/src/elements/thinking-bar.tsx +16 -7
- package/src/elements/thread.tsx +2 -0
- package/src/elements/toast.tsx +17 -1
- package/src/elements/tool.tsx +26 -5
- package/src/elements/voice-input.tsx +11 -2
- package/src/elements/voice-output.tsx +16 -3
- package/src/index.ts +4 -1
- package/src/primitives/card-data-types.ts +49 -0
- package/src/primitives/card-host.tsx +4 -2
- package/src/primitives/card-routing.ts +7 -56
- package/src/primitives/card-schemas/form.schema.json +21 -1
- package/src/primitives/card-validate.ts +10 -2
- package/src/primitives/chat-config.tsx +33 -6
- package/src/primitives/field-mask.ts +256 -0
- package/src/primitives/field-semantics.ts +115 -0
- package/src/primitives/input-mask.ts +853 -0
- package/src/primitives/toast-store.ts +66 -4
- package/src/primitives/url-scheme-policy.ts +70 -0
- package/src/primitives/use-resize-observer.ts +33 -0
- package/src/primitives/use-speech-recognition.ts +12 -1
- package/src/primitives/use-stick-to-bottom.ts +34 -2
- package/src/primitives/use-text-stream.ts +33 -2
- package/src/remote/provider-runtime.ts +6 -3
- package/src/schemas/index.ts +1 -0
- package/src/schemas/tool-defs.ts +307 -6
- package/src/solid.ts +15 -0
- package/src/state/index.ts +13 -1
- package/src/state/mock.ts +92 -6
- package/src/state/persistence.ts +180 -0
- package/src/state/stream.ts +71 -4
- package/src/state/threads.ts +142 -0
- package/src/types.ts +4 -2
- package/src/ui/agent-card.tsx +2 -2
- package/src/ui/avatar.tsx +1 -1
- package/src/ui/checkbox-group.tsx +153 -0
- package/src/ui/checkbox.tsx +63 -0
- package/src/ui/dialog.tsx +6 -0
- package/src/ui/dock.tsx +584 -0
- package/src/ui/dropdown.tsx +67 -23
- package/src/ui/hover-card.tsx +156 -6
- package/src/ui/icon.tsx +53 -0
- package/src/ui/input.tsx +275 -16
- package/src/ui/kbd.tsx +1 -1
- package/src/ui/nav.tsx +1 -1
- package/src/ui/pane-group.tsx +2 -2
- package/src/ui/radio.tsx +150 -0
- package/src/ui/resizable.tsx +11 -0
- package/src/ui/select.tsx +168 -0
- package/src/ui/slider.tsx +178 -0
- package/src/ui/switch.tsx +49 -18
- package/src/utils/cn.ts +11 -5
- package/src/wire/chunk.ts +47 -0
- package/src/wire/consume.ts +185 -26
- package/src/wire/diagnostics.ts +727 -0
- package/src/wire/encode-probe.ts +214 -0
- package/src/wire/encode.ts +267 -14
- package/src/wire/formats/anthropic.ts +8 -1
- package/src/wire/formats/openai.ts +5 -0
- package/src/wire/index.ts +22 -0
- package/src/wire/read.ts +250 -6
- package/src/wire/sse.ts +16 -3
- package/theme.css +84 -13
- package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
- package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
- package/dist/elements/chunks/artifact-BSuPYFHY.js +0 -1
- package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
- package/dist/elements/chunks/badge-TIMiJFKc.js +0 -1
- package/dist/elements/chunks/bash-InADTalH.js +0 -1
- package/dist/elements/chunks/card-renderer-CSoTL_e1.js +0 -1
- package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
- package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
- package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
- package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
- package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
- package/dist/elements/chunks/choice-card-CGMc3kek.js +0 -1
- package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
- package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
- package/dist/elements/chunks/circle-x-mhH7pOK2.js +0 -1
- package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
- package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
- package/dist/elements/chunks/composer-CZZmtYOT.js +0 -69
- package/dist/elements/chunks/confirm-card-BWjf2-xo.js +0 -1
- package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
- package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
- package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
- package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
- package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
- package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
- package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
- package/dist/elements/chunks/download-DnCyWFJE.js +0 -1
- package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
- package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
- package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
- package/dist/elements/chunks/file-text-D0J9F6M7.js +0 -1
- package/dist/elements/chunks/folder-NV1pi_ud.js +0 -1
- package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
- package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
- package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
- package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
- package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
- package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
- package/dist/elements/chunks/info-C8r5Q6cc.js +0 -1
- package/dist/elements/chunks/input-DrseEjhp.js +0 -1
- package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
- package/dist/elements/chunks/json-DxJze_jm.js +0 -1
- package/dist/elements/chunks/kbd-OGJDUT-O.js +0 -1
- package/dist/elements/chunks/link-BdsfLB7b.js +0 -1
- package/dist/elements/chunks/loader-B5QzK_8_.js +0 -1
- package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
- package/dist/elements/chunks/message-DtXKPqiR.js +0 -1
- package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
- package/dist/elements/chunks/paperclip-Bg0ITU3b.js +0 -1
- package/dist/elements/chunks/progress-bar-D1_rzt6N.js +0 -1
- package/dist/elements/chunks/prompt-suggestion-D5Sm8xF1.js +0 -1
- package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
- package/dist/elements/chunks/rotate-cw-DzVDJOA1.js +0 -1
- package/dist/elements/chunks/scroll-area-93A1bbeG.js +0 -1
- package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
- package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
- package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
- package/dist/elements/chunks/source-w9V0NnBn.js +0 -1
- package/dist/elements/chunks/star-DHvACxtm.js +0 -1
- package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
- package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
- package/dist/elements/chunks/tasks-card-lPxoodlA.js +0 -1
- package/dist/elements/chunks/text-shimmer-BY_rI3s5.js +0 -1
- package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
- package/dist/elements/chunks/toast-store-VUZZBhzH.js +0 -1
- package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
- package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
- package/dist/elements/chunks/use-card-resolution-DJg32jGH.js +0 -1
- package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
- package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
- package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
- package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
- package/dist/llms/llms-full.txt +0 -2834
- package/dist/llms/llms.txt +0 -156
- package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
- package/dist/register-impl-DGmGzrEM.js +0 -145
- package/dist/ui/stat.d.ts +0 -16
- package/dist/variant-custom-MkTNTycd.js +0 -1
- package/src/primitives/card-validate-generator.testlib.ts +0 -38
- package/src/ui/stat.tsx +0 -41
- /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
- /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
package/dist/elements.d.ts
CHANGED
|
@@ -305,7 +305,7 @@ export interface KaiArtifactElement extends HTMLElement {
|
|
|
305
305
|
export interface KaiAttachmentsElement extends HTMLElement {
|
|
306
306
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
307
307
|
theme?: "light" | "dark" | "auto";
|
|
308
|
-
/** The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array). */
|
|
308
|
+
/** The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews here but the wire encoders (`toOpenAIMessages`/`toAnthropicMessages`) refuse it. */
|
|
309
309
|
items: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
310
310
|
/** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
|
|
311
311
|
variant?: "grid" | "inline" | "list";
|
|
@@ -344,12 +344,14 @@ export interface KaiAudioVisualizerElement extends HTMLElement {
|
|
|
344
344
|
complexity?: number;
|
|
345
345
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
346
346
|
label?: string;
|
|
347
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
347
|
+
/** Live microphone or WebRTC audio to analyze. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
348
348
|
stream?: MediaStream;
|
|
349
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
349
|
+
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
350
350
|
audioElement?: HTMLMediaElement;
|
|
351
|
-
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. */
|
|
351
|
+
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
352
352
|
bands?: number[];
|
|
353
|
+
/** Render live amplitude during the listening state as well, using the same presentation as speaking. Off by default, which keeps LiveKit parity: amplitude from stream, audio-element or bands renders only while state is "speaking". Set it to show a real mic-level picture while the user is the one talking. Boolean. Attribute: `listening-amplitude` (a bare attribute means true; reflected, so the property reads back what the attribute set). */
|
|
354
|
+
listeningAmplitude?: boolean;
|
|
353
355
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
354
356
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
355
357
|
/** Shader variants only: keep animating while scrolled off screen. Off by default, which stops drawing and releases the WebGL context until the element comes back (browsers ration contexts to roughly 16 a page). Does not override `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. */
|
|
@@ -438,7 +440,7 @@ export interface KaiCardsElement extends HTMLElement {
|
|
|
438
440
|
/** JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `types`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.schemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name, matching `mergeCardTags`, where your entry is spread over ours. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `"type"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one. See `CardSchemaMap` in components/card-renderer.tsx. */
|
|
439
441
|
schemas?: Record<string, object>;
|
|
440
442
|
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
441
|
-
policy?: { onSubmit?: (cardId: string, data: unknown) => void; onAction?: (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: (text: string, opts: { mode: "compose" | "send"; context?: unknown; }) => void; onOpen?: (url: string, target: "tab" | "artifact") => void; onState?: (cardId: string, patch: unknown) => void; onDismiss?: (cardId: string) => void; onReopen?: (cardId: string) => void; onError?: (cardId: string, message: string) => void; maxSendPromptMode?: "compose" | "send" };
|
|
443
|
+
policy?: { onSubmit?: ((cardId: string, data: unknown) => void); onAction?: ((cardId: string, action: string, payload?: unknown) => void); onSendPrompt?: ((text: string, opts: { mode: "compose" | "send"; context?: unknown; }) => void); onOpen?: ((url: string, target: "tab" | "artifact") => void); onState?: ((cardId: string, patch: unknown) => void); onDismiss?: ((cardId: string) => void); onReopen?: ((cardId: string) => void); onError?: ((cardId: string, message: string) => void); maxSendPromptMode?: "compose" | "send" };
|
|
442
444
|
/** Validate each envelope's `data` against the schema for its type before rendering it, using a built-in's own schema or yours from `schemas`. Default `true`; set `validate-cards="false"` (or `el.validateCards = false`) to opt out. A hard failure (wrong type, a missing required field) renders a diagnostic naming the field instead of the card; a soft failure (bounds) renders the card unchanged. Both emit a contract `error` event. On in production too: a model emitting a bad shape is a production failure mode, so stripping the check there would hide it from exactly the person who needs to see it. */
|
|
443
445
|
validateCards?: boolean;
|
|
444
446
|
/** 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. */
|
|
@@ -471,8 +473,6 @@ export interface KaiChainOfThoughtElement extends HTMLElement {
|
|
|
471
473
|
export interface KaiChatElement extends HTMLElement {
|
|
472
474
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
473
475
|
theme?: "light" | "dark" | "auto";
|
|
474
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
475
|
-
search?: boolean;
|
|
476
476
|
/** 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. */
|
|
477
477
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
478
478
|
/** Placeholder text shown in the empty input. */
|
|
@@ -491,6 +491,10 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
491
491
|
codeTheme?: string;
|
|
492
492
|
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
493
493
|
codeHighlight?: boolean;
|
|
494
|
+
/** How `reasoning` parts render across the thread. `'full'` (default) is the current collapsible-disclosure behavior; `'compact'` shows only a shimmer loader while a reasoning part streams and nothing once it settles (no expandable detail); `'off'` renders reasoning parts not at all. Forwarded to every `MessageBody` as `reasoningMode`. */
|
|
495
|
+
reasoning?: "full" | "compact" | "off";
|
|
496
|
+
/** Seeds the reasoning disclosure open AND keeps it tracking the stream (open while streaming, closes when it settles): the pre-Task-19f `full` behavior. Default false/absent: the panel starts closed (just the "Thinking" shimmer chip) and only opens on click, the current default (owner ruling, 2026-08-26). Meaningless when `reasoning` is `'compact'` or `'off'`. Forwarded to every `MessageBody` as `reasoningDefaultOpen`. */
|
|
497
|
+
reasoningOpen?: boolean;
|
|
494
498
|
/** Optional header title shown on the left of the header. */
|
|
495
499
|
chatTitle?: string;
|
|
496
500
|
/** Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection. */
|
|
@@ -517,6 +521,10 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
517
521
|
composerActions?: boolean;
|
|
518
522
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
519
523
|
footer?: boolean;
|
|
524
|
+
/** When `false`, hides the built-in paperclip attach button. Defaults to `true` (undeclared keeps today's behavior: attach visible), matching `DefaultPromptInput`'s own default: only an explicit `false` hides it. */
|
|
525
|
+
attach?: boolean;
|
|
526
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
527
|
+
webSearch?: boolean;
|
|
520
528
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
521
529
|
voice?: boolean;
|
|
522
530
|
/** 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. */
|
|
@@ -545,6 +553,48 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
545
553
|
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
546
554
|
}
|
|
547
555
|
|
|
556
|
+
export interface KaiCheckboxElement extends HTMLElement {
|
|
557
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
558
|
+
theme?: "light" | "dark" | "auto";
|
|
559
|
+
/** Controlled checked state. Settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-checkbox checked>`) drives it; ticking the box updates it and fires `kai-change`. Read `el.checked` for live state. */
|
|
560
|
+
checked?: boolean;
|
|
561
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on. */
|
|
562
|
+
defaultChecked?: boolean;
|
|
563
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`. */
|
|
564
|
+
indeterminate?: boolean;
|
|
565
|
+
/** Disable interaction. */
|
|
566
|
+
disabled?: boolean;
|
|
567
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's. */
|
|
568
|
+
required?: boolean;
|
|
569
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
570
|
+
label?: string;
|
|
571
|
+
/** Form-control name (paired with `value`). */
|
|
572
|
+
name?: string;
|
|
573
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
574
|
+
value?: string;
|
|
575
|
+
/** Flip the box and fire `kai-change` (no-op while disabled). */
|
|
576
|
+
toggle(): void;
|
|
577
|
+
/** Focus the inner input (the host element can't reach it). */
|
|
578
|
+
focus(options?: FocusOptions): void;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export interface KaiCheckboxGroupElement extends HTMLElement {
|
|
582
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
583
|
+
theme?: "light" | "dark" | "auto";
|
|
584
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
585
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
586
|
+
/** The FIRST selected value. Settable and reflected to the `value` attribute, so `:host([value])` and `el.value` see live state, and a seed can be written in markup. Writing it makes that the whole selection; to read or drive the rest, use `el.values`. */
|
|
587
|
+
value?: string;
|
|
588
|
+
/** The shared form-control name every box carries, so `FormData.getAll(name)` reads the whole selection back under one key. NO DEFAULT, unlike `<kai-radio-group>`. A radio set needs a shared `name` for the browser to make it exclusive and arrow-navigable, so one is generated when none is given; checkboxes are independent controls and behave correctly with no name at all. Generating one here would submit the selection under a random key, which is worse than submitting nothing. The element is NOT form-associated (no `ElementInternals`, no `setFormValue()`), the same known gap `<kai-input>` records: the boxes live in a shadow root, so a surrounding `<form>` collects nothing from them whether or not `name` is set. Read `el.values`. The name still lands on every inner input, so it is right the day form association arrives. */
|
|
589
|
+
name?: string;
|
|
590
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
591
|
+
disabled?: boolean;
|
|
592
|
+
/** Accessible name for the group. */
|
|
593
|
+
label?: string;
|
|
594
|
+
/** Focus the group's first box. Not "the first ticked one", which is `<kai-radio-group>`'s rule: a radio group is ONE tab stop that lands on the selection, while every checkbox here is its own tab stop, so the entry point is simply the top of the list. */
|
|
595
|
+
focus(options?: FocusOptions): void;
|
|
596
|
+
}
|
|
597
|
+
|
|
548
598
|
export interface KaiCheckpointElement extends HTMLElement {
|
|
549
599
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
550
600
|
theme?: "light" | "dark" | "auto";
|
|
@@ -623,6 +673,8 @@ export interface KaiCodeBlockElement extends HTMLElement {
|
|
|
623
673
|
codeTheme?: string;
|
|
624
674
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
625
675
|
codeHighlight?: boolean;
|
|
676
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
677
|
+
copy?: boolean;
|
|
626
678
|
/** Code text sizing. */
|
|
627
679
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
628
680
|
}
|
|
@@ -734,19 +786,32 @@ export interface KaiContextElement extends HTMLElement {
|
|
|
734
786
|
dangerThreshold?: number;
|
|
735
787
|
}
|
|
736
788
|
|
|
789
|
+
export interface KaiConversationItemElement extends HTMLElement {
|
|
790
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
791
|
+
theme?: "light" | "dark" | "auto";
|
|
792
|
+
/** The row's identity: the `conversation-id` attribute (host `id` is the fallback). Inside `<kai-conversations>` it is handed to the container's selection contract (`kai-conversation-select`); standalone it is the `id` in this element's own `kai-select` detail. */
|
|
793
|
+
conversationId?: string;
|
|
794
|
+
/** Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; inside a container the container drives it from its `activeId`, standalone you set it yourself. */
|
|
795
|
+
active?: boolean;
|
|
796
|
+
/** Dense single-line row padding. */
|
|
797
|
+
compact?: boolean;
|
|
798
|
+
}
|
|
799
|
+
|
|
737
800
|
export interface KaiConversationsElement extends HTMLElement {
|
|
738
801
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
739
802
|
theme?: "light" | "dark" | "auto";
|
|
740
803
|
/** The list's section headers (`{ id, name, sortOrder, createdAt }`), rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped list. Set as a JS property. */
|
|
741
804
|
groups: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
742
|
-
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. */
|
|
743
|
-
conversations: { id: string; title: string; groupId?: string; scope
|
|
805
|
+
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. A search query that matches nothing shows a visible "No conversations match your search" state, distinct from the zero-conversations empty state. Slotted `<kai-conversation-item>` children switch the list into item mode instead: your own rows win and this array is not rendered. */
|
|
806
|
+
conversations: { id: string; title: string; groupId?: string; scope?: { type: "document" | "collection"; documentId?: string; filters?: { tags?: string[]; authors?: string[]; contentType?: "transcript" | "markdown"; dateRange?: { from: string; to: string } } }; messageCount: number; lastMessageAt?: string; updatedAt: string; trailing?: string }[];
|
|
744
807
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
745
808
|
activeId?: string;
|
|
746
809
|
/** 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. */
|
|
747
810
|
collapsed?: boolean;
|
|
748
811
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
749
812
|
defaultCollapsed?: boolean;
|
|
813
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
814
|
+
compact?: boolean;
|
|
750
815
|
/** Focus the built-in search input inside the shadow root. */
|
|
751
816
|
focus(options?: FocusOptions): void;
|
|
752
817
|
/** Clear the internal search query (resets the list filter) and fire kai-search with an empty string. */
|
|
@@ -768,6 +833,8 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
768
833
|
open?: boolean;
|
|
769
834
|
/** Initial open state on mount (uncontrolled seed). */
|
|
770
835
|
defaultOpen?: boolean;
|
|
836
|
+
/** Accessible name for the modal, used when no `header` slot is projected: `<kai-dialog label="Delete workspace">`. A projected `header` WINS over this (it becomes `aria-labelledby`), because ARIA resolves `aria-labelledby` ahead of `aria-label` and the visible heading is the name both a sighted and a screen-reader user can be talked through. Defaults to `Dialog` so a modal is never nameless. */
|
|
837
|
+
label?: string;
|
|
771
838
|
/** Open it programmatically (no-op while disabled). */
|
|
772
839
|
show(): void;
|
|
773
840
|
/** Close it programmatically. */
|
|
@@ -778,6 +845,66 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
778
845
|
focus(options?: FocusOptions): void;
|
|
779
846
|
}
|
|
780
847
|
|
|
848
|
+
export interface KaiDockElement extends HTMLElement {
|
|
849
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
850
|
+
theme?: "light" | "dark" | "auto";
|
|
851
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on the launcher and Escape). Set `el.open = true`, or `<kai-dock open>`; listen for `kai-open-change`. */
|
|
852
|
+
open?: boolean;
|
|
853
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
854
|
+
defaultOpen?: boolean;
|
|
855
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
856
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
857
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
858
|
+
label?: string;
|
|
859
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
860
|
+
openLabel?: string;
|
|
861
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
862
|
+
closeLabel?: string;
|
|
863
|
+
/** Show the unread dot. YOURS: it renders only while closed, and the dock never writes it back. Clear it in your `kai-open-change` handler. */
|
|
864
|
+
unread?: boolean;
|
|
865
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
866
|
+
disabled?: boolean;
|
|
867
|
+
/** Suppress the dock's own built-in mobile close X. Set this when your slotted panel content supplies its own close affordance (e.g. a `<kai-chat slot="header-end">` close button), otherwise the two stack. TRADEOFF: the mobile panel reserves a padding band above its content so the built-in X never paints over slotted content; that band stays reserved unless you set this true, so only set it once your own control is actually in place. Attribute: `hide-close`. */
|
|
868
|
+
hideClose?: boolean;
|
|
869
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
870
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
871
|
+
/** Open it programmatically (no-op while disabled). */
|
|
872
|
+
show(): void;
|
|
873
|
+
/** Close it programmatically. */
|
|
874
|
+
hide(): void;
|
|
875
|
+
/** Flip the open state (closes while disabled). */
|
|
876
|
+
toggle(): void;
|
|
877
|
+
/** Move focus to the panel while open, or to the launcher while closed. */
|
|
878
|
+
focus(options?: FocusOptions): void;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
export interface KaiDropdownElement extends HTMLElement {
|
|
882
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
883
|
+
theme?: "light" | "dark" | "auto";
|
|
884
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
885
|
+
triggerIcon?: string;
|
|
886
|
+
/** Built-in trigger: a text label. This is the trigger's VISIBLE text, so it is also its accessible name, and `label` does not override it: an accessible name that does not contain the visible text is unreachable by speech input (WCAG 2.5.3, Label in Name). Same rule `kai-menu` follows. */
|
|
887
|
+
triggerLabel?: string;
|
|
888
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
889
|
+
triggerIconTrailing?: string;
|
|
890
|
+
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, which is VISUAL content with the name supplied separately: the same two-slot distinction `kai-menu` documents. */
|
|
891
|
+
label?: string;
|
|
892
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
893
|
+
full?: boolean;
|
|
894
|
+
/** 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-dropdown open>`; listen for `kai-open-change`. */
|
|
895
|
+
open?: boolean;
|
|
896
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
897
|
+
defaultOpen?: boolean;
|
|
898
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
899
|
+
disabled?: boolean;
|
|
900
|
+
/** Open it programmatically (no-op while disabled). */
|
|
901
|
+
show(): void;
|
|
902
|
+
/** Close it programmatically. */
|
|
903
|
+
hide(): void;
|
|
904
|
+
/** Flip the open state (closes while disabled). */
|
|
905
|
+
toggle(): void;
|
|
906
|
+
}
|
|
907
|
+
|
|
781
908
|
export interface KaiEditableLabelElement extends HTMLElement {
|
|
782
909
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
783
910
|
theme?: "light" | "dark" | "auto";
|
|
@@ -864,7 +991,7 @@ export interface KaiFormElement extends HTMLElement {
|
|
|
864
991
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
865
992
|
theme?: "light" | "dark" | "auto";
|
|
866
993
|
/** 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 (`FormField.properties` is another `FormField` map), and the generated `element-types.d.ts` inlines every named type, so the shipped declaration bottoms out in a `Record<string, unknown>` placeholder one level down rather than carrying the recursion. That is why `FormDefinition` is a `type` alias: an interface gets no implicit index signature, so it would not be assignable to that placeholder. */
|
|
867
|
-
data?: { type: "object"; title?: string; description?: string; required?: string[]; properties: Record<string, { type: "string" | "number" | "integer" | "boolean" | "array" | "object"; title?: string; description?: string; default?: unknown; enum?: unknown[]; format?: "email" | "uri" | "url" | "date" | "date-time" | "time"; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; minItems?: number; maxItems?: number; items?: Record<string, unknown> | { enum: unknown[] }; properties?: Record<string, Record<string, unknown>>; required?: string[]; readOnly?: boolean; "x-kai-widget"?: "textarea" | "slider" | "rating" | "radio" | "select" | "checkbox" | "password" | "switch"; "x-kai-placeholder"?: string; "x-kai-step"?: number }>; "x-kai-order"?: string[]; "x-kai-inlineMax"?: number; "x-kai-submitLabel"?: string; "x-kai-dismissible"?: boolean; "x-kai-actions"?: { id: string; label: string; variant?: "default" | "ghost" | "outline" }[] };
|
|
994
|
+
data?: { type: "object"; title?: string; description?: string; required?: string[]; properties: Record<string, { type: "string" | "number" | "integer" | "boolean" | "array" | "object"; title?: string; description?: string; default?: unknown; enum?: unknown[]; format?: "email" | "uri" | "url" | "date" | "date-time" | "time"; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; minItems?: number; maxItems?: number; items?: Record<string, unknown> | { enum: unknown[] }; properties?: Record<string, Record<string, unknown>>; required?: string[]; readOnly?: boolean; "x-kai-widget"?: "textarea" | "slider" | "rating" | "radio" | "select" | "checkbox" | "password" | "switch"; "x-kai-placeholder"?: string; "x-kai-step"?: number; "x-kai-format"?: "tel" | "ssn" | "credit-card" | "custom"; "x-kai-mask"?: string; "x-kai-mask-guide"?: string }>; "x-kai-order"?: string[]; "x-kai-inlineMax"?: number; "x-kai-submitLabel"?: string; "x-kai-dismissible"?: boolean; "x-kai-actions"?: { id: string; label: string; variant?: "default" | "ghost" | "outline" }[] };
|
|
868
995
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
869
996
|
cardId?: string;
|
|
870
997
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -941,7 +1068,7 @@ export interface KaiInputElement extends HTMLElement {
|
|
|
941
1068
|
theme?: "light" | "dark" | "auto";
|
|
942
1069
|
/** Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only. */
|
|
943
1070
|
type?: string;
|
|
944
|
-
/** Controlled value
|
|
1071
|
+
/** Controlled value, and always the CANONICAL one when a mask is active: digits for `tel` / `ssn` / `credit-card`, the formatted text for `custom`. Settable and reflected to the `value` attribute. `el.value = '5551234567'` drives it (no event) and is re-fitted to the mask on the way in, so the field shows `555-123-4567`. Read `el.value` for live state; the formatted text rides along on every `kai-input` / `kai-change` detail as `formattedValue`. */
|
|
945
1072
|
value?: string;
|
|
946
1073
|
/** Placeholder shown when empty. */
|
|
947
1074
|
placeholder?: string;
|
|
@@ -967,11 +1094,25 @@ export interface KaiInputElement extends HTMLElement {
|
|
|
967
1094
|
autocomplete?: string;
|
|
968
1095
|
/** Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`). */
|
|
969
1096
|
inputmode?: string;
|
|
1097
|
+
/** Mask pattern: `#` a digit, `@` a letter or digit, `*` an obscurable letter or digit, and every other character a positional literal (`@@@-####` → `CHG-4821`). The literal `default` is the opt-in sentinel: it resolves to the default format of `semantic` (`tel` → `###-###-####`). A bare `semantic` never starts masking on its own, so an opt-in token is what turns tier 2 on. */
|
|
1098
|
+
format?: string;
|
|
1099
|
+
/** Placeholder guide shown at unfilled positions, aligned position for position with `format`: `mm/dd/yyyy` against `##/##/####`. Spaces are a valid guide character, so a guide of blanks and separators is how a phone field shows its shape without showing letters. Without a guide the field shows only up to the last typed character. A guide is a visual aid, never an accessible name: keep the `hint` text as well. */
|
|
1100
|
+
guide?: string;
|
|
1101
|
+
/** Semantic field type: `tel` · `ssn` · `credit-card` · `custom`. On its own it sets `inputmode` / `autocomplete` / `spellcheck` / `autocorrect` / `autocapitalize` and decides the canonical value; it never starts masking by itself. */
|
|
1102
|
+
semantic?: "credit-card" | "custom" | "ssn" | "tel";
|
|
1103
|
+
/** Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`. */
|
|
1104
|
+
caseMode?: "preserve" | "upper" | "lower";
|
|
1105
|
+
/** What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`. */
|
|
1106
|
+
copyPolicy?: "formatted" | "canonical" | "obscured" | "blocked";
|
|
970
1107
|
/** Focus the inner input (the host can't reach into the shadow root). */
|
|
971
1108
|
focus(options?: FocusOptions): void;
|
|
972
1109
|
/** Select the inner input's text. */
|
|
973
1110
|
select(): void;
|
|
974
|
-
/**
|
|
1111
|
+
/** The canonical value: digits for `tel` / `ssn` / `credit-card`, the formatted text for `custom`, and the field text when no mask is on. Identical to reading `el.value`, under the name backends use for the submitted form of a masked field. The mask engine has a third, narrower notion of raw (the fill characters with no literals at all) and that one is internal: it is not what any backend wants and it is not exposed here. */
|
|
1112
|
+
getRawValue(): string;
|
|
1113
|
+
/** The text on screen, literals and guide included. The counterpart to `formattedValue` on the `kai-input` / `kai-change` details, for a consumer that needs it outside an event. */
|
|
1114
|
+
getFormattedValue(): string;
|
|
1115
|
+
/** Empty the value and fire `kai-change` with `''`. On a masked field this resets the mask itself, not just the text on screen, so the next character starts over. */
|
|
975
1116
|
clear(): void;
|
|
976
1117
|
}
|
|
977
1118
|
|
|
@@ -1034,6 +1175,8 @@ export interface KaiMenuElement extends HTMLElement {
|
|
|
1034
1175
|
triggerIconTrailing?: string;
|
|
1035
1176
|
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, and that is a difference in what the two slots MEAN, not a limitation. `<kai-button>`'s slot IS the button's label, so text slotted there is the name and `label` steps aside. This slot is VISUAL content, a `+` or an `<svg>`, with the name supplied separately: decoration beside a name, never a second name competing with one. So `label` names the trigger here by design. Slotting a real WORD rather than a glyph makes that word a visible label, and an accessible name has to contain the visible text. Then either drop `label` or make it contain the word you slotted. */
|
|
1036
1177
|
label?: string;
|
|
1178
|
+
/** Stretch the trigger to the full width of the menu's container (a block row), e.g. a sidebar-footer account row. Same affordance as `<kai-button full>`. Attribute: `full`. */
|
|
1179
|
+
full?: boolean;
|
|
1037
1180
|
/** 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`. */
|
|
1038
1181
|
open?: boolean;
|
|
1039
1182
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -1145,6 +1288,21 @@ export interface KaiPaneElement extends HTMLElement {
|
|
|
1145
1288
|
status?: { tone: "working" | "idle" | "done" | "error" | "blocked"; label?: string; pulse?: boolean };
|
|
1146
1289
|
}
|
|
1147
1290
|
|
|
1291
|
+
export interface KaiPaneGridElement extends HTMLElement {
|
|
1292
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1293
|
+
theme?: "light" | "dark" | "auto";
|
|
1294
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`. */
|
|
1295
|
+
minPaneWidth?: number;
|
|
1296
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`. */
|
|
1297
|
+
minPaneHeight?: number;
|
|
1298
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
1299
|
+
maxColumns?: number;
|
|
1300
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
1301
|
+
gap?: string;
|
|
1302
|
+
/** When set to a valid child index, render ONLY that pane full-bleed: a simple maximize hook the consumer drives (pair it with `<kai-pane>`'s `kai-maximize` event). Clear it (or point out of range) for the full tiled grid. Attribute: `maximized-index`. */
|
|
1303
|
+
maximizedIndex?: number | null;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1148
1306
|
export interface KaiPaneGroupElement extends HTMLElement {
|
|
1149
1307
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1150
1308
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1218,8 +1376,8 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1218
1376
|
suggestions?: string[];
|
|
1219
1377
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1220
1378
|
suggestionMode?: "submit" | "fill";
|
|
1221
|
-
/** Show a
|
|
1222
|
-
|
|
1379
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1380
|
+
webSearch?: boolean;
|
|
1223
1381
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1224
1382
|
voice?: boolean;
|
|
1225
1383
|
/** 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`. */
|
|
@@ -1228,7 +1386,7 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1228
1386
|
submit?: "always" | "auto";
|
|
1229
1387
|
/** 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`. */
|
|
1230
1388
|
attach?: boolean;
|
|
1231
|
-
/** 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). */
|
|
1389
|
+
/** 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). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews perfectly and is meaningless outside this tab, so `toOpenAIMessages`/`toAnthropicMessages` refuse it. (The built-in paperclip already stages files as `data:` URIs.) */
|
|
1232
1390
|
attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
1233
1391
|
/** 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. */
|
|
1234
1392
|
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
@@ -1244,6 +1402,23 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1244
1402
|
send(): void;
|
|
1245
1403
|
}
|
|
1246
1404
|
|
|
1405
|
+
export interface KaiRadioGroupElement extends HTMLElement {
|
|
1406
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1407
|
+
theme?: "light" | "dark" | "auto";
|
|
1408
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
1409
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
1410
|
+
/** Controlled selected `value`. Settable and reflected to the `value` attribute. `el.value = 'degraded'` drives it; choosing a row updates it and fires `kai-change`. Read `el.value` for live state. */
|
|
1411
|
+
value?: string;
|
|
1412
|
+
/** Shared form-control name for every radio in the group. Defaults to a generated id, so the group is exclusive and keyboard-navigable even when nothing is submitted. */
|
|
1413
|
+
name?: string;
|
|
1414
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
1415
|
+
disabled?: boolean;
|
|
1416
|
+
/** Accessible name for the group. */
|
|
1417
|
+
label?: string;
|
|
1418
|
+
/** Focus the group's tab stop. That is the selected radio, or the first row when nothing is selected yet. */
|
|
1419
|
+
focus(options?: FocusOptions): void;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1247
1422
|
export interface KaiReasoningElement extends HTMLElement {
|
|
1248
1423
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1249
1424
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1389,6 +1564,10 @@ export interface KaiScrollButtonElement extends HTMLElement {
|
|
|
1389
1564
|
variant?: "outline" | "ghost" | "default";
|
|
1390
1565
|
/** Button size token. Defaults to `'icon'` (square). */
|
|
1391
1566
|
size?: "sm" | "md" | "lg" | "icon" | "icon-sm";
|
|
1567
|
+
/** The button's accessible name. It is announced whether or not the label is visible, so the text is always localisable. Defaults to `'Scroll to bottom'`. */
|
|
1568
|
+
label?: string;
|
|
1569
|
+
/** Also render `label` visibly beside the icon. Defaults to `false`, which is the icon-only button. When the text is visible it IS the accessible name, so nothing gets announced twice. */
|
|
1570
|
+
showLabel?: boolean;
|
|
1392
1571
|
}
|
|
1393
1572
|
|
|
1394
1573
|
export interface KaiSearchElement extends HTMLElement {
|
|
@@ -1423,6 +1602,31 @@ export interface KaiSegmentedElement extends HTMLElement {
|
|
|
1423
1602
|
size?: "sm" | "md";
|
|
1424
1603
|
}
|
|
1425
1604
|
|
|
1605
|
+
export interface KaiSelectElement extends HTMLElement {
|
|
1606
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1607
|
+
theme?: "light" | "dark" | "auto";
|
|
1608
|
+
/** The choices, in display order. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
1609
|
+
options: { value: string; label?: undefined | string; disabled?: undefined | boolean }[];
|
|
1610
|
+
/** Controlled selected value. Settable and reflected to the `value` attribute. `el.value = 'high'` drives it; choosing an option updates it and fires `kai-change`. Read `el.value` for live state; for a `multiple` select read `el.values` instead. */
|
|
1611
|
+
value?: string;
|
|
1612
|
+
/** Text for a leading, disabled, empty option: the "nothing chosen yet" row. Omitted means no such row at all; there is no default wording, because inventing one would put words in your UI. */
|
|
1613
|
+
placeholder?: string;
|
|
1614
|
+
/** Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn. */
|
|
1615
|
+
multiple?: boolean;
|
|
1616
|
+
/** Force the invalid (destructive-border) state. */
|
|
1617
|
+
invalid?: boolean;
|
|
1618
|
+
/** Disable interaction. */
|
|
1619
|
+
disabled?: boolean;
|
|
1620
|
+
/** Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's. */
|
|
1621
|
+
required?: boolean;
|
|
1622
|
+
/** Accessible label for the control. */
|
|
1623
|
+
label?: string;
|
|
1624
|
+
/** Form-control name, for a native form submit. */
|
|
1625
|
+
name?: string;
|
|
1626
|
+
/** Focus the inner select (the host element can't reach it). */
|
|
1627
|
+
focus(options?: FocusOptions): void;
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1426
1630
|
export interface KaiSeparatorElement extends HTMLElement {
|
|
1427
1631
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1428
1632
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1468,6 +1672,29 @@ export interface KaiSkillsElement extends HTMLElement {
|
|
|
1468
1672
|
skills: { id: string; name: string }[];
|
|
1469
1673
|
}
|
|
1470
1674
|
|
|
1675
|
+
export interface KaiSliderElement extends HTMLElement {
|
|
1676
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1677
|
+
theme?: "light" | "dark" | "auto";
|
|
1678
|
+
/** Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means. */
|
|
1679
|
+
min?: number;
|
|
1680
|
+
/** Highest selectable value. Required, for the same reason as `min`. */
|
|
1681
|
+
max?: number;
|
|
1682
|
+
/** Granularity. Omitted means the native default of 1; `any` means continuous. */
|
|
1683
|
+
step?: number | "any";
|
|
1684
|
+
/** Controlled value. Settable and reflected to the `value` attribute. `el.value = 40` drives it; dragging updates it and fires `kai-input` per step, `kai-change` on release. Read `el.value` for live state. */
|
|
1685
|
+
value?: number;
|
|
1686
|
+
/** Disable interaction. */
|
|
1687
|
+
disabled?: boolean;
|
|
1688
|
+
/** Accessible label for the slider. */
|
|
1689
|
+
label?: string;
|
|
1690
|
+
/** Form-control name, for a native form submit. */
|
|
1691
|
+
name?: string;
|
|
1692
|
+
/** Show the current value beside the track. Off by default. Two ways in, because one of them is not a scalar. As a bare ATTRIBUTE (`<kai-slider value-label>`) it renders the raw number. As a JS PROPERTY it also accepts a formatter function (`el.valueLabel = (v) => v + '%'`), for a slider that is not counting bare numbers. A function cannot survive an attribute, so that half is property-only. The readout is hidden from assistive tech: the slider already reports the same number, and an exposed copy would be announced twice. */
|
|
1693
|
+
valueLabel?: boolean | ((value: number) => string);
|
|
1694
|
+
/** Focus the inner range input (the host element can't reach it). */
|
|
1695
|
+
focus(options?: FocusOptions): void;
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1471
1698
|
export interface KaiSourceElement extends HTMLElement {
|
|
1472
1699
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1473
1700
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1653,7 +1880,7 @@ export interface KaiThreadElement extends HTMLElement {
|
|
|
1653
1880
|
export interface KaiToastRegionElement extends HTMLElement {
|
|
1654
1881
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1655
1882
|
theme?: "light" | "dark" | "auto";
|
|
1656
|
-
/** The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts. */
|
|
1883
|
+
/** The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts. Note the handover: the first `toast()` call ADOPTS a region you placed in markup (no second region mounts) and binds the imperative store to this property, replacing any array you set. Drive a region as data OR via `toast()`, not both at once. */
|
|
1657
1884
|
toasts: { id: string; message: string; variant?: "neutral" | "success" | "warning" | "error" | "info"; appearance?: "pill" | "card"; inverse?: boolean; description?: string; action?: { label: string; onAction: () => void | false }; duration?: number; dismissible?: boolean; target?: HTMLElement }[];
|
|
1658
1885
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
1659
1886
|
position?: "top-center" | "top-right" | "top-left" | "bottom-center" | "bottom-right" | "bottom-left";
|
|
@@ -1754,67 +1981,26 @@ export interface KaiVoiceOutputElement extends HTMLElement {
|
|
|
1754
1981
|
export interface KaiWorkspaceElement extends HTMLElement {
|
|
1755
1982
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1756
1983
|
theme?: "light" | "dark" | "auto";
|
|
1757
|
-
/**
|
|
1758
|
-
|
|
1759
|
-
/**
|
|
1760
|
-
|
|
1761
|
-
/**
|
|
1762
|
-
|
|
1763
|
-
/**
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
placeholder?: string;
|
|
1767
|
-
loading?: boolean;
|
|
1768
|
-
suggestions?: string[];
|
|
1769
|
-
suggestionMode?: "submit" | "fill";
|
|
1770
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1771
|
-
codeTheme?: string;
|
|
1772
|
-
codeHighlight?: boolean;
|
|
1773
|
-
chatTitle?: string;
|
|
1774
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1775
|
-
currentModel?: string;
|
|
1776
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1777
|
-
scrollButton?: boolean;
|
|
1778
|
-
search?: boolean;
|
|
1779
|
-
voice?: boolean;
|
|
1780
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1781
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1782
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1783
|
-
kindIcons?: Record<string, string>;
|
|
1784
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1785
|
-
sidebarWidth?: number;
|
|
1786
|
-
/** Sidebar min width in px (default 240). */
|
|
1787
|
-
sidebarMinWidth?: number;
|
|
1788
|
-
/** Sidebar max width in px (default 420). */
|
|
1789
|
-
sidebarMaxWidth?: number;
|
|
1790
|
-
/** 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). */
|
|
1791
|
-
sidebarCollapsed?: boolean;
|
|
1792
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1793
|
-
defaultSidebarCollapsed?: boolean;
|
|
1794
|
-
/** 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`. */
|
|
1984
|
+
/** Controlled collapsed state of the start aside. Set this as a JS property (`el.startCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
1985
|
+
startCollapsed?: boolean;
|
|
1986
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
1987
|
+
defaultStartCollapsed?: boolean;
|
|
1988
|
+
/** Controlled collapsed state of the end aside. Set this as a JS property (`el.endCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
1989
|
+
endCollapsed?: boolean;
|
|
1990
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
1991
|
+
defaultEndCollapsed?: boolean;
|
|
1992
|
+
/** Auto-collapse both asides when the shell's own width drops below this many px, and re-expand when it grows back above. Applies to uncontrolled asides only (it never fights an app-driven collapsed prop); omit to disable. Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
|
|
1795
1993
|
collapseBelow?: number;
|
|
1796
|
-
/**
|
|
1994
|
+
/** Below this shell width in px, an expanded aside renders as an overlay drawer over the main region instead of a column beside it. Escape inside the drawer closes it and returns focus to the element focused before it opened. Omit to disable. Attribute: `drawer-below`. */
|
|
1995
|
+
drawerBelow?: number;
|
|
1996
|
+
/** Density hint. Reflected as a `data-compact` hook on the root (and as the `compact` attribute on the element) for your CSS and slotted content; the shell itself keeps no other opinion about density. */
|
|
1797
1997
|
compact?: boolean;
|
|
1798
|
-
/**
|
|
1799
|
-
|
|
1800
|
-
/**
|
|
1801
|
-
|
|
1802
|
-
/**
|
|
1803
|
-
|
|
1804
|
-
/** Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`. */
|
|
1805
|
-
toggleSidebar(): void;
|
|
1806
|
-
/** Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`). */
|
|
1807
|
-
collapseSidebar(): void;
|
|
1808
|
-
/** Force the conversation sidebar expanded (fires `kai-sidebar-toggle`). */
|
|
1809
|
-
expandSidebar(): void;
|
|
1810
|
-
/** Focus the thread's composer. */
|
|
1811
|
-
focus(options?: FocusOptions): void;
|
|
1812
|
-
/** Clear the thread draft + staged attachments. */
|
|
1813
|
-
clear(): void;
|
|
1814
|
-
/** Submit the current thread draft programmatically (fires `kai-submit`). */
|
|
1815
|
-
send(): void;
|
|
1816
|
-
/** Scroll the thread to the newest message. */
|
|
1817
|
-
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
1998
|
+
/** Collapse/expand one aside (fires `kai-aside-toggle`). */
|
|
1999
|
+
toggleAside(side: "start" | "end"): void;
|
|
2000
|
+
/** Force one aside collapsed (fires `kai-aside-toggle`). */
|
|
2001
|
+
collapseAside(side: "start" | "end"): void;
|
|
2002
|
+
/** Force one aside expanded (fires `kai-aside-toggle`). */
|
|
2003
|
+
expandAside(side: "start" | "end"): void;
|
|
1818
2004
|
}
|
|
1819
2005
|
|
|
1820
2006
|
declare global {
|
|
@@ -1830,6 +2016,8 @@ declare global {
|
|
|
1830
2016
|
'kai-cards': KaiCardsElement;
|
|
1831
2017
|
'kai-chain-of-thought': KaiChainOfThoughtElement;
|
|
1832
2018
|
'kai-chat': KaiChatElement;
|
|
2019
|
+
'kai-checkbox': KaiCheckboxElement;
|
|
2020
|
+
'kai-checkbox-group': KaiCheckboxGroupElement;
|
|
1833
2021
|
'kai-checkpoint': KaiCheckpointElement;
|
|
1834
2022
|
'kai-choice': KaiChoiceElement;
|
|
1835
2023
|
'kai-coachmark': KaiCoachmarkElement;
|
|
@@ -1839,8 +2027,11 @@ declare global {
|
|
|
1839
2027
|
'kai-composer': KaiComposerElement;
|
|
1840
2028
|
'kai-confirm': KaiConfirmElement;
|
|
1841
2029
|
'kai-context': KaiContextElement;
|
|
2030
|
+
'kai-conversation-item': KaiConversationItemElement;
|
|
1842
2031
|
'kai-conversations': KaiConversationsElement;
|
|
1843
2032
|
'kai-dialog': KaiDialogElement;
|
|
2033
|
+
'kai-dock': KaiDockElement;
|
|
2034
|
+
'kai-dropdown': KaiDropdownElement;
|
|
1844
2035
|
'kai-editable-label': KaiEditableLabelElement;
|
|
1845
2036
|
'kai-embed': KaiEmbedElement;
|
|
1846
2037
|
'kai-empty': KaiEmptyElement;
|
|
@@ -1862,11 +2053,13 @@ declare global {
|
|
|
1862
2053
|
'kai-nav': KaiNavElement;
|
|
1863
2054
|
'kai-notice': KaiNoticeElement;
|
|
1864
2055
|
'kai-pane': KaiPaneElement;
|
|
2056
|
+
'kai-pane-grid': KaiPaneGridElement;
|
|
1865
2057
|
'kai-pane-group': KaiPaneGroupElement;
|
|
1866
2058
|
'kai-popover': KaiPopoverElement;
|
|
1867
2059
|
'kai-progress-bar': KaiProgressBarElement;
|
|
1868
2060
|
'kai-prompt-dock': KaiPromptDockElement;
|
|
1869
2061
|
'kai-prompt-input': KaiPromptInputElement;
|
|
2062
|
+
'kai-radio-group': KaiRadioGroupElement;
|
|
1870
2063
|
'kai-reasoning': KaiReasoningElement;
|
|
1871
2064
|
'kai-remote': KaiRemoteElement;
|
|
1872
2065
|
'kai-resizable': KaiResizableElement;
|
|
@@ -1878,11 +2071,13 @@ declare global {
|
|
|
1878
2071
|
'kai-scroll-button': KaiScrollButtonElement;
|
|
1879
2072
|
'kai-search': KaiSearchElement;
|
|
1880
2073
|
'kai-segmented': KaiSegmentedElement;
|
|
2074
|
+
'kai-select': KaiSelectElement;
|
|
1881
2075
|
'kai-separator': KaiSeparatorElement;
|
|
1882
2076
|
'kai-setting-item': KaiSettingItemElement;
|
|
1883
2077
|
'kai-settings-group': KaiSettingsGroupElement;
|
|
1884
2078
|
'kai-skeleton': KaiSkeletonElement;
|
|
1885
2079
|
'kai-skills': KaiSkillsElement;
|
|
2080
|
+
'kai-slider': KaiSliderElement;
|
|
1886
2081
|
'kai-source': KaiSourceElement;
|
|
1887
2082
|
'kai-sources': KaiSourcesElement;
|
|
1888
2083
|
'kai-status': KaiStatusElement;
|
|
@@ -1928,6 +2123,8 @@ declare module 'react' {
|
|
|
1928
2123
|
'kai-cards': KaiElementJsxProps;
|
|
1929
2124
|
'kai-chain-of-thought': KaiElementJsxProps;
|
|
1930
2125
|
'kai-chat': KaiElementJsxProps;
|
|
2126
|
+
'kai-checkbox': KaiElementJsxProps;
|
|
2127
|
+
'kai-checkbox-group': KaiElementJsxProps;
|
|
1931
2128
|
'kai-checkpoint': KaiElementJsxProps;
|
|
1932
2129
|
'kai-choice': KaiElementJsxProps;
|
|
1933
2130
|
'kai-coachmark': KaiElementJsxProps;
|
|
@@ -1937,8 +2134,11 @@ declare module 'react' {
|
|
|
1937
2134
|
'kai-composer': KaiElementJsxProps;
|
|
1938
2135
|
'kai-confirm': KaiElementJsxProps;
|
|
1939
2136
|
'kai-context': KaiElementJsxProps;
|
|
2137
|
+
'kai-conversation-item': KaiElementJsxProps;
|
|
1940
2138
|
'kai-conversations': KaiElementJsxProps;
|
|
1941
2139
|
'kai-dialog': KaiElementJsxProps;
|
|
2140
|
+
'kai-dock': KaiElementJsxProps;
|
|
2141
|
+
'kai-dropdown': KaiElementJsxProps;
|
|
1942
2142
|
'kai-editable-label': KaiElementJsxProps;
|
|
1943
2143
|
'kai-embed': KaiElementJsxProps;
|
|
1944
2144
|
'kai-empty': KaiElementJsxProps;
|
|
@@ -1960,11 +2160,13 @@ declare module 'react' {
|
|
|
1960
2160
|
'kai-nav': KaiElementJsxProps;
|
|
1961
2161
|
'kai-notice': KaiElementJsxProps;
|
|
1962
2162
|
'kai-pane': KaiElementJsxProps;
|
|
2163
|
+
'kai-pane-grid': KaiElementJsxProps;
|
|
1963
2164
|
'kai-pane-group': KaiElementJsxProps;
|
|
1964
2165
|
'kai-popover': KaiElementJsxProps;
|
|
1965
2166
|
'kai-progress-bar': KaiElementJsxProps;
|
|
1966
2167
|
'kai-prompt-dock': KaiElementJsxProps;
|
|
1967
2168
|
'kai-prompt-input': KaiElementJsxProps;
|
|
2169
|
+
'kai-radio-group': KaiElementJsxProps;
|
|
1968
2170
|
'kai-reasoning': KaiElementJsxProps;
|
|
1969
2171
|
'kai-remote': KaiElementJsxProps;
|
|
1970
2172
|
'kai-resizable': KaiElementJsxProps;
|
|
@@ -1976,11 +2178,13 @@ declare module 'react' {
|
|
|
1976
2178
|
'kai-scroll-button': KaiElementJsxProps;
|
|
1977
2179
|
'kai-search': KaiElementJsxProps;
|
|
1978
2180
|
'kai-segmented': KaiElementJsxProps;
|
|
2181
|
+
'kai-select': KaiElementJsxProps;
|
|
1979
2182
|
'kai-separator': KaiElementJsxProps;
|
|
1980
2183
|
'kai-setting-item': KaiElementJsxProps;
|
|
1981
2184
|
'kai-settings-group': KaiElementJsxProps;
|
|
1982
2185
|
'kai-skeleton': KaiElementJsxProps;
|
|
1983
2186
|
'kai-skills': KaiElementJsxProps;
|
|
2187
|
+
'kai-slider': KaiElementJsxProps;
|
|
1984
2188
|
'kai-source': KaiElementJsxProps;
|
|
1985
2189
|
'kai-sources': KaiElementJsxProps;
|
|
1986
2190
|
'kai-status': KaiElementJsxProps;
|
|
@@ -2058,7 +2262,7 @@ export interface KaiArtifactElementProps {
|
|
|
2058
2262
|
export interface KaiAttachmentsElementProps {
|
|
2059
2263
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2060
2264
|
theme?: "light" | "dark" | "auto";
|
|
2061
|
-
/** The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array). */
|
|
2265
|
+
/** The attachments to render. Omit (or pass an empty array) for the empty state, which shows `emptyText` if set and nothing otherwise. Set as a JS property (array). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews here but the wire encoders (`toOpenAIMessages`/`toAnthropicMessages`) refuse it. */
|
|
2062
2266
|
items?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
2063
2267
|
/** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
|
|
2064
2268
|
variant?: "grid" | "inline" | "list";
|
|
@@ -2097,12 +2301,14 @@ export interface KaiAudioVisualizerElementProps {
|
|
|
2097
2301
|
complexity?: number;
|
|
2098
2302
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
2099
2303
|
label?: string;
|
|
2100
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
2304
|
+
/** Live microphone or WebRTC audio to analyze. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2101
2305
|
stream?: MediaStream;
|
|
2102
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
2306
|
+
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2103
2307
|
audioElement?: HTMLMediaElement;
|
|
2104
|
-
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. */
|
|
2308
|
+
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2105
2309
|
bands?: number[];
|
|
2310
|
+
/** Render live amplitude during the listening state as well, using the same presentation as speaking. Off by default, which keeps LiveKit parity: amplitude from stream, audio-element or bands renders only while state is "speaking". Set it to show a real mic-level picture while the user is the one talking. Boolean. Attribute: `listening-amplitude` (a bare attribute means true; reflected, so the property reads back what the attribute set). */
|
|
2311
|
+
listeningAmplitude?: boolean;
|
|
2106
2312
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
2107
2313
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
2108
2314
|
/** Shader variants only: keep animating while scrolled off screen. Off by default, which stops drawing and releases the WebGL context until the element comes back (browsers ration contexts to roughly 16 a page). Does not override `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. */
|
|
@@ -2185,7 +2391,7 @@ export interface KaiCardsElementProps {
|
|
|
2185
2391
|
/** JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `types`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.schemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name, matching `mergeCardTags`, where your entry is spread over ours. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `"type"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one. See `CardSchemaMap` in components/card-renderer.tsx. */
|
|
2186
2392
|
schemas?: Record<string, object>;
|
|
2187
2393
|
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
2188
|
-
policy?: { onSubmit?: (cardId: string, data: unknown) => void; onAction?: (cardId: string, action: string, payload?: unknown) => void; onSendPrompt?: (text: string, opts: { mode: "compose" | "send"; context?: unknown; }) => void; onOpen?: (url: string, target: "tab" | "artifact") => void; onState?: (cardId: string, patch: unknown) => void; onDismiss?: (cardId: string) => void; onReopen?: (cardId: string) => void; onError?: (cardId: string, message: string) => void; maxSendPromptMode?: "compose" | "send" };
|
|
2394
|
+
policy?: { onSubmit?: ((cardId: string, data: unknown) => void); onAction?: ((cardId: string, action: string, payload?: unknown) => void); onSendPrompt?: ((text: string, opts: { mode: "compose" | "send"; context?: unknown; }) => void); onOpen?: ((url: string, target: "tab" | "artifact") => void); onState?: ((cardId: string, patch: unknown) => void); onDismiss?: ((cardId: string) => void); onReopen?: ((cardId: string) => void); onError?: ((cardId: string, message: string) => void); maxSendPromptMode?: "compose" | "send" };
|
|
2189
2395
|
/** Validate each envelope's `data` against the schema for its type before rendering it, using a built-in's own schema or yours from `schemas`. Default `true`; set `validate-cards="false"` (or `el.validateCards = false`) to opt out. A hard failure (wrong type, a missing required field) renders a diagnostic naming the field instead of the card; a soft failure (bounds) renders the card unchanged. Both emit a contract `error` event. On in production too: a model emitting a bad shape is a production failure mode, so stripping the check there would hide it from exactly the person who needs to see it. */
|
|
2190
2396
|
validateCards?: boolean;
|
|
2191
2397
|
}
|
|
@@ -2206,8 +2412,6 @@ export interface KaiChainOfThoughtElementProps {
|
|
|
2206
2412
|
export interface KaiChatElementProps {
|
|
2207
2413
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2208
2414
|
theme?: "light" | "dark" | "auto";
|
|
2209
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
2210
|
-
search?: boolean;
|
|
2211
2415
|
/** 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. */
|
|
2212
2416
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
2213
2417
|
/** Placeholder text shown in the empty input. */
|
|
@@ -2226,6 +2430,10 @@ export interface KaiChatElementProps {
|
|
|
2226
2430
|
codeTheme?: string;
|
|
2227
2431
|
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
2228
2432
|
codeHighlight?: boolean;
|
|
2433
|
+
/** How `reasoning` parts render across the thread. `'full'` (default) is the current collapsible-disclosure behavior; `'compact'` shows only a shimmer loader while a reasoning part streams and nothing once it settles (no expandable detail); `'off'` renders reasoning parts not at all. Forwarded to every `MessageBody` as `reasoningMode`. */
|
|
2434
|
+
reasoning?: "full" | "compact" | "off";
|
|
2435
|
+
/** Seeds the reasoning disclosure open AND keeps it tracking the stream (open while streaming, closes when it settles): the pre-Task-19f `full` behavior. Default false/absent: the panel starts closed (just the "Thinking" shimmer chip) and only opens on click, the current default (owner ruling, 2026-08-26). Meaningless when `reasoning` is `'compact'` or `'off'`. Forwarded to every `MessageBody` as `reasoningDefaultOpen`. */
|
|
2436
|
+
reasoningOpen?: boolean;
|
|
2229
2437
|
/** Optional header title shown on the left of the header. */
|
|
2230
2438
|
chatTitle?: string;
|
|
2231
2439
|
/** Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection. */
|
|
@@ -2252,6 +2460,10 @@ export interface KaiChatElementProps {
|
|
|
2252
2460
|
composerActions?: boolean;
|
|
2253
2461
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
2254
2462
|
footer?: boolean;
|
|
2463
|
+
/** When `false`, hides the built-in paperclip attach button. Defaults to `true` (undeclared keeps today's behavior: attach visible), matching `DefaultPromptInput`'s own default: only an explicit `false` hides it. */
|
|
2464
|
+
attach?: boolean;
|
|
2465
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
2466
|
+
webSearch?: boolean;
|
|
2255
2467
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
2256
2468
|
voice?: boolean;
|
|
2257
2469
|
/** 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. */
|
|
@@ -2270,6 +2482,42 @@ export interface KaiChatElementProps {
|
|
|
2270
2482
|
cardSchemas?: Record<string, object>;
|
|
2271
2483
|
}
|
|
2272
2484
|
|
|
2485
|
+
export interface KaiCheckboxElementProps {
|
|
2486
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2487
|
+
theme?: "light" | "dark" | "auto";
|
|
2488
|
+
/** Controlled checked state. Settable and reflected to the `checked` attribute. `el.checked = true` (or `<kai-checkbox checked>`) drives it; ticking the box updates it and fires `kai-change`. Read `el.checked` for live state. */
|
|
2489
|
+
checked?: boolean;
|
|
2490
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on. */
|
|
2491
|
+
defaultChecked?: boolean;
|
|
2492
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`. */
|
|
2493
|
+
indeterminate?: boolean;
|
|
2494
|
+
/** Disable interaction. */
|
|
2495
|
+
disabled?: boolean;
|
|
2496
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's. */
|
|
2497
|
+
required?: boolean;
|
|
2498
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
2499
|
+
label?: string;
|
|
2500
|
+
/** Form-control name (paired with `value`). */
|
|
2501
|
+
name?: string;
|
|
2502
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
2503
|
+
value?: string;
|
|
2504
|
+
}
|
|
2505
|
+
|
|
2506
|
+
export interface KaiCheckboxGroupElementProps {
|
|
2507
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2508
|
+
theme?: "light" | "dark" | "auto";
|
|
2509
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
2510
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
2511
|
+
/** The FIRST selected value. Settable and reflected to the `value` attribute, so `:host([value])` and `el.value` see live state, and a seed can be written in markup. Writing it makes that the whole selection; to read or drive the rest, use `el.values`. */
|
|
2512
|
+
value?: string;
|
|
2513
|
+
/** The shared form-control name every box carries, so `FormData.getAll(name)` reads the whole selection back under one key. NO DEFAULT, unlike `<kai-radio-group>`. A radio set needs a shared `name` for the browser to make it exclusive and arrow-navigable, so one is generated when none is given; checkboxes are independent controls and behave correctly with no name at all. Generating one here would submit the selection under a random key, which is worse than submitting nothing. The element is NOT form-associated (no `ElementInternals`, no `setFormValue()`), the same known gap `<kai-input>` records: the boxes live in a shadow root, so a surrounding `<form>` collects nothing from them whether or not `name` is set. Read `el.values`. The name still lands on every inner input, so it is right the day form association arrives. */
|
|
2514
|
+
name?: string;
|
|
2515
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
2516
|
+
disabled?: boolean;
|
|
2517
|
+
/** Accessible name for the group. */
|
|
2518
|
+
label?: string;
|
|
2519
|
+
}
|
|
2520
|
+
|
|
2273
2521
|
export interface KaiCheckpointElementProps {
|
|
2274
2522
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2275
2523
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2332,6 +2580,8 @@ export interface KaiCodeBlockElementProps {
|
|
|
2332
2580
|
codeTheme?: string;
|
|
2333
2581
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
2334
2582
|
codeHighlight?: boolean;
|
|
2583
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
2584
|
+
copy?: boolean;
|
|
2335
2585
|
/** Code text sizing. */
|
|
2336
2586
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
2337
2587
|
}
|
|
@@ -2415,19 +2665,32 @@ export interface KaiContextElementProps {
|
|
|
2415
2665
|
dangerThreshold?: number;
|
|
2416
2666
|
}
|
|
2417
2667
|
|
|
2668
|
+
export interface KaiConversationItemElementProps {
|
|
2669
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2670
|
+
theme?: "light" | "dark" | "auto";
|
|
2671
|
+
/** The row's identity: the `conversation-id` attribute (host `id` is the fallback). Inside `<kai-conversations>` it is handed to the container's selection contract (`kai-conversation-select`); standalone it is the `id` in this element's own `kai-select` detail. */
|
|
2672
|
+
conversationId?: string;
|
|
2673
|
+
/** Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; inside a container the container drives it from its `activeId`, standalone you set it yourself. */
|
|
2674
|
+
active?: boolean;
|
|
2675
|
+
/** Dense single-line row padding. */
|
|
2676
|
+
compact?: boolean;
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2418
2679
|
export interface KaiConversationsElementProps {
|
|
2419
2680
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2420
2681
|
theme?: "light" | "dark" | "auto";
|
|
2421
2682
|
/** The list's section headers (`{ id, name, sortOrder, createdAt }`), rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped list. Set as a JS property. */
|
|
2422
2683
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
2423
|
-
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. */
|
|
2424
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
2684
|
+
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. A search query that matches nothing shows a visible "No conversations match your search" state, distinct from the zero-conversations empty state. Slotted `<kai-conversation-item>` children switch the list into item mode instead: your own rows win and this array is not rendered. */
|
|
2685
|
+
conversations?: { id: string; title: string; groupId?: string; scope?: { type: "document" | "collection"; documentId?: string; filters?: { tags?: string[]; authors?: string[]; contentType?: "transcript" | "markdown"; dateRange?: { from: string; to: string } } }; messageCount: number; lastMessageAt?: string; updatedAt: string; trailing?: string }[];
|
|
2425
2686
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
2426
2687
|
activeId?: string;
|
|
2427
2688
|
/** 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. */
|
|
2428
2689
|
collapsed?: boolean;
|
|
2429
2690
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
2430
2691
|
defaultCollapsed?: boolean;
|
|
2692
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
2693
|
+
compact?: boolean;
|
|
2431
2694
|
}
|
|
2432
2695
|
|
|
2433
2696
|
export interface KaiDialogElementProps {
|
|
@@ -2437,6 +2700,54 @@ export interface KaiDialogElementProps {
|
|
|
2437
2700
|
open?: boolean;
|
|
2438
2701
|
/** Initial open state on mount (uncontrolled seed). */
|
|
2439
2702
|
defaultOpen?: boolean;
|
|
2703
|
+
/** Accessible name for the modal, used when no `header` slot is projected: `<kai-dialog label="Delete workspace">`. A projected `header` WINS over this (it becomes `aria-labelledby`), because ARIA resolves `aria-labelledby` ahead of `aria-label` and the visible heading is the name both a sighted and a screen-reader user can be talked through. Defaults to `Dialog` so a modal is never nameless. */
|
|
2704
|
+
label?: string;
|
|
2705
|
+
}
|
|
2706
|
+
|
|
2707
|
+
export interface KaiDockElementProps {
|
|
2708
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2709
|
+
theme?: "light" | "dark" | "auto";
|
|
2710
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on the launcher and Escape). Set `el.open = true`, or `<kai-dock open>`; listen for `kai-open-change`. */
|
|
2711
|
+
open?: boolean;
|
|
2712
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2713
|
+
defaultOpen?: boolean;
|
|
2714
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
2715
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
2716
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
2717
|
+
label?: string;
|
|
2718
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
2719
|
+
openLabel?: string;
|
|
2720
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
2721
|
+
closeLabel?: string;
|
|
2722
|
+
/** Show the unread dot. YOURS: it renders only while closed, and the dock never writes it back. Clear it in your `kai-open-change` handler. */
|
|
2723
|
+
unread?: boolean;
|
|
2724
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
2725
|
+
disabled?: boolean;
|
|
2726
|
+
/** Suppress the dock's own built-in mobile close X. Set this when your slotted panel content supplies its own close affordance (e.g. a `<kai-chat slot="header-end">` close button), otherwise the two stack. TRADEOFF: the mobile panel reserves a padding band above its content so the built-in X never paints over slotted content; that band stays reserved unless you set this true, so only set it once your own control is actually in place. Attribute: `hide-close`. */
|
|
2727
|
+
hideClose?: boolean;
|
|
2728
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
2729
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
2730
|
+
}
|
|
2731
|
+
|
|
2732
|
+
export interface KaiDropdownElementProps {
|
|
2733
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2734
|
+
theme?: "light" | "dark" | "auto";
|
|
2735
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
2736
|
+
triggerIcon?: string;
|
|
2737
|
+
/** Built-in trigger: a text label. This is the trigger's VISIBLE text, so it is also its accessible name, and `label` does not override it: an accessible name that does not contain the visible text is unreachable by speech input (WCAG 2.5.3, Label in Name). Same rule `kai-menu` follows. */
|
|
2738
|
+
triggerLabel?: string;
|
|
2739
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
2740
|
+
triggerIconTrailing?: string;
|
|
2741
|
+
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, which is VISUAL content with the name supplied separately: the same two-slot distinction `kai-menu` documents. */
|
|
2742
|
+
label?: string;
|
|
2743
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
2744
|
+
full?: boolean;
|
|
2745
|
+
/** 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-dropdown open>`; listen for `kai-open-change`. */
|
|
2746
|
+
open?: boolean;
|
|
2747
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2748
|
+
defaultOpen?: boolean;
|
|
2749
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
2750
|
+
disabled?: boolean;
|
|
2440
2751
|
}
|
|
2441
2752
|
|
|
2442
2753
|
export interface KaiEditableLabelElementProps {
|
|
@@ -2519,7 +2830,7 @@ export interface KaiFormElementProps {
|
|
|
2519
2830
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2520
2831
|
theme?: "light" | "dark" | "auto";
|
|
2521
2832
|
/** 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 (`FormField.properties` is another `FormField` map), and the generated `element-types.d.ts` inlines every named type, so the shipped declaration bottoms out in a `Record<string, unknown>` placeholder one level down rather than carrying the recursion. That is why `FormDefinition` is a `type` alias: an interface gets no implicit index signature, so it would not be assignable to that placeholder. */
|
|
2522
|
-
data?: { type: "object"; title?: string; description?: string; required?: string[]; properties: Record<string, { type: "string" | "number" | "integer" | "boolean" | "array" | "object"; title?: string; description?: string; default?: unknown; enum?: unknown[]; format?: "email" | "uri" | "url" | "date" | "date-time" | "time"; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; minItems?: number; maxItems?: number; items?: Record<string, unknown> | { enum: unknown[] }; properties?: Record<string, Record<string, unknown>>; required?: string[]; readOnly?: boolean; "x-kai-widget"?: "textarea" | "slider" | "rating" | "radio" | "select" | "checkbox" | "password" | "switch"; "x-kai-placeholder"?: string; "x-kai-step"?: number }>; "x-kai-order"?: string[]; "x-kai-inlineMax"?: number; "x-kai-submitLabel"?: string; "x-kai-dismissible"?: boolean; "x-kai-actions"?: { id: string; label: string; variant?: "default" | "ghost" | "outline" }[] };
|
|
2833
|
+
data?: { type: "object"; title?: string; description?: string; required?: string[]; properties: Record<string, { type: "string" | "number" | "integer" | "boolean" | "array" | "object"; title?: string; description?: string; default?: unknown; enum?: unknown[]; format?: "email" | "uri" | "url" | "date" | "date-time" | "time"; minimum?: number; maximum?: number; minLength?: number; maxLength?: number; pattern?: string; minItems?: number; maxItems?: number; items?: Record<string, unknown> | { enum: unknown[] }; properties?: Record<string, Record<string, unknown>>; required?: string[]; readOnly?: boolean; "x-kai-widget"?: "textarea" | "slider" | "rating" | "radio" | "select" | "checkbox" | "password" | "switch"; "x-kai-placeholder"?: string; "x-kai-step"?: number; "x-kai-format"?: "tel" | "ssn" | "credit-card" | "custom"; "x-kai-mask"?: string; "x-kai-mask-guide"?: string }>; "x-kai-order"?: string[]; "x-kai-inlineMax"?: number; "x-kai-submitLabel"?: string; "x-kai-dismissible"?: boolean; "x-kai-actions"?: { id: string; label: string; variant?: "default" | "ghost" | "outline" }[] };
|
|
2523
2834
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
2524
2835
|
cardId?: string;
|
|
2525
2836
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -2578,7 +2889,7 @@ export interface KaiInputElementProps {
|
|
|
2578
2889
|
theme?: "light" | "dark" | "auto";
|
|
2579
2890
|
/** Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only. */
|
|
2580
2891
|
type?: string;
|
|
2581
|
-
/** Controlled value
|
|
2892
|
+
/** Controlled value, and always the CANONICAL one when a mask is active: digits for `tel` / `ssn` / `credit-card`, the formatted text for `custom`. Settable and reflected to the `value` attribute. `el.value = '5551234567'` drives it (no event) and is re-fitted to the mask on the way in, so the field shows `555-123-4567`. Read `el.value` for live state; the formatted text rides along on every `kai-input` / `kai-change` detail as `formattedValue`. */
|
|
2582
2893
|
value?: string;
|
|
2583
2894
|
/** Placeholder shown when empty. */
|
|
2584
2895
|
placeholder?: string;
|
|
@@ -2604,6 +2915,16 @@ export interface KaiInputElementProps {
|
|
|
2604
2915
|
autocomplete?: string;
|
|
2605
2916
|
/** Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`). */
|
|
2606
2917
|
inputmode?: string;
|
|
2918
|
+
/** Mask pattern: `#` a digit, `@` a letter or digit, `*` an obscurable letter or digit, and every other character a positional literal (`@@@-####` → `CHG-4821`). The literal `default` is the opt-in sentinel: it resolves to the default format of `semantic` (`tel` → `###-###-####`). A bare `semantic` never starts masking on its own, so an opt-in token is what turns tier 2 on. */
|
|
2919
|
+
format?: string;
|
|
2920
|
+
/** Placeholder guide shown at unfilled positions, aligned position for position with `format`: `mm/dd/yyyy` against `##/##/####`. Spaces are a valid guide character, so a guide of blanks and separators is how a phone field shows its shape without showing letters. Without a guide the field shows only up to the last typed character. A guide is a visual aid, never an accessible name: keep the `hint` text as well. */
|
|
2921
|
+
guide?: string;
|
|
2922
|
+
/** Semantic field type: `tel` · `ssn` · `credit-card` · `custom`. On its own it sets `inputmode` / `autocomplete` / `spellcheck` / `autocorrect` / `autocapitalize` and decides the canonical value; it never starts masking by itself. */
|
|
2923
|
+
semantic?: "credit-card" | "custom" | "ssn" | "tel";
|
|
2924
|
+
/** Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`. */
|
|
2925
|
+
caseMode?: "preserve" | "upper" | "lower";
|
|
2926
|
+
/** What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`. */
|
|
2927
|
+
copyPolicy?: "formatted" | "canonical" | "obscured" | "blocked";
|
|
2607
2928
|
}
|
|
2608
2929
|
|
|
2609
2930
|
export interface KaiKbdElementProps {
|
|
@@ -2665,6 +2986,8 @@ export interface KaiMenuElementProps {
|
|
|
2665
2986
|
triggerIconTrailing?: string;
|
|
2666
2987
|
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, and that is a difference in what the two slots MEAN, not a limitation. `<kai-button>`'s slot IS the button's label, so text slotted there is the name and `label` steps aside. This slot is VISUAL content, a `+` or an `<svg>`, with the name supplied separately: decoration beside a name, never a second name competing with one. So `label` names the trigger here by design. Slotting a real WORD rather than a glyph makes that word a visible label, and an accessible name has to contain the visible text. Then either drop `label` or make it contain the word you slotted. */
|
|
2667
2988
|
label?: string;
|
|
2989
|
+
/** Stretch the trigger to the full width of the menu's container (a block row), e.g. a sidebar-footer account row. Same affordance as `<kai-button full>`. Attribute: `full`. */
|
|
2990
|
+
full?: boolean;
|
|
2668
2991
|
/** 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`. */
|
|
2669
2992
|
open?: boolean;
|
|
2670
2993
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -2760,6 +3083,21 @@ export interface KaiPaneElementProps {
|
|
|
2760
3083
|
status?: { tone: "working" | "idle" | "done" | "error" | "blocked"; label?: string; pulse?: boolean };
|
|
2761
3084
|
}
|
|
2762
3085
|
|
|
3086
|
+
export interface KaiPaneGridElementProps {
|
|
3087
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3088
|
+
theme?: "light" | "dark" | "auto";
|
|
3089
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`. */
|
|
3090
|
+
minPaneWidth?: number;
|
|
3091
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`. */
|
|
3092
|
+
minPaneHeight?: number;
|
|
3093
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
3094
|
+
maxColumns?: number;
|
|
3095
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
3096
|
+
gap?: string;
|
|
3097
|
+
/** When set to a valid child index, render ONLY that pane full-bleed: a simple maximize hook the consumer drives (pair it with `<kai-pane>`'s `kai-maximize` event). Clear it (or point out of range) for the full tiled grid. Attribute: `maximized-index`. */
|
|
3098
|
+
maximizedIndex?: number | null;
|
|
3099
|
+
}
|
|
3100
|
+
|
|
2763
3101
|
export interface KaiPaneGroupElementProps {
|
|
2764
3102
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2765
3103
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2823,8 +3161,8 @@ export interface KaiPromptInputElementProps {
|
|
|
2823
3161
|
suggestions?: string[];
|
|
2824
3162
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
2825
3163
|
suggestionMode?: "submit" | "fill";
|
|
2826
|
-
/** Show a
|
|
2827
|
-
|
|
3164
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
3165
|
+
webSearch?: boolean;
|
|
2828
3166
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
2829
3167
|
voice?: boolean;
|
|
2830
3168
|
/** 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`. */
|
|
@@ -2833,7 +3171,7 @@ export interface KaiPromptInputElementProps {
|
|
|
2833
3171
|
submit?: "always" | "auto";
|
|
2834
3172
|
/** 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`. */
|
|
2835
3173
|
attach?: boolean;
|
|
2836
|
-
/** 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). */
|
|
3174
|
+
/** 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). Each item's `url` must be a `data:` URI or an https URL, never `URL.createObjectURL`: a `blob:` URL previews perfectly and is meaningless outside this tab, so `toOpenAIMessages`/`toAnthropicMessages` refuse it. (The built-in paperclip already stages files as `data:` URIs.) */
|
|
2837
3175
|
attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
2838
3176
|
/** 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. */
|
|
2839
3177
|
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
@@ -2841,6 +3179,21 @@ export interface KaiPromptInputElementProps {
|
|
|
2841
3179
|
kindIcons?: Record<string, string>;
|
|
2842
3180
|
}
|
|
2843
3181
|
|
|
3182
|
+
export interface KaiRadioGroupElementProps {
|
|
3183
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3184
|
+
theme?: "light" | "dark" | "auto";
|
|
3185
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
3186
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
3187
|
+
/** Controlled selected `value`. Settable and reflected to the `value` attribute. `el.value = 'degraded'` drives it; choosing a row updates it and fires `kai-change`. Read `el.value` for live state. */
|
|
3188
|
+
value?: string;
|
|
3189
|
+
/** Shared form-control name for every radio in the group. Defaults to a generated id, so the group is exclusive and keyboard-navigable even when nothing is submitted. */
|
|
3190
|
+
name?: string;
|
|
3191
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
3192
|
+
disabled?: boolean;
|
|
3193
|
+
/** Accessible name for the group. */
|
|
3194
|
+
label?: string;
|
|
3195
|
+
}
|
|
3196
|
+
|
|
2844
3197
|
export interface KaiReasoningElementProps {
|
|
2845
3198
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2846
3199
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2962,6 +3315,10 @@ export interface KaiScrollButtonElementProps {
|
|
|
2962
3315
|
variant?: "outline" | "ghost" | "default";
|
|
2963
3316
|
/** Button size token. Defaults to `'icon'` (square). */
|
|
2964
3317
|
size?: "sm" | "md" | "lg" | "icon" | "icon-sm";
|
|
3318
|
+
/** The button's accessible name. It is announced whether or not the label is visible, so the text is always localisable. Defaults to `'Scroll to bottom'`. */
|
|
3319
|
+
label?: string;
|
|
3320
|
+
/** Also render `label` visibly beside the icon. Defaults to `false`, which is the icon-only button. When the text is visible it IS the accessible name, so nothing gets announced twice. */
|
|
3321
|
+
showLabel?: boolean;
|
|
2965
3322
|
}
|
|
2966
3323
|
|
|
2967
3324
|
export interface KaiSearchElementProps {
|
|
@@ -2992,6 +3349,29 @@ export interface KaiSegmentedElementProps {
|
|
|
2992
3349
|
size?: "sm" | "md";
|
|
2993
3350
|
}
|
|
2994
3351
|
|
|
3352
|
+
export interface KaiSelectElementProps {
|
|
3353
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3354
|
+
theme?: "light" | "dark" | "auto";
|
|
3355
|
+
/** The choices, in display order. Set as a JS PROPERTY (array), never an attribute. Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
3356
|
+
options: { value: string; label?: undefined | string; disabled?: undefined | boolean }[];
|
|
3357
|
+
/** Controlled selected value. Settable and reflected to the `value` attribute. `el.value = 'high'` drives it; choosing an option updates it and fires `kai-change`. Read `el.value` for live state; for a `multiple` select read `el.values` instead. */
|
|
3358
|
+
value?: string;
|
|
3359
|
+
/** Text for a leading, disabled, empty option: the "nothing chosen yet" row. Omitted means no such row at all; there is no default wording, because inventing one would put words in your UI. */
|
|
3360
|
+
placeholder?: string;
|
|
3361
|
+
/** Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn. */
|
|
3362
|
+
multiple?: boolean;
|
|
3363
|
+
/** Force the invalid (destructive-border) state. */
|
|
3364
|
+
invalid?: boolean;
|
|
3365
|
+
/** Disable interaction. */
|
|
3366
|
+
disabled?: boolean;
|
|
3367
|
+
/** Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's. */
|
|
3368
|
+
required?: boolean;
|
|
3369
|
+
/** Accessible label for the control. */
|
|
3370
|
+
label?: string;
|
|
3371
|
+
/** Form-control name, for a native form submit. */
|
|
3372
|
+
name?: string;
|
|
3373
|
+
}
|
|
3374
|
+
|
|
2995
3375
|
export interface KaiSeparatorElementProps {
|
|
2996
3376
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2997
3377
|
theme?: "light" | "dark" | "auto";
|
|
@@ -3037,6 +3417,27 @@ export interface KaiSkillsElementProps {
|
|
|
3037
3417
|
skills?: { id: string; name: string }[];
|
|
3038
3418
|
}
|
|
3039
3419
|
|
|
3420
|
+
export interface KaiSliderElementProps {
|
|
3421
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3422
|
+
theme?: "light" | "dark" | "auto";
|
|
3423
|
+
/** Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means. */
|
|
3424
|
+
min?: number;
|
|
3425
|
+
/** Highest selectable value. Required, for the same reason as `min`. */
|
|
3426
|
+
max?: number;
|
|
3427
|
+
/** Granularity. Omitted means the native default of 1; `any` means continuous. */
|
|
3428
|
+
step?: number | "any";
|
|
3429
|
+
/** Controlled value. Settable and reflected to the `value` attribute. `el.value = 40` drives it; dragging updates it and fires `kai-input` per step, `kai-change` on release. Read `el.value` for live state. */
|
|
3430
|
+
value?: number;
|
|
3431
|
+
/** Disable interaction. */
|
|
3432
|
+
disabled?: boolean;
|
|
3433
|
+
/** Accessible label for the slider. */
|
|
3434
|
+
label?: string;
|
|
3435
|
+
/** Form-control name, for a native form submit. */
|
|
3436
|
+
name?: string;
|
|
3437
|
+
/** Show the current value beside the track. Off by default. Two ways in, because one of them is not a scalar. As a bare ATTRIBUTE (`<kai-slider value-label>`) it renders the raw number. As a JS PROPERTY it also accepts a formatter function (`el.valueLabel = (v) => v + '%'`), for a slider that is not counting bare numbers. A function cannot survive an attribute, so that half is property-only. The readout is hidden from assistive tech: the slider already reports the same number, and an exposed copy would be announced twice. */
|
|
3438
|
+
valueLabel?: boolean | ((value: number) => string);
|
|
3439
|
+
}
|
|
3440
|
+
|
|
3040
3441
|
export interface KaiSourceElementProps {
|
|
3041
3442
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3042
3443
|
theme?: "light" | "dark" | "auto";
|
|
@@ -3200,7 +3601,7 @@ export interface KaiThreadElementProps {
|
|
|
3200
3601
|
export interface KaiToastRegionElementProps {
|
|
3201
3602
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3202
3603
|
theme?: "light" | "dark" | "auto";
|
|
3203
|
-
/** The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts. */
|
|
3604
|
+
/** The toasts to render. Newest is shown on top. Set as a JS property (array); pass a new array reference to update. Omit for an empty region, which is the normal resting state and how the imperative `toast()` API starts. Note the handover: the first `toast()` call ADOPTS a region you placed in markup (no second region mounts) and binds the imperative store to this property, replacing any array you set. Drive a region as data OR via `toast()`, not both at once. */
|
|
3204
3605
|
toasts?: { id: string; message: string; variant?: "neutral" | "success" | "warning" | "error" | "info"; appearance?: "pill" | "card"; inverse?: boolean; description?: string; action?: { label: string; onAction: () => void | false }; duration?: number; dismissible?: boolean; target?: HTMLElement }[];
|
|
3205
3606
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
3206
3607
|
position?: "top-center" | "top-right" | "top-left" | "bottom-center" | "bottom-right" | "bottom-left";
|
|
@@ -3277,53 +3678,20 @@ export interface KaiVoiceOutputElementProps {
|
|
|
3277
3678
|
export interface KaiWorkspaceElementProps {
|
|
3278
3679
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3279
3680
|
theme?: "light" | "dark" | "auto";
|
|
3280
|
-
/**
|
|
3281
|
-
|
|
3282
|
-
/**
|
|
3283
|
-
|
|
3284
|
-
/**
|
|
3285
|
-
|
|
3286
|
-
/**
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
placeholder?: string;
|
|
3290
|
-
loading?: boolean;
|
|
3291
|
-
suggestions?: string[];
|
|
3292
|
-
suggestionMode?: "submit" | "fill";
|
|
3293
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
3294
|
-
codeTheme?: string;
|
|
3295
|
-
codeHighlight?: boolean;
|
|
3296
|
-
chatTitle?: string;
|
|
3297
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
3298
|
-
currentModel?: string;
|
|
3299
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
3300
|
-
scrollButton?: boolean;
|
|
3301
|
-
search?: boolean;
|
|
3302
|
-
voice?: boolean;
|
|
3303
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
3304
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
3305
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
3306
|
-
kindIcons?: Record<string, string>;
|
|
3307
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
3308
|
-
sidebarWidth?: number;
|
|
3309
|
-
/** Sidebar min width in px (default 240). */
|
|
3310
|
-
sidebarMinWidth?: number;
|
|
3311
|
-
/** Sidebar max width in px (default 420). */
|
|
3312
|
-
sidebarMaxWidth?: number;
|
|
3313
|
-
/** 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). */
|
|
3314
|
-
sidebarCollapsed?: boolean;
|
|
3315
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
3316
|
-
defaultSidebarCollapsed?: boolean;
|
|
3317
|
-
/** 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`. */
|
|
3681
|
+
/** Controlled collapsed state of the start aside. Set this as a JS property (`el.startCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
3682
|
+
startCollapsed?: boolean;
|
|
3683
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
3684
|
+
defaultStartCollapsed?: boolean;
|
|
3685
|
+
/** Controlled collapsed state of the end aside. Set this as a JS property (`el.endCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
3686
|
+
endCollapsed?: boolean;
|
|
3687
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
3688
|
+
defaultEndCollapsed?: boolean;
|
|
3689
|
+
/** Auto-collapse both asides when the shell's own width drops below this many px, and re-expand when it grows back above. Applies to uncontrolled asides only (it never fights an app-driven collapsed prop); omit to disable. Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
|
|
3318
3690
|
collapseBelow?: number;
|
|
3319
|
-
/**
|
|
3691
|
+
/** Below this shell width in px, an expanded aside renders as an overlay drawer over the main region instead of a column beside it. Escape inside the drawer closes it and returns focus to the element focused before it opened. Omit to disable. Attribute: `drawer-below`. */
|
|
3692
|
+
drawerBelow?: number;
|
|
3693
|
+
/** Density hint. Reflected as a `data-compact` hook on the root (and as the `compact` attribute on the element) for your CSS and slotted content; the shell itself keeps no other opinion about density. */
|
|
3320
3694
|
compact?: boolean;
|
|
3321
|
-
/** 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`. */
|
|
3322
|
-
noConversations?: boolean;
|
|
3323
|
-
/** Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type. */
|
|
3324
|
-
cardTypes?: Record<string, string>;
|
|
3325
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `"type"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one. */
|
|
3326
|
-
cardSchemas?: Record<string, object>;
|
|
3327
3695
|
}
|
|
3328
3696
|
|
|
3329
3697
|
export interface KaiAgentCardElementEvents {
|
|
@@ -3394,8 +3762,6 @@ export interface KaiChatElementEvents {
|
|
|
3394
3762
|
onKaiMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
3395
3763
|
/** The header model switcher changed. */
|
|
3396
3764
|
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3397
|
-
/** The Search button was clicked. */
|
|
3398
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3399
3765
|
/** User submitted a message. */
|
|
3400
3766
|
onKaiSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3401
3767
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -3404,6 +3770,18 @@ export interface KaiChatElementEvents {
|
|
|
3404
3770
|
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3405
3771
|
/** The Mic / voice button was clicked. */
|
|
3406
3772
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3773
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3774
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3775
|
+
}
|
|
3776
|
+
|
|
3777
|
+
export interface KaiCheckboxElementEvents {
|
|
3778
|
+
/** The box was ticked or unticked. */
|
|
3779
|
+
onKaiChange?: (event: CustomEvent<{ checked: boolean }>) => void;
|
|
3780
|
+
}
|
|
3781
|
+
|
|
3782
|
+
export interface KaiCheckboxGroupElementEvents {
|
|
3783
|
+
/** A row was ticked or unticked. `values` is the whole selection after the change, which is what a multi-select control needs; `value` is the first of them (empty when nothing is selected). Both are always present, so neither shape silently loses the other. This is `<kai-select>`'s detail, deliberately. */
|
|
3784
|
+
onKaiChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
3407
3785
|
}
|
|
3408
3786
|
|
|
3409
3787
|
export interface KaiCheckpointElementEvents {
|
|
@@ -3454,7 +3832,7 @@ export interface KaiComposerElementEvents {
|
|
|
3454
3832
|
onKaiEntityRemove?: (event: CustomEvent<{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }>) => void;
|
|
3455
3833
|
/** 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.) */
|
|
3456
3834
|
onKaiFocus?: (event: CustomEvent<{ originalEvent: FocusEvent }>) => void;
|
|
3457
|
-
/** The user submitted the composer (Enter or programmatic submit). */
|
|
3835
|
+
/** The user submitted the composer (Enter or programmatic submit). Note the detail carries no `attachments`; `<kai-composer>` is the bare editing surface: no send button, toolbar, or attachments. For a drop-in composer row with all three, reach for `<kai-prompt-input>`, which is built on this. */
|
|
3458
3836
|
onKaiSubmit?: (event: CustomEvent<{ 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> }[] }>) => void;
|
|
3459
3837
|
/** A trigger character was detected at the caret (e.g. `/` or `@`). */
|
|
3460
3838
|
onKaiTrigger?: (event: CustomEvent<{ char: string; query: string; rect: DOMRect }>) => void;
|
|
@@ -3473,10 +3851,15 @@ export interface KaiContextElementEvents {
|
|
|
3473
3851
|
onKaiThresholdChange?: (event: CustomEvent<{ level: "ok" | "warn" | "danger" }>) => void;
|
|
3474
3852
|
}
|
|
3475
3853
|
|
|
3854
|
+
export interface KaiConversationItemElementEvents {
|
|
3855
|
+
/** STANDALONE activation only: the row was activated (click, Enter or Space on its body) while the item is NOT a direct child of `<kai-conversations>`. `id` is the row's identity: the `conversation-id` attribute, else the host `id`. Inside a container this never fires: activation surfaces once, as `kai-conversation-select` on the container. */
|
|
3856
|
+
onKaiSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3857
|
+
}
|
|
3858
|
+
|
|
3476
3859
|
export interface KaiConversationsElementEvents {
|
|
3477
3860
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
3478
3861
|
onKaiCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3479
|
-
/** A conversation was selected. */
|
|
3862
|
+
/** A conversation was selected. The selection event in BOTH modes: a batteries data row, or an activated `<kai-conversation-item>` child (click, Enter or Space). */
|
|
3480
3863
|
onKaiConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3481
3864
|
/** The "New chat" button was clicked. */
|
|
3482
3865
|
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3491,6 +3874,16 @@ export interface KaiDialogElementEvents {
|
|
|
3491
3874
|
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3492
3875
|
}
|
|
3493
3876
|
|
|
3877
|
+
export interface KaiDockElementEvents {
|
|
3878
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
3879
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3880
|
+
}
|
|
3881
|
+
|
|
3882
|
+
export interface KaiDropdownElementEvents {
|
|
3883
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
3884
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3885
|
+
}
|
|
3886
|
+
|
|
3494
3887
|
export interface KaiEditableLabelElementEvents {
|
|
3495
3888
|
/** Edit was cancelled (Esc); the text is restored. */
|
|
3496
3889
|
onKaiCancel?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3544,10 +3937,12 @@ export interface KaiImageElementEvents {
|
|
|
3544
3937
|
}
|
|
3545
3938
|
|
|
3546
3939
|
export interface KaiInputElementEvents {
|
|
3547
|
-
/** The value was committed (blur). */
|
|
3548
|
-
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3549
|
-
/** The value changed per keystroke. */
|
|
3550
|
-
onKaiInput?: (event: CustomEvent<{ value: string }>) => void;
|
|
3940
|
+
/** The value was committed (blur). Same detail shape as `kai-input`. */
|
|
3941
|
+
onKaiChange?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
3942
|
+
/** The value changed per keystroke. `value` is the canonical value (what a backend wants); `formattedValue` is the text on screen. With no mask the two are equal. */
|
|
3943
|
+
onKaiInput?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
3944
|
+
/** A mask refused, or partly refused, some content. The reasons are `full` (no free position left), `wrong-class` (a letter into a digit position), `over-capacity` (a paste longer than the mask holds; what fits was kept), and `format-change-clipped` (the `format` changed under a value that no longer fits). `data` is the content that was refused. The first three are USER-INPUT errors, and are the ones worth announcing in a polite live region. `format-change-clipped` is not one: it follows the app changing its own configuration, so it reports and nothing more. None of the four touches validity, so `invalid` and `error` stay the consumer decision. */
|
|
3945
|
+
onKaiInputRejected?: (event: CustomEvent<{ reason: "full" | "wrong-class" | "over-capacity" | "format-change-clipped"; data: string }>) => void;
|
|
3551
3946
|
}
|
|
3552
3947
|
|
|
3553
3948
|
export interface KaiKbdElementEvents {
|
|
@@ -3610,6 +4005,10 @@ export interface KaiPaneElementEvents {
|
|
|
3610
4005
|
onKaiSplit?: (event: CustomEvent) => void;
|
|
3611
4006
|
}
|
|
3612
4007
|
|
|
4008
|
+
export interface KaiPaneGridElementEvents {
|
|
4009
|
+
|
|
4010
|
+
}
|
|
4011
|
+
|
|
3613
4012
|
export interface KaiPaneGroupElementEvents {
|
|
3614
4013
|
/** A tab was selected (click, Enter/Space, or arrow-key move). `detail.id` is the tab's id. */
|
|
3615
4014
|
onKaiTabChange?: (event: CustomEvent<{ id: string }>) => void;
|
|
@@ -3635,11 +4034,9 @@ export interface KaiPromptDockElementEvents {
|
|
|
3635
4034
|
export interface KaiPromptInputElementEvents {
|
|
3636
4035
|
/** 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). */
|
|
3637
4036
|
onKaiAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3638
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
3639
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3640
4037
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
3641
4038
|
onKaiStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3642
|
-
/** 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. */
|
|
4039
|
+
/** 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. `<kai-prompt-input>` is the batteries-included composer row (send button, toolbar, attachment staging) built on `<kai-composer>`, the bare editor. */
|
|
3643
4040
|
onKaiSubmit?: (event: CustomEvent<{ 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 }[] }>) => void;
|
|
3644
4041
|
/** A suggestion was clicked while `suggestion-mode="fill"`. */
|
|
3645
4042
|
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
@@ -3649,6 +4046,13 @@ export interface KaiPromptInputElementEvents {
|
|
|
3649
4046
|
onKaiValueChange?: (event: CustomEvent<{ 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> }[] }>) => void;
|
|
3650
4047
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
3651
4048
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
4049
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
4050
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
4051
|
+
}
|
|
4052
|
+
|
|
4053
|
+
export interface KaiRadioGroupElementEvents {
|
|
4054
|
+
/** A row was chosen. */
|
|
4055
|
+
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3652
4056
|
}
|
|
3653
4057
|
|
|
3654
4058
|
export interface KaiReasoningElementEvents {
|
|
@@ -3717,6 +4121,11 @@ export interface KaiSegmentedElementEvents {
|
|
|
3717
4121
|
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3718
4122
|
}
|
|
3719
4123
|
|
|
4124
|
+
export interface KaiSelectElementEvents {
|
|
4125
|
+
/** A choice was made. `value` is the first selected option (empty when nothing is selected); `values` is every selected option, which is what a `multiple` select needs. Both are always present, so neither shape silently loses the other. */
|
|
4126
|
+
onKaiChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
4127
|
+
}
|
|
4128
|
+
|
|
3720
4129
|
export interface KaiSeparatorElementEvents {
|
|
3721
4130
|
|
|
3722
4131
|
}
|
|
@@ -3737,6 +4146,13 @@ export interface KaiSkillsElementEvents {
|
|
|
3737
4146
|
|
|
3738
4147
|
}
|
|
3739
4148
|
|
|
4149
|
+
export interface KaiSliderElementEvents {
|
|
4150
|
+
/** The value was committed: pointer released, or a key press finished. */
|
|
4151
|
+
onKaiChange?: (event: CustomEvent<{ value: number }>) => void;
|
|
4152
|
+
/** The thumb moved. Fires per step during a drag or a key press. */
|
|
4153
|
+
onKaiInput?: (event: CustomEvent<{ value: number }>) => void;
|
|
4154
|
+
}
|
|
4155
|
+
|
|
3740
4156
|
export interface KaiSourceElementEvents {
|
|
3741
4157
|
|
|
3742
4158
|
}
|
|
@@ -3809,36 +4225,24 @@ export interface KaiVoiceInputElementEvents {
|
|
|
3809
4225
|
onKaiTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
3810
4226
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
3811
4227
|
onKaiTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
4228
|
+
/** A voice session failed, so no failure is ever silent. `detail.source` names the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on `<kai-voice-output>`), `detail.error` carries the platform error code, the thrown exception's name, or `no-result` when recognition ended with no error and no text (the user said nothing), and `detail.message` is human-readable. Deliberate cancellation does not fire. */
|
|
4229
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
3812
4230
|
}
|
|
3813
4231
|
|
|
3814
4232
|
export interface KaiVoiceOutputElementEvents {
|
|
3815
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
4233
|
+
/** Playback started or stopped. Drive your own UI in sync. `speaking: true` fires when audio actually starts (utterance.onstart natively; audio playback beginning on the `synthesize` path), not when speak() is called; earlier releases fired it optimistically inside speak() itself. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
3816
4234
|
onKaiSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
3817
4235
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
3818
4236
|
onKaiSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
4237
|
+
/** A voice session failed, so no failure is ever silent. `detail.source` names the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on `<kai-voice-output>`), `detail.error` carries the platform error code, the thrown exception's name, or `no-result` when recognition ended with no error and no text (the user said nothing), and `detail.message` is human-readable. Deliberate cancellation does not fire. */
|
|
4238
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
3819
4239
|
}
|
|
3820
4240
|
|
|
3821
4241
|
export interface KaiWorkspaceElementEvents {
|
|
3822
|
-
/**
|
|
3823
|
-
|
|
3824
|
-
/** An
|
|
3825
|
-
|
|
3826
|
-
/** The header model switcher changed. */
|
|
3827
|
-
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3828
|
-
/** The "New chat" button was clicked. */
|
|
3829
|
-
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3830
|
-
/** The Search button was clicked. */
|
|
3831
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3832
|
-
/** The sidebar was collapsed or expanded. */
|
|
3833
|
-
onKaiSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3834
|
-
/** User submitted a message. */
|
|
3835
|
-
onKaiSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3836
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
3837
|
-
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
3838
|
-
/** Fired on every input change. */
|
|
3839
|
-
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3840
|
-
/** The Mic / voice button was clicked. */
|
|
3841
|
-
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
4242
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
4243
|
+
onKaiAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
4244
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
4245
|
+
onKaiAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
3842
4246
|
}
|
|
3843
4247
|
|
|
3844
4248
|
/** Attributes every kai-* element tolerates in a Vue template on top of its own
|
|
@@ -3880,6 +4284,10 @@ declare module 'vue' {
|
|
|
3880
4284
|
KaiChainOfThought: KaiVueElement<KaiChainOfThoughtElementProps, KaiChainOfThoughtElementEvents>;
|
|
3881
4285
|
'kai-chat': KaiVueElement<KaiChatElementProps, KaiChatElementEvents>;
|
|
3882
4286
|
KaiChat: KaiVueElement<KaiChatElementProps, KaiChatElementEvents>;
|
|
4287
|
+
'kai-checkbox': KaiVueElement<KaiCheckboxElementProps, KaiCheckboxElementEvents>;
|
|
4288
|
+
KaiCheckbox: KaiVueElement<KaiCheckboxElementProps, KaiCheckboxElementEvents>;
|
|
4289
|
+
'kai-checkbox-group': KaiVueElement<KaiCheckboxGroupElementProps, KaiCheckboxGroupElementEvents>;
|
|
4290
|
+
KaiCheckboxGroup: KaiVueElement<KaiCheckboxGroupElementProps, KaiCheckboxGroupElementEvents>;
|
|
3883
4291
|
'kai-checkpoint': KaiVueElement<KaiCheckpointElementProps, KaiCheckpointElementEvents>;
|
|
3884
4292
|
KaiCheckpoint: KaiVueElement<KaiCheckpointElementProps, KaiCheckpointElementEvents>;
|
|
3885
4293
|
'kai-choice': KaiVueElement<KaiChoiceElementProps, KaiChoiceElementEvents>;
|
|
@@ -3898,10 +4306,16 @@ declare module 'vue' {
|
|
|
3898
4306
|
KaiConfirm: KaiVueElement<KaiConfirmElementProps, KaiConfirmElementEvents>;
|
|
3899
4307
|
'kai-context': KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3900
4308
|
KaiContext: KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
4309
|
+
'kai-conversation-item': KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
4310
|
+
KaiConversationItem: KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3901
4311
|
'kai-conversations': KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3902
4312
|
KaiConversations: KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3903
4313
|
'kai-dialog': KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3904
4314
|
KaiDialog: KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
4315
|
+
'kai-dock': KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
4316
|
+
KaiDock: KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
4317
|
+
'kai-dropdown': KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
4318
|
+
KaiDropdown: KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3905
4319
|
'kai-editable-label': KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3906
4320
|
KaiEditableLabel: KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3907
4321
|
'kai-embed': KaiVueElement<KaiEmbedElementProps, KaiEmbedElementEvents>;
|
|
@@ -3944,6 +4358,8 @@ declare module 'vue' {
|
|
|
3944
4358
|
KaiNotice: KaiVueElement<KaiNoticeElementProps, KaiNoticeElementEvents>;
|
|
3945
4359
|
'kai-pane': KaiVueElement<KaiPaneElementProps, KaiPaneElementEvents>;
|
|
3946
4360
|
KaiPane: KaiVueElement<KaiPaneElementProps, KaiPaneElementEvents>;
|
|
4361
|
+
'kai-pane-grid': KaiVueElement<KaiPaneGridElementProps, KaiPaneGridElementEvents>;
|
|
4362
|
+
KaiPaneGrid: KaiVueElement<KaiPaneGridElementProps, KaiPaneGridElementEvents>;
|
|
3947
4363
|
'kai-pane-group': KaiVueElement<KaiPaneGroupElementProps, KaiPaneGroupElementEvents>;
|
|
3948
4364
|
KaiPaneGroup: KaiVueElement<KaiPaneGroupElementProps, KaiPaneGroupElementEvents>;
|
|
3949
4365
|
'kai-popover': KaiVueElement<KaiPopoverElementProps, KaiPopoverElementEvents>;
|
|
@@ -3954,6 +4370,8 @@ declare module 'vue' {
|
|
|
3954
4370
|
KaiPromptDock: KaiVueElement<KaiPromptDockElementProps, KaiPromptDockElementEvents>;
|
|
3955
4371
|
'kai-prompt-input': KaiVueElement<KaiPromptInputElementProps, KaiPromptInputElementEvents>;
|
|
3956
4372
|
KaiPromptInput: KaiVueElement<KaiPromptInputElementProps, KaiPromptInputElementEvents>;
|
|
4373
|
+
'kai-radio-group': KaiVueElement<KaiRadioGroupElementProps, KaiRadioGroupElementEvents>;
|
|
4374
|
+
KaiRadioGroup: KaiVueElement<KaiRadioGroupElementProps, KaiRadioGroupElementEvents>;
|
|
3957
4375
|
'kai-reasoning': KaiVueElement<KaiReasoningElementProps, KaiReasoningElementEvents>;
|
|
3958
4376
|
KaiReasoning: KaiVueElement<KaiReasoningElementProps, KaiReasoningElementEvents>;
|
|
3959
4377
|
'kai-remote': KaiVueElement<KaiRemoteElementProps, KaiRemoteElementEvents>;
|
|
@@ -3976,6 +4394,8 @@ declare module 'vue' {
|
|
|
3976
4394
|
KaiSearch: KaiVueElement<KaiSearchElementProps, KaiSearchElementEvents>;
|
|
3977
4395
|
'kai-segmented': KaiVueElement<KaiSegmentedElementProps, KaiSegmentedElementEvents>;
|
|
3978
4396
|
KaiSegmented: KaiVueElement<KaiSegmentedElementProps, KaiSegmentedElementEvents>;
|
|
4397
|
+
'kai-select': KaiVueElement<KaiSelectElementProps, KaiSelectElementEvents>;
|
|
4398
|
+
KaiSelect: KaiVueElement<KaiSelectElementProps, KaiSelectElementEvents>;
|
|
3979
4399
|
'kai-separator': KaiVueElement<KaiSeparatorElementProps, KaiSeparatorElementEvents>;
|
|
3980
4400
|
KaiSeparator: KaiVueElement<KaiSeparatorElementProps, KaiSeparatorElementEvents>;
|
|
3981
4401
|
'kai-setting-item': KaiVueElement<KaiSettingItemElementProps, KaiSettingItemElementEvents>;
|
|
@@ -3986,6 +4406,8 @@ declare module 'vue' {
|
|
|
3986
4406
|
KaiSkeleton: KaiVueElement<KaiSkeletonElementProps, KaiSkeletonElementEvents>;
|
|
3987
4407
|
'kai-skills': KaiVueElement<KaiSkillsElementProps, KaiSkillsElementEvents>;
|
|
3988
4408
|
KaiSkills: KaiVueElement<KaiSkillsElementProps, KaiSkillsElementEvents>;
|
|
4409
|
+
'kai-slider': KaiVueElement<KaiSliderElementProps, KaiSliderElementEvents>;
|
|
4410
|
+
KaiSlider: KaiVueElement<KaiSliderElementProps, KaiSliderElementEvents>;
|
|
3989
4411
|
'kai-source': KaiVueElement<KaiSourceElementProps, KaiSourceElementEvents>;
|
|
3990
4412
|
KaiSource: KaiVueElement<KaiSourceElementProps, KaiSourceElementEvents>;
|
|
3991
4413
|
'kai-sources': KaiVueElement<KaiSourcesElementProps, KaiSourcesElementEvents>;
|