@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
|
@@ -469,11 +469,21 @@ export function Composer(props: ComposerProps): JSX.Element {
|
|
|
469
469
|
const handleBlur = (e: FocusEvent) => { focused = false; clearPillSelection(); props.onBlur?.(e); };
|
|
470
470
|
|
|
471
471
|
onMount(() => {
|
|
472
|
+
// Captured at SETUP and closed over, never re-resolved as a global inside
|
|
473
|
+
// `onCleanup`: cleanup can run after the host removed the DOM globals (a
|
|
474
|
+
// `kai-*` release is deferred one microtask past detachment, so an
|
|
475
|
+
// environment teardown gets in between), and a bare `document` there throws
|
|
476
|
+
// -- from a promise nobody holds, so it lands as an unhandled rejection that
|
|
477
|
+
// fails the run while every test passes. That is how this was found.
|
|
478
|
+
// See tests/components/teardown-without-dom-globals.test.tsx.
|
|
479
|
+
// `ownerDocument` rather than a captured `document`, matching the rest of
|
|
480
|
+
// this file and staying correct for a composer inside an iframe.
|
|
481
|
+
const doc = editable.ownerDocument;
|
|
472
482
|
const onSelectionChange = () => {
|
|
473
483
|
if (focused) updateTriggerState();
|
|
474
484
|
};
|
|
475
|
-
|
|
476
|
-
onCleanup(() =>
|
|
485
|
+
doc.addEventListener('selectionchange', onSelectionChange);
|
|
486
|
+
onCleanup(() => doc.removeEventListener('selectionchange', onSelectionChange));
|
|
477
487
|
});
|
|
478
488
|
|
|
479
489
|
// --- Imperative controller (Pattern C): hand the facade a handle over the
|
|
@@ -21,29 +21,33 @@ import { useCardHost } from '../primitives/card-host';
|
|
|
21
21
|
import { AlertTriangle, Check, X } from 'lucide-solid';
|
|
22
22
|
|
|
23
23
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
-
// Types (confirm.schema.json) —
|
|
24
|
+
// Types (confirm.schema.json) — AUTHORED IN ../primitives/card-data-types.ts.
|
|
25
|
+
//
|
|
26
|
+
// They used to be declared here, and moving them is the fourth instance of the
|
|
27
|
+
// split card-tags.ts and card-component-types.ts already made twice: a type
|
|
28
|
+
// import still has to RESOLVE, so while these lived in a `.tsx` no Node/no-DOM
|
|
29
|
+
// project could name them (TS6142), which meant `@kitn.ai/ui/schemas` could not
|
|
30
|
+
// re-export them and a TypeScript backend building a card envelope got
|
|
31
|
+
// `data: unknown` while Python and Go read the full shape out of the published
|
|
32
|
+
// JSON Schemas. They are also `type` aliases rather than `interface`s now, which
|
|
33
|
+
// is what makes `el.data = myConfirmCardData` compile — see that file's header
|
|
34
|
+
// for both measurements. Re-exported here, so this module's surface is unchanged.
|
|
25
35
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
import type {
|
|
38
|
+
ConfirmAction,
|
|
39
|
+
ConfirmActionStyle,
|
|
40
|
+
ConfirmCardData,
|
|
41
|
+
ConfirmTone,
|
|
42
|
+
} from '../primitives/card-data-types';
|
|
29
43
|
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface ConfirmCardData {
|
|
39
|
-
heading?: string;
|
|
40
|
-
body?: string;
|
|
41
|
-
tone?: ConfirmTone;
|
|
42
|
-
actions: ConfirmAction[]; // 1..4
|
|
43
|
-
dismissible?: boolean;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export type ConfirmCardEnvelope = CardEnvelope<'confirm', ConfirmCardData>;
|
|
44
|
+
export type {
|
|
45
|
+
ConfirmAction,
|
|
46
|
+
ConfirmActionStyle,
|
|
47
|
+
ConfirmCardData,
|
|
48
|
+
ConfirmCardEnvelope,
|
|
49
|
+
ConfirmTone,
|
|
50
|
+
} from '../primitives/card-data-types';
|
|
47
51
|
|
|
48
52
|
export const CONFIRM_CARD_TYPE = 'confirm' as const;
|
|
49
53
|
|
|
@@ -2,12 +2,12 @@ import { type JSX, Show, createContext, createMemo, useContext } from 'solid-js'
|
|
|
2
2
|
import { HoverCardRoot, HoverCardTrigger, HoverCardContent } from '../ui/hover-card';
|
|
3
3
|
import { cn } from '../utils/cn';
|
|
4
4
|
import { Button } from '../ui/button';
|
|
5
|
+
import { ProgressBar, type ProgressTone } from '../ui/progress-bar';
|
|
5
6
|
|
|
6
7
|
const ICON_RADIUS = 10;
|
|
7
8
|
const ICON_VIEWBOX = 24;
|
|
8
9
|
const ICON_CENTER = 12;
|
|
9
10
|
const ICON_STROKE_WIDTH = 2;
|
|
10
|
-
const PERCENT_MAX = 100;
|
|
11
11
|
|
|
12
12
|
/** Default fraction (0–1) at which the meter transitions to the warning colour. */
|
|
13
13
|
export const DEFAULT_WARN_THRESHOLD = 0.7;
|
|
@@ -206,7 +206,6 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
|
|
|
206
206
|
const displayPct = createMemo(() => fmtPercent.format(usedPercent()));
|
|
207
207
|
const used = createMemo(() => fmtCompact.format(ctx.usedTokens));
|
|
208
208
|
const total = createMemo(() => fmtCompact.format(ctx.maxTokens));
|
|
209
|
-
const barWidth = createMemo(() => `${Math.min(usedPercent() * PERCENT_MAX, PERCENT_MAX)}%`);
|
|
210
209
|
|
|
211
210
|
const severity = createMemo<ContextSeverity>(() => {
|
|
212
211
|
const pct = usedPercent();
|
|
@@ -215,11 +214,16 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
|
|
|
215
214
|
return 'ok';
|
|
216
215
|
});
|
|
217
216
|
|
|
218
|
-
|
|
217
|
+
// Severity used to pick a bare hue class and nothing else, so the meter was a
|
|
218
|
+
// pair of styled divs: no role, no value, invisible to assistive tech. Map it to
|
|
219
|
+
// the shared ProgressBar's semantic `tone` instead and let that primitive supply
|
|
220
|
+
// `role="progressbar"` + aria-valuenow/min/max, rather than hand-rolling those
|
|
221
|
+
// onto the divs.
|
|
222
|
+
const tone = createMemo<ProgressTone>(() => {
|
|
219
223
|
const s = severity();
|
|
220
|
-
if (s === 'danger') return '
|
|
221
|
-
if (s === 'warn') return '
|
|
222
|
-
return '
|
|
224
|
+
if (s === 'danger') return 'error';
|
|
225
|
+
if (s === 'warn') return 'warning';
|
|
226
|
+
return 'primary';
|
|
223
227
|
});
|
|
224
228
|
|
|
225
229
|
return (
|
|
@@ -232,12 +236,14 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
|
|
|
232
236
|
</p>
|
|
233
237
|
</div>
|
|
234
238
|
<div class="space-y-2">
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
239
|
+
{/* Values are the raw token counts, so a screen reader announces
|
|
240
|
+
"190,000 of 200,000" rather than a bare percentage. */}
|
|
241
|
+
<ProgressBar
|
|
242
|
+
value={ctx.usedTokens}
|
|
243
|
+
max={ctx.maxTokens}
|
|
244
|
+
tone={tone()}
|
|
245
|
+
aria-label="Context usage"
|
|
246
|
+
/>
|
|
241
247
|
</div>
|
|
242
248
|
</Show>
|
|
243
249
|
</div>
|
|
@@ -306,7 +312,15 @@ export interface ContextUsageRowProps {
|
|
|
306
312
|
children?: JSX.Element;
|
|
307
313
|
}
|
|
308
314
|
|
|
309
|
-
|
|
315
|
+
// The four rows share one shape, but each still ships a `<Name>Props` alias: a
|
|
316
|
+
// consumer typing a wrapper around one of them should not have to discover that
|
|
317
|
+
// the shared name exists.
|
|
318
|
+
export type ContextInputUsageProps = ContextUsageRowProps;
|
|
319
|
+
export type ContextOutputUsageProps = ContextUsageRowProps;
|
|
320
|
+
export type ContextReasoningUsageProps = ContextUsageRowProps;
|
|
321
|
+
export type ContextCacheUsageProps = ContextUsageRowProps;
|
|
322
|
+
|
|
323
|
+
export function ContextInputUsage(props: ContextInputUsageProps) {
|
|
310
324
|
const ctx = useContextValue();
|
|
311
325
|
return (
|
|
312
326
|
<Show when={props.children || ctx.inputTokens}>
|
|
@@ -320,7 +334,7 @@ export function ContextInputUsage(props: ContextUsageRowProps) {
|
|
|
320
334
|
);
|
|
321
335
|
}
|
|
322
336
|
|
|
323
|
-
export function ContextOutputUsage(props:
|
|
337
|
+
export function ContextOutputUsage(props: ContextOutputUsageProps) {
|
|
324
338
|
const ctx = useContextValue();
|
|
325
339
|
return (
|
|
326
340
|
<Show when={props.children || ctx.outputTokens}>
|
|
@@ -334,7 +348,7 @@ export function ContextOutputUsage(props: ContextUsageRowProps) {
|
|
|
334
348
|
);
|
|
335
349
|
}
|
|
336
350
|
|
|
337
|
-
export function ContextReasoningUsage(props:
|
|
351
|
+
export function ContextReasoningUsage(props: ContextReasoningUsageProps) {
|
|
338
352
|
const ctx = useContextValue();
|
|
339
353
|
return (
|
|
340
354
|
<Show when={props.children || ctx.reasoningTokens}>
|
|
@@ -348,7 +362,7 @@ export function ContextReasoningUsage(props: ContextUsageRowProps) {
|
|
|
348
362
|
);
|
|
349
363
|
}
|
|
350
364
|
|
|
351
|
-
export function ContextCacheUsage(props:
|
|
365
|
+
export function ContextCacheUsage(props: ContextCacheUsageProps) {
|
|
352
366
|
const ctx = useContextValue();
|
|
353
367
|
return (
|
|
354
368
|
<Show when={props.children || ctx.cacheTokens}>
|
|
@@ -43,6 +43,12 @@ export function ConversationItem(props: ConversationItemProps) {
|
|
|
43
43
|
return (
|
|
44
44
|
<button
|
|
45
45
|
data-conversation-id={local.conversation.id}
|
|
46
|
+
// `isActive` drives the selected LOOK below; it has to reach assistive tech
|
|
47
|
+
// too, or the active conversation is visible only to sighted users. `true`
|
|
48
|
+
// rather than `page` because this selects a conversation within the app, it
|
|
49
|
+
// is not page navigation — same call as ui/agent-card.tsx and ui/pane-group.tsx
|
|
50
|
+
// (ui/nav.tsx uses `page` because its items really are nav links).
|
|
51
|
+
aria-current={local.isActive ? 'true' : undefined}
|
|
46
52
|
onClick={() => local.onSelect(local.conversation.id)}
|
|
47
53
|
class={cn(
|
|
48
54
|
'w-full rounded-lg text-left transition-colors',
|
|
@@ -16,7 +16,9 @@ import type { ConversationSummary, ConversationGroup } from '../types';
|
|
|
16
16
|
* surrounding region (the workspace puts the thread beside it, the standalone
|
|
17
17
|
* element stands alone). `onExpand` reopens the rail.
|
|
18
18
|
*/
|
|
19
|
-
export
|
|
19
|
+
export interface CollapsedRailProps { onExpand: () => void; class?: string }
|
|
20
|
+
|
|
21
|
+
export function CollapsedRail(props: CollapsedRailProps) {
|
|
20
22
|
return (
|
|
21
23
|
<Button
|
|
22
24
|
variant="ghost" size="icon-sm" aria-label="Open sidebar"
|
|
@@ -94,7 +96,21 @@ export function ConversationList(props: ConversationListProps) {
|
|
|
94
96
|
return grouped;
|
|
95
97
|
});
|
|
96
98
|
|
|
97
|
-
|
|
99
|
+
/**
|
|
100
|
+
* Everything that is NOT filed under a rendered group heading: no `groupId` at
|
|
101
|
+
* all, OR a `groupId` that matches no entry in `groups`.
|
|
102
|
+
*
|
|
103
|
+
* The second half used to be dropped on the floor. `groups` drives the render
|
|
104
|
+
* loop, so a conversation pointing at a group the consumer had not declared
|
|
105
|
+
* (a stale id, a group removed from the array, a filtered/paginated `groups`
|
|
106
|
+
* response) vanished from the sidebar with no error and no empty state — the
|
|
107
|
+
* list just silently held fewer rows than the data it was given. Falling through
|
|
108
|
+
* to "Ungrouped" keeps every conversation the consumer passed in reachable.
|
|
109
|
+
*/
|
|
110
|
+
const ungrouped = createMemo(() => {
|
|
111
|
+
const known = new Set((local.groups ?? []).map((g) => g.id));
|
|
112
|
+
return filteredConversations().filter((c) => c.groupId == null || !known.has(c.groupId));
|
|
113
|
+
});
|
|
98
114
|
|
|
99
115
|
return (
|
|
100
116
|
<div class={cn('flex flex-col h-full bg-sidebar', local.class)}>
|
|
@@ -18,28 +18,17 @@ import {
|
|
|
18
18
|
File as FileIcon,
|
|
19
19
|
} from 'lucide-solid';
|
|
20
20
|
|
|
21
|
-
/** A single artifact file the tree can show + the preview can load.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
type?: 'html' | 'pdf' | 'image' | 'other';
|
|
33
|
-
/** Lines added vs the base. Rendered as a trailing `+N` stat (success hue,
|
|
34
|
-
* tabular-nums). Only shown when present; omit for a plain file row. */
|
|
35
|
-
additions?: number;
|
|
36
|
-
/** Lines removed vs the base. Rendered as a trailing `-N` stat (error hue). */
|
|
37
|
-
deletions?: number;
|
|
38
|
-
/** Change status vs the base. Drives a small trailing status letter in the
|
|
39
|
-
* conventional VCS hue (added=green, modified=amber, deleted=red,
|
|
40
|
-
* renamed=blue, untracked=muted). Only shown when present. */
|
|
41
|
-
status?: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked';
|
|
42
|
-
}
|
|
21
|
+
/** A single artifact file the tree can show + the preview can load.
|
|
22
|
+
*
|
|
23
|
+
* AUTHORED IN ../primitives/card-data-types.ts as `ArtifactCardFile`, and aliased
|
|
24
|
+
* here rather than declared, so there is ONE shape and not a copy of one. It has
|
|
25
|
+
* to live in that `.ts` because `ArtifactCardData.files` reaches it: a type import
|
|
26
|
+
* still has to RESOLVE, and a Node/no-DOM project (tsconfig.mcp.json has no `jsx`
|
|
27
|
+
* on purpose) cannot resolve a `.tsx` at all — so leaving this declaration here
|
|
28
|
+
* would put TS6142 back on any backend that names an artifact card payload. See
|
|
29
|
+
* that file's header. */
|
|
30
|
+
export type { ArtifactCardFile as FileTreeFile } from '../primitives/card-data-types';
|
|
31
|
+
import type { ArtifactCardFile as FileTreeFile } from '../primitives/card-data-types';
|
|
43
32
|
|
|
44
33
|
/** A change status a file can carry. */
|
|
45
34
|
export type FileStatus = NonNullable<FileTreeFile['status']>;
|
|
@@ -66,16 +66,22 @@ function FileUpload(props: FileUploadProps) {
|
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
window.
|
|
69
|
+
// Captured at SETUP and closed over, never re-resolved as a global inside
|
|
70
|
+
// `onCleanup`: cleanup can run after the host removed the DOM globals (a
|
|
71
|
+
// `kai-*` release is deferred one microtask past detachment, so an
|
|
72
|
+
// environment teardown gets in between), and a bare `window` there throws.
|
|
73
|
+
// See tests/components/teardown-without-dom-globals.test.tsx.
|
|
74
|
+
const win = window;
|
|
75
|
+
win.addEventListener('dragenter', handleDragIn);
|
|
76
|
+
win.addEventListener('dragleave', handleDragOut);
|
|
77
|
+
win.addEventListener('dragover', handleDrag);
|
|
78
|
+
win.addEventListener('drop', handleDrop);
|
|
73
79
|
|
|
74
80
|
onCleanup(() => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
81
|
+
win.removeEventListener('dragenter', handleDragIn);
|
|
82
|
+
win.removeEventListener('dragleave', handleDragOut);
|
|
83
|
+
win.removeEventListener('dragover', handleDrag);
|
|
84
|
+
win.removeEventListener('drop', handleDrop);
|
|
79
85
|
});
|
|
80
86
|
});
|
|
81
87
|
|
package/src/components/form.tsx
CHANGED
|
@@ -44,53 +44,20 @@ import {
|
|
|
44
44
|
// Types (the JSON-Schema subset kai-form renders) — see form.schema.json.
|
|
45
45
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
maxItems?: number;
|
|
62
|
-
items?: FormField | { enum: unknown[] };
|
|
63
|
-
properties?: Record<string, FormField>;
|
|
64
|
-
required?: string[];
|
|
65
|
-
readOnly?: boolean;
|
|
66
|
-
'x-kai-widget'?:
|
|
67
|
-
| 'textarea'
|
|
68
|
-
| 'slider'
|
|
69
|
-
| 'rating'
|
|
70
|
-
| 'radio'
|
|
71
|
-
| 'select'
|
|
72
|
-
| 'checkbox'
|
|
73
|
-
| 'password'
|
|
74
|
-
| 'switch';
|
|
75
|
-
'x-kai-placeholder'?: string;
|
|
76
|
-
'x-kai-step'?: number;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** The form definition = CardEnvelope.data for type:'form'. */
|
|
80
|
-
export interface FormDefinition {
|
|
81
|
-
type: 'object';
|
|
82
|
-
title?: string;
|
|
83
|
-
description?: string;
|
|
84
|
-
required?: string[];
|
|
85
|
-
properties: Record<string, FormField>;
|
|
86
|
-
'x-kai-order'?: string[];
|
|
87
|
-
'x-kai-inlineMax'?: number;
|
|
88
|
-
'x-kai-submitLabel'?: string;
|
|
89
|
-
'x-kai-dismissible'?: boolean;
|
|
90
|
-
'x-kai-actions'?: { id: string; label: string; variant?: 'default' | 'ghost' | 'outline' }[];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export type FormCardEnvelope = CardEnvelope<'form', FormDefinition>;
|
|
47
|
+
// AUTHORED IN ../primitives/card-data-types.ts. See the note in confirm-card.tsx,
|
|
48
|
+
// or that file's header, for why they left a `.tsx` and why they are `type`
|
|
49
|
+
// aliases. `FormField` in particular CANNOT be an interface: it is
|
|
50
|
+
// self-referential, so the element-types generator can only inline it down to a
|
|
51
|
+
// `Record<string, unknown>` placeholder, and an interface is not assignable to
|
|
52
|
+
// that. Re-exported here unchanged.
|
|
53
|
+
|
|
54
|
+
import type { FormDefinition, FormField } from '../primitives/card-data-types';
|
|
55
|
+
|
|
56
|
+
export type {
|
|
57
|
+
FormCardEnvelope,
|
|
58
|
+
FormDefinition,
|
|
59
|
+
FormField,
|
|
60
|
+
} from '../primitives/card-data-types';
|
|
94
61
|
|
|
95
62
|
/** The internal widget identifiers `widgetFor` resolves to. */
|
|
96
63
|
export type WidgetKind =
|
|
@@ -24,9 +24,36 @@ export interface LoaderProps {
|
|
|
24
24
|
class?: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/** Props of the shape-only loader variants (no label). */
|
|
28
|
+
export interface LoaderShapeProps {
|
|
29
|
+
class?: string;
|
|
30
|
+
size?: LoaderSize;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Props of the text-based loader variants, which also take the label. */
|
|
34
|
+
export interface LoaderTextProps extends LoaderShapeProps {
|
|
35
|
+
text?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Every variant shortcut ships its own `<Name>Props` alias: a consumer typing a
|
|
39
|
+
// wrapper around `<DotsLoader>` must be able to name its props without knowing
|
|
40
|
+
// that nine components happen to share one shape.
|
|
41
|
+
export type CircularLoaderProps = LoaderShapeProps;
|
|
42
|
+
export type ClassicLoaderProps = LoaderShapeProps;
|
|
43
|
+
export type PulseLoaderProps = LoaderShapeProps;
|
|
44
|
+
export type PulseDotLoaderProps = LoaderShapeProps;
|
|
45
|
+
export type DotsLoaderProps = LoaderShapeProps;
|
|
46
|
+
export type TypingLoaderProps = LoaderShapeProps;
|
|
47
|
+
export type WaveLoaderProps = LoaderShapeProps;
|
|
48
|
+
export type BarsLoaderProps = LoaderShapeProps;
|
|
49
|
+
export type TerminalLoaderProps = LoaderShapeProps;
|
|
50
|
+
export type TextBlinkLoaderProps = LoaderTextProps;
|
|
51
|
+
export type TextShimmerLoaderProps = LoaderTextProps;
|
|
52
|
+
export type TextDotsLoaderProps = LoaderTextProps;
|
|
53
|
+
|
|
27
54
|
// --- CircularLoader ---
|
|
28
55
|
|
|
29
|
-
export function CircularLoader(props:
|
|
56
|
+
export function CircularLoader(props: CircularLoaderProps) {
|
|
30
57
|
const size = () => props.size ?? 'md';
|
|
31
58
|
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
32
59
|
return (
|
|
@@ -44,7 +71,7 @@ export function CircularLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
44
71
|
|
|
45
72
|
// --- ClassicLoader ---
|
|
46
73
|
|
|
47
|
-
export function ClassicLoader(props:
|
|
74
|
+
export function ClassicLoader(props: ClassicLoaderProps) {
|
|
48
75
|
const size = () => props.size ?? 'md';
|
|
49
76
|
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
50
77
|
const barSizes = {
|
|
@@ -81,7 +108,7 @@ export function ClassicLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
81
108
|
|
|
82
109
|
// --- PulseLoader ---
|
|
83
110
|
|
|
84
|
-
export function PulseLoader(props:
|
|
111
|
+
export function PulseLoader(props: PulseLoaderProps) {
|
|
85
112
|
const size = () => props.size ?? 'md';
|
|
86
113
|
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
87
114
|
return (
|
|
@@ -94,7 +121,7 @@ export function PulseLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
94
121
|
|
|
95
122
|
// --- PulseDotLoader ---
|
|
96
123
|
|
|
97
|
-
export function PulseDotLoader(props:
|
|
124
|
+
export function PulseDotLoader(props: PulseDotLoaderProps) {
|
|
98
125
|
const size = () => props.size ?? 'md';
|
|
99
126
|
const sizeClasses = { sm: 'size-1', md: 'size-2', lg: 'size-3' };
|
|
100
127
|
return (
|
|
@@ -112,7 +139,7 @@ export function PulseDotLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
112
139
|
|
|
113
140
|
// --- DotsLoader ---
|
|
114
141
|
|
|
115
|
-
export function DotsLoader(props:
|
|
142
|
+
export function DotsLoader(props: DotsLoaderProps) {
|
|
116
143
|
const size = () => props.size ?? 'md';
|
|
117
144
|
const dotSizes = { sm: 'h-1.5 w-1.5', md: 'h-2 w-2', lg: 'h-2.5 w-2.5' };
|
|
118
145
|
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
@@ -136,7 +163,7 @@ export function DotsLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
136
163
|
|
|
137
164
|
// --- TypingLoader ---
|
|
138
165
|
|
|
139
|
-
export function TypingLoader(props:
|
|
166
|
+
export function TypingLoader(props: TypingLoaderProps) {
|
|
140
167
|
const size = () => props.size ?? 'md';
|
|
141
168
|
const dotSizes = { sm: 'h-1 w-1', md: 'h-1.5 w-1.5', lg: 'h-2 w-2' };
|
|
142
169
|
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
@@ -160,7 +187,7 @@ export function TypingLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
160
187
|
|
|
161
188
|
// --- WaveLoader ---
|
|
162
189
|
|
|
163
|
-
export function WaveLoader(props:
|
|
190
|
+
export function WaveLoader(props: WaveLoaderProps) {
|
|
164
191
|
const size = () => props.size ?? 'md';
|
|
165
192
|
const barWidths = { sm: 'w-0.5', md: 'w-0.5', lg: 'w-1' };
|
|
166
193
|
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
@@ -192,7 +219,7 @@ export function WaveLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
192
219
|
|
|
193
220
|
// --- BarsLoader ---
|
|
194
221
|
|
|
195
|
-
export function BarsLoader(props:
|
|
222
|
+
export function BarsLoader(props: BarsLoaderProps) {
|
|
196
223
|
const size = () => props.size ?? 'md';
|
|
197
224
|
const barWidths = { sm: 'w-1', md: 'w-1.5', lg: 'w-2' };
|
|
198
225
|
const containerSizes = { sm: 'h-4 gap-1', md: 'h-5 gap-1.5', lg: 'h-6 gap-2' };
|
|
@@ -216,7 +243,7 @@ export function BarsLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
216
243
|
|
|
217
244
|
// --- TerminalLoader ---
|
|
218
245
|
|
|
219
|
-
export function TerminalLoader(props:
|
|
246
|
+
export function TerminalLoader(props: TerminalLoaderProps) {
|
|
220
247
|
const size = () => props.size ?? 'md';
|
|
221
248
|
const cursorSizes = { sm: 'h-3 w-1.5', md: 'h-4 w-2', lg: 'h-5 w-2.5' };
|
|
222
249
|
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
@@ -232,7 +259,7 @@ export function TerminalLoader(props: { class?: string; size?: LoaderSize }) {
|
|
|
232
259
|
|
|
233
260
|
// --- TextBlinkLoader ---
|
|
234
261
|
|
|
235
|
-
export function TextBlinkLoader(props:
|
|
262
|
+
export function TextBlinkLoader(props: TextBlinkLoaderProps) {
|
|
236
263
|
const size = () => props.size ?? 'md';
|
|
237
264
|
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
238
265
|
return (
|
|
@@ -250,7 +277,7 @@ export function TextBlinkLoader(props: { text?: string; class?: string; size?: L
|
|
|
250
277
|
|
|
251
278
|
// --- TextShimmerLoader ---
|
|
252
279
|
|
|
253
|
-
export function TextShimmerLoader(props:
|
|
280
|
+
export function TextShimmerLoader(props: TextShimmerLoaderProps) {
|
|
254
281
|
const size = () => props.size ?? 'md';
|
|
255
282
|
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
256
283
|
return (
|
|
@@ -270,7 +297,7 @@ export function TextShimmerLoader(props: { text?: string; class?: string; size?:
|
|
|
270
297
|
|
|
271
298
|
// --- TextDotsLoader ---
|
|
272
299
|
|
|
273
|
-
export function TextDotsLoader(props:
|
|
300
|
+
export function TextDotsLoader(props: TextDotsLoaderProps) {
|
|
274
301
|
const size = () => props.size ?? 'md';
|
|
275
302
|
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
276
303
|
return (
|
|
@@ -3,8 +3,12 @@ import { cn } from "../utils/cn";
|
|
|
3
3
|
|
|
4
4
|
// --- MessageSkills ---
|
|
5
5
|
|
|
6
|
+
/** One skill badge. Also the shape of `<kai-skills>`' `skills` property and of a
|
|
7
|
+
* `<kai-skill>` light-DOM child. */
|
|
6
8
|
export interface Skill {
|
|
9
|
+
/** Stable identifier for the skill. */
|
|
7
10
|
id: string;
|
|
11
|
+
/** Human-readable skill name shown on the badge. */
|
|
8
12
|
name: string;
|
|
9
13
|
}
|
|
10
14
|
|