@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
|
@@ -99,7 +99,7 @@ export const Artifact = /*#__PURE__*/ createWebComponent<ArtifactProps>(
|
|
|
99
99
|
);
|
|
100
100
|
|
|
101
101
|
export interface AttachmentsProps extends WebComponentProps {
|
|
102
|
-
/** 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). */
|
|
102
|
+
/** 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. */
|
|
103
103
|
items?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
104
104
|
/** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
|
|
105
105
|
variant?: "grid" | "inline" | "list";
|
|
@@ -145,12 +145,14 @@ export interface AudioVisualizerProps extends WebComponentProps {
|
|
|
145
145
|
complexity?: number;
|
|
146
146
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
147
147
|
label?: string;
|
|
148
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
148
|
+
/** 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. */
|
|
149
149
|
stream?: MediaStream;
|
|
150
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
150
|
+
/** 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. */
|
|
151
151
|
audioElement?: HTMLMediaElement;
|
|
152
|
-
/** 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. */
|
|
152
|
+
/** 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. */
|
|
153
153
|
bands?: number[];
|
|
154
|
+
/** 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). */
|
|
155
|
+
listeningAmplitude?: boolean;
|
|
154
156
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
155
157
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
156
158
|
/** 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`. */
|
|
@@ -159,7 +161,7 @@ export interface AudioVisualizerProps extends WebComponentProps {
|
|
|
159
161
|
|
|
160
162
|
export const AudioVisualizer = /*#__PURE__*/ createWebComponent<AudioVisualizerProps>(
|
|
161
163
|
'kai-audio-visualizer',
|
|
162
|
-
["theme","variant","state","size","barCount","count","radius","spread","interval","color","complexity","label","stream","audioElement","bands","shader","animateWhenNotVisible"],
|
|
164
|
+
["theme","variant","state","size","barCount","count","radius","spread","interval","color","complexity","label","stream","audioElement","bands","listeningAmplitude","shader","animateWhenNotVisible"],
|
|
163
165
|
{ },
|
|
164
166
|
() => import('@kitn.ai/ui/elements/audio-visualizer'),
|
|
165
167
|
);
|
|
@@ -264,7 +266,7 @@ export interface CardsProps extends WebComponentProps {
|
|
|
264
266
|
/** 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. */
|
|
265
267
|
schemas?: Record<string, object>;
|
|
266
268
|
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
267
|
-
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" };
|
|
269
|
+
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" };
|
|
268
270
|
/** 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. */
|
|
269
271
|
validateCards?: boolean;
|
|
270
272
|
/** A child card transitioned to a resolved/deferred state (an action was chosen, a form/tasks submission landed, or it was dismissed). Re-emitted off the host as a non-bubbling convenience event so a consumer can observe resolution centrally without diffing the cards array. `detail` = `{ cardId, resolution }`. (A `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire this; observe reopen via the underlying bubbling `kai-card` event.) */
|
|
@@ -299,8 +301,6 @@ export const ChainOfThought = /*#__PURE__*/ createWebComponent<ChainOfThoughtPro
|
|
|
299
301
|
);
|
|
300
302
|
|
|
301
303
|
export interface ChatProps extends WebComponentProps {
|
|
302
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
303
|
-
search?: boolean;
|
|
304
304
|
/** 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. */
|
|
305
305
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
306
306
|
/** Placeholder text shown in the empty input. */
|
|
@@ -319,6 +319,10 @@ export interface ChatProps extends WebComponentProps {
|
|
|
319
319
|
codeTheme?: string;
|
|
320
320
|
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
321
321
|
codeHighlight?: boolean;
|
|
322
|
+
/** 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`. */
|
|
323
|
+
reasoning?: "full" | "compact" | "off";
|
|
324
|
+
/** 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`. */
|
|
325
|
+
reasoningOpen?: boolean;
|
|
322
326
|
/** Optional header title shown on the left of the header. */
|
|
323
327
|
chatTitle?: string;
|
|
324
328
|
/** Optional model list. When set (>1 model) a ModelSwitcher is shown in the header and a `kai-model-change` event fires on selection. */
|
|
@@ -345,6 +349,10 @@ export interface ChatProps extends WebComponentProps {
|
|
|
345
349
|
composerActions?: boolean;
|
|
346
350
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
347
351
|
footer?: boolean;
|
|
352
|
+
/** 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. */
|
|
353
|
+
attach?: boolean;
|
|
354
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
355
|
+
webSearch?: boolean;
|
|
348
356
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
349
357
|
voice?: boolean;
|
|
350
358
|
/** 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. */
|
|
@@ -369,8 +377,6 @@ export interface ChatProps extends WebComponentProps {
|
|
|
369
377
|
onMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
370
378
|
/** The header model switcher changed. */
|
|
371
379
|
onModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
372
|
-
/** The Search button was clicked. */
|
|
373
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
374
380
|
/** User submitted a message. */
|
|
375
381
|
onSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
376
382
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -379,15 +385,67 @@ export interface ChatProps extends WebComponentProps {
|
|
|
379
385
|
onValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
380
386
|
/** The Mic / voice button was clicked. */
|
|
381
387
|
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
388
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
389
|
+
onWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
382
390
|
}
|
|
383
391
|
|
|
384
392
|
export const Chat = /*#__PURE__*/ createWebComponent<ChatProps>(
|
|
385
393
|
'kai-chat',
|
|
386
|
-
["theme","
|
|
387
|
-
{ onAttachmentsChange: 'kai-attachments-change', onAttachmentsRejected: 'kai-attachments-rejected', onMessageAction: 'kai-message-action', onModelChange: 'kai-model-change',
|
|
394
|
+
["theme","value","placeholder","loading","suggestions","suggestionMode","persistSuggestions","proseSize","codeTheme","codeHighlight","reasoning","reasoningOpen","chatTitle","models","currentModel","context","scrollButton","headerStart","headerEnd","headerFull","sidebar","empty","composer","composerActions","footer","attach","webSearch","voice","triggers","kindIcons","actionsReveal","accept","messages","cardTypes","cardSchemas"],
|
|
395
|
+
{ onAttachmentsChange: 'kai-attachments-change', onAttachmentsRejected: 'kai-attachments-rejected', onMessageAction: 'kai-message-action', onModelChange: 'kai-model-change', onSubmit: 'kai-submit', onSuggestionClick: 'kai-suggestion-click', onValueChange: 'kai-value-change', onVoice: 'kai-voice', onWebSearch: 'kai-web-search' },
|
|
388
396
|
() => import('@kitn.ai/ui/elements/chat'),
|
|
389
397
|
);
|
|
390
398
|
|
|
399
|
+
export interface CheckboxProps extends WebComponentProps {
|
|
400
|
+
/** 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. */
|
|
401
|
+
checked?: boolean;
|
|
402
|
+
/** Initial checked state on mount (uncontrolled seed). Bare attribute (`<kai-checkbox default-checked>`) turns it on. */
|
|
403
|
+
defaultChecked?: boolean;
|
|
404
|
+
/** The mixed state, for a parent box whose children are partly ticked. Visual plus an accessibility hint: the box still reports `checked === false`. */
|
|
405
|
+
indeterminate?: boolean;
|
|
406
|
+
/** Disable interaction. */
|
|
407
|
+
disabled?: boolean;
|
|
408
|
+
/** Set the native `required` attribute, and nothing more. Whether an unticked box is an error is the application's rule, not the kit's. */
|
|
409
|
+
required?: boolean;
|
|
410
|
+
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
411
|
+
label?: string;
|
|
412
|
+
/** Form-control name (paired with `value`). */
|
|
413
|
+
name?: string;
|
|
414
|
+
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
415
|
+
value?: string;
|
|
416
|
+
/** The box was ticked or unticked. */
|
|
417
|
+
onChange?: (event: CustomEvent<{ checked: boolean }>) => void;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export const Checkbox = /*#__PURE__*/ createWebComponent<CheckboxProps>(
|
|
421
|
+
'kai-checkbox',
|
|
422
|
+
["theme","checked","defaultChecked","indeterminate","disabled","required","label","name","value"],
|
|
423
|
+
{ onChange: 'kai-change' },
|
|
424
|
+
() => import('@kitn.ai/ui/elements/checkbox'),
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
export interface CheckboxGroupProps extends WebComponentProps {
|
|
428
|
+
/** 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. */
|
|
429
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
430
|
+
/** 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`. */
|
|
431
|
+
value?: string;
|
|
432
|
+
/** 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. */
|
|
433
|
+
name?: string;
|
|
434
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
435
|
+
disabled?: boolean;
|
|
436
|
+
/** Accessible name for the group. */
|
|
437
|
+
label?: string;
|
|
438
|
+
/** 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. */
|
|
439
|
+
onChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export const CheckboxGroup = /*#__PURE__*/ createWebComponent<CheckboxGroupProps>(
|
|
443
|
+
'kai-checkbox-group',
|
|
444
|
+
["theme","options","value","name","disabled","label"],
|
|
445
|
+
{ onChange: 'kai-change' },
|
|
446
|
+
() => import('@kitn.ai/ui/elements/checkbox-group'),
|
|
447
|
+
);
|
|
448
|
+
|
|
391
449
|
export interface CheckpointProps extends WebComponentProps {
|
|
392
450
|
/** Optional text beside the icon. */
|
|
393
451
|
label?: string;
|
|
@@ -471,13 +529,15 @@ export interface CodeBlockProps extends WebComponentProps {
|
|
|
471
529
|
codeTheme?: string;
|
|
472
530
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
473
531
|
codeHighlight?: boolean;
|
|
532
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
533
|
+
copy?: boolean;
|
|
474
534
|
/** Code text sizing. */
|
|
475
535
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
476
536
|
}
|
|
477
537
|
|
|
478
538
|
export const CodeBlock = /*#__PURE__*/ createWebComponent<CodeBlockProps>(
|
|
479
539
|
'kai-code-block',
|
|
480
|
-
["theme","code","language","codeTheme","codeHighlight","proseSize"],
|
|
540
|
+
["theme","code","language","codeTheme","codeHighlight","copy","proseSize"],
|
|
481
541
|
{ },
|
|
482
542
|
() => import('@kitn.ai/ui/elements/code-block'),
|
|
483
543
|
);
|
|
@@ -561,7 +621,7 @@ export interface ComposerProps extends WebComponentProps {
|
|
|
561
621
|
onEntityRemove?: (event: CustomEvent<{ entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } }>) => void;
|
|
562
622
|
/** 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.) */
|
|
563
623
|
onFocus?: (event: CustomEvent<{ originalEvent: FocusEvent }>) => void;
|
|
564
|
-
/** The user submitted the composer (Enter or programmatic submit). */
|
|
624
|
+
/** 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. */
|
|
565
625
|
onSubmit?: (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;
|
|
566
626
|
/** A trigger character was detected at the caret (e.g. `/` or `@`). */
|
|
567
627
|
onTrigger?: (event: CustomEvent<{ char: string; query: string; rect: DOMRect }>) => void;
|
|
@@ -616,20 +676,40 @@ export const Context = /*#__PURE__*/ createWebComponent<ContextProps>(
|
|
|
616
676
|
() => import('@kitn.ai/ui/elements/context-meter'),
|
|
617
677
|
);
|
|
618
678
|
|
|
679
|
+
export interface ConversationItemProps extends WebComponentProps {
|
|
680
|
+
/** 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. */
|
|
681
|
+
conversationId?: string;
|
|
682
|
+
/** 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. */
|
|
683
|
+
active?: boolean;
|
|
684
|
+
/** Dense single-line row padding. */
|
|
685
|
+
compact?: boolean;
|
|
686
|
+
/** 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. */
|
|
687
|
+
onSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
export const ConversationItem = /*#__PURE__*/ createWebComponent<ConversationItemProps>(
|
|
691
|
+
'kai-conversation-item',
|
|
692
|
+
["theme","conversationId","active","compact"],
|
|
693
|
+
{ onSelect: 'kai-select' },
|
|
694
|
+
() => import('@kitn.ai/ui/elements/conversation-item'),
|
|
695
|
+
);
|
|
696
|
+
|
|
619
697
|
export interface ConversationsProps extends WebComponentProps {
|
|
620
698
|
/** 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. */
|
|
621
699
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
622
|
-
/** 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. */
|
|
623
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
700
|
+
/** 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. */
|
|
701
|
+
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 }[];
|
|
624
702
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
625
703
|
activeId?: string;
|
|
626
704
|
/** 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. */
|
|
627
705
|
collapsed?: boolean;
|
|
628
706
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
629
707
|
defaultCollapsed?: boolean;
|
|
708
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
709
|
+
compact?: boolean;
|
|
630
710
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
631
711
|
onCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
632
|
-
/** A conversation was selected. */
|
|
712
|
+
/** 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). */
|
|
633
713
|
onConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
634
714
|
/** The "New chat" button was clicked. */
|
|
635
715
|
onNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -641,7 +721,7 @@ export interface ConversationsProps extends WebComponentProps {
|
|
|
641
721
|
|
|
642
722
|
export const Conversations = /*#__PURE__*/ createWebComponent<ConversationsProps>(
|
|
643
723
|
'kai-conversations',
|
|
644
|
-
["theme","groups","conversations","activeId","collapsed","defaultCollapsed"],
|
|
724
|
+
["theme","groups","conversations","activeId","collapsed","defaultCollapsed","compact"],
|
|
645
725
|
{ onCollapseToggle: 'kai-collapse-toggle', onConversationSelect: 'kai-conversation-select', onNewChat: 'kai-new-chat', onSearch: 'kai-search', onToggleSidebar: 'kai-toggle-sidebar' },
|
|
646
726
|
() => import('@kitn.ai/ui/elements/conversation-list'),
|
|
647
727
|
);
|
|
@@ -651,17 +731,79 @@ export interface DialogProps extends WebComponentProps {
|
|
|
651
731
|
open?: boolean;
|
|
652
732
|
/** Initial open state on mount (uncontrolled seed). */
|
|
653
733
|
defaultOpen?: boolean;
|
|
734
|
+
/** 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. */
|
|
735
|
+
label?: string;
|
|
654
736
|
/** The dialog opened or closed (Escape, backdrop click, a driven `open`, or a method). */
|
|
655
737
|
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
656
738
|
}
|
|
657
739
|
|
|
658
740
|
export const Dialog = /*#__PURE__*/ createWebComponent<DialogProps>(
|
|
659
741
|
'kai-dialog',
|
|
660
|
-
["theme","open","defaultOpen"],
|
|
742
|
+
["theme","open","defaultOpen","label"],
|
|
661
743
|
{ onOpenChange: 'kai-open-change' },
|
|
662
744
|
() => import('@kitn.ai/ui/elements/dialog'),
|
|
663
745
|
);
|
|
664
746
|
|
|
747
|
+
export interface DockProps extends WebComponentProps {
|
|
748
|
+
/** 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`. */
|
|
749
|
+
open?: boolean;
|
|
750
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
751
|
+
defaultOpen?: boolean;
|
|
752
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
753
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
754
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
755
|
+
label?: string;
|
|
756
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
757
|
+
openLabel?: string;
|
|
758
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
759
|
+
closeLabel?: string;
|
|
760
|
+
/** 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. */
|
|
761
|
+
unread?: boolean;
|
|
762
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
763
|
+
disabled?: boolean;
|
|
764
|
+
/** 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`. */
|
|
765
|
+
hideClose?: boolean;
|
|
766
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
767
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
768
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
769
|
+
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
export const Dock = /*#__PURE__*/ createWebComponent<DockProps>(
|
|
773
|
+
'kai-dock',
|
|
774
|
+
["theme","open","defaultOpen","position","label","openLabel","closeLabel","unread","disabled","hideClose","focusOnOpen"],
|
|
775
|
+
{ onOpenChange: 'kai-open-change' },
|
|
776
|
+
() => import('@kitn.ai/ui/elements/dock'),
|
|
777
|
+
);
|
|
778
|
+
|
|
779
|
+
export interface DropdownProps extends WebComponentProps {
|
|
780
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
781
|
+
triggerIcon?: string;
|
|
782
|
+
/** 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. */
|
|
783
|
+
triggerLabel?: string;
|
|
784
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
785
|
+
triggerIconTrailing?: string;
|
|
786
|
+
/** 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. */
|
|
787
|
+
label?: string;
|
|
788
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
789
|
+
full?: boolean;
|
|
790
|
+
/** 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`. */
|
|
791
|
+
open?: boolean;
|
|
792
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
793
|
+
defaultOpen?: boolean;
|
|
794
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
795
|
+
disabled?: boolean;
|
|
796
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
797
|
+
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
export const Dropdown = /*#__PURE__*/ createWebComponent<DropdownProps>(
|
|
801
|
+
'kai-dropdown',
|
|
802
|
+
["theme","triggerIcon","triggerLabel","triggerIconTrailing","label","full","open","defaultOpen","disabled"],
|
|
803
|
+
{ onOpenChange: 'kai-open-change' },
|
|
804
|
+
() => import('@kitn.ai/ui/elements/dropdown'),
|
|
805
|
+
);
|
|
806
|
+
|
|
665
807
|
export interface EditableLabelProps extends WebComponentProps {
|
|
666
808
|
/** The label text. Settable and reflected to the `value` attribute. Read `el.value` for live state. */
|
|
667
809
|
value?: string;
|
|
@@ -784,7 +926,7 @@ export const FileUpload = /*#__PURE__*/ createWebComponent<FileUploadProps>(
|
|
|
784
926
|
|
|
785
927
|
export interface FormProps extends WebComponentProps {
|
|
786
928
|
/** 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. */
|
|
787
|
-
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" }[] };
|
|
929
|
+
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" }[] };
|
|
788
930
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
789
931
|
cardId?: string;
|
|
790
932
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -867,7 +1009,7 @@ export const Image = /*#__PURE__*/ createWebComponent<ImageProps>(
|
|
|
867
1009
|
export interface InputProps extends WebComponentProps {
|
|
868
1010
|
/** Native input type: `text` (default) · `email` · `url` · `search` · `tel` · `password` · `number`. Single-line only. */
|
|
869
1011
|
type?: string;
|
|
870
|
-
/** Controlled value
|
|
1012
|
+
/** 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`. */
|
|
871
1013
|
value?: string;
|
|
872
1014
|
/** Placeholder shown when empty. */
|
|
873
1015
|
placeholder?: string;
|
|
@@ -893,16 +1035,28 @@ export interface InputProps extends WebComponentProps {
|
|
|
893
1035
|
autocomplete?: string;
|
|
894
1036
|
/** Virtual-keyboard hint forwarded to the inner input (e.g. `numeric`, `email`). */
|
|
895
1037
|
inputmode?: string;
|
|
896
|
-
/** The
|
|
897
|
-
|
|
898
|
-
/**
|
|
899
|
-
|
|
1038
|
+
/** 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. */
|
|
1039
|
+
format?: string;
|
|
1040
|
+
/** 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. */
|
|
1041
|
+
guide?: string;
|
|
1042
|
+
/** 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. */
|
|
1043
|
+
semantic?: "credit-card" | "custom" | "ssn" | "tel";
|
|
1044
|
+
/** Case folding applied to typed and pasted text: `preserve` (default) · `upper` · `lower`. Attribute: `case-mode`. */
|
|
1045
|
+
caseMode?: "preserve" | "upper" | "lower";
|
|
1046
|
+
/** What a copy or cut of a masked field puts on the clipboard: `canonical` (default) · `formatted` · `obscured` · `blocked`. Attribute: `copy-policy`. */
|
|
1047
|
+
copyPolicy?: "formatted" | "canonical" | "obscured" | "blocked";
|
|
1048
|
+
/** The value was committed (blur). Same detail shape as `kai-input`. */
|
|
1049
|
+
onChange?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
1050
|
+
/** 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. */
|
|
1051
|
+
onInput?: (event: CustomEvent<{ value: string; formattedValue: string }>) => void;
|
|
1052
|
+
/** 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. */
|
|
1053
|
+
onInputRejected?: (event: CustomEvent<{ reason: "full" | "wrong-class" | "over-capacity" | "format-change-clipped"; data: string }>) => void;
|
|
900
1054
|
}
|
|
901
1055
|
|
|
902
1056
|
export const Input = /*#__PURE__*/ createWebComponent<InputProps>(
|
|
903
1057
|
'kai-input',
|
|
904
|
-
["theme","type","value","placeholder","label","hint","error","size","disabled","readonly","required","invalid","name","autocomplete","inputmode"],
|
|
905
|
-
{ onChange: 'kai-change', onInput: 'kai-input' },
|
|
1058
|
+
["theme","type","value","placeholder","label","hint","error","size","disabled","readonly","required","invalid","name","autocomplete","inputmode","format","guide","semantic","caseMode","copyPolicy"],
|
|
1059
|
+
{ onChange: 'kai-change', onInput: 'kai-input', onInputRejected: 'kai-input-rejected' },
|
|
906
1060
|
() => import('@kitn.ai/ui/elements/input'),
|
|
907
1061
|
);
|
|
908
1062
|
|
|
@@ -983,6 +1137,8 @@ export interface MenuProps extends WebComponentProps {
|
|
|
983
1137
|
triggerIconTrailing?: string;
|
|
984
1138
|
/** 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. */
|
|
985
1139
|
label?: string;
|
|
1140
|
+
/** 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`. */
|
|
1141
|
+
full?: boolean;
|
|
986
1142
|
/** 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`. */
|
|
987
1143
|
open?: boolean;
|
|
988
1144
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -997,7 +1153,7 @@ export interface MenuProps extends WebComponentProps {
|
|
|
997
1153
|
|
|
998
1154
|
export const Menu = /*#__PURE__*/ createWebComponent<MenuProps>(
|
|
999
1155
|
'kai-menu',
|
|
1000
|
-
["theme","items","placement","triggerIcon","triggerLabel","triggerIconTrailing","label","open","defaultOpen","disabled"],
|
|
1156
|
+
["theme","items","placement","triggerIcon","triggerLabel","triggerIconTrailing","label","full","open","defaultOpen","disabled"],
|
|
1001
1157
|
{ onOpenChange: 'kai-open-change', onSelect: 'kai-select' },
|
|
1002
1158
|
() => import('@kitn.ai/ui/elements/menu'),
|
|
1003
1159
|
);
|
|
@@ -1136,6 +1292,26 @@ export const Pane = /*#__PURE__*/ createWebComponent<PaneProps>(
|
|
|
1136
1292
|
() => import('@kitn.ai/ui/elements/pane'),
|
|
1137
1293
|
);
|
|
1138
1294
|
|
|
1295
|
+
export interface PaneGridProps extends WebComponentProps {
|
|
1296
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls. Defaults to `280`. Attribute: `min-pane-width`. */
|
|
1297
|
+
minPaneWidth?: number;
|
|
1298
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically. Defaults to `200`. Attribute: `min-pane-height`. */
|
|
1299
|
+
minPaneHeight?: number;
|
|
1300
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
1301
|
+
maxColumns?: number;
|
|
1302
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
1303
|
+
gap?: string;
|
|
1304
|
+
/** 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`. */
|
|
1305
|
+
maximizedIndex?: number | null;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
export const PaneGrid = /*#__PURE__*/ createWebComponent<PaneGridProps>(
|
|
1309
|
+
'kai-pane-grid',
|
|
1310
|
+
["theme","minPaneWidth","minPaneHeight","maxColumns","gap","maximizedIndex"],
|
|
1311
|
+
{ },
|
|
1312
|
+
() => import('@kitn.ai/ui/elements/pane-grid'),
|
|
1313
|
+
);
|
|
1314
|
+
|
|
1139
1315
|
export interface PaneGroupProps extends WebComponentProps {
|
|
1140
1316
|
/** The tabs to render. An array of `{ id, name, status?, needsAttention?, number? }` set as a JS PROPERTY (not an HTML attribute). */
|
|
1141
1317
|
tabs?: { id: string; name: string; status?: { tone: "working" | "idle" | "done" | "error" | "blocked"; label?: string; pulse?: boolean }; needsAttention?: boolean; number?: number }[];
|
|
@@ -1225,8 +1401,8 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1225
1401
|
suggestions?: string[];
|
|
1226
1402
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1227
1403
|
suggestionMode?: "submit" | "fill";
|
|
1228
|
-
/** Show a
|
|
1229
|
-
|
|
1404
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1405
|
+
webSearch?: boolean;
|
|
1230
1406
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1231
1407
|
voice?: boolean;
|
|
1232
1408
|
/** 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`. */
|
|
@@ -1235,7 +1411,7 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1235
1411
|
submit?: "always" | "auto";
|
|
1236
1412
|
/** 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`. */
|
|
1237
1413
|
attach?: boolean;
|
|
1238
|
-
/** 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). */
|
|
1414
|
+
/** 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.) */
|
|
1239
1415
|
attachments?: { id: string; type: "file" | "source-document"; filename?: string; mediaType?: string; url?: string; title?: string }[];
|
|
1240
1416
|
/** 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. */
|
|
1241
1417
|
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
@@ -1243,11 +1419,9 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1243
1419
|
kindIcons?: Record<string, string>;
|
|
1244
1420
|
/** 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). */
|
|
1245
1421
|
onAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
1246
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
1247
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1248
1422
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
1249
1423
|
onStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1250
|
-
/** 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. */
|
|
1424
|
+
/** 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. */
|
|
1251
1425
|
onSubmit?: (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;
|
|
1252
1426
|
/** A suggestion was clicked while `suggestion-mode="fill"`. */
|
|
1253
1427
|
onSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
@@ -1257,15 +1431,39 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1257
1431
|
onValueChange?: (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;
|
|
1258
1432
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
1259
1433
|
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1434
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
1435
|
+
onWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1260
1436
|
}
|
|
1261
1437
|
|
|
1262
1438
|
export const PromptInput = /*#__PURE__*/ createWebComponent<PromptInputProps>(
|
|
1263
1439
|
'kai-prompt-input',
|
|
1264
|
-
["theme","value","placeholder","disabled","loading","suggestions","suggestionMode","
|
|
1265
|
-
{ onAttachmentsChange: 'kai-attachments-change',
|
|
1440
|
+
["theme","value","placeholder","disabled","loading","suggestions","suggestionMode","webSearch","voice","stoppable","submit","attach","attachments","triggers","kindIcons"],
|
|
1441
|
+
{ onAttachmentsChange: 'kai-attachments-change', onStop: 'kai-stop', onSubmit: 'kai-submit', onSuggestionClick: 'kai-suggestion-click', onToolbarAction: 'kai-toolbar-action', onValueChange: 'kai-value-change', onVoice: 'kai-voice', onWebSearch: 'kai-web-search' },
|
|
1266
1442
|
() => import('@kitn.ai/ui/elements/prompt-input'),
|
|
1267
1443
|
);
|
|
1268
1444
|
|
|
1445
|
+
export interface RadioGroupProps extends WebComponentProps {
|
|
1446
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
1447
|
+
options: { value: string; label: string; description?: undefined | string; disabled?: undefined | boolean }[];
|
|
1448
|
+
/** 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. */
|
|
1449
|
+
value?: string;
|
|
1450
|
+
/** 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. */
|
|
1451
|
+
name?: string;
|
|
1452
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
1453
|
+
disabled?: boolean;
|
|
1454
|
+
/** Accessible name for the group. */
|
|
1455
|
+
label?: string;
|
|
1456
|
+
/** A row was chosen. */
|
|
1457
|
+
onChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
export const RadioGroup = /*#__PURE__*/ createWebComponent<RadioGroupProps>(
|
|
1461
|
+
'kai-radio-group',
|
|
1462
|
+
["theme","options","value","name","disabled","label"],
|
|
1463
|
+
{ onChange: 'kai-change' },
|
|
1464
|
+
() => import('@kitn.ai/ui/elements/radio-group'),
|
|
1465
|
+
);
|
|
1466
|
+
|
|
1269
1467
|
export interface ReasoningProps extends WebComponentProps {
|
|
1270
1468
|
/** The reasoning text to display. */
|
|
1271
1469
|
text: string;
|
|
@@ -1446,13 +1644,17 @@ export interface ScrollButtonProps extends WebComponentProps {
|
|
|
1446
1644
|
variant?: "outline" | "ghost" | "default";
|
|
1447
1645
|
/** Button size token. Defaults to `'icon'` (square). */
|
|
1448
1646
|
size?: "sm" | "md" | "lg" | "icon" | "icon-sm";
|
|
1647
|
+
/** 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'`. */
|
|
1648
|
+
label?: string;
|
|
1649
|
+
/** 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. */
|
|
1650
|
+
showLabel?: boolean;
|
|
1449
1651
|
/** Emitted when the user clicks the button and `scrollToBottom()` is called. Carries no detail; consumers use it to know a manual scroll occurred. */
|
|
1450
1652
|
onScroll?: (event: CustomEvent) => void;
|
|
1451
1653
|
}
|
|
1452
1654
|
|
|
1453
1655
|
export const ScrollButton = /*#__PURE__*/ createWebComponent<ScrollButtonProps>(
|
|
1454
1656
|
'kai-scroll-button',
|
|
1455
|
-
["theme","for","variant","size"],
|
|
1657
|
+
["theme","for","variant","size","label","showLabel"],
|
|
1456
1658
|
{ onScroll: 'kai-scroll' },
|
|
1457
1659
|
() => import('@kitn.ai/ui/elements/scroll-button'),
|
|
1458
1660
|
);
|
|
@@ -1503,6 +1705,36 @@ export const Segmented = /*#__PURE__*/ createWebComponent<SegmentedProps>(
|
|
|
1503
1705
|
() => import('@kitn.ai/ui/elements/segmented'),
|
|
1504
1706
|
);
|
|
1505
1707
|
|
|
1708
|
+
export interface SelectProps extends WebComponentProps {
|
|
1709
|
+
/** 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. */
|
|
1710
|
+
options: { value: string; label?: undefined | string; disabled?: undefined | boolean }[];
|
|
1711
|
+
/** 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. */
|
|
1712
|
+
value?: string;
|
|
1713
|
+
/** 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. */
|
|
1714
|
+
placeholder?: string;
|
|
1715
|
+
/** Allow more than one selection. Turns the control into the platform's list box, so the kit's chevron is not drawn. */
|
|
1716
|
+
multiple?: boolean;
|
|
1717
|
+
/** Force the invalid (destructive-border) state. */
|
|
1718
|
+
invalid?: boolean;
|
|
1719
|
+
/** Disable interaction. */
|
|
1720
|
+
disabled?: boolean;
|
|
1721
|
+
/** Set the native `required` attribute, and nothing more. Whether an empty select is an error is the application's rule, not the kit's. */
|
|
1722
|
+
required?: boolean;
|
|
1723
|
+
/** Accessible label for the control. */
|
|
1724
|
+
label?: string;
|
|
1725
|
+
/** Form-control name, for a native form submit. */
|
|
1726
|
+
name?: string;
|
|
1727
|
+
/** 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. */
|
|
1728
|
+
onChange?: (event: CustomEvent<{ value: string; values: string[] }>) => void;
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
export const Select = /*#__PURE__*/ createWebComponent<SelectProps>(
|
|
1732
|
+
'kai-select',
|
|
1733
|
+
["theme","options","value","placeholder","multiple","invalid","disabled","required","label","name"],
|
|
1734
|
+
{ onChange: 'kai-change' },
|
|
1735
|
+
() => import('@kitn.ai/ui/elements/select'),
|
|
1736
|
+
);
|
|
1737
|
+
|
|
1506
1738
|
export interface SeparatorProps extends WebComponentProps {
|
|
1507
1739
|
/** `horizontal` (default, block + full-width) or `vertical` (a rule inside a flex/grid row, stretching to the row height). */
|
|
1508
1740
|
orientation?: "horizontal" | "vertical";
|
|
@@ -1573,6 +1805,36 @@ export const Skills = /*#__PURE__*/ createWebComponent<SkillsProps>(
|
|
|
1573
1805
|
() => import('@kitn.ai/ui/elements/message-skills'),
|
|
1574
1806
|
);
|
|
1575
1807
|
|
|
1808
|
+
export interface SliderProps extends WebComponentProps {
|
|
1809
|
+
/** Lowest selectable value. Required: a range with no bounds is a guess, and the guess belongs to whoever knows what the number means. */
|
|
1810
|
+
min?: number;
|
|
1811
|
+
/** Highest selectable value. Required, for the same reason as `min`. */
|
|
1812
|
+
max?: number;
|
|
1813
|
+
/** Granularity. Omitted means the native default of 1; `any` means continuous. */
|
|
1814
|
+
step?: number | "any";
|
|
1815
|
+
/** 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. */
|
|
1816
|
+
value?: number;
|
|
1817
|
+
/** Disable interaction. */
|
|
1818
|
+
disabled?: boolean;
|
|
1819
|
+
/** Accessible label for the slider. */
|
|
1820
|
+
label?: string;
|
|
1821
|
+
/** Form-control name, for a native form submit. */
|
|
1822
|
+
name?: string;
|
|
1823
|
+
/** 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. */
|
|
1824
|
+
valueLabel?: boolean | ((value: number) => string);
|
|
1825
|
+
/** The value was committed: pointer released, or a key press finished. */
|
|
1826
|
+
onChange?: (event: CustomEvent<{ value: number }>) => void;
|
|
1827
|
+
/** The thumb moved. Fires per step during a drag or a key press. */
|
|
1828
|
+
onInput?: (event: CustomEvent<{ value: number }>) => void;
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
export const Slider = /*#__PURE__*/ createWebComponent<SliderProps>(
|
|
1832
|
+
'kai-slider',
|
|
1833
|
+
["theme","min","max","step","value","disabled","label","name","valueLabel"],
|
|
1834
|
+
{ onChange: 'kai-change', onInput: 'kai-input' },
|
|
1835
|
+
() => import('@kitn.ai/ui/elements/slider'),
|
|
1836
|
+
);
|
|
1837
|
+
|
|
1576
1838
|
export interface SourceProps extends WebComponentProps {
|
|
1577
1839
|
/** The URL this citation links to (the domain also seeds the default label/favicon). */
|
|
1578
1840
|
href?: string;
|
|
@@ -1796,7 +2058,7 @@ export const Thread = /*#__PURE__*/ createWebComponent<ThreadProps>(
|
|
|
1796
2058
|
);
|
|
1797
2059
|
|
|
1798
2060
|
export interface ToastRegionProps extends WebComponentProps {
|
|
1799
|
-
/** 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. */
|
|
2061
|
+
/** 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. */
|
|
1800
2062
|
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 }[];
|
|
1801
2063
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
1802
2064
|
position?: "top-center" | "top-right" | "top-left" | "bottom-center" | "bottom-right" | "bottom-left";
|
|
@@ -1886,12 +2148,14 @@ export interface VoiceInputProps extends WebComponentProps {
|
|
|
1886
2148
|
onTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
1887
2149
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
1888
2150
|
onTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
2151
|
+
/** 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. */
|
|
2152
|
+
onVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
1889
2153
|
}
|
|
1890
2154
|
|
|
1891
2155
|
export const VoiceInput = /*#__PURE__*/ createWebComponent<VoiceInputProps>(
|
|
1892
2156
|
'kai-voice-input',
|
|
1893
2157
|
["theme","transcribe","disabled","recognitionLang","interim"],
|
|
1894
|
-
{ onAudioCaptured: 'kai-audio-captured', onRecordingChange: 'kai-recording-change', onTranscriptInterim: 'kai-transcript-interim', onTranscription: 'kai-transcription' },
|
|
2158
|
+
{ onAudioCaptured: 'kai-audio-captured', onRecordingChange: 'kai-recording-change', onTranscriptInterim: 'kai-transcript-interim', onTranscription: 'kai-transcription', onVoiceError: 'kai-voice-error' },
|
|
1895
2159
|
() => import('@kitn.ai/ui/elements/voice-input'),
|
|
1896
2160
|
);
|
|
1897
2161
|
|
|
@@ -1904,92 +2168,45 @@ export interface VoiceOutputProps extends WebComponentProps {
|
|
|
1904
2168
|
synthesize?: (text: string) => Promise<Blob>;
|
|
1905
2169
|
/** Disable the button (non-interactive). */
|
|
1906
2170
|
disabled?: boolean;
|
|
1907
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
2171
|
+
/** 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. */
|
|
1908
2172
|
onSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
1909
2173
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
1910
2174
|
onSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
2175
|
+
/** 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. */
|
|
2176
|
+
onVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
1911
2177
|
}
|
|
1912
2178
|
|
|
1913
2179
|
export const VoiceOutput = /*#__PURE__*/ createWebComponent<VoiceOutputProps>(
|
|
1914
2180
|
'kai-voice-output',
|
|
1915
2181
|
["theme","text","autoplay","synthesize","disabled"],
|
|
1916
|
-
{ onSpeakingChange: 'kai-speaking-change', onSynthesized: 'kai-synthesized' },
|
|
2182
|
+
{ onSpeakingChange: 'kai-speaking-change', onSynthesized: 'kai-synthesized', onVoiceError: 'kai-voice-error' },
|
|
1917
2183
|
() => import('@kitn.ai/ui/elements/voice-output'),
|
|
1918
2184
|
);
|
|
1919
2185
|
|
|
1920
2186
|
export interface WorkspaceProps extends WebComponentProps {
|
|
1921
|
-
/**
|
|
1922
|
-
|
|
1923
|
-
/**
|
|
1924
|
-
|
|
1925
|
-
/**
|
|
1926
|
-
|
|
1927
|
-
/**
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
placeholder?: string;
|
|
1931
|
-
loading?: boolean;
|
|
1932
|
-
suggestions?: string[];
|
|
1933
|
-
suggestionMode?: "submit" | "fill";
|
|
1934
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1935
|
-
codeTheme?: string;
|
|
1936
|
-
codeHighlight?: boolean;
|
|
1937
|
-
chatTitle?: string;
|
|
1938
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1939
|
-
currentModel?: string;
|
|
1940
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1941
|
-
scrollButton?: boolean;
|
|
1942
|
-
search?: boolean;
|
|
1943
|
-
voice?: boolean;
|
|
1944
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1945
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1946
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1947
|
-
kindIcons?: Record<string, string>;
|
|
1948
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1949
|
-
sidebarWidth?: number;
|
|
1950
|
-
/** Sidebar min width in px (default 240). */
|
|
1951
|
-
sidebarMinWidth?: number;
|
|
1952
|
-
/** Sidebar max width in px (default 420). */
|
|
1953
|
-
sidebarMaxWidth?: number;
|
|
1954
|
-
/** 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). */
|
|
1955
|
-
sidebarCollapsed?: boolean;
|
|
1956
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1957
|
-
defaultSidebarCollapsed?: boolean;
|
|
1958
|
-
/** 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`. */
|
|
2187
|
+
/** 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). */
|
|
2188
|
+
startCollapsed?: boolean;
|
|
2189
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
2190
|
+
defaultStartCollapsed?: boolean;
|
|
2191
|
+
/** 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). */
|
|
2192
|
+
endCollapsed?: boolean;
|
|
2193
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
2194
|
+
defaultEndCollapsed?: boolean;
|
|
2195
|
+
/** 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`. */
|
|
1959
2196
|
collapseBelow?: number;
|
|
1960
|
-
/**
|
|
2197
|
+
/** 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`. */
|
|
2198
|
+
drawerBelow?: number;
|
|
2199
|
+
/** 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. */
|
|
1961
2200
|
compact?: boolean;
|
|
1962
|
-
/**
|
|
1963
|
-
|
|
1964
|
-
/**
|
|
1965
|
-
|
|
1966
|
-
/** 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. */
|
|
1967
|
-
cardSchemas?: Record<string, object>;
|
|
1968
|
-
/** A conversation was selected in the sidebar. */
|
|
1969
|
-
onConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
1970
|
-
/** An action button on a message was clicked. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear. */
|
|
1971
|
-
onMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
1972
|
-
/** The header model switcher changed. */
|
|
1973
|
-
onModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
1974
|
-
/** The "New chat" button was clicked. */
|
|
1975
|
-
onNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1976
|
-
/** The Search button was clicked. */
|
|
1977
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1978
|
-
/** The sidebar was collapsed or expanded. */
|
|
1979
|
-
onSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
1980
|
-
/** User submitted a message. */
|
|
1981
|
-
onSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
1982
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
1983
|
-
onSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
1984
|
-
/** Fired on every input change. */
|
|
1985
|
-
onValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
1986
|
-
/** The Mic / voice button was clicked. */
|
|
1987
|
-
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
2201
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
2202
|
+
onAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
2203
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
2204
|
+
onAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
1988
2205
|
}
|
|
1989
2206
|
|
|
1990
2207
|
export const Workspace = /*#__PURE__*/ createWebComponent<WorkspaceProps>(
|
|
1991
2208
|
'kai-workspace',
|
|
1992
|
-
["theme","
|
|
1993
|
-
{
|
|
2209
|
+
["theme","startCollapsed","defaultStartCollapsed","endCollapsed","defaultEndCollapsed","collapseBelow","drawerBelow","compact"],
|
|
2210
|
+
{ onAsideResize: 'kai-aside-resize', onAsideToggle: 'kai-aside-toggle' },
|
|
1994
2211
|
() => import('@kitn.ai/ui/elements/chat-workspace'),
|
|
1995
2212
|
);
|