@kitn.ai/ui 0.20.1 → 0.22.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 +44 -45
- package/dist/components/artifact-card.d.ts +51 -0
- package/dist/components/artifact.d.ts +1 -1
- package/dist/components/attachments.d.ts +2 -2
- package/dist/components/audio-visualizer/index.d.ts +3 -3
- package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
- package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
- package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
- package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
- package/dist/components/card-fallback.d.ts +12 -2
- package/dist/components/card-renderer.d.ts +63 -2
- package/dist/components/chat-container.d.ts +3 -0
- package/dist/components/chat-scope-picker.d.ts +2 -2
- package/dist/components/chat-thread.d.ts +77 -18
- package/dist/components/choice-card.d.ts +3 -28
- package/dist/components/composer-dom.d.ts +1 -1
- package/dist/components/composer-highlight.d.ts +1 -1
- package/dist/components/composer-history.d.ts +1 -1
- package/dist/components/composer.d.ts +1 -1
- package/dist/components/confirm-card.d.ts +3 -18
- package/dist/components/context.d.ts +8 -4
- package/dist/components/conversation-item.d.ts +1 -1
- package/dist/components/conversation-list.d.ts +4 -3
- package/dist/components/embed.d.ts +3 -3
- package/dist/components/file-tree.d.ts +11 -22
- package/dist/components/form-widgets.d.ts +1 -1
- package/dist/components/form.d.ts +3 -44
- package/dist/components/link-preview.d.ts +3 -3
- package/dist/components/loader.d.ts +30 -48
- package/dist/components/message-skills.d.ts +4 -0
- package/dist/components/message.d.ts +84 -21
- package/dist/components/model-switcher.d.ts +2 -2
- package/dist/components/prompt-input.d.ts +2 -2
- package/dist/components/response-compare-types.d.ts +11 -2
- package/dist/components/response-compare.d.ts +3 -3
- package/dist/components/source.d.ts +12 -3
- package/dist/components/tasks-card.d.ts +3 -31
- package/dist/components/thread.d.ts +17 -5
- package/dist/components/toast.d.ts +2 -2
- package/dist/components/tool-classify.d.ts +8 -0
- package/dist/components/tool-types.d.ts +29 -1
- package/dist/components/tool.d.ts +3 -3
- package/dist/components/use-card-resolution.d.ts +1 -1
- package/dist/create-tween-COnPwAQN.js +338 -0
- package/dist/create-tween-DmTUaXWE.js +341 -0
- package/dist/create-tween-qs-jjvNA.js +7 -0
- package/dist/custom-elements.json +1726 -463
- 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/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-types.d.ts +70 -10
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/chunks/{Icon-Tj58ES_d.js → Icon-CHG5z5L7.js} +1 -1
- package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-BAtCEEgg.js} +1 -1
- package/dist/elements/chunks/arrow-left-CFPTeL1Y.js +1 -0
- package/dist/elements/chunks/artifact-fBZOE4SO.js +1 -0
- package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-DpYMe5VQ.js} +1 -1
- package/dist/elements/chunks/audio-visualizer-DFwzAcuL.js +1 -0
- package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-D6zodm6E.js} +1 -1
- package/dist/elements/chunks/{button-ZWNif3--.js → button-C42vrGvO.js} +1 -1
- package/dist/elements/chunks/card-renderer-DMZsSuvU.js +1 -0
- package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
- package/dist/elements/chunks/chat-thread-CNNEhol-.js +1 -0
- package/dist/elements/chunks/check-7Q3K-iXE.js +1 -0
- package/dist/elements/chunks/chevron-down-CpNYLn7E.js +1 -0
- package/dist/elements/chunks/chevron-right-DrH85Fha.js +1 -0
- package/dist/elements/chunks/choice-card-YoWjpsFV.js +1 -0
- package/dist/elements/chunks/circle-C9KRjKYv.js +1 -0
- package/dist/elements/chunks/circle-check-Dmi7Y4zw.js +1 -0
- package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-QIxXda6k.js} +1 -1
- package/dist/elements/chunks/code-block-CqeugReY.js +1 -0
- package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-sTv-_5lF.js} +1 -1
- package/dist/elements/chunks/{composer-BguS0QL_.js → composer-ldQyeVEB.js} +2 -2
- package/dist/elements/chunks/confirm-card-C0RNOwfn.js +1 -0
- package/dist/elements/chunks/context-5qgypNHC.js +1 -0
- package/dist/elements/chunks/conversation-list-DLzOacXz.js +1 -0
- package/dist/elements/chunks/create-tween-V4TXZ93X.js +7 -0
- package/dist/elements/chunks/default-input-DeeRSDHc.js +1 -0
- package/dist/elements/chunks/define-lE-QvQFn.js +1 -0
- package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DZSa9jog.js} +1 -1
- package/dist/elements/chunks/{download-Dsbg3ste.js → download-B2ZmnGqW.js} +1 -1
- package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-R3B7cSRE.js} +1 -1
- package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BmxceY4l.js} +1 -1
- package/dist/elements/chunks/embed-BVrtTZPo.js +1 -0
- package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-BbdR7YO7.js} +1 -1
- package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-D7dijo1A.js} +1 -1
- package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-0upJ5jeb.js} +1 -1
- package/dist/elements/chunks/{folder-glP5rha4.js → folder-D8z58t7B.js} +1 -1
- package/dist/elements/chunks/form-p5BKJNw5.js +1 -0
- package/dist/elements/chunks/hover-card-CN9s2md5.js +1 -0
- package/dist/elements/chunks/{icon-BLb8beoi.js → icon-CNiKP37E.js} +1 -1
- package/dist/elements/chunks/{info-CIsv92JK.js → info-BSnuJiHI.js} +1 -1
- package/dist/elements/chunks/{input-Dds1kFyt.js → input-BauDmzxX.js} +1 -1
- package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-BlHJaP9b.js} +1 -1
- package/dist/elements/chunks/{link-i4r_k7z4.js → link-DEi5iUWC.js} +1 -1
- package/dist/elements/chunks/link-preview-BaHyM6W4.js +1 -0
- package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-CmJG_Fkq.js} +1 -1
- package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-D2jaMpCN.js} +1 -1
- package/dist/elements/chunks/message-C5UfXZ2Z.js +1 -0
- package/dist/elements/chunks/message-CXWLmmLn.js +1 -0
- package/dist/elements/chunks/message-square-hXylwsy0.js +1 -0
- package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-C9ytZFMU.js} +1 -1
- package/dist/elements/chunks/model-switcher-CivGfD7-.js +1 -0
- package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-DJL_sbOm.js} +1 -1
- package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CFaB8naM.js} +1 -1
- package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-Br5SksfR.js} +1 -1
- package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-CMIvtAhU.js} +1 -1
- package/dist/elements/chunks/reasoning-DpZcNzLq.js +1 -0
- package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-Q8i3T9a_.js} +1 -1
- package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-B5IHCBFV.js} +1 -1
- package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-eLeydBje.js} +1 -1
- package/dist/elements/chunks/scroll-button-DWbz0yA1.js +1 -0
- package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-Xic78AD_.js} +1 -1
- package/dist/elements/chunks/{settings-B8lmec4D.js → settings-B8H51pAx.js} +1 -1
- package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-CsG9eYLe.js} +1 -1
- package/dist/elements/chunks/{share-C3lTiYGt.js → share-CNTx0z__.js} +1 -1
- package/dist/elements/chunks/skeleton-CLlHTcMI.js +1 -0
- package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
- package/dist/elements/chunks/source-BoVcU5ok.js +1 -0
- package/dist/elements/chunks/{star-CSJtGxgv.js → star-CxQVTVhI.js} +1 -1
- package/dist/elements/chunks/{store-CHyW95TP.js → store-CLtS5CUG.js} +1 -1
- package/dist/elements/chunks/tasks-card-CzlkLmUt.js +1 -0
- package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D5NhpIQ1.js} +1 -1
- package/dist/elements/chunks/textarea-x5Uxsmtm.js +1 -0
- package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-UobcJnx9.js} +1 -1
- package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-BOfs9eXq.js} +1 -1
- package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-Be6Dh_dt.js} +1 -1
- package/dist/elements/chunks/tooltip-RxMxyCLF.js +1 -0
- package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C4yxH2XN.js} +1 -1
- package/dist/elements/chunks/use-card-resolution-jva9ehH6.js +1 -0
- package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Dx4VRcjS.js} +2 -2
- package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-Y1ZTWgEa.js} +1 -1
- package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-B9gml9Cg.js} +2 -2
- package/dist/elements/chunks/{video-B7vmenoC.js → video-CrPHsytT.js} +1 -1
- package/dist/elements/chunks/x-_-OPHept.js +1 -0
- 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-list.js +1 -1
- package/dist/elements/default-input.d.ts +34 -7
- package/dist/elements/define.d.ts +1 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/disclosure.d.ts +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +107 -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-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/reasoning.js +1 -1
- package/dist/elements/register.d.ts +8 -6
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +1 -1
- 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/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/slot-text.d.ts +51 -0
- package/dist/elements/slots.d.ts +21 -0
- 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/validate-messages.d.ts +25 -0
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +2734 -217
- package/dist/index.d.ts +163 -125
- package/dist/index.js +6572 -5990
- package/dist/index.server.d.ts +5 -0
- package/dist/index.server.js +5403 -4860
- package/dist/kai-provider.es.d.ts +5 -0
- package/dist/kai-provider.es.js +79 -77
- package/dist/kai.es.d.ts +5 -0
- package/dist/kai.es.js +1 -1
- package/dist/llms/llms-full.txt +774 -151
- package/dist/llms/llms.txt +57 -5
- package/dist/mcp.es.js +4756 -782
- package/dist/primitives/card-component-types.d.ts +11 -0
- package/dist/primitives/card-data-types.d.ts +196 -0
- package/dist/primitives/card-host.d.ts +1 -1
- package/dist/primitives/card-recovery.d.ts +3 -3
- package/dist/primitives/card-registry.d.ts +4 -14
- package/dist/primitives/card-resolution.d.ts +1 -1
- package/dist/primitives/card-routing.d.ts +1 -1
- package/dist/primitives/card-tags.d.ts +11 -0
- package/dist/primitives/card-validate-cards.d.ts +57 -0
- package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
- package/dist/primitives/card-validate-schemas.d.ts +17 -0
- package/dist/primitives/card-validate.d.ts +24 -0
- package/dist/primitives/create-kai-chat.d.ts +3 -3
- package/dist/primitives/embed-providers.d.ts +1 -1
- package/dist/primitives/link-preview.d.ts +1 -1
- package/dist/primitives/message-feedback.d.ts +2 -2
- package/dist/primitives/toast-store.d.ts +1 -1
- package/dist/react/index.d.ts +730 -302
- package/dist/react/use-kai-chat.d.ts +8 -4
- package/dist/react.d.ts +5 -0
- package/dist/react.js +418 -317
- package/dist/register-impl-AxIlqjo7.js +145 -0
- package/dist/remote/host-embed.d.ts +1 -1
- package/dist/remote/index.d.ts +2 -2
- package/dist/remote/provider-runtime.d.ts +2 -2
- package/dist/remote/provider.d.ts +2 -2
- package/dist/remote/validate.d.ts +1 -1
- package/dist/remote/wire.d.ts +1 -1
- package/dist/schemas/artifact.schema.json +92 -0
- package/dist/schemas/embed.schema.json +0 -2
- package/dist/schemas/from-tool-call.d.ts +48 -0
- package/dist/schemas/index.d.ts +48 -0
- package/dist/schemas/link.schema.json +0 -2
- package/dist/schemas/provider-subsets.d.ts +136 -0
- package/dist/schemas/registry.d.ts +140 -0
- package/dist/schemas/tool-defs.d.ts +121 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +717 -0
- package/dist/solid-BGYSJyHG.js +22960 -0
- package/dist/solid-Dt2nEwfl.js +20194 -0
- package/dist/solid.d.ts +66 -0
- package/dist/solid.js +261 -0
- package/dist/solid.server.d.ts +5 -0
- package/dist/solid.server.js +261 -0
- package/dist/state/index.d.ts +14 -4
- package/dist/state/messages.d.ts +8 -3
- package/dist/state/mock.d.ts +46 -0
- package/dist/state/parts.d.ts +85 -0
- package/dist/state/stream.d.ts +15 -9
- package/dist/state.d.ts +5 -0
- package/dist/state.js +253 -84
- package/dist/ui/action-icons.d.ts +1 -1
- package/dist/ui/collapsible.d.ts +11 -6
- package/dist/ui/dropdown.d.ts +47 -42
- package/dist/ui/pane-group.d.ts +1 -1
- package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-B44X69AG.js} +1 -1
- package/dist/variant-aurora-BRhV8Flk.js +391 -0
- package/dist/variant-aurora-Ds5ou9BH.js +381 -0
- package/dist/variant-custom-B20FhtYj.js +170 -0
- package/dist/{variant-custom-Dif-IV4u.js → variant-custom-BvA1Schl.js} +1 -1
- package/dist/variant-custom-D6Rtvneb.js +200 -0
- package/dist/{variant-wave-DbfNdvSi.js → variant-wave-BUQtkryq.js} +1 -1
- package/dist/variant-wave-BVYnqy9L.js +218 -0
- package/dist/variant-wave-DXC6_LcH.js +208 -0
- package/dist/wire/chunk.d.ts +171 -0
- package/dist/wire/consume.d.ts +26 -0
- package/dist/wire/encode.d.ts +221 -0
- package/dist/wire/files.d.ts +116 -0
- package/dist/wire/formats/anthropic.d.ts +2 -0
- package/dist/wire/formats/openai.d.ts +5 -0
- package/dist/wire/index.d.ts +16 -0
- package/dist/wire/media-types.d.ts +106 -0
- package/dist/wire/read.d.ts +26 -0
- package/dist/wire/sink-helpers.d.ts +21 -0
- package/dist/wire/sse.d.ts +33 -0
- package/dist/wire.d.ts +5 -53
- package/dist/wire.js +1126 -0
- package/frameworks/react/index.tsx +191 -158
- package/frameworks/react/runtime.tsx +21 -1
- package/frameworks/react/use-kai-chat.tsx +11 -1
- package/llms-full.txt +774 -151
- package/llms.txt +57 -5
- package/package.json +62 -8
- package/src/agent-tooling/archetypes.ts +127 -0
- package/src/agent-tooling/integrations/anthropic.ts +436 -0
- package/src/agent-tooling/integrations/cloudflare.ts +141 -52
- package/src/agent-tooling/integrations/langgraph.ts +80 -13
- package/src/agent-tooling/integrations/mastra.ts +161 -12
- package/src/agent-tooling/integrations/mock.ts +47 -8
- package/src/agent-tooling/integrations/ollama.ts +68 -24
- package/src/agent-tooling/integrations/openai.ts +89 -0
- package/src/agent-tooling/integrations/openrouter.ts +58 -8
- package/src/agent-tooling/integrations/pi.ts +104 -23
- package/src/agent-tooling/integrations/pydantic-ai.ts +61 -5
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +120 -13
- package/src/agent-tooling/mcp/manifest.ts +206 -25
- package/src/agent-tooling/mcp/tools/debug.ts +13 -7
- package/src/agent-tooling/mcp/tools/reference.ts +285 -6
- package/src/agent-tooling/mcp/tools/scaffold.ts +4152 -661
- package/src/agent-tooling/registry.ts +74 -0
- package/src/agent-tooling/types.ts +361 -1
- package/src/components/artifact-card.tsx +120 -0
- package/src/components/audio-visualizer/index.tsx +9 -0
- package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
- package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
- package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
- package/src/components/card-fallback.tsx +42 -10
- package/src/components/card-renderer.tsx +146 -9
- package/src/components/chat-container.tsx +4 -0
- package/src/components/chat-thread.tsx +128 -52
- package/src/components/choice-card.tsx +17 -29
- package/src/components/composer.tsx +12 -2
- package/src/components/confirm-card.tsx +24 -20
- package/src/components/context.tsx +30 -16
- package/src/components/conversation-item.tsx +6 -0
- package/src/components/conversation-list.tsx +18 -2
- package/src/components/file-tree.tsx +11 -22
- package/src/components/file-upload.tsx +14 -8
- package/src/components/form.tsx +14 -47
- package/src/components/loader.tsx +39 -12
- package/src/components/message-skills.tsx +4 -0
- package/src/components/message.tsx +294 -46
- package/src/components/model-switcher.tsx +38 -8
- package/src/components/reasoning.tsx +92 -5
- package/src/components/response-compare-types.ts +25 -0
- package/src/components/response-compare.tsx +4 -9
- package/src/components/source.tsx +50 -24
- package/src/components/tasks-card.tsx +10 -33
- package/src/components/thread.tsx +84 -42
- package/src/components/toast.tsx +17 -6
- package/src/components/tool-classify.ts +26 -0
- package/src/components/tool-types.ts +31 -1
- package/src/elements/agent-card.tsx +11 -11
- package/src/elements/artifact.tsx +15 -7
- package/src/elements/attachments.tsx +6 -4
- package/src/elements/avatar.tsx +1 -1
- package/src/elements/button.tsx +29 -6
- package/src/elements/card.tsx +2 -2
- package/src/elements/cards.tsx +109 -14
- package/src/elements/chain-of-thought.tsx +14 -10
- package/src/elements/chat-scope-picker.tsx +9 -7
- package/src/elements/chat-types.ts +59 -6
- package/src/elements/chat-workspace.tsx +50 -9
- package/src/elements/chat.tsx +90 -3
- package/src/elements/choice.tsx +8 -8
- package/src/elements/coachmark.tsx +1 -1
- package/src/elements/command.tsx +8 -23
- package/src/elements/compare.tsx +7 -6
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +8 -8
- package/src/elements/confirm-card.tsx +9 -9
- package/src/elements/context-meter.tsx +4 -18
- package/src/elements/conversation-list.tsx +14 -9
- package/src/elements/default-input.tsx +131 -8
- package/src/elements/define.tsx +178 -43
- package/src/elements/editable-label.tsx +17 -2
- package/src/elements/element-data-types.ts +112 -0
- package/src/elements/element-meta.json +1624 -306
- package/src/elements/element-types.d.ts +2645 -214
- package/src/elements/feedback-bar.tsx +1 -1
- package/src/elements/file-tree.tsx +1 -1
- package/src/elements/file-upload.tsx +1 -1
- package/src/elements/form.tsx +14 -6
- package/src/elements/input.tsx +1 -1
- package/src/elements/kbd.tsx +1 -1
- package/src/elements/menu.tsx +40 -32
- package/src/elements/message-skills.tsx +7 -9
- package/src/elements/message.tsx +200 -32
- package/src/elements/model-switcher.tsx +5 -3
- package/src/elements/pane.tsx +1 -1
- package/src/elements/prompt-dock.tsx +8 -8
- package/src/elements/prompt-input.tsx +10 -10
- package/src/elements/prompt-suggestions.tsx +7 -4
- package/src/elements/reasoning.tsx +1 -1
- package/src/elements/register.ts +9 -0
- package/src/elements/resizable.globals.d.ts +36 -0
- package/src/elements/resizable.tsx +24 -13
- package/src/elements/response-stream.tsx +1 -1
- package/src/elements/scroll-button.tsx +1 -1
- package/src/elements/search.tsx +6 -1
- package/src/elements/segmented.tsx +5 -11
- package/src/elements/separator.tsx +1 -1
- package/src/elements/slot-text.ts +73 -0
- package/src/elements/slots.ts +67 -24
- package/src/elements/source.tsx +21 -22
- package/src/elements/switch.tsx +3 -3
- package/src/elements/tasks.tsx +5 -4
- package/src/elements/thread.tsx +36 -4
- package/src/elements/toast.tsx +3 -2
- package/src/elements/tool.tsx +1 -1
- package/src/elements/validate-messages.ts +76 -0
- package/src/elements/voice-input.tsx +7 -7
- package/src/elements/voice-output.tsx +4 -4
- package/src/index.ts +145 -6
- package/src/primitives/card-component-types.ts +63 -0
- package/src/primitives/card-data-types.ts +312 -0
- package/src/primitives/card-recovery.ts +13 -2
- package/src/primitives/card-registry.tsx +34 -23
- package/src/primitives/card-schemas/artifact.schema.json +92 -0
- package/src/primitives/card-schemas/embed.schema.json +0 -2
- package/src/primitives/card-schemas/link.schema.json +0 -2
- package/src/primitives/card-tags.ts +61 -0
- package/src/primitives/card-validate-cards.ts +255 -0
- package/src/primitives/card-validate-generator.testlib.ts +38 -0
- package/src/primitives/card-validate-schemas.ts +58 -0
- package/src/primitives/card-validate.ts +48 -20
- package/src/primitives/create-tween.ts +54 -2
- package/src/primitives/message-feedback.ts +3 -2
- package/src/primitives/use-audio-analysis.ts +20 -1
- package/src/primitives/use-sequencer.ts +20 -1
- package/src/schemas/from-tool-call.ts +151 -0
- package/src/schemas/index.ts +340 -0
- package/src/schemas/provider-subsets.ts +538 -0
- package/src/schemas/registry.ts +355 -0
- package/src/schemas/tool-defs.ts +492 -0
- package/src/solid.ts +150 -0
- package/src/state/index.ts +27 -1
- package/src/state/messages.ts +21 -4
- package/src/state/mock.ts +211 -0
- package/src/state/parts.ts +295 -0
- package/src/state/stream.ts +56 -58
- package/src/ui/collapsible.tsx +17 -5
- package/src/ui/dropdown.tsx +46 -12
- package/src/ui/overlay.tsx +10 -4
- package/src/wire/chunk.ts +201 -0
- package/src/wire/consume.ts +440 -0
- package/src/wire/encode.ts +689 -0
- package/src/wire/files.ts +342 -0
- package/src/wire/formats/anthropic.ts +267 -0
- package/src/wire/formats/openai.ts +187 -0
- package/src/wire/index.ts +73 -0
- package/src/wire/media-types.ts +344 -0
- package/src/wire/read.ts +152 -0
- package/src/wire/sink-helpers.ts +50 -0
- package/src/wire/sse.ts +140 -0
- package/dist/create-tween-hvpmSuwW.js +0 -7
- package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
- package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
- package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
- package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
- package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
- package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
- package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
- package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
- package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
- package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
- package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
- package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
- package/dist/elements/chunks/default-input-Cqqilg9t.js +0 -1
- package/dist/elements/chunks/define-D1din7Ld.js +0 -1
- package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
- package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
- package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
- package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
- package/dist/elements/chunks/model-switcher-B94YAKsM.js +0 -1
- package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
- package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
- package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
- package/dist/elements/chunks/slots--V19HwUb.js +0 -1
- package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
- package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
- package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
- package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
- package/dist/host-embed.d.ts +0 -33
- package/dist/kai-provider.d.ts +0 -2
- package/dist/origin.d.ts +0 -5
- package/dist/provider-runtime.d.ts +0 -27
- package/dist/register-impl-DQyejdfb.js +0 -145
- package/dist/validate.d.ts +0 -4
- package/dist/version.d.ts +0 -4
- package/src/components/component-meta.json +0 -4550
- package/src/elements/card-media.jpg +0 -0
- package/src/elements/resizable.d.ts +0 -27
- package/src/elements/video-poster.jpg +0 -0
package/src/elements/chat.tsx
CHANGED
|
@@ -2,7 +2,11 @@ import { createEffect, createSignal, onCleanup, onMount } from 'solid-js';
|
|
|
2
2
|
import { defineWebComponent } from './define';
|
|
3
3
|
import { CHAT_SLOTS, readSlots } from './slots';
|
|
4
4
|
import { ChatThread, type ChatThreadProps, type ChatThreadContextUsage, type ChatThreadController } from '../components/chat-thread';
|
|
5
|
+
import { cardComponentsFromTags } from './message';
|
|
6
|
+
import { createMessagesGuard } from './validate-messages';
|
|
5
7
|
import type { AttachmentData } from '../components/attachments';
|
|
8
|
+
import type { RejectedAttachment } from './default-input';
|
|
9
|
+
import type { ChatMessage } from './chat-types';
|
|
6
10
|
import type { TriggerDef } from '../components/composer';
|
|
7
11
|
import type { ComposerDoc } from '../primitives/composer-model';
|
|
8
12
|
import type { ProseSize } from '../primitives/chat-config';
|
|
@@ -10,7 +14,56 @@ import type { ModelOption } from '../types';
|
|
|
10
14
|
|
|
11
15
|
type Props = Omit<ChatThreadProps,
|
|
12
16
|
'class' | 'onValueChange' | 'onSubmit' | 'onAttachmentsChange' | 'onSuggestionClick' | 'onModelChange'
|
|
13
|
-
| 'onMessageAction' | 'onSearch' | 'onVoice' | 'controllerRef'
|
|
17
|
+
| 'onMessageAction' | 'onSearch' | 'onVoice' | 'controllerRef' | 'cardTypes' | 'cardSchemas' | 'messages'
|
|
18
|
+
| 'accept' | 'onAttachmentsRejected'> & Record<string, unknown> & {
|
|
19
|
+
/** Which attachment media types the user may stage, in HTML `accept` syntax:
|
|
20
|
+
* `<kai-chat accept="image/*,application/pdf">`. A plain string, so unlike
|
|
21
|
+
* `messages` it DOES work as an attribute. Omitted means no filter.
|
|
22
|
+
*
|
|
23
|
+
* MEDIA TYPES ONLY -- exact (`image/png`) or subtype wildcard (`text/*`).
|
|
24
|
+
* HTML allows a file extension here and this does not: `accept=".py"` THROWS
|
|
25
|
+
* with the entry named, rather than silently resolving to a picker that
|
|
26
|
+
* accepts nothing.
|
|
27
|
+
*
|
|
28
|
+
* It can only NARROW what the kit can already encode: `accept="image/*"`
|
|
29
|
+
* resolves to the four image formats both APIs take, not to every image type
|
|
30
|
+
* the OS offers. Pass the SAME string to `toOpenAIMessages(msgs, { accept })`
|
|
31
|
+
* and the picker and the wire cannot disagree -- both resolve it through
|
|
32
|
+
* `resolveMediaPolicy` against one declaration. That declaration is readable
|
|
33
|
+
* as `encodableMediaTypes()` from `@kitn.ai/ui/wire`, if you would rather
|
|
34
|
+
* build your own picker than use this prop. */
|
|
35
|
+
accept?: string;
|
|
36
|
+
/** The full message thread to render, newest last. Each entry carries its
|
|
37
|
+
* role, ordered `parts`, and optional actions/avatar/feedback. Set as a JS
|
|
38
|
+
* property (`el.messages = [...]`); a NEW array reference per streaming
|
|
39
|
+
* chunk re-renders (mutating in place does not). Omit for an empty thread.
|
|
40
|
+
*
|
|
41
|
+
* Re-declared here (rather than inherited from `ChatThreadProps`) because
|
|
42
|
+
* the ELEMENT registers a `[]` default and renders the empty state without
|
|
43
|
+
* it, while the SolidJS `<ChatThread>` component still requires it. The
|
|
44
|
+
* facade hands it a validated array either way. Matches `<kai-thread>`. */
|
|
45
|
+
messages?: ChatMessage[];
|
|
46
|
+
/** Optional card type -> custom-element tag overrides/additions for `card`
|
|
47
|
+
* parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
|
|
48
|
+
* plain string map (not the `CardTagMap` alias) so the generated React
|
|
49
|
+
* wrapper inlines it instead of emitting an unresolved named type. */
|
|
50
|
+
cardTypes?: Record<string, string>;
|
|
51
|
+
/** JSON Schemas for the card types this app renders, keyed by envelope type. The
|
|
52
|
+
* companion of `cardTypes`, which says what DRAWS a card while this says what a
|
|
53
|
+
* VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
|
|
54
|
+
* = { 'pricing-table': pricingSchema }`, never an attribute.
|
|
55
|
+
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
56
|
+
*
|
|
57
|
+
* Without it the kit validates its own seven built-ins and leaves your own card
|
|
58
|
+
* type, the one your app actually cares about, as the only unchecked thing on
|
|
59
|
+
* screen. A schema here WINS over a built-in of the same name.
|
|
60
|
+
*
|
|
61
|
+
* Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
|
|
62
|
+
* deliberately: an imported `.json` schema widens `"type"` to `string`, and an
|
|
63
|
+
* authored one carries `$schema`/`title`/`description`/`additionalProperties`,
|
|
64
|
+
* so the tighter type would reject both of the normal ways to supply one. */
|
|
65
|
+
cardSchemas?: Record<string, object>;
|
|
66
|
+
};
|
|
14
67
|
|
|
15
68
|
interface Events {
|
|
16
69
|
/** User submitted a message. */
|
|
@@ -20,6 +73,11 @@ interface Events {
|
|
|
20
73
|
/** The staged attachments changed (file added or removed). Carries the full
|
|
21
74
|
* current list so a consumer can react in real time. */
|
|
22
75
|
'kai-attachments-change': { attachments: AttachmentData[] };
|
|
76
|
+
/** One or more picked files were refused because `accept` excluded them. The
|
|
77
|
+
* element renders NO message of its own: it reports the facts (name, media
|
|
78
|
+
* type, whether the kit could have sent it) and what the user should see is
|
|
79
|
+
* the application's call. Only ever fires when `accept` is set. */
|
|
80
|
+
'kai-attachments-rejected': { rejected: RejectedAttachment[] };
|
|
23
81
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
24
82
|
'kai-suggestion-click': { value: string };
|
|
25
83
|
/** An action button on a message was clicked. `action` is the built-in name or
|
|
@@ -40,8 +98,14 @@ defineWebComponent<Props, Events>('kai-chat', {
|
|
|
40
98
|
codeTheme: 'github-dark-dimmed', codeHighlight: true, chatTitle: undefined,
|
|
41
99
|
models: undefined, currentModel: undefined, context: undefined, scrollButton: true,
|
|
42
100
|
search: false, voice: false, triggers: undefined, kindIcons: undefined,
|
|
43
|
-
actionsReveal: 'always',
|
|
101
|
+
actionsReveal: 'always', cardTypes: undefined, cardSchemas: undefined, accept: undefined,
|
|
44
102
|
}, (props, { dispatch, flag, element, expose }) => {
|
|
103
|
+
// `messages` is an untyped boundary: a consumer can hand it anything at
|
|
104
|
+
// runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
|
|
105
|
+
// the invalid entries rather than let `groupMessageParts` throw deep inside a
|
|
106
|
+
// render pass, which would blank the whole chat instead of one message.
|
|
107
|
+
const validMessages = createMessagesGuard('kai-chat');
|
|
108
|
+
|
|
45
109
|
// Slot detection is driven by the CHAT_SLOTS registry (single source of truth)
|
|
46
110
|
// so slot names never drift between the view, the facade, and the docs.
|
|
47
111
|
const [slots, setSlots] = createSignal<Record<string, boolean>>({});
|
|
@@ -62,16 +126,35 @@ defineWebComponent<Props, Events>('kai-chat', {
|
|
|
62
126
|
// (focus the composer, clear it, send programmatically, scroll the thread).
|
|
63
127
|
let controller: ChatThreadController | undefined;
|
|
64
128
|
expose({
|
|
129
|
+
/** Focus the composer, meaning the contenteditable (or textarea) inside the
|
|
130
|
+
* shadow root. A native `focus()` on the host lands on the host itself and
|
|
131
|
+
* never reaches it, so this is the only way to focus the input
|
|
132
|
+
* programmatically. */
|
|
65
133
|
focus: (options?: FocusOptions) => controller?.focus(options),
|
|
134
|
+
/** Blur whatever currently holds focus inside the shadow root. The companion
|
|
135
|
+
* to `focus()`, for the same reason: a native `blur()` on the host misses
|
|
136
|
+
* the real focus target. */
|
|
66
137
|
blur: () => (element.shadowRoot?.activeElement as HTMLElement | null)?.blur(),
|
|
138
|
+
/** Empty the COMPOSER: drops the draft text and every staged attachment, then
|
|
139
|
+
* fires `kai-value-change` with `''`. It does NOT touch the thread. `messages`
|
|
140
|
+
* is the consumer's own state, so clearing history stays the consumer's call. */
|
|
67
141
|
clear: () => controller?.clear(),
|
|
142
|
+
/** Submit whatever the composer currently holds, on the same path as Enter or
|
|
143
|
+
* the send button: fires `kai-submit` with that value plus the staged
|
|
144
|
+
* attachments, then drops the attachments. It takes no argument, so to send
|
|
145
|
+
* text the user never typed, set `el.value` first. There is no empty-check,
|
|
146
|
+
* so an empty composer still fires. The draft is cleared afterwards only when
|
|
147
|
+
* `value` is uncontrolled; a controlled host owns its value and clears it
|
|
148
|
+
* itself. Named `send`, not `submit`, to match the shared vocabulary. */
|
|
68
149
|
send: () => controller?.send(),
|
|
150
|
+
/** Scroll the message viewport to the newest message. Defaults to `'smooth'`;
|
|
151
|
+
* pass `'instant'` to jump without animating. */
|
|
69
152
|
scrollToBottom: (behavior?: ScrollBehavior) => controller?.scrollToBottom(behavior),
|
|
70
153
|
});
|
|
71
154
|
|
|
72
155
|
return (
|
|
73
156
|
<ChatThread
|
|
74
|
-
messages={props.messages} value={props.value as string | ComposerDoc | undefined} placeholder={props.placeholder as string}
|
|
157
|
+
messages={validMessages(props.messages)} value={props.value as string | ComposerDoc | undefined} placeholder={props.placeholder as string}
|
|
75
158
|
loading={flag('loading')} suggestions={props.suggestions as string[] | undefined}
|
|
76
159
|
suggestionMode={props.suggestionMode as 'submit' | 'fill'} persistSuggestions={flag('persistSuggestions')}
|
|
77
160
|
proseSize={props.proseSize as ProseSize}
|
|
@@ -82,9 +165,13 @@ defineWebComponent<Props, Events>('kai-chat', {
|
|
|
82
165
|
triggers={props.triggers as TriggerDef[] | undefined}
|
|
83
166
|
kindIcons={props.kindIcons as Record<string, string> | undefined}
|
|
84
167
|
actionsReveal={props.actionsReveal as 'always' | 'hover'}
|
|
168
|
+
cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
|
|
169
|
+
cardSchemas={props.cardSchemas as Record<string, object> | undefined}
|
|
85
170
|
onValueChange={(value) => dispatch('kai-value-change', { value })}
|
|
86
171
|
onSubmit={(detail) => dispatch('kai-submit', detail)}
|
|
172
|
+
accept={props.accept as string | undefined}
|
|
87
173
|
onAttachmentsChange={(attachments) => dispatch('kai-attachments-change', { attachments })}
|
|
174
|
+
onAttachmentsRejected={(rejected) => dispatch('kai-attachments-rejected', { rejected })}
|
|
88
175
|
onSuggestionClick={(value) => dispatch('kai-suggestion-click', { value })}
|
|
89
176
|
onModelChange={(modelId) => dispatch('kai-model-change', { modelId })}
|
|
90
177
|
onMessageAction={(detail) => dispatch('kai-message-action', detail)}
|
package/src/elements/choice.tsx
CHANGED
|
@@ -6,7 +6,7 @@ interface Props extends Record<string, unknown> {
|
|
|
6
6
|
/** The choice definition (the CardEnvelope.data). Set as a JS PROPERTY:
|
|
7
7
|
* `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import
|
|
8
8
|
* `ChoiceCardData` from `@kitn.ai/ui` for the full shape. */
|
|
9
|
-
data?:
|
|
9
|
+
data?: ChoiceCardData;
|
|
10
10
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
11
11
|
cardId?: string;
|
|
12
12
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -14,7 +14,7 @@ interface Props extends Record<string, unknown> {
|
|
|
14
14
|
/** Set when the user resolved this card; renders the read-only view. Property:
|
|
15
15
|
* `el.resolution = { kind:'action', action:'…' }`. */
|
|
16
16
|
resolution?: Record<string, unknown>;
|
|
17
|
-
/** Controlled selection
|
|
17
|
+
/** Controlled selection: the selected option id. When set, the consumer owns
|
|
18
18
|
* the current pick (RadioGroup `value`). Attribute: `value`. */
|
|
19
19
|
value?: string;
|
|
20
20
|
/** Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`. */
|
|
@@ -68,23 +68,23 @@ defineWebComponent<Props, Events>(
|
|
|
68
68
|
expose({
|
|
69
69
|
/** Focus the radiogroup roving tab stop (or the Other input when selected). */
|
|
70
70
|
focus: (options?: FocusOptions) => controller?.focus(options),
|
|
71
|
-
/** Select an option by id locally
|
|
72
|
-
*
|
|
71
|
+
/** Select an option by id locally: no emit, fires kai-value-change (same as a
|
|
72
|
+
* row click). Lets a consumer pre-highlight or drive selection externally. */
|
|
73
73
|
select: (optionId: string) => controller?.select(optionId),
|
|
74
|
-
/** Submit the current selection
|
|
74
|
+
/** Submit the current selection: emits the `action` verb on kai-card and
|
|
75
75
|
* resolves the card (single-shot). Named `send`, not `submit`, per the shared
|
|
76
76
|
* vocabulary. */
|
|
77
77
|
send: () => controller?.send(),
|
|
78
|
-
/** Trigger the dismiss path
|
|
78
|
+
/** Trigger the dismiss path: emits `dismiss` on kai-card and optimistically
|
|
79
79
|
* collapses the card to its re-openable stub. */
|
|
80
80
|
dismiss: () => controller?.dismiss(),
|
|
81
|
-
/** Re-open a dismissed card from its stub
|
|
81
|
+
/** Re-open a dismissed card from its stub: emits `reopen` on kai-card. */
|
|
82
82
|
reopen: () => controller?.reopen(),
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
return (
|
|
86
86
|
<ChoiceCard
|
|
87
|
-
data={props.data
|
|
87
|
+
data={props.data}
|
|
88
88
|
cardId={props.cardId ?? (element.id || 'kai-choice')}
|
|
89
89
|
heading={props.heading}
|
|
90
90
|
resolution={props.resolution as CardResolution | undefined}
|
|
@@ -17,7 +17,7 @@ interface Props extends Record<string, unknown> {
|
|
|
17
17
|
/** Floating placement relative to the anchor (default `bottom`). */
|
|
18
18
|
placement?: string;
|
|
19
19
|
/** Color tone: `primary` (default, theme accent), `info` (blue), `success`
|
|
20
|
-
* (green), `warning` (amber), or `error` (red)
|
|
20
|
+
* (green), `warning` (amber), or `error` (red), reusing the kit's tool hues. */
|
|
21
21
|
tone?: 'primary' | 'info' | 'success' | 'warning' | 'error';
|
|
22
22
|
/** Render the arrow that points at the anchor (default `true`). Set
|
|
23
23
|
* `arrow="false"` for a plain bubble with no pointer. */
|
package/src/elements/command.tsx
CHANGED
|
@@ -1,30 +1,15 @@
|
|
|
1
1
|
import { createEffect, createMemo, createSignal, createUniqueId, on } from 'solid-js';
|
|
2
2
|
import { CommandList, type CommandGroup } from '../ui/command';
|
|
3
3
|
import { defineWebComponent } from './define';
|
|
4
|
+
import type { KaiCommandItem } from './element-data-types';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
export interface KaiCommandItem {
|
|
11
|
-
/** Unique identifier emitted in `kai-select`. */
|
|
12
|
-
id: string;
|
|
13
|
-
/** Display name shown in the list row. */
|
|
14
|
-
label: string;
|
|
15
|
-
/** Named icon (e.g. "search"), image URL / data-URI, or plain text. */
|
|
16
|
-
icon?: string;
|
|
17
|
-
/** Muted supplementary text (e.g. a file path or a short description). */
|
|
18
|
-
description?: string;
|
|
19
|
-
/** Optional keyboard shortcut shown as right-aligned key caps; uses the
|
|
20
|
-
* kai-kbd `keys` syntax (e.g. "Mod+K", "Alt+1"). */
|
|
21
|
-
shortcut?: string;
|
|
22
|
-
/** Group name that buckets this item under a section header. */
|
|
23
|
-
group?: string;
|
|
24
|
-
}
|
|
6
|
+
// The item shape lives in ./element-data-types so the ROOT entry can re-export it
|
|
7
|
+
// (a per-element module's shipped .d.ts is `export {};`). Re-exported here so
|
|
8
|
+
// `import type { KaiCommandItem } from './command'` keeps working.
|
|
9
|
+
export type { KaiCommandItem } from './element-data-types';
|
|
25
10
|
|
|
26
11
|
interface Props extends Record<string, unknown> {
|
|
27
|
-
/** Flat list of items. Set as a JS property
|
|
12
|
+
/** Flat list of items. Set as a JS property, not an HTML attribute. */
|
|
28
13
|
items?: KaiCommandItem[];
|
|
29
14
|
/** Placeholder text for the search input. */
|
|
30
15
|
placeholder?: string;
|
|
@@ -37,7 +22,7 @@ interface Events {
|
|
|
37
22
|
'kai-select': { id: string };
|
|
38
23
|
/** Fired on every keystroke in the search input. */
|
|
39
24
|
'kai-query-change': { value: string };
|
|
40
|
-
/** Fired when the highlighted/active item changes
|
|
25
|
+
/** Fired when the highlighted/active item changes, via Arrow keys or when
|
|
41
26
|
* filtering re-clamps the active row. `id` is the newly active item's id, or
|
|
42
27
|
* `undefined` when no item is active (e.g. the filtered list is empty). Lets a
|
|
43
28
|
* host preview the active item without committing a selection. */
|
|
@@ -169,7 +154,7 @@ defineWebComponent<Props, Events>('kai-command', {
|
|
|
169
154
|
element.shadowRoot
|
|
170
155
|
?.querySelector<HTMLInputElement>('input[role="combobox"], input')
|
|
171
156
|
?.blur(),
|
|
172
|
-
/** Reset the search query to empty
|
|
157
|
+
/** Reset the search query to empty, re-showing all items, and fire
|
|
173
158
|
* `kai-query-change` with `''`. Mirrors the Escape-key behavior. */
|
|
174
159
|
clear: () => {
|
|
175
160
|
setQuery('');
|
package/src/elements/compare.tsx
CHANGED
|
@@ -17,8 +17,8 @@ interface Props extends Record<string, unknown> {
|
|
|
17
17
|
/** Re-hydrate / control the user's pick. Set as a JS PROPERTY:
|
|
18
18
|
* `el.selection = { chosenId, rejectedIds }`. Renders the collapsed winner. */
|
|
19
19
|
selection?: Record<string, unknown>;
|
|
20
|
-
/** Layout: `'auto'` (default
|
|
21
|
-
*
|
|
20
|
+
/** Layout: `'auto'` (default, columns when wide, tabs when narrow, by CONTAINER width) |
|
|
21
|
+
* `'columns'` (side-by-side) | `'tabs'` (pills to switch). Attribute: `layout`. */
|
|
22
22
|
layout?: CompareLayout;
|
|
23
23
|
/** Prose/text size for the rendered candidates. Attribute: `prose-size`. */
|
|
24
24
|
proseSize?: ProseSize;
|
|
@@ -77,10 +77,11 @@ defineWebComponent<Props, Events>(
|
|
|
77
77
|
// component's own callbacks still fire (select → onSelect → kai-compare-select).
|
|
78
78
|
let controller: ResponseCompareController | undefined;
|
|
79
79
|
expose({
|
|
80
|
-
/** Programmatically commit a pick by candidate id
|
|
81
|
-
* this" button: fires kai-compare-select and optimistically
|
|
82
|
-
* (single-shot; inert while streaming or already resolved).
|
|
83
|
-
* NOT collide with the `selection` prop (distinct
|
|
80
|
+
/** Programmatically commit a pick by candidate id, on the same path as the
|
|
81
|
+
* "Pick this" button: fires kai-compare-select and optimistically
|
|
82
|
+
* collapses (single-shot; inert while streaming or already resolved).
|
|
83
|
+
* `select` does NOT collide with the `selection` prop (distinct
|
|
84
|
+
* identifier). */
|
|
84
85
|
select: (candidateId: string) => controller?.select(candidateId),
|
|
85
86
|
/** Focus the current roving tab stop (the focused candidate's "Pick this"
|
|
86
87
|
* radio) so a consumer can move keyboard focus into the radiogroup. */
|