@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,132 +0,0 @@
|
|
|
1
|
-
import { splitProps, For, Show, createSignal } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Dropdown, DropdownTrigger, DropdownContent, DropdownRadioItem, type DropdownController } from '../ui/dropdown';
|
|
4
|
-
import { Button } from '../ui/button';
|
|
5
|
-
import type { ModelOption } from '../types';
|
|
6
|
-
|
|
7
|
-
export interface ModelSwitcherProps {
|
|
8
|
-
models: ModelOption[];
|
|
9
|
-
currentModelId: string;
|
|
10
|
-
onModelChange: (modelId: string) => void;
|
|
11
|
-
class?: string;
|
|
12
|
-
/** Initial open state of the dropdown (uncontrolled seed). */
|
|
13
|
-
defaultOpen?: boolean;
|
|
14
|
-
/** Disable the trigger — click/keyboard no longer open the dropdown. */
|
|
15
|
-
disabled?: boolean;
|
|
16
|
-
/** Receive the dropdown's open controller (forwarded from the inner Dropdown). */
|
|
17
|
-
controllerRef?: (api: DropdownController) => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const Chevron = (props: { class?: string }) => (
|
|
21
|
-
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class={props.class}>
|
|
22
|
-
<polyline points="6 9 12 15 18 9" />
|
|
23
|
-
</svg>
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* One selectable model.
|
|
28
|
-
*
|
|
29
|
-
* A single-select list of models IS a radio group, so this routes through
|
|
30
|
-
* `DropdownRadioItem` (`role="menuitemradio"` + `aria-checked`) rather than
|
|
31
|
-
* hand-rolling those attributes onto a plain `DropdownItem`. Being the current
|
|
32
|
-
* model used to render as `font-medium` and nothing else — invisible to a screen
|
|
33
|
-
* reader. `kai-menu` already renders its radio items this way.
|
|
34
|
-
*
|
|
35
|
-
* `DropdownRadioItem` deliberately does NOT close the menu on activation (it is
|
|
36
|
-
* built for groups the consumer keeps mutating), so `onSelect` closes it here to
|
|
37
|
-
* preserve the pick-and-close behaviour `DropdownItem` used to provide.
|
|
38
|
-
*/
|
|
39
|
-
function ModelRow(props: {
|
|
40
|
-
model: ModelOption;
|
|
41
|
-
currentModelId: string;
|
|
42
|
-
onModelChange: (id: string) => void;
|
|
43
|
-
onClose: () => void;
|
|
44
|
-
}) {
|
|
45
|
-
const subtitle = () => props.model.description ?? props.model.provider;
|
|
46
|
-
const checked = () => props.model.id === props.currentModelId;
|
|
47
|
-
return (
|
|
48
|
-
<DropdownRadioItem
|
|
49
|
-
checked={checked()}
|
|
50
|
-
onSelect={() => { props.onModelChange(props.model.id); props.onClose(); }}
|
|
51
|
-
>
|
|
52
|
-
<div class="flex flex-col">
|
|
53
|
-
<span class={cn('text-body', checked() && 'font-medium text-foreground')}>{props.model.name}</span>
|
|
54
|
-
<Show when={subtitle()}><span class="text-caption text-muted-foreground">{subtitle()}</span></Show>
|
|
55
|
-
</div>
|
|
56
|
-
</DropdownRadioItem>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function ModelSwitcher(props: ModelSwitcherProps) {
|
|
61
|
-
const [local] = splitProps(props, ['models', 'currentModelId', 'onModelChange', 'class', 'defaultOpen', 'disabled', 'controllerRef']);
|
|
62
|
-
const currentModel = () => local.models.find((m) => m.id === local.currentModelId);
|
|
63
|
-
|
|
64
|
-
// The rows are DropdownRadioItems, which stay open by design, so the switcher
|
|
65
|
-
// needs its own handle on the dropdown to close after a pick. Tapping
|
|
66
|
-
// `controllerRef` keeps that inside this component — the dropdown's own context
|
|
67
|
-
// is module-private — and the consumer's `controllerRef` is still called, so
|
|
68
|
-
// this is invisible from the outside.
|
|
69
|
-
let controller: DropdownController | undefined;
|
|
70
|
-
const closeMenu = () => controller?.setOpen(false);
|
|
71
|
-
|
|
72
|
-
// Ungrouped models list first; grouped models collect under their group name,
|
|
73
|
-
// preserving first-seen group order.
|
|
74
|
-
const ungrouped = () => local.models.filter((m) => !m.group);
|
|
75
|
-
const groups = () => {
|
|
76
|
-
const order: string[] = [];
|
|
77
|
-
const byGroup = new Map<string, ModelOption[]>();
|
|
78
|
-
for (const m of local.models) {
|
|
79
|
-
if (!m.group) continue;
|
|
80
|
-
if (!byGroup.has(m.group)) { byGroup.set(m.group, []); order.push(m.group); }
|
|
81
|
-
byGroup.get(m.group)!.push(m);
|
|
82
|
-
}
|
|
83
|
-
return order.map((name) => ({ name, models: byGroup.get(name)! }));
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<Show when={local.models.length > 1}>
|
|
88
|
-
<Dropdown
|
|
89
|
-
defaultOpen={local.defaultOpen}
|
|
90
|
-
disabled={local.disabled}
|
|
91
|
-
controllerRef={(api) => { controller = api; local.controllerRef?.(api); }}
|
|
92
|
-
>
|
|
93
|
-
<DropdownTrigger as={(triggerProps: any) => (
|
|
94
|
-
<Button variant="ghost" size="sm" class={cn('gap-1 text-meta text-muted-foreground', local.class)} {...triggerProps}>
|
|
95
|
-
{currentModel()?.name ?? local.currentModelId}
|
|
96
|
-
<Chevron />
|
|
97
|
-
</Button>
|
|
98
|
-
)} />
|
|
99
|
-
<DropdownContent>
|
|
100
|
-
<For each={ungrouped()}>
|
|
101
|
-
{(model) => <ModelRow model={model} currentModelId={local.currentModelId} onModelChange={local.onModelChange} onClose={closeMenu} />}
|
|
102
|
-
</For>
|
|
103
|
-
<For each={groups()}>
|
|
104
|
-
{(group) => {
|
|
105
|
-
const [open, setOpen] = createSignal(false);
|
|
106
|
-
return (
|
|
107
|
-
<div>
|
|
108
|
-
<button
|
|
109
|
-
type="button"
|
|
110
|
-
aria-expanded={open()}
|
|
111
|
-
onClick={() => setOpen(!open())}
|
|
112
|
-
class="flex w-full items-center justify-between rounded-md px-2 py-1.5 text-body outline-none transition-colors hover:bg-muted focus:bg-muted"
|
|
113
|
-
>
|
|
114
|
-
{group.name}
|
|
115
|
-
<Chevron class={cn('transition-transform', open() && 'rotate-180')} />
|
|
116
|
-
</button>
|
|
117
|
-
<Show when={open()}>
|
|
118
|
-
<div class="pl-2">
|
|
119
|
-
<For each={group.models}>
|
|
120
|
-
{(model) => <ModelRow model={model} currentModelId={local.currentModelId} onModelChange={local.onModelChange} onClose={closeMenu} />}
|
|
121
|
-
</For>
|
|
122
|
-
</div>
|
|
123
|
-
</Show>
|
|
124
|
-
</div>
|
|
125
|
-
);
|
|
126
|
-
}}
|
|
127
|
-
</For>
|
|
128
|
-
</DropdownContent>
|
|
129
|
-
</Dropdown>
|
|
130
|
-
</Show>
|
|
131
|
-
);
|
|
132
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { type JSX, splitProps, createSignal, createContext, useContext } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { useChatConfig, textClass } from '../primitives/chat-config';
|
|
4
|
-
import { Composer, type TriggerDef, type ComposerChange } from './composer';
|
|
5
|
-
import type { ComposerDoc } from '../primitives/composer-model';
|
|
6
|
-
|
|
7
|
-
// --- Context ---
|
|
8
|
-
|
|
9
|
-
interface PromptInputContextType {
|
|
10
|
-
isLoading: boolean;
|
|
11
|
-
// A string (controlled text) or a ComposerDoc (a seed that pre-populates pills).
|
|
12
|
-
value: () => string | ComposerDoc;
|
|
13
|
-
setValue: (value: string) => void;
|
|
14
|
-
maxHeight: number | string;
|
|
15
|
-
onSubmit?: () => void;
|
|
16
|
-
disabled?: boolean;
|
|
17
|
-
textareaRef: HTMLElement | undefined;
|
|
18
|
-
setTextareaRef: (el: HTMLElement) => void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const PromptInputContext = createContext<PromptInputContextType>();
|
|
22
|
-
|
|
23
|
-
function usePromptInput() {
|
|
24
|
-
const ctx = useContext(PromptInputContext);
|
|
25
|
-
if (!ctx) throw new Error('PromptInput subcomponents must be used within PromptInput');
|
|
26
|
-
return ctx;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// --- PromptInput (Root) ---
|
|
30
|
-
|
|
31
|
-
export interface PromptInputProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
32
|
-
isLoading?: boolean;
|
|
33
|
-
/** String = controlled text; ComposerDoc = a seed that pre-populates pills. */
|
|
34
|
-
value?: string | ComposerDoc;
|
|
35
|
-
onValueChange?: (value: string) => void;
|
|
36
|
-
maxHeight?: number | string;
|
|
37
|
-
onSubmit?: () => void;
|
|
38
|
-
children: JSX.Element;
|
|
39
|
-
disabled?: boolean;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function PromptInput(props: PromptInputProps) {
|
|
43
|
-
const [local, rest] = splitProps(props, [
|
|
44
|
-
'isLoading', 'value', 'onValueChange', 'maxHeight', 'onSubmit',
|
|
45
|
-
'children', 'disabled', 'class', 'onClick',
|
|
46
|
-
]);
|
|
47
|
-
|
|
48
|
-
const [internalValue, setInternalValue] = createSignal<string | ComposerDoc>(local.value ?? '');
|
|
49
|
-
let textareaRef: HTMLElement | undefined;
|
|
50
|
-
|
|
51
|
-
const handleChange = (newValue: string) => {
|
|
52
|
-
setInternalValue(newValue);
|
|
53
|
-
local.onValueChange?.(newValue);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const handleClick: JSX.EventHandler<HTMLDivElement, MouseEvent> = (e) => {
|
|
57
|
-
if (!local.disabled) textareaRef?.focus();
|
|
58
|
-
if (typeof local.onClick === 'function') {
|
|
59
|
-
(local.onClick as (e: MouseEvent & { currentTarget: HTMLDivElement }) => void)(e);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
return (
|
|
64
|
-
<PromptInputContext.Provider
|
|
65
|
-
value={{
|
|
66
|
-
isLoading: local.isLoading ?? false,
|
|
67
|
-
value: () => local.value ?? internalValue(),
|
|
68
|
-
setValue: local.onValueChange ?? handleChange,
|
|
69
|
-
maxHeight: local.maxHeight ?? 240,
|
|
70
|
-
onSubmit: local.onSubmit,
|
|
71
|
-
get disabled() { return local.disabled; },
|
|
72
|
-
get textareaRef() { return textareaRef; },
|
|
73
|
-
setTextareaRef: (el) => { textareaRef = el; },
|
|
74
|
-
}}
|
|
75
|
-
>
|
|
76
|
-
<div
|
|
77
|
-
data-prompt-input
|
|
78
|
-
onClick={handleClick}
|
|
79
|
-
class={cn(
|
|
80
|
-
// The inner textarea neutralizes its own ring (focus-visible:ring-0),
|
|
81
|
-
// so the FRAME owns the focus affordance: a blue ring whenever a
|
|
82
|
-
// control inside it is focused. Without this the composer had no
|
|
83
|
-
// visible keyboard-focus state.
|
|
84
|
-
'bg-surface cursor-text rounded-xl p-2 shadow-xs',
|
|
85
|
-
'focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-0',
|
|
86
|
-
local.disabled && 'cursor-not-allowed opacity-60',
|
|
87
|
-
local.class
|
|
88
|
-
)}
|
|
89
|
-
{...rest}
|
|
90
|
-
>
|
|
91
|
-
{local.children}
|
|
92
|
-
</div>
|
|
93
|
-
</PromptInputContext.Provider>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// --- PromptInputTextarea ---
|
|
98
|
-
|
|
99
|
-
export interface PromptInputTextareaProps extends JSX.TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
100
|
-
disableAutosize?: boolean;
|
|
101
|
-
/** Rich entity triggers (`/`, `@`) forwarded to the composer. */
|
|
102
|
-
triggers?: TriggerDef[];
|
|
103
|
-
/** Default icon per entity kind (kind → image src), forwarded to the composer. */
|
|
104
|
-
kindIcons?: Record<string, string>;
|
|
105
|
-
/** Structured change (doc + entities) from the composer, on every edit. */
|
|
106
|
-
onComposerChange?: (change: ComposerChange) => void;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function PromptInputTextarea(props: PromptInputTextareaProps) {
|
|
110
|
-
const [local] = splitProps(props, ['class', 'placeholder', 'aria-label', 'triggers', 'kindIcons', 'onComposerChange']);
|
|
111
|
-
const ctx = usePromptInput();
|
|
112
|
-
const config = useChatConfig();
|
|
113
|
-
|
|
114
|
-
// The editable mirrors the original <textarea>'s classes EXACTLY so swapping in
|
|
115
|
-
// the contenteditable composer is visually identical. The frame (PromptInput
|
|
116
|
-
// root) still owns radius/bg/padding/focus-ring; auto-grow is native to a
|
|
117
|
-
// contenteditable block (capped via max-height on the editable).
|
|
118
|
-
// `text-start` is a PIN, not a style choice: `text-align` inherits, so any
|
|
119
|
-
// centered ancestor (`Empty`'s root did exactly this) reached in and centered
|
|
120
|
-
// the placeholder AND the typed text. An input control's text alignment is a
|
|
121
|
-
// fact about the control, so it states it rather than inheriting it. LOGICAL
|
|
122
|
-
// (`start`), not `text-left` — in RTL the correct edge is the right one, and
|
|
123
|
-
// pinning the physical value would be a worse bug than the one it fixes.
|
|
124
|
-
const editableClass = () =>
|
|
125
|
-
cn(
|
|
126
|
-
'text-foreground min-h-[44px] w-full bg-transparent text-start shadow-none outline-none focus-visible:ring-0 focus-visible:ring-offset-0 overflow-y-auto whitespace-pre-wrap break-words',
|
|
127
|
-
textClass(config.proseSize()),
|
|
128
|
-
local.class,
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
return (
|
|
132
|
-
<Composer
|
|
133
|
-
bare
|
|
134
|
-
value={ctx.value()}
|
|
135
|
-
placeholder={local.placeholder as string | undefined}
|
|
136
|
-
ariaLabel={local['aria-label'] as string | undefined}
|
|
137
|
-
disabled={ctx.disabled}
|
|
138
|
-
maxHeight={ctx.maxHeight}
|
|
139
|
-
editableClass={editableClass()}
|
|
140
|
-
editableRef={(el) => ctx.setTextareaRef(el)}
|
|
141
|
-
triggers={local.triggers}
|
|
142
|
-
kindIcons={local.kindIcons}
|
|
143
|
-
// Surface the structured change (doc/entities) BEFORE the string value, so a
|
|
144
|
-
// consumer that enriches its events has the latest doc when value-change fires.
|
|
145
|
-
// A prompt can't start with whitespace — strip leading whitespace from the
|
|
146
|
-
// string value (parity with the old textarea); the controlled round-trip
|
|
147
|
-
// re-renders the editable so the stripped value shows too.
|
|
148
|
-
onChange={(c) => { local.onComposerChange?.(c); ctx.setValue(c.text.replace(/^\s+/, '')); }}
|
|
149
|
-
onSubmit={() => { if (!ctx.disabled) ctx.onSubmit?.(); }}
|
|
150
|
-
/>
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// --- PromptInputActions ---
|
|
155
|
-
|
|
156
|
-
export interface PromptInputActionsProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
157
|
-
children: JSX.Element;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function PromptInputActions(props: PromptInputActionsProps) {
|
|
161
|
-
const [local, rest] = splitProps(props, ['children', 'class']);
|
|
162
|
-
return (
|
|
163
|
-
<div class={cn('flex items-center gap-2', local.class)} {...rest}>
|
|
164
|
-
{local.children}
|
|
165
|
-
</div>
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// --- PromptInputAction ---
|
|
170
|
-
|
|
171
|
-
export interface PromptInputActionProps {
|
|
172
|
-
tooltip?: string;
|
|
173
|
-
children: JSX.Element;
|
|
174
|
-
side?: 'top' | 'bottom' | 'left' | 'right';
|
|
175
|
-
class?: string;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function PromptInputAction(props: PromptInputActionProps) {
|
|
179
|
-
return <>{props.children}</>;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export {
|
|
183
|
-
PromptInput,
|
|
184
|
-
PromptInputTextarea,
|
|
185
|
-
PromptInputActions,
|
|
186
|
-
PromptInputAction,
|
|
187
|
-
usePromptInput,
|
|
188
|
-
};
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { type JSX, Show, splitProps } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Button } from '../ui/button';
|
|
4
|
-
import { renderIcon } from '../ui/icon';
|
|
5
|
-
|
|
6
|
-
export interface PromptSuggestionProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
7
|
-
children: JSX.Element | string;
|
|
8
|
-
variant?: 'outline' | 'ghost' | 'default';
|
|
9
|
-
/** Row height for the `list` layout: `'md'` (default) or `'lg'` for taller
|
|
10
|
-
* rows (more vertical padding). Chips/block/highlight are unaffected. */
|
|
11
|
-
size?: 'md' | 'lg';
|
|
12
|
-
/** Optional leading icon (named icon, image URL/data-URI, or text). */
|
|
13
|
-
icon?: string;
|
|
14
|
-
highlight?: string;
|
|
15
|
-
/** Render as a full-width, left-aligned list row (the "suggested questions"
|
|
16
|
-
* idiom) instead of a rounded pill. Wraps long text. Ignored in highlight
|
|
17
|
-
* mode, which is always a list row. */
|
|
18
|
-
block?: boolean;
|
|
19
|
-
/** Render as a full-width "Ideas for you" list row: a leading icon, a
|
|
20
|
-
* left-aligned label, and a hover background. Like `block`, but keeps the
|
|
21
|
-
* leading icon. Ignored in highlight mode. */
|
|
22
|
-
list?: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function PromptSuggestion(props: PromptSuggestionProps) {
|
|
26
|
-
const [local, rest] = splitProps(props, ['children', 'variant', 'size', 'class', 'icon', 'highlight', 'block', 'list']);
|
|
27
|
-
const Icon = () => <Show when={local.icon}>{renderIcon(local.icon, { class: 'size-3.5 shrink-0' })}</Show>;
|
|
28
|
-
|
|
29
|
-
const isHighlightMode = () => local.highlight !== undefined && local.highlight.trim() !== '';
|
|
30
|
-
const content = () => typeof local.children === 'string' ? local.children : '';
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<Show
|
|
34
|
-
when={isHighlightMode()}
|
|
35
|
-
fallback={
|
|
36
|
-
<Show
|
|
37
|
-
when={local.list}
|
|
38
|
-
fallback={
|
|
39
|
-
<Show
|
|
40
|
-
when={local.block}
|
|
41
|
-
fallback={
|
|
42
|
-
<Button
|
|
43
|
-
variant={local.variant ?? 'outline'}
|
|
44
|
-
size="lg"
|
|
45
|
-
class={cn('rounded-full', local.class)}
|
|
46
|
-
{...rest}
|
|
47
|
-
>
|
|
48
|
-
<Icon />
|
|
49
|
-
{local.children}
|
|
50
|
-
</Button>
|
|
51
|
-
}
|
|
52
|
-
>
|
|
53
|
-
<Button
|
|
54
|
-
variant={local.variant ?? 'outline'}
|
|
55
|
-
size="md"
|
|
56
|
-
class={cn(
|
|
57
|
-
'h-auto w-full cursor-pointer justify-start rounded-xl px-4 py-2.5',
|
|
58
|
-
'text-left text-sm leading-snug whitespace-normal text-pretty',
|
|
59
|
-
local.class,
|
|
60
|
-
)}
|
|
61
|
-
{...rest}
|
|
62
|
-
>
|
|
63
|
-
{local.children}
|
|
64
|
-
</Button>
|
|
65
|
-
</Show>
|
|
66
|
-
}
|
|
67
|
-
>
|
|
68
|
-
<Button
|
|
69
|
-
variant={local.variant ?? 'ghost'}
|
|
70
|
-
size="md"
|
|
71
|
-
class={cn(
|
|
72
|
-
'group h-auto w-full cursor-pointer items-center justify-start gap-2.5 rounded-xl px-3',
|
|
73
|
-
local.size === 'lg' ? 'py-3.5' : 'py-2.5',
|
|
74
|
-
'text-left text-sm leading-snug whitespace-normal text-pretty',
|
|
75
|
-
'hover:bg-accent',
|
|
76
|
-
local.class,
|
|
77
|
-
)}
|
|
78
|
-
{...rest}
|
|
79
|
-
>
|
|
80
|
-
<Icon />
|
|
81
|
-
<span class="min-w-0 flex-1">{local.children}</span>
|
|
82
|
-
</Button>
|
|
83
|
-
</Show>
|
|
84
|
-
}
|
|
85
|
-
>
|
|
86
|
-
<Show
|
|
87
|
-
when={content()}
|
|
88
|
-
fallback={
|
|
89
|
-
<Button
|
|
90
|
-
variant={local.variant ?? 'ghost'}
|
|
91
|
-
size="sm"
|
|
92
|
-
class={cn(
|
|
93
|
-
'w-full cursor-pointer justify-start rounded-xl py-2',
|
|
94
|
-
'hover:bg-accent',
|
|
95
|
-
local.class
|
|
96
|
-
)}
|
|
97
|
-
{...rest}
|
|
98
|
-
>
|
|
99
|
-
{local.children}
|
|
100
|
-
</Button>
|
|
101
|
-
}
|
|
102
|
-
>
|
|
103
|
-
<Button
|
|
104
|
-
variant={local.variant ?? 'ghost'}
|
|
105
|
-
size="sm"
|
|
106
|
-
class={cn(
|
|
107
|
-
'w-full cursor-pointer justify-start gap-0 rounded-xl py-2',
|
|
108
|
-
'hover:bg-accent',
|
|
109
|
-
local.class
|
|
110
|
-
)}
|
|
111
|
-
{...rest}
|
|
112
|
-
>
|
|
113
|
-
{renderHighlighted(content(), local.highlight!)}
|
|
114
|
-
</Button>
|
|
115
|
-
</Show>
|
|
116
|
-
</Show>
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function renderHighlighted(text: string, highlight: string) {
|
|
121
|
-
const trimmed = highlight.trim();
|
|
122
|
-
const textLower = text.toLowerCase();
|
|
123
|
-
const highlightLower = trimmed.toLowerCase();
|
|
124
|
-
const index = textLower.indexOf(highlightLower);
|
|
125
|
-
|
|
126
|
-
if (index === -1) {
|
|
127
|
-
return <span class="text-foreground/70 whitespace-pre-wrap">{text}</span>;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const before = text.substring(0, index);
|
|
131
|
-
const matched = text.substring(index, index + highlightLower.length);
|
|
132
|
-
const after = text.substring(index + matched.length);
|
|
133
|
-
|
|
134
|
-
return (
|
|
135
|
-
<>
|
|
136
|
-
<Show when={before}>
|
|
137
|
-
<span class="text-foreground/70 whitespace-pre-wrap">{before}</span>
|
|
138
|
-
</Show>
|
|
139
|
-
{/* Matched-substring highlight is CONTENT, not a control — was the BRAND
|
|
140
|
-
token. Full-strength `text-foreground` against the `/70`-opacity
|
|
141
|
-
siblings above/below is what actually carries the highlight. */}
|
|
142
|
-
<span class="text-foreground font-medium whitespace-pre-wrap">{matched}</span>
|
|
143
|
-
<Show when={after}>
|
|
144
|
-
<span class="text-foreground/70 whitespace-pre-wrap">{after}</span>
|
|
145
|
-
</Show>
|
|
146
|
-
</>
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export { PromptSuggestion };
|