@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
|
@@ -198,7 +198,7 @@ export interface KaiArtifactElement extends HTMLElement {
|
|
|
198
198
|
export interface KaiAttachmentsElement extends HTMLElement {
|
|
199
199
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
200
200
|
theme?: "light" | "dark" | "auto";
|
|
201
|
-
/** 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). */
|
|
201
|
+
/** 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. */
|
|
202
202
|
items: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
203
203
|
/** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
|
|
204
204
|
variant?: "grid" | "inline" | "list";
|
|
@@ -237,12 +237,14 @@ export interface KaiAudioVisualizerElement extends HTMLElement {
|
|
|
237
237
|
complexity?: number;
|
|
238
238
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
239
239
|
label?: string;
|
|
240
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
240
|
+
/** 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. */
|
|
241
241
|
stream?: MediaStream;
|
|
242
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
242
|
+
/** 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. */
|
|
243
243
|
audioElement?: HTMLMediaElement;
|
|
244
|
-
/** 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. */
|
|
244
|
+
/** 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. */
|
|
245
245
|
bands?: number[];
|
|
246
|
+
/** 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). */
|
|
247
|
+
listeningAmplitude?: boolean;
|
|
246
248
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
247
249
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
248
250
|
/** 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`. */
|
|
@@ -331,7 +333,7 @@ export interface KaiCardsElement extends HTMLElement {
|
|
|
331
333
|
/** 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. */
|
|
332
334
|
schemas?: Record<string, object>;
|
|
333
335
|
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
334
|
-
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" };
|
|
336
|
+
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" };
|
|
335
337
|
/** 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. */
|
|
336
338
|
validateCards?: boolean;
|
|
337
339
|
/** 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. */
|
|
@@ -364,8 +366,6 @@ export interface KaiChainOfThoughtElement extends HTMLElement {
|
|
|
364
366
|
export interface KaiChatElement extends HTMLElement {
|
|
365
367
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
366
368
|
theme?: "light" | "dark" | "auto";
|
|
367
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
368
|
-
search?: boolean;
|
|
369
369
|
/** 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. */
|
|
370
370
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
371
371
|
/** Placeholder text shown in the empty input. */
|
|
@@ -384,6 +384,10 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
384
384
|
codeTheme?: string;
|
|
385
385
|
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
386
386
|
codeHighlight?: boolean;
|
|
387
|
+
/** 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`. */
|
|
388
|
+
reasoning?: "full" | "compact" | "off";
|
|
389
|
+
/** 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`. */
|
|
390
|
+
reasoningOpen?: boolean;
|
|
387
391
|
/** Optional header title shown on the left of the header. */
|
|
388
392
|
chatTitle?: string;
|
|
389
393
|
/** Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection. */
|
|
@@ -410,6 +414,10 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
410
414
|
composerActions?: boolean;
|
|
411
415
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
412
416
|
footer?: boolean;
|
|
417
|
+
/** 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. */
|
|
418
|
+
attach?: boolean;
|
|
419
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
420
|
+
webSearch?: boolean;
|
|
413
421
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
414
422
|
voice?: boolean;
|
|
415
423
|
/** 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. */
|
|
@@ -438,6 +446,48 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
438
446
|
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
439
447
|
}
|
|
440
448
|
|
|
449
|
+
export interface KaiCheckboxElement extends HTMLElement {
|
|
450
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
451
|
+
theme?: "light" | "dark" | "auto";
|
|
452
|
+
/** 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. */
|
|
453
|
+
checked?: boolean;
|
|
454
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on. */
|
|
455
|
+
defaultChecked?: boolean;
|
|
456
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`. */
|
|
457
|
+
indeterminate?: boolean;
|
|
458
|
+
/** Disable interaction. */
|
|
459
|
+
disabled?: boolean;
|
|
460
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's. */
|
|
461
|
+
required?: boolean;
|
|
462
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
463
|
+
label?: string;
|
|
464
|
+
/** Form-control name (paired with `value`). */
|
|
465
|
+
name?: string;
|
|
466
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
467
|
+
value?: string;
|
|
468
|
+
/** Flip the box and fire `kai-change` (no-op while disabled). */
|
|
469
|
+
toggle(): void;
|
|
470
|
+
/** Focus the inner input (the host element can't reach it). */
|
|
471
|
+
focus(options?: FocusOptions): void;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export interface KaiCheckboxGroupElement extends HTMLElement {
|
|
475
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
476
|
+
theme?: "light" | "dark" | "auto";
|
|
477
|
+
/** 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. */
|
|
478
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
479
|
+
/** 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`. */
|
|
480
|
+
value?: string;
|
|
481
|
+
/** 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. */
|
|
482
|
+
name?: string;
|
|
483
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
484
|
+
disabled?: boolean;
|
|
485
|
+
/** Accessible name for the group. */
|
|
486
|
+
label?: string;
|
|
487
|
+
/** 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. */
|
|
488
|
+
focus(options?: FocusOptions): void;
|
|
489
|
+
}
|
|
490
|
+
|
|
441
491
|
export interface KaiCheckpointElement extends HTMLElement {
|
|
442
492
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
443
493
|
theme?: "light" | "dark" | "auto";
|
|
@@ -516,6 +566,8 @@ export interface KaiCodeBlockElement extends HTMLElement {
|
|
|
516
566
|
codeTheme?: string;
|
|
517
567
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
518
568
|
codeHighlight?: boolean;
|
|
569
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
570
|
+
copy?: boolean;
|
|
519
571
|
/** Code text sizing. */
|
|
520
572
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
521
573
|
}
|
|
@@ -627,19 +679,32 @@ export interface KaiContextElement extends HTMLElement {
|
|
|
627
679
|
dangerThreshold?: number;
|
|
628
680
|
}
|
|
629
681
|
|
|
682
|
+
export interface KaiConversationItemElement extends HTMLElement {
|
|
683
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
684
|
+
theme?: "light" | "dark" | "auto";
|
|
685
|
+
/** 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. */
|
|
686
|
+
conversationId?: string;
|
|
687
|
+
/** 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. */
|
|
688
|
+
active?: boolean;
|
|
689
|
+
/** Dense single-line row padding. */
|
|
690
|
+
compact?: boolean;
|
|
691
|
+
}
|
|
692
|
+
|
|
630
693
|
export interface KaiConversationsElement extends HTMLElement {
|
|
631
694
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
632
695
|
theme?: "light" | "dark" | "auto";
|
|
633
696
|
/** 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. */
|
|
634
697
|
groups: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
635
|
-
/** 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. */
|
|
636
|
-
conversations: { id: string; title: string; groupId?: string; scope
|
|
698
|
+
/** 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. */
|
|
699
|
+
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 }[];
|
|
637
700
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
638
701
|
activeId?: string;
|
|
639
702
|
/** 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. */
|
|
640
703
|
collapsed?: boolean;
|
|
641
704
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
642
705
|
defaultCollapsed?: boolean;
|
|
706
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
707
|
+
compact?: boolean;
|
|
643
708
|
/** Focus the built-in search input inside the shadow root. */
|
|
644
709
|
focus(options?: FocusOptions): void;
|
|
645
710
|
/** Clear the internal search query (resets the list filter) and fire kai-search with an empty string. */
|
|
@@ -661,6 +726,8 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
661
726
|
open?: boolean;
|
|
662
727
|
/** Initial open state on mount (uncontrolled seed). */
|
|
663
728
|
defaultOpen?: boolean;
|
|
729
|
+
/** 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. */
|
|
730
|
+
label?: string;
|
|
664
731
|
/** Open it programmatically (no-op while disabled). */
|
|
665
732
|
show(): void;
|
|
666
733
|
/** Close it programmatically. */
|
|
@@ -671,6 +738,66 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
671
738
|
focus(options?: FocusOptions): void;
|
|
672
739
|
}
|
|
673
740
|
|
|
741
|
+
export interface KaiDockElement extends HTMLElement {
|
|
742
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
743
|
+
theme?: "light" | "dark" | "auto";
|
|
744
|
+
/** 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`. */
|
|
745
|
+
open?: boolean;
|
|
746
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
747
|
+
defaultOpen?: boolean;
|
|
748
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
749
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
750
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
751
|
+
label?: string;
|
|
752
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
753
|
+
openLabel?: string;
|
|
754
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
755
|
+
closeLabel?: string;
|
|
756
|
+
/** 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. */
|
|
757
|
+
unread?: boolean;
|
|
758
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
759
|
+
disabled?: boolean;
|
|
760
|
+
/** 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`. */
|
|
761
|
+
hideClose?: boolean;
|
|
762
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
763
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
764
|
+
/** Open it programmatically (no-op while disabled). */
|
|
765
|
+
show(): void;
|
|
766
|
+
/** Close it programmatically. */
|
|
767
|
+
hide(): void;
|
|
768
|
+
/** Flip the open state (closes while disabled). */
|
|
769
|
+
toggle(): void;
|
|
770
|
+
/** Move focus to the panel while open, or to the launcher while closed. */
|
|
771
|
+
focus(options?: FocusOptions): void;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
export interface KaiDropdownElement extends HTMLElement {
|
|
775
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
776
|
+
theme?: "light" | "dark" | "auto";
|
|
777
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
778
|
+
triggerIcon?: string;
|
|
779
|
+
/** 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. */
|
|
780
|
+
triggerLabel?: string;
|
|
781
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
782
|
+
triggerIconTrailing?: string;
|
|
783
|
+
/** 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. */
|
|
784
|
+
label?: string;
|
|
785
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
786
|
+
full?: boolean;
|
|
787
|
+
/** 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`. */
|
|
788
|
+
open?: boolean;
|
|
789
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
790
|
+
defaultOpen?: boolean;
|
|
791
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
792
|
+
disabled?: boolean;
|
|
793
|
+
/** Open it programmatically (no-op while disabled). */
|
|
794
|
+
show(): void;
|
|
795
|
+
/** Close it programmatically. */
|
|
796
|
+
hide(): void;
|
|
797
|
+
/** Flip the open state (closes while disabled). */
|
|
798
|
+
toggle(): void;
|
|
799
|
+
}
|
|
800
|
+
|
|
674
801
|
export interface KaiEditableLabelElement extends HTMLElement {
|
|
675
802
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
676
803
|
theme?: "light" | "dark" | "auto";
|
|
@@ -757,7 +884,7 @@ export interface KaiFormElement extends HTMLElement {
|
|
|
757
884
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
758
885
|
theme?: "light" | "dark" | "auto";
|
|
759
886
|
/** 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. */
|
|
760
|
-
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" }[] };
|
|
887
|
+
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" }[] };
|
|
761
888
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
762
889
|
cardId?: string;
|
|
763
890
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -834,7 +961,7 @@ export interface KaiInputElement extends HTMLElement {
|
|
|
834
961
|
theme?: "light" | "dark" | "auto";
|
|
835
962
|
/** Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only. */
|
|
836
963
|
type?: string;
|
|
837
|
-
/** Controlled value
|
|
964
|
+
/** 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`. */
|
|
838
965
|
value?: string;
|
|
839
966
|
/** Placeholder shown when empty. */
|
|
840
967
|
placeholder?: string;
|
|
@@ -860,11 +987,25 @@ export interface KaiInputElement extends HTMLElement {
|
|
|
860
987
|
autocomplete?: string;
|
|
861
988
|
/** Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`). */
|
|
862
989
|
inputmode?: string;
|
|
990
|
+
/** 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. */
|
|
991
|
+
format?: string;
|
|
992
|
+
/** 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. */
|
|
993
|
+
guide?: string;
|
|
994
|
+
/** 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. */
|
|
995
|
+
semantic?: "credit-card" | "custom" | "ssn" | "tel";
|
|
996
|
+
/** Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`. */
|
|
997
|
+
caseMode?: "preserve" | "upper" | "lower";
|
|
998
|
+
/** What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`. */
|
|
999
|
+
copyPolicy?: "formatted" | "canonical" | "obscured" | "blocked";
|
|
863
1000
|
/** Focus the inner input (the host can't reach into the shadow root). */
|
|
864
1001
|
focus(options?: FocusOptions): void;
|
|
865
1002
|
/** Select the inner input's text. */
|
|
866
1003
|
select(): void;
|
|
867
|
-
/**
|
|
1004
|
+
/** 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. */
|
|
1005
|
+
getRawValue(): string;
|
|
1006
|
+
/** 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. */
|
|
1007
|
+
getFormattedValue(): string;
|
|
1008
|
+
/** 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. */
|
|
868
1009
|
clear(): void;
|
|
869
1010
|
}
|
|
870
1011
|
|
|
@@ -927,6 +1068,8 @@ export interface KaiMenuElement extends HTMLElement {
|
|
|
927
1068
|
triggerIconTrailing?: string;
|
|
928
1069
|
/** 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. */
|
|
929
1070
|
label?: string;
|
|
1071
|
+
/** 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`. */
|
|
1072
|
+
full?: boolean;
|
|
930
1073
|
/** 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`. */
|
|
931
1074
|
open?: boolean;
|
|
932
1075
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -1038,6 +1181,21 @@ export interface KaiPaneElement extends HTMLElement {
|
|
|
1038
1181
|
status?: { tone: "working" | "idle" | "done" | "error" | "blocked"; label?: string; pulse?: boolean };
|
|
1039
1182
|
}
|
|
1040
1183
|
|
|
1184
|
+
export interface KaiPaneGridElement extends HTMLElement {
|
|
1185
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1186
|
+
theme?: "light" | "dark" | "auto";
|
|
1187
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`. */
|
|
1188
|
+
minPaneWidth?: number;
|
|
1189
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`. */
|
|
1190
|
+
minPaneHeight?: number;
|
|
1191
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
1192
|
+
maxColumns?: number;
|
|
1193
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
1194
|
+
gap?: string;
|
|
1195
|
+
/** 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`. */
|
|
1196
|
+
maximizedIndex?: number | null;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1041
1199
|
export interface KaiPaneGroupElement extends HTMLElement {
|
|
1042
1200
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1043
1201
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1111,8 +1269,8 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1111
1269
|
suggestions?: string[];
|
|
1112
1270
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1113
1271
|
suggestionMode?: "submit" | "fill";
|
|
1114
|
-
/** Show a
|
|
1115
|
-
|
|
1272
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1273
|
+
webSearch?: boolean;
|
|
1116
1274
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1117
1275
|
voice?: boolean;
|
|
1118
1276
|
/** 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`. */
|
|
@@ -1121,7 +1279,7 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1121
1279
|
submit?: "always" | "auto";
|
|
1122
1280
|
/** 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`. */
|
|
1123
1281
|
attach?: boolean;
|
|
1124
|
-
/** 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). */
|
|
1282
|
+
/** 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.) */
|
|
1125
1283
|
attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
1126
1284
|
/** 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. */
|
|
1127
1285
|
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
@@ -1137,6 +1295,23 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1137
1295
|
send(): void;
|
|
1138
1296
|
}
|
|
1139
1297
|
|
|
1298
|
+
export interface KaiRadioGroupElement extends HTMLElement {
|
|
1299
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1300
|
+
theme?: "light" | "dark" | "auto";
|
|
1301
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
1302
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
1303
|
+
/** 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. */
|
|
1304
|
+
value?: string;
|
|
1305
|
+
/** 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. */
|
|
1306
|
+
name?: string;
|
|
1307
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
1308
|
+
disabled?: boolean;
|
|
1309
|
+
/** Accessible name for the group. */
|
|
1310
|
+
label?: string;
|
|
1311
|
+
/** Focus the group's tab stop. That is the selected radio, or the first row when nothing is selected yet. */
|
|
1312
|
+
focus(options?: FocusOptions): void;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1140
1315
|
export interface KaiReasoningElement extends HTMLElement {
|
|
1141
1316
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1142
1317
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1282,6 +1457,10 @@ export interface KaiScrollButtonElement extends HTMLElement {
|
|
|
1282
1457
|
variant?: "outline" | "ghost" | "default";
|
|
1283
1458
|
/** Button size token. Defaults to `'icon'` (square). */
|
|
1284
1459
|
size?: "sm" | "md" | "lg" | "icon" | "icon-sm";
|
|
1460
|
+
/** 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'`. */
|
|
1461
|
+
label?: string;
|
|
1462
|
+
/** 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. */
|
|
1463
|
+
showLabel?: boolean;
|
|
1285
1464
|
}
|
|
1286
1465
|
|
|
1287
1466
|
export interface KaiSearchElement extends HTMLElement {
|
|
@@ -1316,6 +1495,31 @@ export interface KaiSegmentedElement extends HTMLElement {
|
|
|
1316
1495
|
size?: "sm" | "md";
|
|
1317
1496
|
}
|
|
1318
1497
|
|
|
1498
|
+
export interface KaiSelectElement extends HTMLElement {
|
|
1499
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1500
|
+
theme?: "light" | "dark" | "auto";
|
|
1501
|
+
/** 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. */
|
|
1502
|
+
options: { value: string; label?: undefined | string; disabled?: undefined | boolean }[];
|
|
1503
|
+
/** 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. */
|
|
1504
|
+
value?: string;
|
|
1505
|
+
/** 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. */
|
|
1506
|
+
placeholder?: string;
|
|
1507
|
+
/** Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn. */
|
|
1508
|
+
multiple?: boolean;
|
|
1509
|
+
/** Force the invalid (destructive-border) state. */
|
|
1510
|
+
invalid?: boolean;
|
|
1511
|
+
/** Disable interaction. */
|
|
1512
|
+
disabled?: boolean;
|
|
1513
|
+
/** Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's. */
|
|
1514
|
+
required?: boolean;
|
|
1515
|
+
/** Accessible label for the control. */
|
|
1516
|
+
label?: string;
|
|
1517
|
+
/** Form-control name, for a native form submit. */
|
|
1518
|
+
name?: string;
|
|
1519
|
+
/** Focus the inner select (the host element can't reach it). */
|
|
1520
|
+
focus(options?: FocusOptions): void;
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1319
1523
|
export interface KaiSeparatorElement extends HTMLElement {
|
|
1320
1524
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1321
1525
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1361,6 +1565,29 @@ export interface KaiSkillsElement extends HTMLElement {
|
|
|
1361
1565
|
skills: { id: string; name: string }[];
|
|
1362
1566
|
}
|
|
1363
1567
|
|
|
1568
|
+
export interface KaiSliderElement extends HTMLElement {
|
|
1569
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1570
|
+
theme?: "light" | "dark" | "auto";
|
|
1571
|
+
/** Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means. */
|
|
1572
|
+
min?: number;
|
|
1573
|
+
/** Highest selectable value. Required, for the same reason as `min`. */
|
|
1574
|
+
max?: number;
|
|
1575
|
+
/** Granularity. Omitted means the native default of 1; `any` means continuous. */
|
|
1576
|
+
step?: number | "any";
|
|
1577
|
+
/** 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. */
|
|
1578
|
+
value?: number;
|
|
1579
|
+
/** Disable interaction. */
|
|
1580
|
+
disabled?: boolean;
|
|
1581
|
+
/** Accessible label for the slider. */
|
|
1582
|
+
label?: string;
|
|
1583
|
+
/** Form-control name, for a native form submit. */
|
|
1584
|
+
name?: string;
|
|
1585
|
+
/** 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. */
|
|
1586
|
+
valueLabel?: boolean | ((value: number) => string);
|
|
1587
|
+
/** Focus the inner range input (the host element can't reach it). */
|
|
1588
|
+
focus(options?: FocusOptions): void;
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1364
1591
|
export interface KaiSourceElement extends HTMLElement {
|
|
1365
1592
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1366
1593
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1546,7 +1773,7 @@ export interface KaiThreadElement extends HTMLElement {
|
|
|
1546
1773
|
export interface KaiToastRegionElement extends HTMLElement {
|
|
1547
1774
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1548
1775
|
theme?: "light" | "dark" | "auto";
|
|
1549
|
-
/** 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. */
|
|
1776
|
+
/** 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. */
|
|
1550
1777
|
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 }[];
|
|
1551
1778
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
1552
1779
|
position?: "top-center" | "top-right" | "top-left" | "bottom-center" | "bottom-right" | "bottom-left";
|
|
@@ -1647,67 +1874,26 @@ export interface KaiVoiceOutputElement extends HTMLElement {
|
|
|
1647
1874
|
export interface KaiWorkspaceElement extends HTMLElement {
|
|
1648
1875
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1649
1876
|
theme?: "light" | "dark" | "auto";
|
|
1650
|
-
/**
|
|
1651
|
-
|
|
1652
|
-
/**
|
|
1653
|
-
|
|
1654
|
-
/**
|
|
1655
|
-
|
|
1656
|
-
/**
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
placeholder?: string;
|
|
1660
|
-
loading?: boolean;
|
|
1661
|
-
suggestions?: string[];
|
|
1662
|
-
suggestionMode?: "submit" | "fill";
|
|
1663
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1664
|
-
codeTheme?: string;
|
|
1665
|
-
codeHighlight?: boolean;
|
|
1666
|
-
chatTitle?: string;
|
|
1667
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1668
|
-
currentModel?: string;
|
|
1669
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1670
|
-
scrollButton?: boolean;
|
|
1671
|
-
search?: boolean;
|
|
1672
|
-
voice?: boolean;
|
|
1673
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1674
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1675
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1676
|
-
kindIcons?: Record<string, string>;
|
|
1677
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1678
|
-
sidebarWidth?: number;
|
|
1679
|
-
/** Sidebar min width in px (default 240). */
|
|
1680
|
-
sidebarMinWidth?: number;
|
|
1681
|
-
/** Sidebar max width in px (default 420). */
|
|
1682
|
-
sidebarMaxWidth?: number;
|
|
1683
|
-
/** 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). */
|
|
1684
|
-
sidebarCollapsed?: boolean;
|
|
1685
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1686
|
-
defaultSidebarCollapsed?: boolean;
|
|
1687
|
-
/** 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`. */
|
|
1877
|
+
/** 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). */
|
|
1878
|
+
startCollapsed?: boolean;
|
|
1879
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
1880
|
+
defaultStartCollapsed?: boolean;
|
|
1881
|
+
/** 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). */
|
|
1882
|
+
endCollapsed?: boolean;
|
|
1883
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
1884
|
+
defaultEndCollapsed?: boolean;
|
|
1885
|
+
/** 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`. */
|
|
1688
1886
|
collapseBelow?: number;
|
|
1689
|
-
/**
|
|
1887
|
+
/** 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`. */
|
|
1888
|
+
drawerBelow?: number;
|
|
1889
|
+
/** 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. */
|
|
1690
1890
|
compact?: boolean;
|
|
1691
|
-
/**
|
|
1692
|
-
|
|
1693
|
-
/**
|
|
1694
|
-
|
|
1695
|
-
/**
|
|
1696
|
-
|
|
1697
|
-
/** Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`. */
|
|
1698
|
-
toggleSidebar(): void;
|
|
1699
|
-
/** Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`). */
|
|
1700
|
-
collapseSidebar(): void;
|
|
1701
|
-
/** Force the conversation sidebar expanded (fires `kai-sidebar-toggle`). */
|
|
1702
|
-
expandSidebar(): void;
|
|
1703
|
-
/** Focus the thread's composer. */
|
|
1704
|
-
focus(options?: FocusOptions): void;
|
|
1705
|
-
/** Clear the thread draft + staged attachments. */
|
|
1706
|
-
clear(): void;
|
|
1707
|
-
/** Submit the current thread draft programmatically (fires `kai-submit`). */
|
|
1708
|
-
send(): void;
|
|
1709
|
-
/** Scroll the thread to the newest message. */
|
|
1710
|
-
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
1891
|
+
/** Collapse/expand one aside (fires `kai-aside-toggle`). */
|
|
1892
|
+
toggleAside(side: "start" | "end"): void;
|
|
1893
|
+
/** Force one aside collapsed (fires `kai-aside-toggle`). */
|
|
1894
|
+
collapseAside(side: "start" | "end"): void;
|
|
1895
|
+
/** Force one aside expanded (fires `kai-aside-toggle`). */
|
|
1896
|
+
expandAside(side: "start" | "end"): void;
|
|
1711
1897
|
}
|
|
1712
1898
|
|
|
1713
1899
|
declare global {
|
|
@@ -1723,6 +1909,8 @@ declare global {
|
|
|
1723
1909
|
'kai-cards': KaiCardsElement;
|
|
1724
1910
|
'kai-chain-of-thought': KaiChainOfThoughtElement;
|
|
1725
1911
|
'kai-chat': KaiChatElement;
|
|
1912
|
+
'kai-checkbox': KaiCheckboxElement;
|
|
1913
|
+
'kai-checkbox-group': KaiCheckboxGroupElement;
|
|
1726
1914
|
'kai-checkpoint': KaiCheckpointElement;
|
|
1727
1915
|
'kai-choice': KaiChoiceElement;
|
|
1728
1916
|
'kai-coachmark': KaiCoachmarkElement;
|
|
@@ -1732,8 +1920,11 @@ declare global {
|
|
|
1732
1920
|
'kai-composer': KaiComposerElement;
|
|
1733
1921
|
'kai-confirm': KaiConfirmElement;
|
|
1734
1922
|
'kai-context': KaiContextElement;
|
|
1923
|
+
'kai-conversation-item': KaiConversationItemElement;
|
|
1735
1924
|
'kai-conversations': KaiConversationsElement;
|
|
1736
1925
|
'kai-dialog': KaiDialogElement;
|
|
1926
|
+
'kai-dock': KaiDockElement;
|
|
1927
|
+
'kai-dropdown': KaiDropdownElement;
|
|
1737
1928
|
'kai-editable-label': KaiEditableLabelElement;
|
|
1738
1929
|
'kai-embed': KaiEmbedElement;
|
|
1739
1930
|
'kai-empty': KaiEmptyElement;
|
|
@@ -1755,11 +1946,13 @@ declare global {
|
|
|
1755
1946
|
'kai-nav': KaiNavElement;
|
|
1756
1947
|
'kai-notice': KaiNoticeElement;
|
|
1757
1948
|
'kai-pane': KaiPaneElement;
|
|
1949
|
+
'kai-pane-grid': KaiPaneGridElement;
|
|
1758
1950
|
'kai-pane-group': KaiPaneGroupElement;
|
|
1759
1951
|
'kai-popover': KaiPopoverElement;
|
|
1760
1952
|
'kai-progress-bar': KaiProgressBarElement;
|
|
1761
1953
|
'kai-prompt-dock': KaiPromptDockElement;
|
|
1762
1954
|
'kai-prompt-input': KaiPromptInputElement;
|
|
1955
|
+
'kai-radio-group': KaiRadioGroupElement;
|
|
1763
1956
|
'kai-reasoning': KaiReasoningElement;
|
|
1764
1957
|
'kai-remote': KaiRemoteElement;
|
|
1765
1958
|
'kai-resizable': KaiResizableElement;
|
|
@@ -1771,11 +1964,13 @@ declare global {
|
|
|
1771
1964
|
'kai-scroll-button': KaiScrollButtonElement;
|
|
1772
1965
|
'kai-search': KaiSearchElement;
|
|
1773
1966
|
'kai-segmented': KaiSegmentedElement;
|
|
1967
|
+
'kai-select': KaiSelectElement;
|
|
1774
1968
|
'kai-separator': KaiSeparatorElement;
|
|
1775
1969
|
'kai-setting-item': KaiSettingItemElement;
|
|
1776
1970
|
'kai-settings-group': KaiSettingsGroupElement;
|
|
1777
1971
|
'kai-skeleton': KaiSkeletonElement;
|
|
1778
1972
|
'kai-skills': KaiSkillsElement;
|
|
1973
|
+
'kai-slider': KaiSliderElement;
|
|
1779
1974
|
'kai-source': KaiSourceElement;
|
|
1780
1975
|
'kai-sources': KaiSourcesElement;
|
|
1781
1976
|
'kai-status': KaiStatusElement;
|
|
@@ -1821,6 +2016,8 @@ declare module 'react' {
|
|
|
1821
2016
|
'kai-cards': KaiElementJsxProps;
|
|
1822
2017
|
'kai-chain-of-thought': KaiElementJsxProps;
|
|
1823
2018
|
'kai-chat': KaiElementJsxProps;
|
|
2019
|
+
'kai-checkbox': KaiElementJsxProps;
|
|
2020
|
+
'kai-checkbox-group': KaiElementJsxProps;
|
|
1824
2021
|
'kai-checkpoint': KaiElementJsxProps;
|
|
1825
2022
|
'kai-choice': KaiElementJsxProps;
|
|
1826
2023
|
'kai-coachmark': KaiElementJsxProps;
|
|
@@ -1830,8 +2027,11 @@ declare module 'react' {
|
|
|
1830
2027
|
'kai-composer': KaiElementJsxProps;
|
|
1831
2028
|
'kai-confirm': KaiElementJsxProps;
|
|
1832
2029
|
'kai-context': KaiElementJsxProps;
|
|
2030
|
+
'kai-conversation-item': KaiElementJsxProps;
|
|
1833
2031
|
'kai-conversations': KaiElementJsxProps;
|
|
1834
2032
|
'kai-dialog': KaiElementJsxProps;
|
|
2033
|
+
'kai-dock': KaiElementJsxProps;
|
|
2034
|
+
'kai-dropdown': KaiElementJsxProps;
|
|
1835
2035
|
'kai-editable-label': KaiElementJsxProps;
|
|
1836
2036
|
'kai-embed': KaiElementJsxProps;
|
|
1837
2037
|
'kai-empty': KaiElementJsxProps;
|
|
@@ -1853,11 +2053,13 @@ declare module 'react' {
|
|
|
1853
2053
|
'kai-nav': KaiElementJsxProps;
|
|
1854
2054
|
'kai-notice': KaiElementJsxProps;
|
|
1855
2055
|
'kai-pane': KaiElementJsxProps;
|
|
2056
|
+
'kai-pane-grid': KaiElementJsxProps;
|
|
1856
2057
|
'kai-pane-group': KaiElementJsxProps;
|
|
1857
2058
|
'kai-popover': KaiElementJsxProps;
|
|
1858
2059
|
'kai-progress-bar': KaiElementJsxProps;
|
|
1859
2060
|
'kai-prompt-dock': KaiElementJsxProps;
|
|
1860
2061
|
'kai-prompt-input': KaiElementJsxProps;
|
|
2062
|
+
'kai-radio-group': KaiElementJsxProps;
|
|
1861
2063
|
'kai-reasoning': KaiElementJsxProps;
|
|
1862
2064
|
'kai-remote': KaiElementJsxProps;
|
|
1863
2065
|
'kai-resizable': KaiElementJsxProps;
|
|
@@ -1869,11 +2071,13 @@ declare module 'react' {
|
|
|
1869
2071
|
'kai-scroll-button': KaiElementJsxProps;
|
|
1870
2072
|
'kai-search': KaiElementJsxProps;
|
|
1871
2073
|
'kai-segmented': KaiElementJsxProps;
|
|
2074
|
+
'kai-select': KaiElementJsxProps;
|
|
1872
2075
|
'kai-separator': KaiElementJsxProps;
|
|
1873
2076
|
'kai-setting-item': KaiElementJsxProps;
|
|
1874
2077
|
'kai-settings-group': KaiElementJsxProps;
|
|
1875
2078
|
'kai-skeleton': KaiElementJsxProps;
|
|
1876
2079
|
'kai-skills': KaiElementJsxProps;
|
|
2080
|
+
'kai-slider': KaiElementJsxProps;
|
|
1877
2081
|
'kai-source': KaiElementJsxProps;
|
|
1878
2082
|
'kai-sources': KaiElementJsxProps;
|
|
1879
2083
|
'kai-status': KaiElementJsxProps;
|
|
@@ -1951,7 +2155,7 @@ export interface KaiArtifactElementProps {
|
|
|
1951
2155
|
export interface KaiAttachmentsElementProps {
|
|
1952
2156
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1953
2157
|
theme?: "light" | "dark" | "auto";
|
|
1954
|
-
/** 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). */
|
|
2158
|
+
/** 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. */
|
|
1955
2159
|
items?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
1956
2160
|
/** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
|
|
1957
2161
|
variant?: "grid" | "inline" | "list";
|
|
@@ -1990,12 +2194,14 @@ export interface KaiAudioVisualizerElementProps {
|
|
|
1990
2194
|
complexity?: number;
|
|
1991
2195
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
1992
2196
|
label?: string;
|
|
1993
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
2197
|
+
/** 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. */
|
|
1994
2198
|
stream?: MediaStream;
|
|
1995
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
2199
|
+
/** 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. */
|
|
1996
2200
|
audioElement?: HTMLMediaElement;
|
|
1997
|
-
/** 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. */
|
|
2201
|
+
/** 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. */
|
|
1998
2202
|
bands?: number[];
|
|
2203
|
+
/** 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). */
|
|
2204
|
+
listeningAmplitude?: boolean;
|
|
1999
2205
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
2000
2206
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
2001
2207
|
/** 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`. */
|
|
@@ -2078,7 +2284,7 @@ export interface KaiCardsElementProps {
|
|
|
2078
2284
|
/** 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. */
|
|
2079
2285
|
schemas?: Record<string, object>;
|
|
2080
2286
|
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
2081
|
-
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" };
|
|
2287
|
+
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" };
|
|
2082
2288
|
/** 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. */
|
|
2083
2289
|
validateCards?: boolean;
|
|
2084
2290
|
}
|
|
@@ -2099,8 +2305,6 @@ export interface KaiChainOfThoughtElementProps {
|
|
|
2099
2305
|
export interface KaiChatElementProps {
|
|
2100
2306
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2101
2307
|
theme?: "light" | "dark" | "auto";
|
|
2102
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
2103
|
-
search?: boolean;
|
|
2104
2308
|
/** 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. */
|
|
2105
2309
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
2106
2310
|
/** Placeholder text shown in the empty input. */
|
|
@@ -2119,6 +2323,10 @@ export interface KaiChatElementProps {
|
|
|
2119
2323
|
codeTheme?: string;
|
|
2120
2324
|
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
2121
2325
|
codeHighlight?: boolean;
|
|
2326
|
+
/** 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`. */
|
|
2327
|
+
reasoning?: "full" | "compact" | "off";
|
|
2328
|
+
/** 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`. */
|
|
2329
|
+
reasoningOpen?: boolean;
|
|
2122
2330
|
/** Optional header title shown on the left of the header. */
|
|
2123
2331
|
chatTitle?: string;
|
|
2124
2332
|
/** Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection. */
|
|
@@ -2145,6 +2353,10 @@ export interface KaiChatElementProps {
|
|
|
2145
2353
|
composerActions?: boolean;
|
|
2146
2354
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
2147
2355
|
footer?: boolean;
|
|
2356
|
+
/** 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. */
|
|
2357
|
+
attach?: boolean;
|
|
2358
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
2359
|
+
webSearch?: boolean;
|
|
2148
2360
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
2149
2361
|
voice?: boolean;
|
|
2150
2362
|
/** 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. */
|
|
@@ -2163,6 +2375,42 @@ export interface KaiChatElementProps {
|
|
|
2163
2375
|
cardSchemas?: Record<string, object>;
|
|
2164
2376
|
}
|
|
2165
2377
|
|
|
2378
|
+
export interface KaiCheckboxElementProps {
|
|
2379
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2380
|
+
theme?: "light" | "dark" | "auto";
|
|
2381
|
+
/** 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. */
|
|
2382
|
+
checked?: boolean;
|
|
2383
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on. */
|
|
2384
|
+
defaultChecked?: boolean;
|
|
2385
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`. */
|
|
2386
|
+
indeterminate?: boolean;
|
|
2387
|
+
/** Disable interaction. */
|
|
2388
|
+
disabled?: boolean;
|
|
2389
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's. */
|
|
2390
|
+
required?: boolean;
|
|
2391
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
2392
|
+
label?: string;
|
|
2393
|
+
/** Form-control name (paired with `value`). */
|
|
2394
|
+
name?: string;
|
|
2395
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
2396
|
+
value?: string;
|
|
2397
|
+
}
|
|
2398
|
+
|
|
2399
|
+
export interface KaiCheckboxGroupElementProps {
|
|
2400
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2401
|
+
theme?: "light" | "dark" | "auto";
|
|
2402
|
+
/** 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. */
|
|
2403
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
2404
|
+
/** 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`. */
|
|
2405
|
+
value?: string;
|
|
2406
|
+
/** 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. */
|
|
2407
|
+
name?: string;
|
|
2408
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
2409
|
+
disabled?: boolean;
|
|
2410
|
+
/** Accessible name for the group. */
|
|
2411
|
+
label?: string;
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2166
2414
|
export interface KaiCheckpointElementProps {
|
|
2167
2415
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2168
2416
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2225,6 +2473,8 @@ export interface KaiCodeBlockElementProps {
|
|
|
2225
2473
|
codeTheme?: string;
|
|
2226
2474
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
2227
2475
|
codeHighlight?: boolean;
|
|
2476
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
2477
|
+
copy?: boolean;
|
|
2228
2478
|
/** Code text sizing. */
|
|
2229
2479
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
2230
2480
|
}
|
|
@@ -2308,19 +2558,32 @@ export interface KaiContextElementProps {
|
|
|
2308
2558
|
dangerThreshold?: number;
|
|
2309
2559
|
}
|
|
2310
2560
|
|
|
2561
|
+
export interface KaiConversationItemElementProps {
|
|
2562
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2563
|
+
theme?: "light" | "dark" | "auto";
|
|
2564
|
+
/** 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. */
|
|
2565
|
+
conversationId?: string;
|
|
2566
|
+
/** 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. */
|
|
2567
|
+
active?: boolean;
|
|
2568
|
+
/** Dense single-line row padding. */
|
|
2569
|
+
compact?: boolean;
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2311
2572
|
export interface KaiConversationsElementProps {
|
|
2312
2573
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2313
2574
|
theme?: "light" | "dark" | "auto";
|
|
2314
2575
|
/** 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. */
|
|
2315
2576
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
2316
|
-
/** 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. */
|
|
2317
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
2577
|
+
/** 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. */
|
|
2578
|
+
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 }[];
|
|
2318
2579
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
2319
2580
|
activeId?: string;
|
|
2320
2581
|
/** 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. */
|
|
2321
2582
|
collapsed?: boolean;
|
|
2322
2583
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
2323
2584
|
defaultCollapsed?: boolean;
|
|
2585
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
2586
|
+
compact?: boolean;
|
|
2324
2587
|
}
|
|
2325
2588
|
|
|
2326
2589
|
export interface KaiDialogElementProps {
|
|
@@ -2330,6 +2593,54 @@ export interface KaiDialogElementProps {
|
|
|
2330
2593
|
open?: boolean;
|
|
2331
2594
|
/** Initial open state on mount (uncontrolled seed). */
|
|
2332
2595
|
defaultOpen?: boolean;
|
|
2596
|
+
/** 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. */
|
|
2597
|
+
label?: string;
|
|
2598
|
+
}
|
|
2599
|
+
|
|
2600
|
+
export interface KaiDockElementProps {
|
|
2601
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2602
|
+
theme?: "light" | "dark" | "auto";
|
|
2603
|
+
/** 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`. */
|
|
2604
|
+
open?: boolean;
|
|
2605
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2606
|
+
defaultOpen?: boolean;
|
|
2607
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
2608
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
2609
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
2610
|
+
label?: string;
|
|
2611
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
2612
|
+
openLabel?: string;
|
|
2613
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
2614
|
+
closeLabel?: string;
|
|
2615
|
+
/** 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. */
|
|
2616
|
+
unread?: boolean;
|
|
2617
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
2618
|
+
disabled?: boolean;
|
|
2619
|
+
/** 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`. */
|
|
2620
|
+
hideClose?: boolean;
|
|
2621
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
2622
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
2623
|
+
}
|
|
2624
|
+
|
|
2625
|
+
export interface KaiDropdownElementProps {
|
|
2626
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2627
|
+
theme?: "light" | "dark" | "auto";
|
|
2628
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
2629
|
+
triggerIcon?: string;
|
|
2630
|
+
/** 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. */
|
|
2631
|
+
triggerLabel?: string;
|
|
2632
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
2633
|
+
triggerIconTrailing?: string;
|
|
2634
|
+
/** 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. */
|
|
2635
|
+
label?: string;
|
|
2636
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
2637
|
+
full?: boolean;
|
|
2638
|
+
/** 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`. */
|
|
2639
|
+
open?: boolean;
|
|
2640
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2641
|
+
defaultOpen?: boolean;
|
|
2642
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
2643
|
+
disabled?: boolean;
|
|
2333
2644
|
}
|
|
2334
2645
|
|
|
2335
2646
|
export interface KaiEditableLabelElementProps {
|
|
@@ -2412,7 +2723,7 @@ export interface KaiFormElementProps {
|
|
|
2412
2723
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2413
2724
|
theme?: "light" | "dark" | "auto";
|
|
2414
2725
|
/** 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. */
|
|
2415
|
-
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" }[] };
|
|
2726
|
+
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" }[] };
|
|
2416
2727
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
2417
2728
|
cardId?: string;
|
|
2418
2729
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -2471,7 +2782,7 @@ export interface KaiInputElementProps {
|
|
|
2471
2782
|
theme?: "light" | "dark" | "auto";
|
|
2472
2783
|
/** Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only. */
|
|
2473
2784
|
type?: string;
|
|
2474
|
-
/** Controlled value
|
|
2785
|
+
/** 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`. */
|
|
2475
2786
|
value?: string;
|
|
2476
2787
|
/** Placeholder shown when empty. */
|
|
2477
2788
|
placeholder?: string;
|
|
@@ -2497,6 +2808,16 @@ export interface KaiInputElementProps {
|
|
|
2497
2808
|
autocomplete?: string;
|
|
2498
2809
|
/** Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`). */
|
|
2499
2810
|
inputmode?: string;
|
|
2811
|
+
/** 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. */
|
|
2812
|
+
format?: string;
|
|
2813
|
+
/** 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. */
|
|
2814
|
+
guide?: string;
|
|
2815
|
+
/** 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. */
|
|
2816
|
+
semantic?: "credit-card" | "custom" | "ssn" | "tel";
|
|
2817
|
+
/** Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`. */
|
|
2818
|
+
caseMode?: "preserve" | "upper" | "lower";
|
|
2819
|
+
/** What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`. */
|
|
2820
|
+
copyPolicy?: "formatted" | "canonical" | "obscured" | "blocked";
|
|
2500
2821
|
}
|
|
2501
2822
|
|
|
2502
2823
|
export interface KaiKbdElementProps {
|
|
@@ -2558,6 +2879,8 @@ export interface KaiMenuElementProps {
|
|
|
2558
2879
|
triggerIconTrailing?: string;
|
|
2559
2880
|
/** 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. */
|
|
2560
2881
|
label?: string;
|
|
2882
|
+
/** 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`. */
|
|
2883
|
+
full?: boolean;
|
|
2561
2884
|
/** 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`. */
|
|
2562
2885
|
open?: boolean;
|
|
2563
2886
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -2653,6 +2976,21 @@ export interface KaiPaneElementProps {
|
|
|
2653
2976
|
status?: { tone: "working" | "idle" | "done" | "error" | "blocked"; label?: string; pulse?: boolean };
|
|
2654
2977
|
}
|
|
2655
2978
|
|
|
2979
|
+
export interface KaiPaneGridElementProps {
|
|
2980
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2981
|
+
theme?: "light" | "dark" | "auto";
|
|
2982
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`. */
|
|
2983
|
+
minPaneWidth?: number;
|
|
2984
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`. */
|
|
2985
|
+
minPaneHeight?: number;
|
|
2986
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
2987
|
+
maxColumns?: number;
|
|
2988
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
2989
|
+
gap?: string;
|
|
2990
|
+
/** 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`. */
|
|
2991
|
+
maximizedIndex?: number | null;
|
|
2992
|
+
}
|
|
2993
|
+
|
|
2656
2994
|
export interface KaiPaneGroupElementProps {
|
|
2657
2995
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2658
2996
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2716,8 +3054,8 @@ export interface KaiPromptInputElementProps {
|
|
|
2716
3054
|
suggestions?: string[];
|
|
2717
3055
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
2718
3056
|
suggestionMode?: "submit" | "fill";
|
|
2719
|
-
/** Show a
|
|
2720
|
-
|
|
3057
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
3058
|
+
webSearch?: boolean;
|
|
2721
3059
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
2722
3060
|
voice?: boolean;
|
|
2723
3061
|
/** 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`. */
|
|
@@ -2726,7 +3064,7 @@ export interface KaiPromptInputElementProps {
|
|
|
2726
3064
|
submit?: "always" | "auto";
|
|
2727
3065
|
/** 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`. */
|
|
2728
3066
|
attach?: boolean;
|
|
2729
|
-
/** 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). */
|
|
3067
|
+
/** 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.) */
|
|
2730
3068
|
attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
2731
3069
|
/** 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. */
|
|
2732
3070
|
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
@@ -2734,6 +3072,21 @@ export interface KaiPromptInputElementProps {
|
|
|
2734
3072
|
kindIcons?: Record<string, string>;
|
|
2735
3073
|
}
|
|
2736
3074
|
|
|
3075
|
+
export interface KaiRadioGroupElementProps {
|
|
3076
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3077
|
+
theme?: "light" | "dark" | "auto";
|
|
3078
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
3079
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
3080
|
+
/** 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. */
|
|
3081
|
+
value?: string;
|
|
3082
|
+
/** 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. */
|
|
3083
|
+
name?: string;
|
|
3084
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
3085
|
+
disabled?: boolean;
|
|
3086
|
+
/** Accessible name for the group. */
|
|
3087
|
+
label?: string;
|
|
3088
|
+
}
|
|
3089
|
+
|
|
2737
3090
|
export interface KaiReasoningElementProps {
|
|
2738
3091
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2739
3092
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2855,6 +3208,10 @@ export interface KaiScrollButtonElementProps {
|
|
|
2855
3208
|
variant?: "outline" | "ghost" | "default";
|
|
2856
3209
|
/** Button size token. Defaults to `'icon'` (square). */
|
|
2857
3210
|
size?: "sm" | "md" | "lg" | "icon" | "icon-sm";
|
|
3211
|
+
/** 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'`. */
|
|
3212
|
+
label?: string;
|
|
3213
|
+
/** 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. */
|
|
3214
|
+
showLabel?: boolean;
|
|
2858
3215
|
}
|
|
2859
3216
|
|
|
2860
3217
|
export interface KaiSearchElementProps {
|
|
@@ -2885,6 +3242,29 @@ export interface KaiSegmentedElementProps {
|
|
|
2885
3242
|
size?: "sm" | "md";
|
|
2886
3243
|
}
|
|
2887
3244
|
|
|
3245
|
+
export interface KaiSelectElementProps {
|
|
3246
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3247
|
+
theme?: "light" | "dark" | "auto";
|
|
3248
|
+
/** 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. */
|
|
3249
|
+
options: { value: string; label?: undefined | string; disabled?: undefined | boolean }[];
|
|
3250
|
+
/** 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. */
|
|
3251
|
+
value?: string;
|
|
3252
|
+
/** 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. */
|
|
3253
|
+
placeholder?: string;
|
|
3254
|
+
/** Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn. */
|
|
3255
|
+
multiple?: boolean;
|
|
3256
|
+
/** Force the invalid (destructive-border) state. */
|
|
3257
|
+
invalid?: boolean;
|
|
3258
|
+
/** Disable interaction. */
|
|
3259
|
+
disabled?: boolean;
|
|
3260
|
+
/** Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's. */
|
|
3261
|
+
required?: boolean;
|
|
3262
|
+
/** Accessible label for the control. */
|
|
3263
|
+
label?: string;
|
|
3264
|
+
/** Form-control name, for a native form submit. */
|
|
3265
|
+
name?: string;
|
|
3266
|
+
}
|
|
3267
|
+
|
|
2888
3268
|
export interface KaiSeparatorElementProps {
|
|
2889
3269
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2890
3270
|
theme?: "light" | "dark" | "auto";
|
|
@@ -2930,6 +3310,27 @@ export interface KaiSkillsElementProps {
|
|
|
2930
3310
|
skills?: { id: string; name: string }[];
|
|
2931
3311
|
}
|
|
2932
3312
|
|
|
3313
|
+
export interface KaiSliderElementProps {
|
|
3314
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3315
|
+
theme?: "light" | "dark" | "auto";
|
|
3316
|
+
/** Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means. */
|
|
3317
|
+
min?: number;
|
|
3318
|
+
/** Highest selectable value. Required, for the same reason as `min`. */
|
|
3319
|
+
max?: number;
|
|
3320
|
+
/** Granularity. Omitted means the native default of 1; `any` means continuous. */
|
|
3321
|
+
step?: number | "any";
|
|
3322
|
+
/** 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. */
|
|
3323
|
+
value?: number;
|
|
3324
|
+
/** Disable interaction. */
|
|
3325
|
+
disabled?: boolean;
|
|
3326
|
+
/** Accessible label for the slider. */
|
|
3327
|
+
label?: string;
|
|
3328
|
+
/** Form-control name, for a native form submit. */
|
|
3329
|
+
name?: string;
|
|
3330
|
+
/** 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. */
|
|
3331
|
+
valueLabel?: boolean | ((value: number) => string);
|
|
3332
|
+
}
|
|
3333
|
+
|
|
2933
3334
|
export interface KaiSourceElementProps {
|
|
2934
3335
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2935
3336
|
theme?: "light" | "dark" | "auto";
|
|
@@ -3093,7 +3494,7 @@ export interface KaiThreadElementProps {
|
|
|
3093
3494
|
export interface KaiToastRegionElementProps {
|
|
3094
3495
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3095
3496
|
theme?: "light" | "dark" | "auto";
|
|
3096
|
-
/** 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. */
|
|
3497
|
+
/** 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. */
|
|
3097
3498
|
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 }[];
|
|
3098
3499
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
3099
3500
|
position?: "top-center" | "top-right" | "top-left" | "bottom-center" | "bottom-right" | "bottom-left";
|
|
@@ -3170,53 +3571,20 @@ export interface KaiVoiceOutputElementProps {
|
|
|
3170
3571
|
export interface KaiWorkspaceElementProps {
|
|
3171
3572
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3172
3573
|
theme?: "light" | "dark" | "auto";
|
|
3173
|
-
/**
|
|
3174
|
-
|
|
3175
|
-
/**
|
|
3176
|
-
|
|
3177
|
-
/**
|
|
3178
|
-
|
|
3179
|
-
/**
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
placeholder?: string;
|
|
3183
|
-
loading?: boolean;
|
|
3184
|
-
suggestions?: string[];
|
|
3185
|
-
suggestionMode?: "submit" | "fill";
|
|
3186
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
3187
|
-
codeTheme?: string;
|
|
3188
|
-
codeHighlight?: boolean;
|
|
3189
|
-
chatTitle?: string;
|
|
3190
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
3191
|
-
currentModel?: string;
|
|
3192
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
3193
|
-
scrollButton?: boolean;
|
|
3194
|
-
search?: boolean;
|
|
3195
|
-
voice?: boolean;
|
|
3196
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
3197
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
3198
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
3199
|
-
kindIcons?: Record<string, string>;
|
|
3200
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
3201
|
-
sidebarWidth?: number;
|
|
3202
|
-
/** Sidebar min width in px (default 240). */
|
|
3203
|
-
sidebarMinWidth?: number;
|
|
3204
|
-
/** Sidebar max width in px (default 420). */
|
|
3205
|
-
sidebarMaxWidth?: number;
|
|
3206
|
-
/** 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). */
|
|
3207
|
-
sidebarCollapsed?: boolean;
|
|
3208
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
3209
|
-
defaultSidebarCollapsed?: boolean;
|
|
3210
|
-
/** 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`. */
|
|
3574
|
+
/** 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). */
|
|
3575
|
+
startCollapsed?: boolean;
|
|
3576
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
3577
|
+
defaultStartCollapsed?: boolean;
|
|
3578
|
+
/** 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). */
|
|
3579
|
+
endCollapsed?: boolean;
|
|
3580
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
3581
|
+
defaultEndCollapsed?: boolean;
|
|
3582
|
+
/** 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`. */
|
|
3211
3583
|
collapseBelow?: number;
|
|
3212
|
-
/**
|
|
3584
|
+
/** 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`. */
|
|
3585
|
+
drawerBelow?: number;
|
|
3586
|
+
/** 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. */
|
|
3213
3587
|
compact?: boolean;
|
|
3214
|
-
/** 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`. */
|
|
3215
|
-
noConversations?: boolean;
|
|
3216
|
-
/** 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. */
|
|
3217
|
-
cardTypes?: Record<string, string>;
|
|
3218
|
-
/** 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. */
|
|
3219
|
-
cardSchemas?: Record<string, object>;
|
|
3220
3588
|
}
|
|
3221
3589
|
|
|
3222
3590
|
export interface KaiAgentCardElementEvents {
|
|
@@ -3287,8 +3655,6 @@ export interface KaiChatElementEvents {
|
|
|
3287
3655
|
onKaiMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
3288
3656
|
/** The header model switcher changed. */
|
|
3289
3657
|
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3290
|
-
/** The Search button was clicked. */
|
|
3291
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3292
3658
|
/** User submitted a message. */
|
|
3293
3659
|
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;
|
|
3294
3660
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -3297,6 +3663,18 @@ export interface KaiChatElementEvents {
|
|
|
3297
3663
|
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3298
3664
|
/** The Mic / voice button was clicked. */
|
|
3299
3665
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3666
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3667
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3668
|
+
}
|
|
3669
|
+
|
|
3670
|
+
export interface KaiCheckboxElementEvents {
|
|
3671
|
+
/** The box was ticked or unticked. */
|
|
3672
|
+
onKaiChange?: (event: CustomEvent<{ checked: boolean }>) => void;
|
|
3673
|
+
}
|
|
3674
|
+
|
|
3675
|
+
export interface KaiCheckboxGroupElementEvents {
|
|
3676
|
+
/** 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. */
|
|
3677
|
+
onKaiChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
3300
3678
|
}
|
|
3301
3679
|
|
|
3302
3680
|
export interface KaiCheckpointElementEvents {
|
|
@@ -3347,7 +3725,7 @@ export interface KaiComposerElementEvents {
|
|
|
3347
3725
|
onKaiEntityRemove?: (event: CustomEvent<{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }>) => void;
|
|
3348
3726
|
/** 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.) */
|
|
3349
3727
|
onKaiFocus?: (event: CustomEvent<{ originalEvent: FocusEvent }>) => void;
|
|
3350
|
-
/** The user submitted the composer (Enter or programmatic submit). */
|
|
3728
|
+
/** 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. */
|
|
3351
3729
|
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;
|
|
3352
3730
|
/** A trigger character was detected at the caret (e.g. `/` or `@`). */
|
|
3353
3731
|
onKaiTrigger?: (event: CustomEvent<{ char: string; query: string; rect: DOMRect }>) => void;
|
|
@@ -3366,10 +3744,15 @@ export interface KaiContextElementEvents {
|
|
|
3366
3744
|
onKaiThresholdChange?: (event: CustomEvent<{ level: "ok" | "warn" | "danger" }>) => void;
|
|
3367
3745
|
}
|
|
3368
3746
|
|
|
3747
|
+
export interface KaiConversationItemElementEvents {
|
|
3748
|
+
/** 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. */
|
|
3749
|
+
onKaiSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3750
|
+
}
|
|
3751
|
+
|
|
3369
3752
|
export interface KaiConversationsElementEvents {
|
|
3370
3753
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
3371
3754
|
onKaiCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3372
|
-
/** A conversation was selected. */
|
|
3755
|
+
/** 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). */
|
|
3373
3756
|
onKaiConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3374
3757
|
/** The "New chat" button was clicked. */
|
|
3375
3758
|
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3384,6 +3767,16 @@ export interface KaiDialogElementEvents {
|
|
|
3384
3767
|
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3385
3768
|
}
|
|
3386
3769
|
|
|
3770
|
+
export interface KaiDockElementEvents {
|
|
3771
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
3772
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3773
|
+
}
|
|
3774
|
+
|
|
3775
|
+
export interface KaiDropdownElementEvents {
|
|
3776
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
3777
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3778
|
+
}
|
|
3779
|
+
|
|
3387
3780
|
export interface KaiEditableLabelElementEvents {
|
|
3388
3781
|
/** Edit was cancelled (Esc); the text is restored. */
|
|
3389
3782
|
onKaiCancel?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3437,10 +3830,12 @@ export interface KaiImageElementEvents {
|
|
|
3437
3830
|
}
|
|
3438
3831
|
|
|
3439
3832
|
export interface KaiInputElementEvents {
|
|
3440
|
-
/** The value was committed (blur). */
|
|
3441
|
-
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3442
|
-
/** The value changed per keystroke. */
|
|
3443
|
-
onKaiInput?: (event: CustomEvent<{ value: string }>) => void;
|
|
3833
|
+
/** The value was committed (blur). Same detail shape as `kai-input`. */
|
|
3834
|
+
onKaiChange?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
3835
|
+
/** 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. */
|
|
3836
|
+
onKaiInput?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
3837
|
+
/** 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. */
|
|
3838
|
+
onKaiInputRejected?: (event: CustomEvent<{ reason: "full" | "wrong-class" | "over-capacity" | "format-change-clipped"; data: string }>) => void;
|
|
3444
3839
|
}
|
|
3445
3840
|
|
|
3446
3841
|
export interface KaiKbdElementEvents {
|
|
@@ -3503,6 +3898,10 @@ export interface KaiPaneElementEvents {
|
|
|
3503
3898
|
onKaiSplit?: (event: CustomEvent) => void;
|
|
3504
3899
|
}
|
|
3505
3900
|
|
|
3901
|
+
export interface KaiPaneGridElementEvents {
|
|
3902
|
+
|
|
3903
|
+
}
|
|
3904
|
+
|
|
3506
3905
|
export interface KaiPaneGroupElementEvents {
|
|
3507
3906
|
/** A tab was selected (click, Enter/Space, or arrow-key move). `detail.id` is the tab's id. */
|
|
3508
3907
|
onKaiTabChange?: (event: CustomEvent<{ id: string }>) => void;
|
|
@@ -3528,11 +3927,9 @@ export interface KaiPromptDockElementEvents {
|
|
|
3528
3927
|
export interface KaiPromptInputElementEvents {
|
|
3529
3928
|
/** 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). */
|
|
3530
3929
|
onKaiAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3531
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
3532
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3533
3930
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
3534
3931
|
onKaiStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3535
|
-
/** 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. */
|
|
3932
|
+
/** 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. */
|
|
3536
3933
|
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;
|
|
3537
3934
|
/** A suggestion was clicked while `suggestion-mode="fill"`. */
|
|
3538
3935
|
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
@@ -3542,6 +3939,13 @@ export interface KaiPromptInputElementEvents {
|
|
|
3542
3939
|
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;
|
|
3543
3940
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
3544
3941
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3942
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3943
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3944
|
+
}
|
|
3945
|
+
|
|
3946
|
+
export interface KaiRadioGroupElementEvents {
|
|
3947
|
+
/** A row was chosen. */
|
|
3948
|
+
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3545
3949
|
}
|
|
3546
3950
|
|
|
3547
3951
|
export interface KaiReasoningElementEvents {
|
|
@@ -3610,6 +4014,11 @@ export interface KaiSegmentedElementEvents {
|
|
|
3610
4014
|
onKaiChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3611
4015
|
}
|
|
3612
4016
|
|
|
4017
|
+
export interface KaiSelectElementEvents {
|
|
4018
|
+
/** 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. */
|
|
4019
|
+
onKaiChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
4020
|
+
}
|
|
4021
|
+
|
|
3613
4022
|
export interface KaiSeparatorElementEvents {
|
|
3614
4023
|
|
|
3615
4024
|
}
|
|
@@ -3630,6 +4039,13 @@ export interface KaiSkillsElementEvents {
|
|
|
3630
4039
|
|
|
3631
4040
|
}
|
|
3632
4041
|
|
|
4042
|
+
export interface KaiSliderElementEvents {
|
|
4043
|
+
/** The value was committed: pointer released, or a key press finished. */
|
|
4044
|
+
onKaiChange?: (event: CustomEvent<{ value: number }>) => void;
|
|
4045
|
+
/** The thumb moved. Fires per step during a drag or a key press. */
|
|
4046
|
+
onKaiInput?: (event: CustomEvent<{ value: number }>) => void;
|
|
4047
|
+
}
|
|
4048
|
+
|
|
3633
4049
|
export interface KaiSourceElementEvents {
|
|
3634
4050
|
|
|
3635
4051
|
}
|
|
@@ -3702,36 +4118,24 @@ export interface KaiVoiceInputElementEvents {
|
|
|
3702
4118
|
onKaiTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
3703
4119
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
3704
4120
|
onKaiTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
4121
|
+
/** 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. */
|
|
4122
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
3705
4123
|
}
|
|
3706
4124
|
|
|
3707
4125
|
export interface KaiVoiceOutputElementEvents {
|
|
3708
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
4126
|
+
/** 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. */
|
|
3709
4127
|
onKaiSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
3710
4128
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
3711
4129
|
onKaiSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
4130
|
+
/** 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. */
|
|
4131
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
3712
4132
|
}
|
|
3713
4133
|
|
|
3714
4134
|
export interface KaiWorkspaceElementEvents {
|
|
3715
|
-
/**
|
|
3716
|
-
|
|
3717
|
-
/** An
|
|
3718
|
-
|
|
3719
|
-
/** The header model switcher changed. */
|
|
3720
|
-
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3721
|
-
/** The "New chat" button was clicked. */
|
|
3722
|
-
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3723
|
-
/** The Search button was clicked. */
|
|
3724
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3725
|
-
/** The sidebar was collapsed or expanded. */
|
|
3726
|
-
onKaiSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3727
|
-
/** User submitted a message. */
|
|
3728
|
-
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;
|
|
3729
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
3730
|
-
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
3731
|
-
/** Fired on every input change. */
|
|
3732
|
-
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3733
|
-
/** The Mic / voice button was clicked. */
|
|
3734
|
-
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
4135
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
4136
|
+
onKaiAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
4137
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
4138
|
+
onKaiAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
3735
4139
|
}
|
|
3736
4140
|
|
|
3737
4141
|
/** Attributes every kai-* element tolerates in a Vue template on top of its own
|
|
@@ -3773,6 +4177,10 @@ declare module 'vue' {
|
|
|
3773
4177
|
KaiChainOfThought: KaiVueElement<KaiChainOfThoughtElementProps, KaiChainOfThoughtElementEvents>;
|
|
3774
4178
|
'kai-chat': KaiVueElement<KaiChatElementProps, KaiChatElementEvents>;
|
|
3775
4179
|
KaiChat: KaiVueElement<KaiChatElementProps, KaiChatElementEvents>;
|
|
4180
|
+
'kai-checkbox': KaiVueElement<KaiCheckboxElementProps, KaiCheckboxElementEvents>;
|
|
4181
|
+
KaiCheckbox: KaiVueElement<KaiCheckboxElementProps, KaiCheckboxElementEvents>;
|
|
4182
|
+
'kai-checkbox-group': KaiVueElement<KaiCheckboxGroupElementProps, KaiCheckboxGroupElementEvents>;
|
|
4183
|
+
KaiCheckboxGroup: KaiVueElement<KaiCheckboxGroupElementProps, KaiCheckboxGroupElementEvents>;
|
|
3776
4184
|
'kai-checkpoint': KaiVueElement<KaiCheckpointElementProps, KaiCheckpointElementEvents>;
|
|
3777
4185
|
KaiCheckpoint: KaiVueElement<KaiCheckpointElementProps, KaiCheckpointElementEvents>;
|
|
3778
4186
|
'kai-choice': KaiVueElement<KaiChoiceElementProps, KaiChoiceElementEvents>;
|
|
@@ -3791,10 +4199,16 @@ declare module 'vue' {
|
|
|
3791
4199
|
KaiConfirm: KaiVueElement<KaiConfirmElementProps, KaiConfirmElementEvents>;
|
|
3792
4200
|
'kai-context': KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3793
4201
|
KaiContext: KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
4202
|
+
'kai-conversation-item': KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
4203
|
+
KaiConversationItem: KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3794
4204
|
'kai-conversations': KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3795
4205
|
KaiConversations: KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3796
4206
|
'kai-dialog': KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3797
4207
|
KaiDialog: KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
4208
|
+
'kai-dock': KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
4209
|
+
KaiDock: KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
4210
|
+
'kai-dropdown': KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
4211
|
+
KaiDropdown: KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3798
4212
|
'kai-editable-label': KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3799
4213
|
KaiEditableLabel: KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3800
4214
|
'kai-embed': KaiVueElement<KaiEmbedElementProps, KaiEmbedElementEvents>;
|
|
@@ -3837,6 +4251,8 @@ declare module 'vue' {
|
|
|
3837
4251
|
KaiNotice: KaiVueElement<KaiNoticeElementProps, KaiNoticeElementEvents>;
|
|
3838
4252
|
'kai-pane': KaiVueElement<KaiPaneElementProps, KaiPaneElementEvents>;
|
|
3839
4253
|
KaiPane: KaiVueElement<KaiPaneElementProps, KaiPaneElementEvents>;
|
|
4254
|
+
'kai-pane-grid': KaiVueElement<KaiPaneGridElementProps, KaiPaneGridElementEvents>;
|
|
4255
|
+
KaiPaneGrid: KaiVueElement<KaiPaneGridElementProps, KaiPaneGridElementEvents>;
|
|
3840
4256
|
'kai-pane-group': KaiVueElement<KaiPaneGroupElementProps, KaiPaneGroupElementEvents>;
|
|
3841
4257
|
KaiPaneGroup: KaiVueElement<KaiPaneGroupElementProps, KaiPaneGroupElementEvents>;
|
|
3842
4258
|
'kai-popover': KaiVueElement<KaiPopoverElementProps, KaiPopoverElementEvents>;
|
|
@@ -3847,6 +4263,8 @@ declare module 'vue' {
|
|
|
3847
4263
|
KaiPromptDock: KaiVueElement<KaiPromptDockElementProps, KaiPromptDockElementEvents>;
|
|
3848
4264
|
'kai-prompt-input': KaiVueElement<KaiPromptInputElementProps, KaiPromptInputElementEvents>;
|
|
3849
4265
|
KaiPromptInput: KaiVueElement<KaiPromptInputElementProps, KaiPromptInputElementEvents>;
|
|
4266
|
+
'kai-radio-group': KaiVueElement<KaiRadioGroupElementProps, KaiRadioGroupElementEvents>;
|
|
4267
|
+
KaiRadioGroup: KaiVueElement<KaiRadioGroupElementProps, KaiRadioGroupElementEvents>;
|
|
3850
4268
|
'kai-reasoning': KaiVueElement<KaiReasoningElementProps, KaiReasoningElementEvents>;
|
|
3851
4269
|
KaiReasoning: KaiVueElement<KaiReasoningElementProps, KaiReasoningElementEvents>;
|
|
3852
4270
|
'kai-remote': KaiVueElement<KaiRemoteElementProps, KaiRemoteElementEvents>;
|
|
@@ -3869,6 +4287,8 @@ declare module 'vue' {
|
|
|
3869
4287
|
KaiSearch: KaiVueElement<KaiSearchElementProps, KaiSearchElementEvents>;
|
|
3870
4288
|
'kai-segmented': KaiVueElement<KaiSegmentedElementProps, KaiSegmentedElementEvents>;
|
|
3871
4289
|
KaiSegmented: KaiVueElement<KaiSegmentedElementProps, KaiSegmentedElementEvents>;
|
|
4290
|
+
'kai-select': KaiVueElement<KaiSelectElementProps, KaiSelectElementEvents>;
|
|
4291
|
+
KaiSelect: KaiVueElement<KaiSelectElementProps, KaiSelectElementEvents>;
|
|
3872
4292
|
'kai-separator': KaiVueElement<KaiSeparatorElementProps, KaiSeparatorElementEvents>;
|
|
3873
4293
|
KaiSeparator: KaiVueElement<KaiSeparatorElementProps, KaiSeparatorElementEvents>;
|
|
3874
4294
|
'kai-setting-item': KaiVueElement<KaiSettingItemElementProps, KaiSettingItemElementEvents>;
|
|
@@ -3879,6 +4299,8 @@ declare module 'vue' {
|
|
|
3879
4299
|
KaiSkeleton: KaiVueElement<KaiSkeletonElementProps, KaiSkeletonElementEvents>;
|
|
3880
4300
|
'kai-skills': KaiVueElement<KaiSkillsElementProps, KaiSkillsElementEvents>;
|
|
3881
4301
|
KaiSkills: KaiVueElement<KaiSkillsElementProps, KaiSkillsElementEvents>;
|
|
4302
|
+
'kai-slider': KaiVueElement<KaiSliderElementProps, KaiSliderElementEvents>;
|
|
4303
|
+
KaiSlider: KaiVueElement<KaiSliderElementProps, KaiSliderElementEvents>;
|
|
3882
4304
|
'kai-source': KaiVueElement<KaiSourceElementProps, KaiSourceElementEvents>;
|
|
3883
4305
|
KaiSource: KaiVueElement<KaiSourceElementProps, KaiSourceElementEvents>;
|
|
3884
4306
|
'kai-sources': KaiVueElement<KaiSourcesElementProps, KaiSourcesElementEvents>;
|