@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,367 +0,0 @@
|
|
|
1
|
-
import { Switch, Match, For, Show } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
|
|
4
|
-
export type LoaderVariant =
|
|
5
|
-
| 'circular'
|
|
6
|
-
| 'classic'
|
|
7
|
-
| 'pulse'
|
|
8
|
-
| 'pulse-dot'
|
|
9
|
-
| 'dots'
|
|
10
|
-
| 'typing'
|
|
11
|
-
| 'wave'
|
|
12
|
-
| 'bars'
|
|
13
|
-
| 'terminal'
|
|
14
|
-
| 'text-blink'
|
|
15
|
-
| 'text-shimmer'
|
|
16
|
-
| 'loading-dots';
|
|
17
|
-
|
|
18
|
-
export type LoaderSize = 'sm' | 'md' | 'lg';
|
|
19
|
-
|
|
20
|
-
export interface LoaderProps {
|
|
21
|
-
variant?: LoaderVariant;
|
|
22
|
-
size?: LoaderSize;
|
|
23
|
-
text?: string;
|
|
24
|
-
class?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Props of the shape-only loader variants (no label). */
|
|
28
|
-
export interface LoaderShapeProps {
|
|
29
|
-
class?: string;
|
|
30
|
-
size?: LoaderSize;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** Props of the text-based loader variants, which also take the label. */
|
|
34
|
-
export interface LoaderTextProps extends LoaderShapeProps {
|
|
35
|
-
text?: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Every variant shortcut ships its own `<Name>Props` alias: a consumer typing a
|
|
39
|
-
// wrapper around `<DotsLoader>` must be able to name its props without knowing
|
|
40
|
-
// that nine components happen to share one shape.
|
|
41
|
-
export type CircularLoaderProps = LoaderShapeProps;
|
|
42
|
-
export type ClassicLoaderProps = LoaderShapeProps;
|
|
43
|
-
export type PulseLoaderProps = LoaderShapeProps;
|
|
44
|
-
export type PulseDotLoaderProps = LoaderShapeProps;
|
|
45
|
-
export type DotsLoaderProps = LoaderShapeProps;
|
|
46
|
-
export type TypingLoaderProps = LoaderShapeProps;
|
|
47
|
-
export type WaveLoaderProps = LoaderShapeProps;
|
|
48
|
-
export type BarsLoaderProps = LoaderShapeProps;
|
|
49
|
-
export type TerminalLoaderProps = LoaderShapeProps;
|
|
50
|
-
export type TextBlinkLoaderProps = LoaderTextProps;
|
|
51
|
-
export type TextShimmerLoaderProps = LoaderTextProps;
|
|
52
|
-
export type TextDotsLoaderProps = LoaderTextProps;
|
|
53
|
-
|
|
54
|
-
// --- CircularLoader ---
|
|
55
|
-
|
|
56
|
-
export function CircularLoader(props: CircularLoaderProps) {
|
|
57
|
-
const size = () => props.size ?? 'md';
|
|
58
|
-
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
59
|
-
return (
|
|
60
|
-
<div
|
|
61
|
-
class={cn(
|
|
62
|
-
'border-primary animate-spin rounded-full border-2 border-t-transparent',
|
|
63
|
-
sizeClasses[size()],
|
|
64
|
-
props.class
|
|
65
|
-
)}
|
|
66
|
-
>
|
|
67
|
-
<span class="sr-only">Loading</span>
|
|
68
|
-
</div>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// --- ClassicLoader ---
|
|
73
|
-
|
|
74
|
-
export function ClassicLoader(props: ClassicLoaderProps) {
|
|
75
|
-
const size = () => props.size ?? 'md';
|
|
76
|
-
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
77
|
-
const barSizes = {
|
|
78
|
-
sm: { height: '6px', width: '1.5px' },
|
|
79
|
-
md: { height: '8px', width: '2px' },
|
|
80
|
-
lg: { height: '10px', width: '2.5px' },
|
|
81
|
-
};
|
|
82
|
-
return (
|
|
83
|
-
<div class={cn('relative', sizeClasses[size()], props.class)}>
|
|
84
|
-
<div class="absolute h-full w-full">
|
|
85
|
-
<For each={Array.from({ length: 12 }, (_, i) => i)}>
|
|
86
|
-
{(i) => (
|
|
87
|
-
<div
|
|
88
|
-
class="bg-primary absolute animate-[spinner-fade_1.2s_linear_infinite] rounded-full"
|
|
89
|
-
style={{
|
|
90
|
-
top: '0',
|
|
91
|
-
left: '50%',
|
|
92
|
-
'margin-left': size() === 'sm' ? '-0.75px' : size() === 'lg' ? '-1.25px' : '-1px',
|
|
93
|
-
'transform-origin': `${size() === 'sm' ? '0.75px' : size() === 'lg' ? '1.25px' : '1px'} ${size() === 'sm' ? '10px' : size() === 'lg' ? '14px' : '12px'}`,
|
|
94
|
-
transform: `rotate(${i * 30}deg)`,
|
|
95
|
-
opacity: 0,
|
|
96
|
-
'animation-delay': `${i * 0.1}s`,
|
|
97
|
-
height: barSizes[size()].height,
|
|
98
|
-
width: barSizes[size()].width,
|
|
99
|
-
}}
|
|
100
|
-
/>
|
|
101
|
-
)}
|
|
102
|
-
</For>
|
|
103
|
-
</div>
|
|
104
|
-
<span class="sr-only">Loading</span>
|
|
105
|
-
</div>
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// --- PulseLoader ---
|
|
110
|
-
|
|
111
|
-
export function PulseLoader(props: PulseLoaderProps) {
|
|
112
|
-
const size = () => props.size ?? 'md';
|
|
113
|
-
const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
|
|
114
|
-
return (
|
|
115
|
-
<div class={cn('relative', sizeClasses[size()], props.class)}>
|
|
116
|
-
<div class="border-primary absolute inset-0 animate-[thin-pulse_1.5s_ease-in-out_infinite] rounded-full border-2" />
|
|
117
|
-
<span class="sr-only">Loading</span>
|
|
118
|
-
</div>
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// --- PulseDotLoader ---
|
|
123
|
-
|
|
124
|
-
export function PulseDotLoader(props: PulseDotLoaderProps) {
|
|
125
|
-
const size = () => props.size ?? 'md';
|
|
126
|
-
const sizeClasses = { sm: 'size-1', md: 'size-2', lg: 'size-3' };
|
|
127
|
-
return (
|
|
128
|
-
<div
|
|
129
|
-
class={cn(
|
|
130
|
-
'bg-primary animate-[pulse-dot_1.2s_ease-in-out_infinite] rounded-full',
|
|
131
|
-
sizeClasses[size()],
|
|
132
|
-
props.class
|
|
133
|
-
)}
|
|
134
|
-
>
|
|
135
|
-
<span class="sr-only">Loading</span>
|
|
136
|
-
</div>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// --- DotsLoader ---
|
|
141
|
-
|
|
142
|
-
export function DotsLoader(props: DotsLoaderProps) {
|
|
143
|
-
const size = () => props.size ?? 'md';
|
|
144
|
-
const dotSizes = { sm: 'h-1.5 w-1.5', md: 'h-2 w-2', lg: 'h-2.5 w-2.5' };
|
|
145
|
-
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
146
|
-
return (
|
|
147
|
-
<div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
|
|
148
|
-
<For each={[0, 1, 2]}>
|
|
149
|
-
{(i) => (
|
|
150
|
-
<div
|
|
151
|
-
class={cn(
|
|
152
|
-
'bg-primary animate-[bounce-dots_1.4s_ease-in-out_infinite] rounded-full',
|
|
153
|
-
dotSizes[size()]
|
|
154
|
-
)}
|
|
155
|
-
style={{ 'animation-delay': `${i * 160}ms` }}
|
|
156
|
-
/>
|
|
157
|
-
)}
|
|
158
|
-
</For>
|
|
159
|
-
<span class="sr-only">Loading</span>
|
|
160
|
-
</div>
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// --- TypingLoader ---
|
|
165
|
-
|
|
166
|
-
export function TypingLoader(props: TypingLoaderProps) {
|
|
167
|
-
const size = () => props.size ?? 'md';
|
|
168
|
-
const dotSizes = { sm: 'h-1 w-1', md: 'h-1.5 w-1.5', lg: 'h-2 w-2' };
|
|
169
|
-
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
170
|
-
return (
|
|
171
|
-
<div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
|
|
172
|
-
<For each={[0, 1, 2]}>
|
|
173
|
-
{(i) => (
|
|
174
|
-
<div
|
|
175
|
-
class={cn(
|
|
176
|
-
'bg-primary animate-[typing_1s_infinite] rounded-full',
|
|
177
|
-
dotSizes[size()]
|
|
178
|
-
)}
|
|
179
|
-
style={{ 'animation-delay': `${i * 250}ms` }}
|
|
180
|
-
/>
|
|
181
|
-
)}
|
|
182
|
-
</For>
|
|
183
|
-
<span class="sr-only">Loading</span>
|
|
184
|
-
</div>
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// --- WaveLoader ---
|
|
189
|
-
|
|
190
|
-
export function WaveLoader(props: WaveLoaderProps) {
|
|
191
|
-
const size = () => props.size ?? 'md';
|
|
192
|
-
const barWidths = { sm: 'w-0.5', md: 'w-0.5', lg: 'w-1' };
|
|
193
|
-
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
194
|
-
const heights: Record<LoaderSize, string[]> = {
|
|
195
|
-
sm: ['6px', '9px', '12px', '9px', '6px'],
|
|
196
|
-
md: ['8px', '12px', '16px', '12px', '8px'],
|
|
197
|
-
lg: ['10px', '15px', '20px', '15px', '10px'],
|
|
198
|
-
};
|
|
199
|
-
return (
|
|
200
|
-
<div class={cn('flex items-center gap-0.5', containerSizes[size()], props.class)}>
|
|
201
|
-
<For each={[0, 1, 2, 3, 4]}>
|
|
202
|
-
{(i) => (
|
|
203
|
-
<div
|
|
204
|
-
class={cn(
|
|
205
|
-
'bg-primary animate-[wave_1s_ease-in-out_infinite] rounded-full',
|
|
206
|
-
barWidths[size()]
|
|
207
|
-
)}
|
|
208
|
-
style={{
|
|
209
|
-
'animation-delay': `${i * 100}ms`,
|
|
210
|
-
height: heights[size()][i],
|
|
211
|
-
}}
|
|
212
|
-
/>
|
|
213
|
-
)}
|
|
214
|
-
</For>
|
|
215
|
-
<span class="sr-only">Loading</span>
|
|
216
|
-
</div>
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// --- BarsLoader ---
|
|
221
|
-
|
|
222
|
-
export function BarsLoader(props: BarsLoaderProps) {
|
|
223
|
-
const size = () => props.size ?? 'md';
|
|
224
|
-
const barWidths = { sm: 'w-1', md: 'w-1.5', lg: 'w-2' };
|
|
225
|
-
const containerSizes = { sm: 'h-4 gap-1', md: 'h-5 gap-1.5', lg: 'h-6 gap-2' };
|
|
226
|
-
return (
|
|
227
|
-
<div class={cn('flex', containerSizes[size()], props.class)}>
|
|
228
|
-
<For each={[0, 1, 2]}>
|
|
229
|
-
{(i) => (
|
|
230
|
-
<div
|
|
231
|
-
class={cn(
|
|
232
|
-
'bg-primary h-full animate-[wave-bars_1.2s_ease-in-out_infinite]',
|
|
233
|
-
barWidths[size()]
|
|
234
|
-
)}
|
|
235
|
-
style={{ 'animation-delay': `${i * 0.2}s` }}
|
|
236
|
-
/>
|
|
237
|
-
)}
|
|
238
|
-
</For>
|
|
239
|
-
<span class="sr-only">Loading</span>
|
|
240
|
-
</div>
|
|
241
|
-
);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// --- TerminalLoader ---
|
|
245
|
-
|
|
246
|
-
export function TerminalLoader(props: TerminalLoaderProps) {
|
|
247
|
-
const size = () => props.size ?? 'md';
|
|
248
|
-
const cursorSizes = { sm: 'h-3 w-1.5', md: 'h-4 w-2', lg: 'h-5 w-2.5' };
|
|
249
|
-
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
250
|
-
const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
|
|
251
|
-
return (
|
|
252
|
-
<div class={cn('flex items-center space-x-1', containerSizes[size()], props.class)}>
|
|
253
|
-
{/* Decorative status chrome, not a control — was the BRAND token
|
|
254
|
-
(text-primary). The sibling TextShimmerLoader below already renders
|
|
255
|
-
its "Thinking" text purely in --color-foreground/--color-muted-foreground,
|
|
256
|
-
with no brand color at all; matches that precedent. */}
|
|
257
|
-
<span class={cn('text-foreground font-mono', textSizes[size()])}>{'>'}</span>
|
|
258
|
-
<div class={cn('bg-primary animate-[blink_1s_step-end_infinite]', cursorSizes[size()])} />
|
|
259
|
-
<span class="sr-only">Loading</span>
|
|
260
|
-
</div>
|
|
261
|
-
);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// --- TextBlinkLoader ---
|
|
265
|
-
|
|
266
|
-
export function TextBlinkLoader(props: TextBlinkLoaderProps) {
|
|
267
|
-
const size = () => props.size ?? 'md';
|
|
268
|
-
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
269
|
-
return (
|
|
270
|
-
<div
|
|
271
|
-
class={cn(
|
|
272
|
-
'animate-[text-blink_2s_ease-in-out_infinite] font-medium',
|
|
273
|
-
textSizes[size()],
|
|
274
|
-
props.class
|
|
275
|
-
)}
|
|
276
|
-
>
|
|
277
|
-
{props.text ?? 'Thinking'}
|
|
278
|
-
</div>
|
|
279
|
-
);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// --- TextShimmerLoader ---
|
|
283
|
-
|
|
284
|
-
export function TextShimmerLoader(props: TextShimmerLoaderProps) {
|
|
285
|
-
const size = () => props.size ?? 'md';
|
|
286
|
-
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
287
|
-
return (
|
|
288
|
-
<div
|
|
289
|
-
class={cn(
|
|
290
|
-
'bg-[linear-gradient(to_right,var(--color-muted-foreground)_40%,var(--color-foreground)_60%,var(--color-muted-foreground)_80%)]',
|
|
291
|
-
'bg-size-[200%_auto] bg-clip-text font-medium text-transparent',
|
|
292
|
-
'animate-[shimmer_4s_infinite_linear]',
|
|
293
|
-
textSizes[size()],
|
|
294
|
-
props.class
|
|
295
|
-
)}
|
|
296
|
-
>
|
|
297
|
-
{props.text ?? 'Thinking'}
|
|
298
|
-
</div>
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// --- TextDotsLoader ---
|
|
303
|
-
|
|
304
|
-
export function TextDotsLoader(props: TextDotsLoaderProps) {
|
|
305
|
-
const size = () => props.size ?? 'md';
|
|
306
|
-
const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
|
|
307
|
-
return (
|
|
308
|
-
<div class={cn('inline-flex items-center', props.class)}>
|
|
309
|
-
{/* Content/chrome, not a control — was `text-primary` on the label AND
|
|
310
|
-
the dots (both must match: one phrase, "Thinking..."). Matches
|
|
311
|
-
TextShimmerLoader's neutral precedent above. */}
|
|
312
|
-
<span class={cn('text-foreground font-medium', textSizes[size()])}>
|
|
313
|
-
{props.text ?? 'Thinking'}
|
|
314
|
-
</span>
|
|
315
|
-
<span class="inline-flex">
|
|
316
|
-
<span class="text-foreground animate-[loading-dots_1.4s_infinite_0.2s]">.</span>
|
|
317
|
-
<span class="text-foreground animate-[loading-dots_1.4s_infinite_0.4s]">.</span>
|
|
318
|
-
<span class="text-foreground animate-[loading-dots_1.4s_infinite_0.6s]">.</span>
|
|
319
|
-
</span>
|
|
320
|
-
</div>
|
|
321
|
-
);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// --- Loader (variant dispatcher) ---
|
|
325
|
-
|
|
326
|
-
export function Loader(props: LoaderProps) {
|
|
327
|
-
return (
|
|
328
|
-
<Switch fallback={<CircularLoader size={props.size} class={props.class} />}>
|
|
329
|
-
<Match when={props.variant === 'circular'}>
|
|
330
|
-
<CircularLoader size={props.size} class={props.class} />
|
|
331
|
-
</Match>
|
|
332
|
-
<Match when={props.variant === 'classic'}>
|
|
333
|
-
<ClassicLoader size={props.size} class={props.class} />
|
|
334
|
-
</Match>
|
|
335
|
-
<Match when={props.variant === 'pulse'}>
|
|
336
|
-
<PulseLoader size={props.size} class={props.class} />
|
|
337
|
-
</Match>
|
|
338
|
-
<Match when={props.variant === 'pulse-dot'}>
|
|
339
|
-
<PulseDotLoader size={props.size} class={props.class} />
|
|
340
|
-
</Match>
|
|
341
|
-
<Match when={props.variant === 'dots'}>
|
|
342
|
-
<DotsLoader size={props.size} class={props.class} />
|
|
343
|
-
</Match>
|
|
344
|
-
<Match when={props.variant === 'typing'}>
|
|
345
|
-
<TypingLoader size={props.size} class={props.class} />
|
|
346
|
-
</Match>
|
|
347
|
-
<Match when={props.variant === 'wave'}>
|
|
348
|
-
<WaveLoader size={props.size} class={props.class} />
|
|
349
|
-
</Match>
|
|
350
|
-
<Match when={props.variant === 'bars'}>
|
|
351
|
-
<BarsLoader size={props.size} class={props.class} />
|
|
352
|
-
</Match>
|
|
353
|
-
<Match when={props.variant === 'terminal'}>
|
|
354
|
-
<TerminalLoader size={props.size} class={props.class} />
|
|
355
|
-
</Match>
|
|
356
|
-
<Match when={props.variant === 'text-blink'}>
|
|
357
|
-
<TextBlinkLoader text={props.text} size={props.size} class={props.class} />
|
|
358
|
-
</Match>
|
|
359
|
-
<Match when={props.variant === 'text-shimmer'}>
|
|
360
|
-
<TextShimmerLoader text={props.text} size={props.size} class={props.class} />
|
|
361
|
-
</Match>
|
|
362
|
-
<Match when={props.variant === 'loading-dots'}>
|
|
363
|
-
<TextDotsLoader text={props.text} size={props.size} class={props.class} />
|
|
364
|
-
</Match>
|
|
365
|
-
</Switch>
|
|
366
|
-
);
|
|
367
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import { splitProps, createMemo, createUniqueId, For, Show, Switch, Match } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Marked } from 'marked';
|
|
4
|
-
import { CodeBlock, CodeBlockCode } from './code-block';
|
|
5
|
-
import { useChatConfig, textClass } from '../primitives/chat-config';
|
|
6
|
-
import { isSafeUrl } from '../primitives/card-routing';
|
|
7
|
-
|
|
8
|
-
// --- The markdown sink -------------------------------------------------------
|
|
9
|
-
//
|
|
10
|
-
// `MarkdownBlock` writes this parser's output to `innerHTML`, so THIS is the one
|
|
11
|
-
// place in the kit where a string the model produced becomes live DOM in the
|
|
12
|
-
// host page's origin. `marked` passes raw HTML through verbatim by default and
|
|
13
|
-
// dropped its own URL sanitizing in v5, so both have to be handled here.
|
|
14
|
-
//
|
|
15
|
-
// The threat model is NOT a hostile provider. An attacker only needs to
|
|
16
|
-
// influence the model's OUTPUT -- a user asking to be shown an `<img onerror>`
|
|
17
|
-
// example, a prompt-injected model, or RAG over an untrusted document all reach
|
|
18
|
-
// this sink against a perfectly trusted provider.
|
|
19
|
-
//
|
|
20
|
-
// WHY ESCAPE RATHER THAN SANITIZE (no DOMPurify):
|
|
21
|
-
// - A sanitizer needs a DOM. In Node this package's ESM build has no
|
|
22
|
-
// `sanitize` at all (`isSupported === false`), so the SSR path either throws
|
|
23
|
-
// or gets "guarded" into returning the payload UNCHANGED -- a silent
|
|
24
|
-
// passthrough of exactly the string we were trying to neutralise. Escaping
|
|
25
|
-
// is pure string work and behaves identically on server and client.
|
|
26
|
-
// - It costs no dependency. Escaping is the ~20 lines below; DOMPurify is
|
|
27
|
-
// ~35 KB gzipped of ESM in a package that gates its own footprint.
|
|
28
|
-
// - For a CHAT UI it is also the better RENDERING, not just the safer one.
|
|
29
|
-
// Raw HTML in model output is either the model quoting markup -- which the
|
|
30
|
-
// reader should SEE as text -- or an injection. Escaping serves the first
|
|
31
|
-
// case correctly and defuses the second. Nothing in this repo emits markdown
|
|
32
|
-
// that relies on inline HTML.
|
|
33
|
-
// There is deliberately NO opt-in to restore raw HTML: nothing needs it today,
|
|
34
|
-
// and an unsafe switch is the hole again for whoever flips it.
|
|
35
|
-
//
|
|
36
|
-
// This is a PRIVATE `Marked` instance, and that is load-bearing rather than
|
|
37
|
-
// tidiness. Configuring the shared `marked` singleton would mean a consumer's
|
|
38
|
-
// own `marked.use({ renderer })` elsewhere in the same app silently replaces
|
|
39
|
-
// this renderer and reopens the vulnerability. It also stops the kit mutating
|
|
40
|
-
// global `marked` options out from under a consumer, which it used to do.
|
|
41
|
-
|
|
42
|
-
/** Escape for HTML TEXT content. */
|
|
43
|
-
function escapeText(s: string): string {
|
|
44
|
-
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Escape for a double-quoted ATTRIBUTE value. */
|
|
48
|
-
function escapeAttr(s: string): string {
|
|
49
|
-
return escapeText(s).replace(/"/g, '"');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const md = new Marked({
|
|
53
|
-
gfm: true,
|
|
54
|
-
breaks: true,
|
|
55
|
-
renderer: {
|
|
56
|
-
/** Raw HTML -- block (`Tokens.HTML`) and inline (`Tokens.Tag`) both land
|
|
57
|
-
* here. Rendered as visible text instead of markup. */
|
|
58
|
-
html({ text }) {
|
|
59
|
-
return escapeText(text);
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
/** Markdown link syntax. marked BUILDS this anchor itself, so escaping raw
|
|
63
|
-
* HTML does not cover it and it needs the scheme allowlist of its own.
|
|
64
|
-
* A blocked link keeps its LABEL -- the reader still sees what the model
|
|
65
|
-
* wrote, we simply refuse to make it clickable. */
|
|
66
|
-
link({ href, title, tokens }) {
|
|
67
|
-
const text = this.parser.parseInline(tokens);
|
|
68
|
-
if (!isSafeUrl(href)) return text;
|
|
69
|
-
const t = title ? ` title="${escapeAttr(title)}"` : '';
|
|
70
|
-
return `<a href="${escapeAttr(href)}"${t}>${text}</a>`;
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
/** Markdown image syntax. Same reasoning as `link`; a blocked image falls
|
|
74
|
-
* back to its alt text. NOTE this also blocks `data:` image URIs, which
|
|
75
|
-
* are inert inside `<img>` -- one allowlist for both is worth more than
|
|
76
|
-
* the rare inline-data-image case it costs. */
|
|
77
|
-
image({ href, title, text }) {
|
|
78
|
-
if (!isSafeUrl(href)) return escapeText(text);
|
|
79
|
-
const t = title ? ` title="${escapeAttr(title)}"` : '';
|
|
80
|
-
return `<img src="${escapeAttr(href)}" alt="${escapeAttr(text)}"${t}>`;
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
export interface MarkdownProps {
|
|
86
|
-
content: string;
|
|
87
|
-
id?: string;
|
|
88
|
-
class?: string;
|
|
89
|
-
codeTheme?: string;
|
|
90
|
-
/** Optional `::part` name(s) to expose on the rendered root. Lets callers
|
|
91
|
-
* (e.g. the message bubble) surface a styleable part through the shadow. */
|
|
92
|
-
part?: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
interface ParsedBlock {
|
|
96
|
-
type: 'markdown' | 'code';
|
|
97
|
-
content: string;
|
|
98
|
-
language?: string;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function parseMarkdownIntoBlocks(markdown: string): ParsedBlock[] {
|
|
102
|
-
const tokens = md.lexer(markdown);
|
|
103
|
-
return tokens.map((token) => {
|
|
104
|
-
if (token.type === 'code') {
|
|
105
|
-
return {
|
|
106
|
-
type: 'code' as const,
|
|
107
|
-
content: token.text,
|
|
108
|
-
language: token.lang || undefined,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
type: 'markdown' as const,
|
|
113
|
-
content: token.raw,
|
|
114
|
-
};
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function MarkdownBlock(props: { content: string }) {
|
|
119
|
-
const html = createMemo(() => {
|
|
120
|
-
try {
|
|
121
|
-
return md.parse(props.content, { async: false }) as string;
|
|
122
|
-
} catch {
|
|
123
|
-
// The parse failed, so nothing has been escaped -- the raw source must
|
|
124
|
-
// NOT go to `innerHTML`. Escape it and show it as text.
|
|
125
|
-
return escapeText(props.content);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
return <div innerHTML={html()} />;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function Markdown(props: MarkdownProps) {
|
|
133
|
-
const [local] = splitProps(props, ['content', 'id', 'class', 'codeTheme', 'part']);
|
|
134
|
-
const config = useChatConfig();
|
|
135
|
-
const blockId = () => local.id ?? createUniqueId();
|
|
136
|
-
const blocks = createMemo(() => parseMarkdownIntoBlocks(local.content));
|
|
137
|
-
|
|
138
|
-
return (
|
|
139
|
-
<div part={local.part} class={cn('chat-markdown max-w-none break-words whitespace-normal [&>div:first-child>p:first-child]:mt-0 [&>div:last-child>p:last-child]:mb-0', textClass(config.proseSize()), local.class)}>
|
|
140
|
-
<For each={blocks()}>
|
|
141
|
-
{(block) => (
|
|
142
|
-
<Switch>
|
|
143
|
-
<Match when={block.type === 'code'}>
|
|
144
|
-
<CodeBlock class="my-4">
|
|
145
|
-
<CodeBlockCode
|
|
146
|
-
code={block.content}
|
|
147
|
-
language={block.language}
|
|
148
|
-
theme={local.codeTheme ?? config.codeTheme()}
|
|
149
|
-
/>
|
|
150
|
-
</CodeBlock>
|
|
151
|
-
</Match>
|
|
152
|
-
<Match when={block.type === 'markdown'}>
|
|
153
|
-
<MarkdownBlock content={block.content} />
|
|
154
|
-
</Match>
|
|
155
|
-
</Switch>
|
|
156
|
-
)}
|
|
157
|
-
</For>
|
|
158
|
-
</div>
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export { Markdown };
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Show, For, type JSX, splitProps } from "solid-js";
|
|
2
|
-
import { cn } from "../utils/cn";
|
|
3
|
-
|
|
4
|
-
// --- MessageSkills ---
|
|
5
|
-
|
|
6
|
-
/** One skill badge. Also the shape of `<kai-skills>`' `skills` property and of a
|
|
7
|
-
* `<kai-skill>` light-DOM child. */
|
|
8
|
-
export interface Skill {
|
|
9
|
-
/** Stable identifier for the skill. */
|
|
10
|
-
id: string;
|
|
11
|
-
/** Human-readable skill name shown on the badge. */
|
|
12
|
-
name: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface MessageSkillsProps {
|
|
16
|
-
skills: Skill[];
|
|
17
|
-
class?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Displays skill badges above a message to indicate which skills
|
|
22
|
-
* were active when the message was generated.
|
|
23
|
-
*/
|
|
24
|
-
function MessageSkills(props: MessageSkillsProps) {
|
|
25
|
-
return (
|
|
26
|
-
<Show when={props.skills.length > 0}>
|
|
27
|
-
<div class={cn("flex items-center gap-1 flex-wrap", props.class)}>
|
|
28
|
-
<For each={props.skills}>
|
|
29
|
-
{(skill) => (
|
|
30
|
-
<span class="inline-flex items-center px-1.5 py-0.5 rounded text-micro font-medium bg-violet-400/10 text-violet-600 dark:text-violet-400">
|
|
31
|
-
{skill.name}
|
|
32
|
-
</span>
|
|
33
|
-
)}
|
|
34
|
-
</For>
|
|
35
|
-
</div>
|
|
36
|
-
</Show>
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { MessageSkills };
|