@kitn.ai/ui 0.28.0 → 0.30.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 +11 -7
- package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
- package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/arrow-down-D783iMJj.js +1 -0
- package/dist/arrow-left-0VLM5kyg.js +1 -0
- package/dist/artifact-DGjzHYUT.js +1 -0
- package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
- package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
- package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
- package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
- package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
- package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
- package/dist/check-CiEOVnEN.js +1 -0
- package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
- package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
- package/dist/chevron-down-CSobuZRG.js +1 -0
- package/dist/chevron-right-DR9ZAP-2.js +1 -0
- package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
- package/dist/circle-BC66EYF7.js +1 -0
- package/dist/circle-check-BqmahW0O.js +1 -0
- package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
- package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
- package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
- package/dist/components/builder-composer-triggers.d.ts +62 -0
- package/dist/components/builder-layout.d.ts +54 -0
- package/dist/components/builder-message-actions.d.ts +72 -0
- package/dist/components/builder-panel.d.ts +189 -0
- package/dist/components/builder-preview.d.ts +11 -0
- package/dist/components/builder-shell-controls.d.ts +69 -0
- package/dist/components/builder-skeleton.d.ts +58 -0
- package/dist/components/builder-start.d.ts +75 -0
- package/dist/components/builder-workspace-variants.d.ts +23 -0
- package/dist/components/captions.d.ts +66 -0
- package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
- package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
- package/dist/construct-cli.es.js +3 -3
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
- package/dist/controllable-BagRpyHv.js +1 -0
- package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
- package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
- package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
- package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
- package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
- package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
- package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
- package/dist/define-CI0y3eE4.js +1 -0
- package/dist/define.js +40 -40
- package/dist/define.server.js +45 -45
- package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
- package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.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/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.js +1 -1
- package/dist/elements/checkbox.js +1 -1
- 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/dialog.js +1 -1
- package/dist/elements/dock.js +1 -1
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- 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.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/radio-group.js +1 -1
- 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 +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/select.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/slider.js +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/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
- package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
- package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
- package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
- package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
- package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
- package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
- package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
- package/dist/index.js +1741 -1725
- package/dist/index.server.js +1582 -1566
- package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
- package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
- package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
- package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
- package/dist/loader-KvJB6NrT.js +1 -0
- package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
- package/dist/mcp.es.js +9 -5
- package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
- package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
- package/dist/message-circle-BPpp5QKv.js +1 -0
- package/dist/message-square-BLbsd9BJ.js +1 -0
- package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
- package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
- package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
- package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
- package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
- package/dist/play-BXy1u7rW.js +1 -0
- package/dist/primitives/use-auto-resize.d.ts +11 -0
- package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
- package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
- package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
- package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
- package/dist/register-impl-DvEnhIxx.js +424 -0
- package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
- package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
- package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
- package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
- package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
- package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
- package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
- package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
- package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
- package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
- package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
- package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
- package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
- package/dist/solid.d.ts +6 -0
- package/dist/solid.js +259 -254
- package/dist/solid.server.js +259 -254
- package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
- package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
- package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
- package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
- package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
- package/dist/text-shimmer-BSzgEnDH.js +1 -0
- package/dist/textarea-DrYNt_0z.js +1 -0
- package/dist/theme.tokens.css +22 -21
- package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
- package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
- package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
- package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
- package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
- package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
- package/dist/ui/color-field.d.ts +48 -0
- package/dist/ui/textarea.d.ts +4 -0
- package/dist/ui/toggle-chip.d.ts +40 -0
- package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
- package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
- package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
- package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
- package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
- package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
- package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
- package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
- package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
- package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
- package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
- package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
- package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
- package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
- package/dist/x-eiO9V6J6.js +1 -0
- package/{src/elements/styles.css → kit-base.css} +27 -44
- package/package.json +32 -17
- package/solid.css +33 -0
- package/theme.css +39 -23
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-CjRU3JgV.js +0 -1
- package/dist/arrow-left-Bnpb1UEW.js +0 -1
- package/dist/artifact-Bwt7OgcR.js +0 -1
- package/dist/check-njkVdZu2.js +0 -1
- package/dist/chevron-down-B72s6PXR.js +0 -1
- package/dist/chevron-right-BatuHzUm.js +0 -1
- package/dist/circle-check-B62pODB3.js +0 -1
- package/dist/circle-zx0ByzY9.js +0 -1
- package/dist/controllable-CnGpMF6r.js +0 -1
- package/dist/define-By-uL588.js +0 -1
- package/dist/loader-BM4CEz4G.js +0 -1
- package/dist/message-circle-DruwObfX.js +0 -1
- package/dist/message-square-BG6q6mlm.js +0 -1
- package/dist/play-BvKKq3fX.js +0 -1
- package/dist/register-impl-B1hLkrI8.js +0 -424
- package/dist/text-shimmer-Dcj1MHuq.js +0 -1
- package/dist/textarea-Dpvbngbg.js +0 -1
- package/dist/x-Z5UntkIJ.js +0 -1
- package/src/agent-tooling/README.md +0 -192
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -147
- package/src/agent-tooling/construct/codegen.ts +0 -1635
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
- package/src/agent-tooling/construct/schema.ts +0 -452
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -1014
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -241
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/conversation-panel.tsx +0 -118
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/home-panel.tsx +0 -159
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/widget-tab-bar.tsx +0 -73
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -304
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -187
- package/src/elements/element-types.d.ts +0 -4353
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -430
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/conversation-store.ts +0 -248
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -173
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -95
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -630
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { type JSX, splitProps } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Dynamic } from 'solid-js/web';
|
|
4
|
-
|
|
5
|
-
export interface TextShimmerProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
6
|
-
as?: string;
|
|
7
|
-
duration?: number;
|
|
8
|
-
spread?: number;
|
|
9
|
-
children: JSX.Element;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function TextShimmer(props: TextShimmerProps) {
|
|
13
|
-
const [local, rest] = splitProps(props, ['as', 'class', 'duration', 'spread', 'children']);
|
|
14
|
-
|
|
15
|
-
const dynamicSpread = () => Math.min(Math.max(local.spread ?? 20, 5), 45);
|
|
16
|
-
const tag = () => local.as ?? 'span';
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<Dynamic
|
|
20
|
-
component={tag()}
|
|
21
|
-
class={cn(
|
|
22
|
-
'bg-size-[200%_auto] bg-clip-text font-medium text-transparent',
|
|
23
|
-
'animate-[shimmer_4s_infinite_linear]',
|
|
24
|
-
local.class
|
|
25
|
-
)}
|
|
26
|
-
style={{
|
|
27
|
-
'background-image': `linear-gradient(to right, var(--color-muted-foreground) ${50 - dynamicSpread()}%, var(--color-foreground) 50%, var(--color-muted-foreground) ${50 + dynamicSpread()}%)`,
|
|
28
|
-
'animation-duration': `${local.duration ?? 4}s`,
|
|
29
|
-
}}
|
|
30
|
-
{...rest}
|
|
31
|
-
>
|
|
32
|
-
{local.children}
|
|
33
|
-
</Dynamic>
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export { TextShimmer };
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { type JSX, splitProps, Show } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { TextShimmer } from './text-shimmer';
|
|
4
|
-
import { ChevronRight } from 'lucide-solid';
|
|
5
|
-
|
|
6
|
-
export interface ThinkingBarProps {
|
|
7
|
-
class?: string;
|
|
8
|
-
text?: string;
|
|
9
|
-
onStop?: () => void;
|
|
10
|
-
stopLabel?: string;
|
|
11
|
-
onClick?: () => void;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function ThinkingBar(props: ThinkingBarProps) {
|
|
15
|
-
const [local] = splitProps(props, ['class', 'text', 'onStop', 'stopLabel', 'onClick']);
|
|
16
|
-
|
|
17
|
-
const text = () => local.text ?? 'Thinking';
|
|
18
|
-
const stopLabel = () => local.stopLabel ?? 'Answer now';
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<div class={cn('flex w-full items-center justify-between', local.class)}>
|
|
22
|
-
<Show
|
|
23
|
-
when={local.onClick}
|
|
24
|
-
fallback={
|
|
25
|
-
<TextShimmer class="cursor-default text-sm font-medium">{text()}</TextShimmer>
|
|
26
|
-
}
|
|
27
|
-
>
|
|
28
|
-
<button
|
|
29
|
-
type="button"
|
|
30
|
-
onClick={local.onClick}
|
|
31
|
-
class="flex items-center gap-1 text-sm transition-opacity hover:opacity-80"
|
|
32
|
-
>
|
|
33
|
-
<TextShimmer class="text-sm font-medium">{text()}</TextShimmer>
|
|
34
|
-
<ChevronRight class="text-muted-foreground size-4" />
|
|
35
|
-
</button>
|
|
36
|
-
</Show>
|
|
37
|
-
<Show when={local.onStop}>
|
|
38
|
-
<button
|
|
39
|
-
onClick={local.onStop}
|
|
40
|
-
type="button"
|
|
41
|
-
class="text-muted-foreground hover:text-foreground border-muted-foreground/50 hover:border-foreground border-b border-dotted text-sm transition-colors"
|
|
42
|
-
>
|
|
43
|
-
{stopLabel()}
|
|
44
|
-
</button>
|
|
45
|
-
</Show>
|
|
46
|
-
</div>
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export { ThinkingBar };
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import { For, Show, createMemo, onMount, type JSX } from 'solid-js';
|
|
2
|
-
import { ChatConfig, useChatConfig } from '../primitives/chat-config';
|
|
3
|
-
import { ChatContainer, ChatContainerContent, ChatContainerScrollAnchor } from './chat-container';
|
|
4
|
-
import { Message, MessageAvatar, MessageBody } from './message';
|
|
5
|
-
import { createMessageFeedback, type MessageActionDetail } from '../primitives/message-feedback';
|
|
6
|
-
import { ScrollButton } from './scroll-button';
|
|
7
|
-
import { Loader } from './loader';
|
|
8
|
-
import type { ChatMessage } from '../elements/chat-types';
|
|
9
|
-
import type { ProseSize } from '../primitives/chat-config';
|
|
10
|
-
import type { CardComponentMap } from '../primitives/card-registry';
|
|
11
|
-
import type { CardSchemaMap } from './card-renderer';
|
|
12
|
-
|
|
13
|
-
/** Imperative handle exposed via `controllerRef` — the thread's scroll control,
|
|
14
|
-
* forwarded onto `<kai-thread>` as the `scrollToBottom()` instance method. */
|
|
15
|
-
export interface ThreadController {
|
|
16
|
-
/** Scroll the message list to the bottom (default `'smooth'`). */
|
|
17
|
-
scrollToBottom(behavior?: ScrollBehavior): void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface ThreadProps {
|
|
21
|
-
/** Extra classes for the thread root (e.g. `rounded-xl`). */
|
|
22
|
-
class?: string;
|
|
23
|
-
/** The full message thread to render, newest last. Each entry carries its role,
|
|
24
|
-
* ordered `parts`, and optional actions/avatar/feedback. A new array reference
|
|
25
|
-
* per streaming chunk re-renders (mutating in place does not). */
|
|
26
|
-
messages: ChatMessage[];
|
|
27
|
-
/** Add/override card type -> component entries, forwarded to `CardRenderer`
|
|
28
|
-
* for `card` parts. */
|
|
29
|
-
cardTypes?: CardComponentMap;
|
|
30
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type,
|
|
31
|
-
* forwarded to `CardRenderer` for `card` parts. The companion of `cardTypes`:
|
|
32
|
-
* that says what DRAWS a card, this says what a VALID one looks like.
|
|
33
|
-
* `createCardRegistry(...).validationSchemas` is exactly this shape. Without it
|
|
34
|
-
* the kit checks its own seven built-ins and leaves your own card type
|
|
35
|
-
* unvalidated. A schema here WINS over a built-in of the same name. */
|
|
36
|
-
cardSchemas?: CardSchemaMap;
|
|
37
|
-
/** The custom-element host node to emit card events off when no `CardProvider`
|
|
38
|
-
* is present, forwarded through `MessageBody` to `CardRenderer`. The
|
|
39
|
-
* element facades pass their own host element so card events leave as the
|
|
40
|
-
* bubbling `kai-card` CustomEvent. */
|
|
41
|
-
cardHostElement?: HTMLElement;
|
|
42
|
-
/** Show a typing indicator on the pending assistant turn — use while awaiting
|
|
43
|
-
* the assistant's reply. */
|
|
44
|
-
loading?: boolean;
|
|
45
|
-
/** Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`).
|
|
46
|
-
* Defaults to `'sm'`. */
|
|
47
|
-
proseSize?: ProseSize;
|
|
48
|
-
/** Shiki theme name for syntax-highlighted code blocks (e.g.
|
|
49
|
-
* `'github-dark-dimmed'`). */
|
|
50
|
-
codeTheme?: string;
|
|
51
|
-
/** Enable Shiki syntax highlighting in code blocks. Turn off to render plain
|
|
52
|
-
* `<pre>` blocks (lighter, no highlighter load). Default true. */
|
|
53
|
-
codeHighlight?: boolean;
|
|
54
|
-
/** Whether each message's action bar is always visible (`'always'`, default) or
|
|
55
|
-
* only revealed on hover of that message row (`'hover'`). */
|
|
56
|
-
actionsReveal?: 'always' | 'hover';
|
|
57
|
-
/** Show the scroll-to-bottom button inside the scroll area. Default true. */
|
|
58
|
-
scrollButton?: boolean;
|
|
59
|
-
/** Custom zero-state shown while the thread is empty. A sensible default renders
|
|
60
|
-
* when omitted (the `<kai-thread>` facade wires this to `slot="empty"`). */
|
|
61
|
-
empty?: JSX.Element;
|
|
62
|
-
/** Fired when a message's action button is clicked (copy / vote / regenerate /
|
|
63
|
-
* edit / custom). The facade re-dispatches this as `kai-message-action`. */
|
|
64
|
-
onMessageAction?: (detail: MessageActionDetail) => void;
|
|
65
|
-
/** Receive the imperative controller once mounted — the `<kai-thread>` facade
|
|
66
|
-
* forwards `scrollToBottom` onto the host. */
|
|
67
|
-
controllerRef?: (controller: ThreadController) => void;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Built-in zero-state, shown when the thread is empty and no `empty` is supplied. */
|
|
71
|
-
function DefaultEmpty() {
|
|
72
|
-
return (
|
|
73
|
-
<div class="flex min-h-[10rem] flex-1 flex-col items-center justify-center gap-1 py-12 text-center">
|
|
74
|
-
<p class="text-sm font-medium text-foreground">No messages yet</p>
|
|
75
|
-
<p class="text-xs text-muted-foreground">
|
|
76
|
-
Messages will appear here as the conversation starts.
|
|
77
|
-
</p>
|
|
78
|
-
</div>
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* `Thread` — the message-list slice of a chat, as a standalone composable: the
|
|
84
|
-
* scrolling list of messages + per-message rendering (markdown, code highlight,
|
|
85
|
-
* reasoning + tool panels, avatars, and the action row), stick-to-bottom scroll
|
|
86
|
-
* with a scroll-to-bottom button, an optional typing indicator, and an empty
|
|
87
|
-
* state. No composer, header, suggestions, or sidebar — those are sibling/preset
|
|
88
|
-
* concerns. This is the source of truth behind the `<kai-thread>` facade; it is
|
|
89
|
-
* composed from the same internal pieces `ChatThread` uses for its message list.
|
|
90
|
-
*/
|
|
91
|
-
export function Thread(props: ThreadProps) {
|
|
92
|
-
const outer = useChatConfig();
|
|
93
|
-
const reveal = () => (props.actionsReveal === 'hover' ? 'hover' : 'always');
|
|
94
|
-
// Feedback (copy + vote) state lives ABOVE the per-message <For>, so streaming
|
|
95
|
-
// re-renders (a fresh `messages` array ref per chunk) don't wipe it. The
|
|
96
|
-
// copy/feedback toasts scope to this thread's root so they appear in-thread
|
|
97
|
-
// rather than at the page top.
|
|
98
|
-
let rootEl: HTMLElement | undefined;
|
|
99
|
-
const feedback = createMessageFeedback({
|
|
100
|
-
emit: (detail) => props.onMessageAction?.(detail),
|
|
101
|
-
target: () => rootEl,
|
|
102
|
-
});
|
|
103
|
-
const showScrollButton = () => props.scrollButton !== false;
|
|
104
|
-
const showEmpty = () => props.messages.length === 0 && !props.loading;
|
|
105
|
-
// Keyed by message id, NOT by object reference: a streaming message is a new
|
|
106
|
-
// object every delta, and a reference-keyed <For> rebuilds the whole row for
|
|
107
|
-
// each one — which is why expanding a tool/reasoning panel mid-stream used to
|
|
108
|
-
// do nothing. Full rationale (and why not `<Index>`) in `chat-thread.tsx`.
|
|
109
|
-
const messageKeys = createMemo(() => props.messages.map((m) => m.id));
|
|
110
|
-
|
|
111
|
-
// Hand the imperative controller to the facade once mounted (rootEl is set).
|
|
112
|
-
onMount(() => {
|
|
113
|
-
props.controllerRef?.({
|
|
114
|
-
scrollToBottom: (behavior) => {
|
|
115
|
-
const vp = rootEl?.querySelector<HTMLElement>('.overflow-y-auto');
|
|
116
|
-
vp?.scrollTo({ top: vp.scrollHeight, behavior: behavior ?? 'smooth' });
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
return (
|
|
122
|
-
<ChatConfig
|
|
123
|
-
proseSize={props.proseSize}
|
|
124
|
-
codeTheme={props.codeTheme}
|
|
125
|
-
codeHighlight={props.codeHighlight !== false}
|
|
126
|
-
portalMount={outer.portalMount()}
|
|
127
|
-
>
|
|
128
|
-
<div
|
|
129
|
-
ref={(e) => (rootEl = e as HTMLElement)}
|
|
130
|
-
class={`relative flex h-full min-h-0 flex-col bg-background ${props.class ?? ''}`}
|
|
131
|
-
>
|
|
132
|
-
<ChatContainer class="h-full px-4 py-3">
|
|
133
|
-
<ChatContainerContent class="mx-auto w-full max-w-3xl space-y-4">
|
|
134
|
-
{/* Zero-state: the consumer owns WHAT it looks like (`empty`); the
|
|
135
|
-
component owns WHEN it shows (empty + not loading). */}
|
|
136
|
-
<Show when={showEmpty()}>
|
|
137
|
-
<Show when={props.empty} fallback={<DefaultEmpty />}>
|
|
138
|
-
{props.empty}
|
|
139
|
-
</Show>
|
|
140
|
-
</Show>
|
|
141
|
-
<For each={messageKeys()}>
|
|
142
|
-
{(_id, i) => (
|
|
143
|
-
// Read the message through <For>'s index accessor, never through
|
|
144
|
-
// a captured value — the row outlives the delta that replaced its
|
|
145
|
-
// object. <Show> supplies the non-null accessor and covers the
|
|
146
|
-
// frame where a removal has shortened the array.
|
|
147
|
-
<Show when={props.messages[i()]}>
|
|
148
|
-
{(m) => {
|
|
149
|
-
const body = (
|
|
150
|
-
<MessageBody
|
|
151
|
-
parts={m().parts}
|
|
152
|
-
cardTypes={props.cardTypes}
|
|
153
|
-
cardSchemas={props.cardSchemas}
|
|
154
|
-
cardHostElement={props.cardHostElement}
|
|
155
|
-
isUser={m().role === 'user'}
|
|
156
|
-
markdown={m().role === 'assistant'}
|
|
157
|
-
actions={m().actions}
|
|
158
|
-
actionsReveal={reveal()}
|
|
159
|
-
activeFeedback={feedback.resolveFeedback(m())}
|
|
160
|
-
copied={feedback.isCopied(m().id)}
|
|
161
|
-
onAction={(action) => feedback.handleAction(m(), action)}
|
|
162
|
-
/>
|
|
163
|
-
);
|
|
164
|
-
const rowGroup = () => (reveal() === 'hover' ? 'group ' : '');
|
|
165
|
-
return (
|
|
166
|
-
// `role` is the SPEAKER, and it has to be forwarded on BOTH
|
|
167
|
-
// branches. `Message` turns it into `role="article"` + an
|
|
168
|
-
// `aria-label` naming the speaker; without it the row is a
|
|
169
|
-
// bare div that chromium prunes from the accessibility tree
|
|
170
|
-
// as "uninteresting", so a screen reader gets no speaker at
|
|
171
|
-
// all. Every other read of `m().role` here is cosmetic
|
|
172
|
-
// (alignment, markdown), which is exactly how it went
|
|
173
|
-
// missing: the value was in hand and used for styling while
|
|
174
|
-
// being dropped for semantics.
|
|
175
|
-
<Show
|
|
176
|
-
when={m().avatar}
|
|
177
|
-
fallback={
|
|
178
|
-
<Message role={m().role} class={`${rowGroup()}${m().role === 'user' ? 'flex-col items-end' : 'flex-col items-start'}`}>
|
|
179
|
-
{body}
|
|
180
|
-
</Message>
|
|
181
|
-
}
|
|
182
|
-
>
|
|
183
|
-
{(av) => (
|
|
184
|
-
<Message role={m().role} class={rowGroup()}>
|
|
185
|
-
<MessageAvatar src={av().src ?? ''} alt={av().alt ?? ''} fallback={av().fallback} />
|
|
186
|
-
<div class={`flex min-w-0 flex-1 flex-col ${m().role === 'user' ? 'items-end' : 'items-start'}`}>
|
|
187
|
-
{body}
|
|
188
|
-
</div>
|
|
189
|
-
</Message>
|
|
190
|
-
)}
|
|
191
|
-
</Show>
|
|
192
|
-
);
|
|
193
|
-
}}
|
|
194
|
-
</Show>
|
|
195
|
-
)}
|
|
196
|
-
</For>
|
|
197
|
-
{/* Typing indicator on the pending assistant turn.
|
|
198
|
-
DELIBERATELY role-less, unlike the rows above — this is not an
|
|
199
|
-
oversight of the same kind. There is no message here yet, so
|
|
200
|
-
`role="assistant"` would announce an empty article named
|
|
201
|
-
"Assistant message". What a pending indicator needs instead is a
|
|
202
|
-
live region, so its ARRIVAL and departure are announced. The
|
|
203
|
-
Loader already carries an accessible name — an sr-only "Loading"
|
|
204
|
-
on all nine shape variants — and what it lacks is the
|
|
205
|
-
`role="status"` / aria-live wrapper around it. A real but
|
|
206
|
-
SEPARATE gap, and it lives in loader.tsx. Filed, not fixed here. */}
|
|
207
|
-
<Show when={props.loading}>
|
|
208
|
-
<Message class="flex-col items-start">
|
|
209
|
-
<div class="rounded-lg px-1 py-2">
|
|
210
|
-
<Loader variant="typing" />
|
|
211
|
-
</div>
|
|
212
|
-
</Message>
|
|
213
|
-
</Show>
|
|
214
|
-
<ChatContainerScrollAnchor />
|
|
215
|
-
</ChatContainerContent>
|
|
216
|
-
<Show when={showScrollButton()}>
|
|
217
|
-
<div class="absolute bottom-4 left-1/2 flex w-full max-w-3xl -translate-x-1/2 justify-center px-5">
|
|
218
|
-
{/* The button now owns its elevation (kai-elevation); a `shadow-sm`
|
|
219
|
-
here would set box-shadow a second time and the winner would
|
|
220
|
-
be stylesheet order, not this call site. */}
|
|
221
|
-
<ScrollButton />
|
|
222
|
-
</div>
|
|
223
|
-
</Show>
|
|
224
|
-
</ChatContainer>
|
|
225
|
-
</div>
|
|
226
|
-
</ChatConfig>
|
|
227
|
-
);
|
|
228
|
-
}
|