@kitn.ai/ui 0.26.0 → 0.28.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 +25 -6
- package/bin/mcp.js +16 -3
- package/bin/route.js +23 -0
- package/bin/route.test.js +58 -0
- package/dist/{elements/chunks/Icon--Y8vsFal.js → Icon-DObhsRtm.js} +1 -1
- package/dist/action-icons-CcgNN2oT.js +1 -0
- package/dist/arrow-down-CjRU3JgV.js +1 -0
- package/dist/arrow-left-Bnpb1UEW.js +1 -0
- package/dist/artifact-Bwt7OgcR.js +1 -0
- package/dist/assets/dev-5XzXYR21.js +91 -0
- package/dist/attachments-Qr4kg-2b.js +1 -0
- package/dist/{elements/chunks/audio-visualizer-D7lB6mvR.js → audio-visualizer-DToYdfSc.js} +1 -1
- package/dist/badge-CdEu_jn2.js +1 -0
- package/dist/bash-InADTalH.js +1 -6
- package/dist/bell-DQAAOpDz.js +1 -0
- package/dist/{elements/chunks/button-flUbeufF.js → button-DkuOnGLy.js} +1 -1
- package/dist/card-renderer-Jx70m6_l.js +1 -0
- package/dist/card-routing-0YidER_3.js +1 -0
- package/dist/check-njkVdZu2.js +1 -0
- package/dist/checkbox-D7iRB3nL.js +1 -0
- package/dist/checkbox-group-B2_rpoPM.js +1 -0
- package/dist/chevron-down-B72s6PXR.js +1 -0
- package/dist/chevron-right-BatuHzUm.js +1 -0
- package/dist/choice-card-m0BYqqOK.js +1 -0
- package/dist/circle-check-B62pODB3.js +1 -0
- package/dist/circle-x-BPG0iPst.js +1 -0
- package/dist/circle-zx0ByzY9.js +1 -0
- package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
- package/dist/code-block-ClMLKb7C.js +1 -0
- package/dist/{elements/chunks/collapsible-BzbXpPzr.js → collapsible-B4DlWicL.js} +1 -1
- package/dist/components/attachment-types.d.ts +7 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +1 -1
- package/dist/components/card-renderer.d.ts +13 -0
- package/dist/components/card.d.ts +4 -0
- package/dist/components/chat-thread.d.ts +135 -2
- package/dist/components/conversation-item.d.ts +35 -7
- package/dist/components/conversation-list.d.ts +17 -5
- package/dist/components/conversation-panel.d.ts +29 -0
- package/dist/components/form-widgets.d.ts +67 -2
- package/dist/components/form.d.ts +48 -1
- package/dist/components/home-panel.d.ts +34 -0
- package/dist/components/message.d.ts +25 -3
- package/dist/components/reasoning.d.ts +6 -0
- package/dist/components/scroll-button.d.ts +11 -0
- package/dist/components/thread.d.ts +5 -0
- package/dist/components/tool-types.d.ts +9 -0
- package/dist/components/widget-tab-bar.d.ts +16 -0
- package/dist/composer-sQ0HcvyG.js +106 -0
- package/dist/confirm-card-rQWDQsnC.js +1 -0
- package/dist/construct-cli.es.js +1337 -0
- package/dist/{elements/chunks/context-VLIL3sJ-.js → context-0kg4ZX1J.js} +1 -1
- package/dist/controllable-CnGpMF6r.js +1 -0
- package/dist/conversation-item-BxwQLaFJ.js +1 -0
- package/dist/conversation-list-BCfGN1JU.js +1 -0
- package/dist/copy-n9u9rqpi.js +1 -0
- package/dist/core-AYMC6_lb.js +12 -5874
- package/dist/{create-tween-BFT6c-Y8.js → create-tween-C-q-JCM-.js} +1 -1
- package/dist/{create-tween-CJNlzoaO.js → create-tween-CRrJXxBd.js} +1 -1
- package/dist/{create-tween-CQED4T0g.js → create-tween-DZ3RRDHD.js} +1 -1
- package/dist/{elements/chunks/create-tween-c4Z8TDYz.js → create-tween-uPkArjIG.js} +2 -2
- package/dist/css-M7EaDHN_.js +1 -6
- package/dist/custom-elements.json +1433 -202
- package/dist/default-input-CaMrJkgH.js +1 -0
- package/dist/define-By-uL588.js +1 -0
- package/dist/define.d.ts +4 -0
- package/dist/define.js +510 -0
- package/dist/define.server.d.ts +5 -0
- package/dist/define.server.js +506 -0
- package/dist/{elements/chunks/disclosure-CcNbyLy0.js → disclosure-WUImBbDv.js} +1 -1
- package/dist/{elements/chunks/dropdown-BgWTthUx.js → dropdown-wZVeJOMd.js} +1 -1
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/autoloader.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.d.ts +1 -0
- package/dist/elements/checkbox-group.js +1 -0
- package/dist/elements/checkbox.d.ts +1 -0
- package/dist/elements/checkbox.js +1 -0
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/define-entry.d.ts +12 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +102 -8
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +37 -0
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-grid.d.ts +1 -0
- package/dist/elements/pane-grid.js +1 -0
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/radio-group.d.ts +1 -0
- package/dist/elements/radio-group.js +1 -0
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +2 -2
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/select.d.ts +1 -0
- package/dist/elements/select.js +1 -0
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slider.d.ts +1 -0
- package/dist/elements/slider.js +1 -0
- package/dist/elements/slots.d.ts +1 -1
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +380 -26
- package/dist/{elements/chunks/ellipsis-7gU33mL2.js → ellipsis-CbOpJnU3.js} +1 -1
- package/dist/embed-CrfjkbUG.js +1 -0
- package/dist/engine-javascript-vq0WuIJl.js +14 -2516
- package/dist/{elements/chunks/external-link-CSOEsNlx.js → external-link-ByXAwBBQ.js} +1 -1
- package/dist/file-text-DMib2qwt.js +1 -0
- package/dist/{elements/chunks/file-tree-zvB2i7P9.js → file-tree-CJqM2aP7.js} +1 -1
- package/dist/folder-_BAb929C.js +1 -0
- package/dist/form-DSZgZQZk.js +1 -0
- package/dist/github-dark-dimmed-DUshB20C.js +1 -4
- package/dist/github-light-JYsPkUQd.js +1 -4
- package/dist/hover-card-BQbul9eq.js +1 -0
- package/dist/html-CPZ3oZQ7.js +1 -10
- package/dist/icon-CdcfRhYI.js +1 -0
- package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +7474 -5857
- package/dist/index.server.js +5965 -4762
- package/dist/info-DsFjGuI_.js +1 -0
- package/dist/input-DKbmkMos.js +1 -0
- package/dist/javascript-C25yR2R2.js +1 -6
- package/dist/json-DxJze_jm.js +1 -6
- package/dist/kai.es.js +1 -1
- package/dist/kbd-PvdGhX4s.js +1 -0
- package/dist/{elements/chunks/link-preview-OQ9IEq0f.js → link-preview-DbM1866N.js} +1 -1
- package/dist/link-zF8PzWfF.js +1 -0
- package/dist/loader-BM4CEz4G.js +1 -0
- package/dist/{elements/chunks/markdown-DgBFaGAz.js → markdown-LMvmAyBk.js} +7 -7
- package/dist/mcp.es.js +1361 -81
- package/dist/message-BSsgvHvf.js +1 -0
- package/dist/message-BYZECyek.js +1 -0
- package/dist/message-circle-DruwObfX.js +1 -0
- package/dist/message-square-BG6q6mlm.js +1 -0
- package/dist/{elements/chunks/minimize-2-DPIUKTrT.js → minimize-2-BQRoBV1V.js} +1 -1
- package/dist/{elements/chunks/model-switcher-DsT8tFB0.js → model-switcher-CMpCOYcB.js} +1 -1
- package/dist/{elements/chunks/overlay-DuiwdXjm.js → overlay-Cb-MkyDa.js} +1 -1
- package/dist/panel-right-i8warFxT.js +1 -0
- package/dist/paperclip-ByY3UVO6.js +1 -0
- package/dist/play-BvKKq3fX.js +1 -0
- package/dist/primitives/card-data-types.d.ts +49 -0
- package/dist/primitives/card-routing.d.ts +1 -33
- package/dist/primitives/card-validate.d.ts +2 -2
- package/dist/primitives/chat-config.d.ts +29 -2
- package/dist/primitives/conversation-store.d.ts +54 -0
- package/dist/primitives/field-mask.d.ts +96 -0
- package/dist/primitives/field-semantics.d.ts +36 -0
- package/dist/primitives/input-mask.d.ts +46 -0
- package/dist/primitives/url-scheme-policy.d.ts +34 -0
- package/dist/primitives/use-resize-observer.d.ts +2 -2
- package/dist/progress-bar-jVAHvMUf.js +1 -0
- package/dist/prompt-suggestion-CD-qtNgC.js +1 -0
- package/dist/radio-BsoBMhkF.js +1 -0
- package/dist/react/index.d.ts +586 -19
- package/dist/react.js +223 -187
- package/dist/reasoning-4kBPtlTx.js +1 -0
- package/dist/register-impl-B1hLkrI8.js +424 -0
- package/dist/{elements/chunks/resizable-D181b4fM.js → resizable-uPmY9VY-.js} +1 -1
- package/dist/rotate-ccw-B2xn93py.js +1 -0
- package/dist/rotate-cw-CMVLoCyH.js +1 -0
- package/dist/schemas/form.schema.json +21 -1
- package/dist/schemas/tool-defs.d.ts +11 -1
- package/dist/schemas.js +81 -81
- package/dist/scroll-area-BqLUo8ZZ.js +1 -0
- package/dist/scroll-button-DslXiJyL.js +1 -0
- package/dist/select-2cLRtPGT.js +1 -0
- package/dist/{elements/chunks/separator-CeJHQqLW.js → separator-BWQtNJcM.js} +1 -1
- package/dist/{elements/chunks/settings-CqaHgJF9.js → settings-BBR63jLg.js} +1 -1
- package/dist/{elements/chunks/settings-group-CjqjLCOn.js → settings-group-B2ciy-Iw.js} +1 -1
- package/dist/{elements/chunks/skeleton-D8akBnKS.js → skeleton-CkHI-HgC.js} +1 -1
- package/dist/slider-DDR9U-i0.js +1 -0
- package/dist/{solid-BtdqNZI7.js → solid-BzCFdL25.js} +9771 -7594
- package/dist/{solid-CnavwBye.js → solid-DruVOXnf.js} +7893 -6183
- package/dist/solid.d.ts +16 -2
- package/dist/solid.js +256 -243
- package/dist/solid.server.js +256 -243
- package/dist/source-GEnFF528.js +1 -0
- package/dist/star-CilHq8GP.js +1 -0
- package/dist/state/index.d.ts +1 -1
- package/dist/state/mock.d.ts +32 -2
- package/dist/state.js +133 -108
- package/dist/store-Ciyk6eZG.js +1 -0
- package/dist/svelte--5p79yCD.js +1 -15
- package/dist/switch-KkeQIbuH.js +1 -0
- package/dist/tasks-card-BrN4bggJ.js +1 -0
- package/dist/text-shimmer-Dcj1MHuq.js +1 -0
- package/dist/textarea-Dpvbngbg.js +1 -0
- package/dist/theme.tokens.css +110 -13
- package/dist/{elements/chunks/thumbs-up-DX2Ijk3H.js → thumbs-up-CsT9Wzb9.js} +1 -1
- package/dist/toast-store-tgK6MuMv.js +1 -0
- package/dist/{elements/chunks/tool-DKQ2D1DP.js → tool-DzUjIBT8.js} +1 -1
- package/dist/{elements/chunks/tooltip-B0G99y8w.js → tooltip-Bkkg_4t0.js} +1 -1
- package/dist/trash-2-jBKxjGGQ.js +1 -0
- package/dist/{elements/chunks/triangle-alert-F9cyUEyy.js → triangle-alert-DlQ68ppf.js} +1 -1
- package/dist/tsx-B8rCNbgL.js +1 -6
- package/dist/types.d.ts +48 -3
- package/dist/typescript-RycA9KXf.js +1 -6
- package/dist/ui/checkbox-group.d.ts +83 -0
- package/dist/ui/checkbox.d.ts +40 -0
- package/dist/ui/dock.d.ts +51 -0
- package/dist/ui/icon.d.ts +3 -0
- package/dist/ui/input.d.ts +48 -2
- package/dist/ui/radio.d.ts +85 -0
- package/dist/ui/select.d.ts +71 -0
- package/dist/ui/slider.d.ts +65 -0
- package/dist/ui/switch.d.ts +9 -2
- package/dist/upload-TcAHXv9W.js +1 -0
- package/dist/url-scheme-policy-DR5DgvkM.js +1 -0
- package/dist/use-card-resolution-DaZqAdWf.js +1 -0
- package/dist/{elements/chunks/variant-aurora-qt6Zct8M.js → variant-aurora-BhLuYxJR.js} +1 -1
- package/dist/{variant-aurora-B8II3-I1.js → variant-aurora-CNmfHhcx.js} +2 -2
- package/dist/{variant-aurora-CMNWOSJR.js → variant-aurora-D6GsdTPA.js} +2 -2
- package/dist/{variant-aurora-CcuDMWwQ.js → variant-aurora-DbW_OWL2.js} +1 -1
- package/dist/{elements/chunks/variant-custom-tJp22_BQ.js → variant-custom-BRvaNHSi.js} +1 -1
- package/dist/{variant-custom-L16JLLZy.js → variant-custom-BvYHR62b.js} +1 -1
- package/dist/{variant-custom-BdvYC7af.js → variant-custom-DMTrEO5w.js} +2 -2
- package/dist/{variant-custom-C714mqKl.js → variant-custom-DV2x254s.js} +2 -2
- package/dist/{variant-wave-ecwykeyL.js → variant-wave-BNMGrDfj.js} +2 -2
- package/dist/{variant-wave-2S4La2Ka.js → variant-wave-BpDd8t3Z.js} +1 -1
- package/dist/{variant-wave-D7ruiA1W.js → variant-wave-CyBueXj9.js} +2 -2
- package/dist/{elements/chunks/variant-wave-CaQ5ti39.js → variant-wave-sp-qwsdI.js} +1 -1
- package/dist/vue-BmIZj4XD.js +1 -33
- package/dist/x-Z5UntkIJ.js +1 -0
- package/frameworks/react/index.tsx +210 -22
- package/llms-full.txt +1184 -22
- package/llms.txt +6 -3
- package/package.json +17 -4
- package/src/agent-tooling/README.md +192 -0
- package/src/agent-tooling/catalog/invariants.ts +3 -3
- package/src/agent-tooling/catalog/surfaces.ts +72 -0
- package/src/agent-tooling/construct/cli-entry.ts +8 -0
- package/src/agent-tooling/construct/cli.ts +147 -0
- package/src/agent-tooling/construct/codegen.ts +1635 -0
- package/src/agent-tooling/construct/construct.v1.schema.json +319 -0
- package/src/agent-tooling/construct/dev.ts +148 -0
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +32 -0
- package/src/agent-tooling/construct/schema.ts +452 -0
- package/src/agent-tooling/mcp/server.ts +2 -1
- package/src/agent-tooling/mcp/tools/construct.ts +130 -0
- package/src/agent-tooling/mcp/tools/debug.ts +126 -4
- package/src/agent-tooling/mcp/tools/reference.ts +104 -3
- package/src/agent-tooling/recipes/composed-thread.ts +714 -0
- package/src/agent-tooling/recipes/index.ts +22 -0
- package/src/agent-tooling/recipes/types.ts +32 -0
- package/src/agent-tooling/registry.ts +5 -0
- package/src/components/attachment-types.ts +7 -0
- package/src/components/audio-visualizer/fit-scale.ts +1 -1
- package/src/components/card-renderer.tsx +39 -8
- package/src/components/card.tsx +10 -2
- package/src/components/chat-scope-picker.tsx +2 -2
- package/src/components/chat-thread.tsx +602 -43
- package/src/components/choice-card.tsx +102 -37
- package/src/components/coachmark.tsx +1 -1
- package/src/components/code-block.tsx +2 -2
- package/src/components/composer.tsx +89 -15
- package/src/components/confirm-card.tsx +20 -4
- package/src/components/conversation-item.tsx +56 -9
- package/src/components/conversation-list.tsx +25 -10
- package/src/components/conversation-panel.tsx +118 -0
- package/src/components/empty.tsx +14 -3
- package/src/components/file-tree.tsx +5 -1
- package/src/components/form-widgets.tsx +257 -195
- package/src/components/form.tsx +297 -9
- package/src/components/home-panel.tsx +159 -0
- package/src/components/loader.tsx +12 -5
- package/src/components/message-skills.tsx +1 -1
- package/src/components/message.tsx +71 -11
- package/src/components/prompt-input.tsx +7 -1
- package/src/components/prompt-suggestion.tsx +4 -1
- package/src/components/reasoning.tsx +30 -3
- package/src/components/response-compare.tsx +2 -2
- package/src/components/scroll-button.tsx +56 -4
- package/src/components/source.tsx +6 -1
- package/src/components/tasks-card.tsx +58 -16
- package/src/components/thread.tsx +10 -1
- package/src/components/toast.tsx +1 -1
- package/src/components/tool-types.ts +9 -0
- package/src/components/widget-tab-bar.tsx +73 -0
- package/src/elements/attachments.tsx +3 -1
- package/src/elements/chat-workspace.tsx +1 -1
- package/src/elements/chat.tsx +115 -5
- package/src/elements/checkbox-group.tsx +164 -0
- package/src/elements/checkbox.tsx +134 -0
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +12 -1
- package/src/elements/conversation-item.tsx +62 -22
- package/src/elements/conversation-list.tsx +2 -2
- package/src/elements/define-entry.ts +12 -0
- package/src/elements/dock.tsx +11 -0
- package/src/elements/element-data-types.ts +40 -0
- package/src/elements/element-manifest.json +24 -0
- package/src/elements/element-meta.json +767 -34
- package/src/elements/element-nonscalar.json +17 -0
- package/src/elements/element-types.d.ts +380 -26
- package/src/elements/feedback-bar.tsx +5 -0
- package/src/elements/icon-names.json +29 -0
- package/src/elements/input.tsx +312 -23
- package/src/elements/message.tsx +2 -0
- package/src/elements/pane-grid.tsx +111 -0
- package/src/elements/prompt-input.tsx +8 -2
- package/src/elements/radio-group.tsx +129 -0
- package/src/elements/register-impl.ts +6 -0
- package/src/elements/scroll-button.tsx +54 -6
- package/src/elements/select.tsx +165 -0
- package/src/elements/slider.tsx +171 -0
- package/src/elements/slots.ts +1 -1
- package/src/elements/styles.css +89 -3
- package/src/elements/thread.tsx +2 -0
- package/src/elements/toast.tsx +14 -1
- package/src/index.ts +5 -2
- package/src/primitives/card-data-types.ts +49 -0
- package/src/primitives/card-host.tsx +4 -2
- package/src/primitives/card-routing.ts +7 -56
- package/src/primitives/card-schemas/form.schema.json +21 -1
- package/src/primitives/card-validate.ts +10 -2
- package/src/primitives/chat-config.tsx +33 -6
- package/src/primitives/conversation-store.ts +248 -0
- package/src/primitives/field-mask.ts +256 -0
- package/src/primitives/field-semantics.ts +115 -0
- package/src/primitives/input-mask.ts +853 -0
- package/src/primitives/toast-store.ts +66 -4
- package/src/primitives/url-scheme-policy.ts +70 -0
- package/src/primitives/use-resize-observer.ts +2 -2
- package/src/schemas/tool-defs.ts +12 -2
- package/src/solid.ts +20 -2
- package/src/state/index.ts +1 -1
- package/src/state/mock.ts +92 -6
- package/src/types.ts +45 -3
- package/src/ui/agent-card.tsx +2 -2
- package/src/ui/avatar.tsx +1 -1
- package/src/ui/checkbox-group.tsx +153 -0
- package/src/ui/checkbox.tsx +63 -0
- package/src/ui/dock.tsx +192 -7
- package/src/ui/icon.tsx +53 -0
- package/src/ui/input.tsx +249 -9
- package/src/ui/kbd.tsx +1 -1
- package/src/ui/nav.tsx +1 -1
- package/src/ui/pane-group.tsx +2 -2
- package/src/ui/radio.tsx +150 -0
- package/src/ui/select.tsx +168 -0
- package/src/ui/slider.tsx +178 -0
- package/src/ui/switch.tsx +49 -18
- package/src/utils/cn.ts +11 -5
- package/theme.css +112 -13
- package/dist/elements/chunks/action-icons-D9u3OzYW.js +0 -1
- package/dist/elements/chunks/arrow-left-CVh1TeN7.js +0 -1
- package/dist/elements/chunks/artifact-BkYcfIlZ.js +0 -1
- package/dist/elements/chunks/attachments-DwfNlubq.js +0 -1
- package/dist/elements/chunks/badge-Q0-Cmwzz.js +0 -1
- package/dist/elements/chunks/bash-InADTalH.js +0 -1
- package/dist/elements/chunks/card-renderer-3Dyl-FpN.js +0 -1
- package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
- package/dist/elements/chunks/check-B5kBPKeo.js +0 -1
- package/dist/elements/chunks/chevron-down-DZ1GS39h.js +0 -1
- package/dist/elements/chunks/chevron-right-CvP7OUd2.js +0 -1
- package/dist/elements/chunks/choice-card-D4QUIOWZ.js +0 -1
- package/dist/elements/chunks/circle-CDf9g6MQ.js +0 -1
- package/dist/elements/chunks/circle-check-CA47Nqbz.js +0 -1
- package/dist/elements/chunks/circle-x-CJ_HVbC8.js +0 -1
- package/dist/elements/chunks/code-block-BdLiTitd.js +0 -1
- package/dist/elements/chunks/composer-Byve-n8K.js +0 -69
- package/dist/elements/chunks/confirm-card-B0flE3MN.js +0 -1
- package/dist/elements/chunks/controllable-DTwTIlwp.js +0 -1
- package/dist/elements/chunks/conversation-item-BDztezOG.js +0 -1
- package/dist/elements/chunks/copy-Nf-kqxXH.js +0 -1
- package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
- package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
- package/dist/elements/chunks/default-input-C2iLFq0b.js +0 -1
- package/dist/elements/chunks/define-wjHR1MkU.js +0 -1
- package/dist/elements/chunks/download-C4V7tBdb.js +0 -1
- package/dist/elements/chunks/embed-D3KewsIJ.js +0 -1
- package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
- package/dist/elements/chunks/file-text-D1G8khle.js +0 -1
- package/dist/elements/chunks/folder-WW2LGLid.js +0 -1
- package/dist/elements/chunks/form-CQirdC4W.js +0 -1
- package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
- package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
- package/dist/elements/chunks/hover-card-CJJkfHTK.js +0 -1
- package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
- package/dist/elements/chunks/icon-Cfgmf4fa.js +0 -1
- package/dist/elements/chunks/info-DX3YMOt6.js +0 -1
- package/dist/elements/chunks/input-BtW9U6Sq.js +0 -1
- package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
- package/dist/elements/chunks/json-DxJze_jm.js +0 -1
- package/dist/elements/chunks/kbd-LGXwuT_V.js +0 -1
- package/dist/elements/chunks/link-2My69BqT.js +0 -1
- package/dist/elements/chunks/loader-iOxc_Tu-.js +0 -1
- package/dist/elements/chunks/message-VMZohrXx.js +0 -1
- package/dist/elements/chunks/message-circle-CpXMM-_n.js +0 -1
- package/dist/elements/chunks/message-square-DxcWtETQ.js +0 -1
- package/dist/elements/chunks/message-tZmV2A3p.js +0 -1
- package/dist/elements/chunks/paperclip-CRZVp4z_.js +0 -1
- package/dist/elements/chunks/progress-bar-DNy66e_E.js +0 -1
- package/dist/elements/chunks/prompt-suggestion-Bn64Nl7L.js +0 -1
- package/dist/elements/chunks/reasoning-Emn9N4-T.js +0 -1
- package/dist/elements/chunks/rotate-cw-CPWe37D9.js +0 -1
- package/dist/elements/chunks/scroll-area-ClZkZxIk.js +0 -1
- package/dist/elements/chunks/scroll-button-DPE-t3x_.js +0 -1
- package/dist/elements/chunks/share-CyfnNEqp.js +0 -1
- package/dist/elements/chunks/source-UWCvmVak.js +0 -1
- package/dist/elements/chunks/star-DoHFAikQ.js +0 -1
- package/dist/elements/chunks/store-Cjq0qwYN.js +0 -1
- package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
- package/dist/elements/chunks/tasks-card-CmZ5xh6v.js +0 -1
- package/dist/elements/chunks/text-shimmer-DYn09zrz.js +0 -1
- package/dist/elements/chunks/textarea-skiGHURM.js +0 -1
- package/dist/elements/chunks/toast-store-CFnQpThX.js +0 -1
- package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
- package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
- package/dist/elements/chunks/use-card-resolution-DoA2f_EU.js +0 -1
- package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
- package/dist/elements/chunks/x-B6UnOiLw.js +0 -1
- package/dist/llms/llms-full.txt +0 -2949
- package/dist/llms/llms.txt +0 -156
- package/dist/register-impl-DpE7icIb.js +0 -293
- package/dist/ui/stat.d.ts +0 -16
- package/src/ui/stat.tsx +0 -41
- /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
- /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
- /package/dist/{elements/chunks/slots-DaNjX0rc.js → slots-DaNjX0rc.js} +0 -0
|
@@ -41,6 +41,21 @@ export function readConversationItemId(el: Element): string {
|
|
|
41
41
|
return el.getAttribute('conversation-id') ?? el.id;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** Whether a `<kai-conversation-item>` is STANDALONE — outside the management
|
|
45
|
+
* of a `<kai-conversations>` container — and therefore activates ITSELF:
|
|
46
|
+
* the facade makes its row body a
|
|
47
|
+
* tabbable button and fires `kai-select` on click / Enter / Space. Derived
|
|
48
|
+
* from the container's own membership rule, not from mere ancestry: item mode
|
|
49
|
+
* queries `:scope > kai-conversation-item` (direct children only), so an item
|
|
50
|
+
* wrapped in another element inside a container is standalone too — the
|
|
51
|
+
* container's controller never stamps or activates it. Inside a container
|
|
52
|
+
* (a direct child), the parent-item contract is the ONLY activation
|
|
53
|
+
* path: the container dispatches `kai-conversation-select` and owns roving
|
|
54
|
+
* tabindex, and the item fires nothing of its own. */
|
|
55
|
+
export function isStandaloneConversationItem(el: Element): boolean {
|
|
56
|
+
return el.parentElement?.localName !== 'kai-conversations';
|
|
57
|
+
}
|
|
58
|
+
|
|
44
59
|
export interface ConversationItemsControllerOptions {
|
|
45
60
|
/** The current slotted item hosts, in DOM order. */
|
|
46
61
|
getItems: () => HTMLElement[];
|
|
@@ -63,7 +78,7 @@ export interface ConversationItemsController {
|
|
|
63
78
|
}
|
|
64
79
|
|
|
65
80
|
/**
|
|
66
|
-
* The parent-item contract of item mode
|
|
81
|
+
* The parent-item contract of item mode, as a pure-DOM
|
|
67
82
|
* controller so it is host-agnostic: the `kai-conversations` facade wires it over
|
|
68
83
|
* its slotted `kai-conversation-item` children, and the jsdom contract tests
|
|
69
84
|
* drive it over plain nodes. Solid context cannot cross the element boundary
|
|
@@ -78,8 +93,8 @@ export interface ConversationItemsController {
|
|
|
78
93
|
* left alone);
|
|
79
94
|
* - roving tabindex — exactly one body node `tabindex="0"` (the active
|
|
80
95
|
* item's, else the first's), the rest `-1`, re-derived on every `sync()`;
|
|
81
|
-
* menu content keeps its natural tab order (it is the body's SIBLING,
|
|
82
|
-
*
|
|
96
|
+
* menu content keeps its natural tab order (it is the body's SIBLING, not a
|
|
97
|
+
* descendant);
|
|
83
98
|
* - activation (click / Enter / Space) calls `onSelect` with the item's id, and
|
|
84
99
|
* is SUPPRESSED when the composed path crosses the item's `menu` region
|
|
85
100
|
* (light-DOM `slot="menu"` content or the shadow `data-kai-item-menu`
|
|
@@ -96,7 +111,7 @@ export function createConversationItemsController(
|
|
|
96
111
|
};
|
|
97
112
|
/** The item's ACTIVATION node — the target of role/aria-current/tabindex/
|
|
98
113
|
* focus. For a `kai-conversation-item` host that is its shadow body (the
|
|
99
|
-
* sibling restructure
|
|
114
|
+
* sibling restructure: the host is the row listitem
|
|
100
115
|
* wrapping the body AND the consumer's tabbable menu, so the control
|
|
101
116
|
* semantics must sit below it). A bare node with no such body is its own
|
|
102
117
|
* control. */
|
|
@@ -205,8 +220,8 @@ export interface ConversationListProps {
|
|
|
205
220
|
/** Receive the imperative controller once mounted. The `kai-conversations`
|
|
206
221
|
* facade uses it to focus / clear the internal search input. */
|
|
207
222
|
controllerRef?: (controller: ConversationListController) => void;
|
|
208
|
-
/** Item mode
|
|
209
|
-
*
|
|
223
|
+
/** Item mode: your OWN rows, rendered inside a list region in place of the
|
|
224
|
+
* data rows. When set, the built-in search
|
|
210
225
|
* filter, grouping and empty/no-match states do not apply — the consumer's
|
|
211
226
|
* loop owns them — while the chrome (header, search box, new-chat, footer)
|
|
212
227
|
* still renders and `onSearchChange` still reports queries. The
|
|
@@ -309,13 +324,13 @@ export function ConversationList(props: ConversationListProps) {
|
|
|
309
324
|
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="text-muted-foreground"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
|
310
325
|
<input ref={searchInput} type="text" value={searchQuery()} onInput={(e) => setQuery(e.currentTarget.value)} placeholder="Search chats..."
|
|
311
326
|
aria-label="Search chats"
|
|
312
|
-
class="bg-transparent text-
|
|
327
|
+
class="bg-transparent text-compact text-foreground placeholder:text-muted-foreground rounded-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring w-full" />
|
|
313
328
|
</div>
|
|
314
329
|
</div>
|
|
315
330
|
</Show>
|
|
316
331
|
{/* Item mode: the consumer's own rows in a list region. The container's
|
|
317
332
|
filter/grouping/empty states do not apply — the consumer's loop owns
|
|
318
|
-
them
|
|
333
|
+
them. */}
|
|
319
334
|
<Show when={itemMode()}>
|
|
320
335
|
<ScrollArea class="flex-1 px-2">
|
|
321
336
|
<div
|
|
@@ -396,11 +411,11 @@ function GroupSection(props: { name: string; count: number; conversations: Conve
|
|
|
396
411
|
const [open, setOpen] = createSignal(true);
|
|
397
412
|
return (
|
|
398
413
|
<Collapsible open={open()} onOpenChange={setOpen}>
|
|
399
|
-
<CollapsibleTrigger class="flex items-center gap-1.5 w-full px-1.5 py-1 rounded-md text-
|
|
414
|
+
<CollapsibleTrigger class="flex items-center gap-1.5 w-full px-1.5 py-1 rounded-md text-compact text-muted-foreground font-medium hover:bg-muted/30 transition-colors cursor-pointer mt-1.5">
|
|
400
415
|
<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
|
|
401
416
|
class={cn('transition-transform', !open() && '-rotate-90')}><polyline points="6 9 12 15 18 9"/></svg>
|
|
402
417
|
<span>{props.name}</span>
|
|
403
|
-
<Badge variant="count" class="ml-auto text-
|
|
418
|
+
<Badge variant="count" class="ml-auto text-caption">{props.count}</Badge>
|
|
404
419
|
</CollapsibleTrigger>
|
|
405
420
|
<CollapsibleContent>
|
|
406
421
|
<div class="pl-2 mt-0.5 space-y-0.5">
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { For, Show, createMemo } from 'solid-js';
|
|
2
|
+
import { cn } from '../utils/cn';
|
|
3
|
+
import { ScrollArea } from '../ui/scroll-area';
|
|
4
|
+
import { relativeTimeShort, isConversationUnread } from './conversation-item';
|
|
5
|
+
import { byRecency } from '../primitives/conversation-store';
|
|
6
|
+
import type { ConversationSummary } from '../types';
|
|
7
|
+
|
|
8
|
+
export interface ConversationPanelProps {
|
|
9
|
+
conversations: ConversationSummary[];
|
|
10
|
+
activeId?: string;
|
|
11
|
+
onSelect: (id: string) => void;
|
|
12
|
+
onNewChat: () => void;
|
|
13
|
+
/** Wording for the floating new-conversation pill. Defaults to "New conversation". */
|
|
14
|
+
newChatLabel?: string;
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The widget-box list view (owner rework, 2026-08-26 — the earlier retrofit
|
|
20
|
+
* of the desktop `ConversationList` into this box was rejected at the live
|
|
21
|
+
* demo). NOT `ConversationList`, which stays the desktop-sidebar surface
|
|
22
|
+
* unchanged: no search box, no group headers, no per-row menu, no full-width
|
|
23
|
+
* footer bar, no second "+" beside the header toggle. A row is a
|
|
24
|
+
* conversation, full stop — bold title, right-aligned relative time, one
|
|
25
|
+
* truncated line of the last message. The ONE way to start a new
|
|
26
|
+
* conversation is the floating pill near the bottom.
|
|
27
|
+
*
|
|
28
|
+
* Modeled directly on Intercom's Messenger "Messages" tab (first-hand
|
|
29
|
+
* research: `.superpowers/sdd/2026-08-26-conversations/
|
|
30
|
+
* research-intercom-messages-view.md`) — a box this size gets one job at a
|
|
31
|
+
* time: browsing conversations OR having one, never both, and the list
|
|
32
|
+
* replaces the ENTIRE content area (`ChatThread` hides the thread,
|
|
33
|
+
* suggestions and composer while this renders — see its `view() === 'list'`
|
|
34
|
+
* branch).
|
|
35
|
+
*/
|
|
36
|
+
export function ConversationPanel(props: ConversationPanelProps) {
|
|
37
|
+
// Most-recently-updated first — the same defensive sort ChatThread's own
|
|
38
|
+
// auto-restore uses (an unparsable/missing date sorts last, never throws).
|
|
39
|
+
const ordered = createMemo(() =>
|
|
40
|
+
[...props.conversations].sort(byRecency),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<div class={cn('relative flex h-full flex-col', props.class)}>
|
|
45
|
+
<Show
|
|
46
|
+
when={props.conversations.length > 0}
|
|
47
|
+
fallback={
|
|
48
|
+
<div class="flex flex-1 flex-col items-center justify-center gap-1 p-6 text-center text-sm text-muted-foreground">
|
|
49
|
+
No conversations yet
|
|
50
|
+
</div>
|
|
51
|
+
}
|
|
52
|
+
>
|
|
53
|
+
<ScrollArea class="flex-1 px-2 pt-2">
|
|
54
|
+
{/* Bottom padding clears the floating pill so the last row is never
|
|
55
|
+
hidden behind it. */}
|
|
56
|
+
<div role="list" aria-label="Conversations" class="space-y-0.5 pb-16">
|
|
57
|
+
<For each={ordered()}>
|
|
58
|
+
{(conv) => {
|
|
59
|
+
const isActive = () => conv.id === props.activeId;
|
|
60
|
+
const time = () => relativeTimeShort(conv.updatedAt ?? conv.lastMessageAt);
|
|
61
|
+
const unread = () => isConversationUnread(conv);
|
|
62
|
+
return (
|
|
63
|
+
<button
|
|
64
|
+
type="button"
|
|
65
|
+
role="listitem"
|
|
66
|
+
data-conversation-id={conv.id}
|
|
67
|
+
data-active={isActive() ? '' : undefined}
|
|
68
|
+
data-unread={unread() ? '' : undefined}
|
|
69
|
+
aria-current={isActive() ? 'true' : undefined}
|
|
70
|
+
onClick={() => props.onSelect(conv.id)}
|
|
71
|
+
class={cn(
|
|
72
|
+
'block w-full rounded-lg px-3 py-2.5 text-left transition-colors',
|
|
73
|
+
isActive() ? 'bg-muted' : 'hover:bg-muted/50',
|
|
74
|
+
)}
|
|
75
|
+
>
|
|
76
|
+
<div class="flex items-baseline gap-2">
|
|
77
|
+
<span class={cn('min-w-0 flex-1 truncate text-sm font-semibold', isActive() ? 'text-foreground' : 'text-foreground/90')}>
|
|
78
|
+
{conv.title}
|
|
79
|
+
</span>
|
|
80
|
+
<Show when={time()}>
|
|
81
|
+
<span class="shrink-0 text-xs text-muted-foreground">{time()}</span>
|
|
82
|
+
</Show>
|
|
83
|
+
</div>
|
|
84
|
+
{/* Trailing line: the last-message preview, plus — Intercom's own
|
|
85
|
+
placement (research doc §2) — a small unread dot at its end. No
|
|
86
|
+
preview text and no unread still renders nothing, same as before. */}
|
|
87
|
+
<Show when={conv.trailing || unread()}>
|
|
88
|
+
<div class="mt-0.5 flex items-center gap-1.5">
|
|
89
|
+
<span class="min-w-0 flex-1 truncate text-xs text-muted-foreground">{conv.trailing}</span>
|
|
90
|
+
<Show when={unread()}>
|
|
91
|
+
<span aria-hidden="true" class="size-1.5 shrink-0 rounded-full bg-unread" />
|
|
92
|
+
<span class="sr-only">Unread</span>
|
|
93
|
+
</Show>
|
|
94
|
+
</div>
|
|
95
|
+
</Show>
|
|
96
|
+
</button>
|
|
97
|
+
);
|
|
98
|
+
}}
|
|
99
|
+
</For>
|
|
100
|
+
</div>
|
|
101
|
+
</ScrollArea>
|
|
102
|
+
</Show>
|
|
103
|
+
{/* The ONE new-conversation control: a compact centered floating pill,
|
|
104
|
+
never a header "+" AND a footer bar at once (the retrofit's
|
|
105
|
+
rejected shape). */}
|
|
106
|
+
<div class="pointer-events-none absolute inset-x-0 bottom-3 flex justify-center">
|
|
107
|
+
<button
|
|
108
|
+
type="button"
|
|
109
|
+
data-kai-new-conversation
|
|
110
|
+
onClick={props.onNewChat}
|
|
111
|
+
class="pointer-events-auto rounded-full border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-md transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
112
|
+
>
|
|
113
|
+
{props.newChatLabel ?? 'New conversation'}
|
|
114
|
+
</button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|
package/src/components/empty.tsx
CHANGED
|
@@ -26,9 +26,16 @@ function Empty(props: EmptyProps) {
|
|
|
26
26
|
const [local, rest] = splitProps(props, ['class', 'children']);
|
|
27
27
|
return (
|
|
28
28
|
<div
|
|
29
|
+
// NO `text-center` / `text-balance` on the root. Both INHERIT, and
|
|
30
|
+
// `EmptyContent` is an arbitrary-content slot — a `PromptInput` dropped in
|
|
31
|
+
// it picked the centering up and rendered its placeholder and its typed
|
|
32
|
+
// text centred (owner report). Centering is a fact about the empty state's
|
|
33
|
+
// OWN title/description, so it lives on `EmptyTitle`/`EmptyDescription`
|
|
34
|
+
// (and `EmptyHeader`, which wraps only those). The root still centres its
|
|
35
|
+
// children as BOXES via `items-center`, which is what it actually wants.
|
|
29
36
|
data-slot="empty"
|
|
30
37
|
class={cn(
|
|
31
|
-
'flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg p-6
|
|
38
|
+
'flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg p-6',
|
|
32
39
|
local.class,
|
|
33
40
|
)}
|
|
34
41
|
{...rest}
|
|
@@ -103,7 +110,9 @@ function EmptyTitle(props: EmptyTitleProps) {
|
|
|
103
110
|
return (
|
|
104
111
|
<div
|
|
105
112
|
data-slot="empty-title"
|
|
106
|
-
|
|
113
|
+
// Carries its own centering + balance (the root no longer broadcasts them
|
|
114
|
+
// to every slotted child), so a title is centred wherever it is placed.
|
|
115
|
+
class={cn('text-title font-medium tracking-tight text-center text-balance', local.class)}
|
|
107
116
|
{...rest}
|
|
108
117
|
>
|
|
109
118
|
{local.children}
|
|
@@ -123,7 +132,9 @@ function EmptyDescription(props: EmptyDescriptionProps) {
|
|
|
123
132
|
<p
|
|
124
133
|
data-slot="empty-description"
|
|
125
134
|
class={cn(
|
|
126
|
-
|
|
135
|
+
// Same as EmptyTitle: own the centering + balance rather than inheriting
|
|
136
|
+
// it from a root that also reaches arbitrary slotted content.
|
|
137
|
+
'text-muted-foreground text-body text-center text-balance [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary',
|
|
127
138
|
local.class,
|
|
128
139
|
)}
|
|
129
140
|
{...rest}
|
|
@@ -492,7 +492,11 @@ function TreeNode(props: TreeNodeProps): JSX.Element {
|
|
|
492
492
|
/>
|
|
493
493
|
{(() => {
|
|
494
494
|
const Icon = open() ? FolderOpen : Folder;
|
|
495
|
-
|
|
495
|
+
// Decorative folder icon, not a control (the row is the click
|
|
496
|
+
// target) — was the BRAND token. `text-foreground/80` matches the
|
|
497
|
+
// row's own `text-foreground` and the chevron's neutral opacity
|
|
498
|
+
// treatment two lines above.
|
|
499
|
+
return <Icon size={14} class="shrink-0 text-foreground/80" aria-hidden="true" />;
|
|
496
500
|
})()}
|
|
497
501
|
<span class="truncate font-medium">{node().name}</span>
|
|
498
502
|
</div>
|