@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
package/src/elements/message.tsx
DELETED
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
import { Show, createSignal, createEffect, onMount, onCleanup, type JSX } from 'solid-js';
|
|
2
|
-
import { Dynamic } from 'solid-js/web';
|
|
3
|
-
import { defineWebComponent } from './define';
|
|
4
|
-
import { readSlots, MESSAGE_SLOTS } from './slots';
|
|
5
|
-
import { ChatConfig, useChatConfig, type ProseSize } from '../primitives/chat-config';
|
|
6
|
-
import { Message, MessageAvatar, MessageBody } from '../components/message';
|
|
7
|
-
import { createMessageFeedback } from '../primitives/message-feedback';
|
|
8
|
-
import {
|
|
9
|
-
mergeCardTags,
|
|
10
|
-
BUILTIN_CARD_TAGS,
|
|
11
|
-
BUILTIN_CARD_COMPONENTS,
|
|
12
|
-
type CardTagMap,
|
|
13
|
-
type CardComponentMap,
|
|
14
|
-
} from '../primitives/card-registry';
|
|
15
|
-
import type { CardEnvelope } from '../primitives/card-contract';
|
|
16
|
-
import { hasParts } from './validate-messages';
|
|
17
|
-
import type { ChatMessage } from './chat-types';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Bridges the web-component-facing `cardTypes` (envelope type -> custom-element
|
|
21
|
-
* TAG name, e.g. `{ 'my-widget': 'my-widget-el' }`) into the `CardComponentMap`
|
|
22
|
-
* that `MessageBody`/`Thread` expect. A type the consumer did NOT override keeps
|
|
23
|
-
* rendering its built-in Solid component directly (no extra custom-element
|
|
24
|
-
* indirection); an overridden built-in or a brand-new consumer type renders as a
|
|
25
|
-
* dynamically-created custom element instead, mirroring `<kai-cards>`'s
|
|
26
|
-
* `CardSlot`. A type with no tag at all (unregistered) simply gets no entry, so
|
|
27
|
-
* `CardRenderer`'s own fallback (`CardFallback`) takes over.
|
|
28
|
-
*/
|
|
29
|
-
export function cardComponentsFromTags(types?: CardTagMap, theme = 'auto'): CardComponentMap {
|
|
30
|
-
const tags = mergeCardTags(types);
|
|
31
|
-
const map: CardComponentMap = {};
|
|
32
|
-
for (const type of Object.keys(tags)) {
|
|
33
|
-
const tag = tags[type];
|
|
34
|
-
map[type] = tag === BUILTIN_CARD_TAGS[type] && BUILTIN_CARD_COMPONENTS[type]
|
|
35
|
-
? BUILTIN_CARD_COMPONENTS[type]
|
|
36
|
-
: (p) => <CardTagSlot tag={tag} envelope={p.envelope} theme={theme} />;
|
|
37
|
-
}
|
|
38
|
-
return map;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Renders one envelope as a dynamically-created custom element, setting the
|
|
42
|
-
* envelope's data/id/title/resolution as DOM properties (reactive) plus the
|
|
43
|
-
* `theme` + `data-card-id` chrome, mirroring `<kai-cards>`'s `CardSlot` so a
|
|
44
|
-
* custom card behaves identically whether it arrives via `<kai-cards>` or a
|
|
45
|
-
* `card` message part here. */
|
|
46
|
-
function CardTagSlot(props: { tag: string; envelope: CardEnvelope; theme: string }): JSX.Element {
|
|
47
|
-
let ref: HTMLElement | undefined;
|
|
48
|
-
createEffect(() => {
|
|
49
|
-
if (!ref) return;
|
|
50
|
-
(ref as unknown as { data: unknown }).data = props.envelope.data;
|
|
51
|
-
(ref as unknown as { cardId: string }).cardId = props.envelope.id;
|
|
52
|
-
if (props.envelope.title != null) (ref as unknown as { heading: string }).heading = props.envelope.title;
|
|
53
|
-
(ref as unknown as { resolution: unknown }).resolution = props.envelope.resolution;
|
|
54
|
-
ref.setAttribute('theme', props.theme);
|
|
55
|
-
ref.setAttribute('data-card-id', props.envelope.id);
|
|
56
|
-
});
|
|
57
|
-
return <Dynamic component={props.tag} ref={ref} />;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
interface Props extends Record<string, unknown> {
|
|
61
|
-
/** The full message object. Set as a JS property. */
|
|
62
|
-
message?: ChatMessage;
|
|
63
|
-
/** Who is speaking: `'user'` or `'assistant'`. Convenience for simple cases when
|
|
64
|
-
* not passing a `message` object.
|
|
65
|
-
*
|
|
66
|
-
* This is the SEMANTIC role of the message, not an ARIA role. The name collides
|
|
67
|
-
* with the global ARIA `role` attribute, which is why the facade lifts it off
|
|
68
|
-
* the host (see `liftRoleOffHost`). Neither speaker is a valid ARIA role,
|
|
69
|
-
* so a `role="user"` left on `<kai-message>` is a CRITICAL axe `aria-roles`
|
|
70
|
-
* violation. The accessible role lives on the row inside the shadow root
|
|
71
|
-
* instead: `role="article"` plus an `aria-label` naming the speaker, matching
|
|
72
|
-
* the SolidJS `<Message>` component. */
|
|
73
|
-
role?: 'user' | 'assistant';
|
|
74
|
-
/** Force markdown on/off. Defaults to on for assistant, off for user. */
|
|
75
|
-
markdown?: boolean;
|
|
76
|
-
/** Text/markdown sizing for the message body. */
|
|
77
|
-
proseSize?: ProseSize;
|
|
78
|
-
/** Shiki theme name used for fenced code blocks in the content. */
|
|
79
|
-
codeTheme?: string;
|
|
80
|
-
/** Disable syntax highlighting for code blocks (no Shiki loads). */
|
|
81
|
-
codeHighlight?: boolean;
|
|
82
|
-
/** Whether the action bar is always visible (`'always'`, default) or only
|
|
83
|
-
* revealed on hover of the message row (`'hover'`). */
|
|
84
|
-
actionsReveal?: 'always' | 'hover';
|
|
85
|
-
/** Convenience avatar image URL (used when `message.avatar` is not set). */
|
|
86
|
-
avatarSrc?: string;
|
|
87
|
-
/** Convenience avatar fallback text (used when `message.avatar` is not set). */
|
|
88
|
-
avatarFallback?: string;
|
|
89
|
-
/** Avatar rail mode. `'none'` omits the avatar rail entirely so the body spans
|
|
90
|
-
* the full row (predictable layout when you never show avatars). Any other
|
|
91
|
-
* value keeps the default behaviour: the built-in avatar when one resolves, or
|
|
92
|
-
* your `slot="avatar"` content when projected (which REPLACES the built-in). */
|
|
93
|
-
avatar?: 'none' | string;
|
|
94
|
-
/** Optional card type -> custom-element tag overrides/additions for `card`
|
|
95
|
-
* parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
|
|
96
|
-
* plain string map (not the `CardTagMap` alias) so the generated React
|
|
97
|
-
* wrapper inlines it instead of emitting an unresolved named type. */
|
|
98
|
-
cardTypes?: Record<string, string>;
|
|
99
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type. The
|
|
100
|
-
* companion of `cardTypes`, which says what DRAWS a card while this says what a
|
|
101
|
-
* VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
|
|
102
|
-
* = { 'pricing-table': pricingSchema }`, never an attribute.
|
|
103
|
-
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
104
|
-
*
|
|
105
|
-
* Without it the kit validates its own seven built-ins and leaves your own card
|
|
106
|
-
* type, the one your app actually cares about, as the only unchecked thing on
|
|
107
|
-
* screen. A schema here WINS over a built-in of the same name.
|
|
108
|
-
*
|
|
109
|
-
* Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
|
|
110
|
-
* deliberately: an imported `.json` schema widens `"type"` to `string`, and an
|
|
111
|
-
* authored one carries `$schema`/`title`/`description`/`additionalProperties`,
|
|
112
|
-
* so the tighter type would reject both of the normal ways to supply one. */
|
|
113
|
-
cardSchemas?: Record<string, object>;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Move a `role` the consumer put on the host into the element's own prop store,
|
|
118
|
-
* and off the DOM.
|
|
119
|
-
*
|
|
120
|
-
* `role` names the SPEAKER here (`'user'` / `'assistant'`) — the correct domain
|
|
121
|
-
* word, and the documented attribute — but it is also the global ARIA `role`
|
|
122
|
-
* attribute, and neither speaker is a valid ARIA role. Measured in a real chromium:
|
|
123
|
-
* a host left carrying `role="user"` is a CRITICAL axe `aria-roles` violation
|
|
124
|
-
* ("Role must be one of the valid ARIA roles: user"), and chromium discards the
|
|
125
|
-
* unknown token and computes `generic`, so the row is left with no accessible role
|
|
126
|
-
* and no accessible name rather than a mis-announced one.
|
|
127
|
-
*
|
|
128
|
-
* Capture the value, remove the attribute, then write it back as a PROPERTY.
|
|
129
|
-
* component-register's prop accessors do not reflect, so the write cannot put it
|
|
130
|
-
* back on the DOM, and it feeds the same reactive prop the facade already reads.
|
|
131
|
-
*
|
|
132
|
-
* The ORDER is load-bearing: `removeAttribute` fires component-register's
|
|
133
|
-
* `attributeChangedCallback` with `null`, which sets the property to `null`. The
|
|
134
|
-
* write-back has to come after that, or the scrub destroys the speaker it was
|
|
135
|
-
* meant to preserve.
|
|
136
|
-
*
|
|
137
|
-
* NOTE — this covers every path where the attribute is still on the host by the
|
|
138
|
-
* time the facade runs (`setAttribute` before or after connection, and any later
|
|
139
|
-
* change, via the observer below). It does NOT cover an element authored in HTML
|
|
140
|
-
* and upgraded at registration time: `defineWebComponent` installs its
|
|
141
|
-
* non-reflecting `role` accessor AFTER `customElements.define()`, so for elements
|
|
142
|
-
* already in the document the native ARIAMixin setter runs first in the constructor
|
|
143
|
-
* (`this[prop] = undefined` → `role` is a nullable reflected IDL attribute →
|
|
144
|
-
* `removeAttribute`) and the value is gone before any of this code executes. That
|
|
145
|
-
* is a separate defect in `src/elements/define.tsx`, not something the facade can
|
|
146
|
-
* reach; this function composes correctly with the fix once it lands.
|
|
147
|
-
*/
|
|
148
|
-
function liftRoleOffHost(element: HTMLElement): void {
|
|
149
|
-
const attr = element.getAttribute('role');
|
|
150
|
-
if (attr === null) return;
|
|
151
|
-
element.removeAttribute('role');
|
|
152
|
-
(element as unknown as { role?: string }).role = attr;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/** Events fired by `<kai-message>`. */
|
|
156
|
-
interface Events {
|
|
157
|
-
/** An action button was clicked. `action` is the built-in name or custom id.
|
|
158
|
-
* `state` is present only for the toggleable feedback votes: `'on'` when a
|
|
159
|
-
* like/dislike is set, `'off'` when re-tapped to clear. */
|
|
160
|
-
'kai-message-action': { messageId: string; action: string; state?: 'on' | 'off' };
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* `<kai-message>` — a single message row: markdown/plain content, reasoning,
|
|
165
|
-
* tool calls, attachments, and action buttons, rendered from one `message`
|
|
166
|
-
* object (the same shape `<kai-chat>` uses per message). The keystone of the
|
|
167
|
-
* "compose your own message list" pattern. Emits `kai-message-action`.
|
|
168
|
-
*/
|
|
169
|
-
defineWebComponent<Props, Events>('kai-message', {
|
|
170
|
-
message: undefined,
|
|
171
|
-
role: 'assistant',
|
|
172
|
-
markdown: undefined,
|
|
173
|
-
proseSize: 'sm',
|
|
174
|
-
codeTheme: 'github-dark-dimmed',
|
|
175
|
-
codeHighlight: true,
|
|
176
|
-
actionsReveal: 'always',
|
|
177
|
-
avatarSrc: undefined,
|
|
178
|
-
avatarFallback: undefined,
|
|
179
|
-
avatar: undefined,
|
|
180
|
-
cardTypes: undefined,
|
|
181
|
-
cardSchemas: undefined,
|
|
182
|
-
}, (props, { dispatch, flag, element, expose }) => {
|
|
183
|
-
const outer = useChatConfig();
|
|
184
|
-
// Do this FIRST, before anything reads `props.role`: it rewrites that prop as a
|
|
185
|
-
// side effect of taking the invalid ARIA role off the host.
|
|
186
|
-
liftRoleOffHost(element);
|
|
187
|
-
const msg = (): ChatMessage =>
|
|
188
|
-
props.message ?? {
|
|
189
|
-
id: 'message',
|
|
190
|
-
role: props.role ?? 'assistant',
|
|
191
|
-
parts: [],
|
|
192
|
-
};
|
|
193
|
-
// `message` is an untyped boundary: a consumer can hand it anything at
|
|
194
|
-
// runtime (a pre-0.20.0 `{ id, role, content }` object, in particular).
|
|
195
|
-
// `parts` is a REQUIRED field, so validate it here rather than let
|
|
196
|
-
// `MessageBody`/`groupMessageParts` throw deep inside a Solid render pass;
|
|
197
|
-
// an uncaught exception there blanks the whole element instead of just this
|
|
198
|
-
// one message. Warn once per bad message (not on every unrelated re-render)
|
|
199
|
-
// and render nothing for it, matching the old pre-parts fallback behavior
|
|
200
|
-
// (an unusable message rendered an empty body, not a crash).
|
|
201
|
-
let lastWarnedMessage: unknown;
|
|
202
|
-
const hasValidParts = (): boolean => {
|
|
203
|
-
const m = msg();
|
|
204
|
-
if (hasParts(m)) return true;
|
|
205
|
-
if (m !== lastWarnedMessage) {
|
|
206
|
-
lastWarnedMessage = m;
|
|
207
|
-
console.error(
|
|
208
|
-
"<kai-message>: 'message' must have a 'parts' array. The 'content' string field was removed in 0.20.0.",
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
return false;
|
|
212
|
-
};
|
|
213
|
-
// Copy + vote state lives here (above the rendered body) so it survives a
|
|
214
|
-
// re-render when the host swaps in a fresh `message` object during streaming.
|
|
215
|
-
const feedback = createMessageFeedback({
|
|
216
|
-
emit: (detail) => dispatch('kai-message-action', detail),
|
|
217
|
-
// No `target`: a STANDALONE <kai-message> must not anchor its copy/feedback
|
|
218
|
-
// toast to the individual message (that lands mid-thread in a compose-your-own
|
|
219
|
-
// list). Let them route to the global region (top of the viewport), which is
|
|
220
|
-
// where a confirmation belongs across a hand-built thread. (Inside <kai-chat>
|
|
221
|
-
// the chat owns feedback and targets ITSELF, so in-chat toasts still stay in-chat.)
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// Imperative method API — `copy()` runs the exact path of the built-in copy
|
|
225
|
-
// action (`feedback.handleAction(msg, 'copy')`): writes the content to the
|
|
226
|
-
// clipboard, shows the transient copied-check on the bar, and emits
|
|
227
|
-
// `kai-message-action{action:'copy'}`.
|
|
228
|
-
expose({
|
|
229
|
-
/** Copy the message content to the clipboard and show the copied check. */
|
|
230
|
-
copy: () => { if (hasValidParts()) feedback.handleAction(msg(), 'copy'); },
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// Read declarative <kai-action> children from light DOM.
|
|
234
|
-
// Shadow DOM with no <slot> suppresses them visually — they're invisible data carriers.
|
|
235
|
-
const [slottedActions, setSlottedActions] = createSignal<import('../elements/chat-types').CustomAction[]>([]);
|
|
236
|
-
// Which composition slots (before-body / after-body / avatar) the consumer filled.
|
|
237
|
-
const [slots, setSlots] = createSignal<Record<string, boolean>>({});
|
|
238
|
-
onMount(() => {
|
|
239
|
-
const read = () => {
|
|
240
|
-
const nodes = [...element.querySelectorAll('kai-action')];
|
|
241
|
-
setSlottedActions(nodes.map(n => ({
|
|
242
|
-
id: n.id || n.getAttribute('action') || '',
|
|
243
|
-
label: n.textContent?.trim() || n.getAttribute('label') || n.id || '',
|
|
244
|
-
icon: n.getAttribute('icon') ?? undefined,
|
|
245
|
-
tooltip: n.getAttribute('tooltip') ?? undefined,
|
|
246
|
-
})));
|
|
247
|
-
setSlots(readSlots(element, MESSAGE_SLOTS));
|
|
248
|
-
};
|
|
249
|
-
read();
|
|
250
|
-
const observer = new MutationObserver(read);
|
|
251
|
-
observer.observe(element, { childList: true, attributes: true, subtree: true });
|
|
252
|
-
onCleanup(() => observer.disconnect());
|
|
253
|
-
});
|
|
254
|
-
// A consumer can set `role` at any point after the element is live
|
|
255
|
-
// (`el.setAttribute('role', 'user')`), which puts the invalid ARIA role back on
|
|
256
|
-
// the host. Keep lifting it off. Scoped to the one attribute so this cannot be
|
|
257
|
-
// mistaken for general attribute handling; no loop, because the write-back is a
|
|
258
|
-
// property and the removal leaves nothing for the next callback to find.
|
|
259
|
-
onMount(() => {
|
|
260
|
-
const roleObserver = new MutationObserver(() => liftRoleOffHost(element));
|
|
261
|
-
roleObserver.observe(element, { attributes: true, attributeFilter: ['role'] });
|
|
262
|
-
onCleanup(() => roleObserver.disconnect());
|
|
263
|
-
});
|
|
264
|
-
const isUser = () => msg().role === 'user';
|
|
265
|
-
const avatar = () =>
|
|
266
|
-
msg().avatar ??
|
|
267
|
-
(props.avatarSrc || props.avatarFallback
|
|
268
|
-
? { src: props.avatarSrc as string | undefined, fallback: props.avatarFallback as string | undefined }
|
|
269
|
-
: undefined);
|
|
270
|
-
// Avatar rail state. `avatar="none"` omits the rail; a filled `slot="avatar"`
|
|
271
|
-
// REPLACES the built-in; otherwise the built-in renders when one resolves.
|
|
272
|
-
const noAvatar = () => props.avatar === 'none';
|
|
273
|
-
const hasAvatarSlot = () => !!slots()['avatar'];
|
|
274
|
-
// The rail shows when not suppressed and there's either a slot or a resolved avatar.
|
|
275
|
-
const showRail = () => !noAvatar() && (hasAvatarSlot() || !!avatar());
|
|
276
|
-
const reveal = () => (props.actionsReveal === 'hover' ? 'hover' : 'always');
|
|
277
|
-
// markdown: explicit prop/attribute wins; otherwise default by role.
|
|
278
|
-
const markdownExplicit = () =>
|
|
279
|
-
element.hasAttribute('markdown') || props.markdown === true || props.markdown === false;
|
|
280
|
-
const useMarkdown = () => (markdownExplicit() ? flag('markdown') : !isUser());
|
|
281
|
-
|
|
282
|
-
const mergedActions = () => [...(msg().actions ?? []), ...slottedActions()];
|
|
283
|
-
const body = () => (
|
|
284
|
-
<MessageBody
|
|
285
|
-
parts={msg().parts}
|
|
286
|
-
cardTypes={cardComponentsFromTags(props.cardTypes, (props as { theme?: string }).theme)}
|
|
287
|
-
cardSchemas={props.cardSchemas}
|
|
288
|
-
/* F-26: card parts emit off THIS element as the bubbling `kai-card` event. */
|
|
289
|
-
cardHostElement={element}
|
|
290
|
-
isUser={isUser()}
|
|
291
|
-
markdown={useMarkdown()}
|
|
292
|
-
actions={mergedActions()}
|
|
293
|
-
actionsReveal={reveal()}
|
|
294
|
-
activeFeedback={feedback.resolveFeedback(msg())}
|
|
295
|
-
copied={feedback.isCopied(msg().id)}
|
|
296
|
-
onAction={(action) => feedback.handleAction(msg(), action)}
|
|
297
|
-
beforeBody={slots()['before-body'] ? <slot name="before-body" /> : undefined}
|
|
298
|
-
afterBody={slots()['after-body'] ? <slot name="after-body" /> : undefined}
|
|
299
|
-
/>
|
|
300
|
-
);
|
|
301
|
-
|
|
302
|
-
// Row carries `group` so a hover-revealed action bar fades in on row hover.
|
|
303
|
-
const rowGroup = () => (reveal() === 'hover' ? 'group ' : '');
|
|
304
|
-
|
|
305
|
-
// The avatar rail: a filled `slot="avatar"` REPLACES the built-in MessageAvatar
|
|
306
|
-
// (the consumer owns that node, wrapped in `part="avatar"` so it's still
|
|
307
|
-
// styleable + consistent with the built-in part name).
|
|
308
|
-
const avatarRail = () => (
|
|
309
|
-
<Show
|
|
310
|
-
when={hasAvatarSlot()}
|
|
311
|
-
fallback={
|
|
312
|
-
<Show when={avatar()}>
|
|
313
|
-
{(av) => <MessageAvatar src={av().src ?? ''} alt={av().alt ?? ''} fallback={av().fallback} />}
|
|
314
|
-
</Show>
|
|
315
|
-
}
|
|
316
|
-
>
|
|
317
|
-
<div part="avatar" class="shrink-0">
|
|
318
|
-
<slot name="avatar" />
|
|
319
|
-
</div>
|
|
320
|
-
</Show>
|
|
321
|
-
);
|
|
322
|
-
|
|
323
|
-
return (
|
|
324
|
-
// No fallback: an invalid `message` (missing `parts`) renders nothing for
|
|
325
|
-
// this element rather than crashing. `hasValidParts()` already logged why.
|
|
326
|
-
<Show when={hasValidParts()}>
|
|
327
|
-
<ChatConfig
|
|
328
|
-
proseSize={props.proseSize}
|
|
329
|
-
codeTheme={props.codeTheme}
|
|
330
|
-
codeHighlight={flag('codeHighlight')}
|
|
331
|
-
portalMount={outer.portalMount()}
|
|
332
|
-
>
|
|
333
|
-
<Show
|
|
334
|
-
when={showRail()}
|
|
335
|
-
fallback={
|
|
336
|
-
// `role` here is `<Message>`'s SPEAKER prop, not an ARIA role: the
|
|
337
|
-
// component turns it into `role="article"` + an `aria-label` naming the
|
|
338
|
-
// speaker, so the row an assistive technology sees has a valid role and
|
|
339
|
-
// a name. This is the same treatment the SolidJS `<Message>` gets when
|
|
340
|
-
// used directly — the facade just always knows its speaker, so unlike
|
|
341
|
-
// the bare component (where `role` is optional and usually omitted) the
|
|
342
|
-
// row is never left unlabelled.
|
|
343
|
-
<Message
|
|
344
|
-
role={msg().role}
|
|
345
|
-
class={`${rowGroup()}${isUser() ? 'flex-col items-end' : 'flex-col items-start'}`}
|
|
346
|
-
>
|
|
347
|
-
{body()}
|
|
348
|
-
</Message>
|
|
349
|
-
}
|
|
350
|
-
>
|
|
351
|
-
<Message role={msg().role} class={rowGroup()}>
|
|
352
|
-
{avatarRail()}
|
|
353
|
-
<div class={`flex min-w-0 flex-1 flex-col ${isUser() ? 'items-end' : 'items-start'}`}>
|
|
354
|
-
{body()}
|
|
355
|
-
</div>
|
|
356
|
-
</Message>
|
|
357
|
-
</Show>
|
|
358
|
-
</ChatConfig>
|
|
359
|
-
</Show>
|
|
360
|
-
);
|
|
361
|
-
});
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { createSignal, onCleanup, onMount } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { ModelSwitcher } from '../components/model-switcher';
|
|
4
|
-
import { wireDisclosure } from './disclosure';
|
|
5
|
-
import type { DropdownController } from '../ui/dropdown';
|
|
6
|
-
import type { ModelOption } from '../types';
|
|
7
|
-
|
|
8
|
-
interface Props extends Record<string, unknown> {
|
|
9
|
-
/** The selectable models. Set as a JS property (array). Omit to supply them as
|
|
10
|
-
* `<kai-model>` light-DOM children instead; when both are present the
|
|
11
|
-
* property's models come first. */
|
|
12
|
-
models?: ModelOption[];
|
|
13
|
-
/** The currently-selected model id. Defaults to the first model. */
|
|
14
|
-
currentModel?: string;
|
|
15
|
-
/** Drive/observe the dropdown's open state (Shoelace-style: settable + reflected
|
|
16
|
-
* to the `open` attribute, the dropdown still self-manages on click/keyboard).
|
|
17
|
-
* Set `el.open = true`, or `<kai-model-switcher open>`; listen for `kai-open-change`. */
|
|
18
|
-
open?: boolean;
|
|
19
|
-
/** Initial open state on mount (uncontrolled seed). */
|
|
20
|
-
defaultOpen?: boolean;
|
|
21
|
-
/** Disable the trigger: click/keyboard and `show()` no longer open the dropdown. */
|
|
22
|
-
disabled?: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Events fired by `<kai-model-switcher>`. */
|
|
26
|
-
interface Events {
|
|
27
|
-
/** A model was selected. */
|
|
28
|
-
'kai-model-change': { modelId: string };
|
|
29
|
-
/** The model dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method). */
|
|
30
|
-
'kai-open-change': { open: boolean };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Parse a single light-DOM `<kai-model>` element into a `ModelOption` descriptor.
|
|
35
|
-
* Attribute mapping:
|
|
36
|
-
* - `id` → ModelOption.id
|
|
37
|
-
* - textContent → ModelOption.name
|
|
38
|
-
* - `provider` → ModelOption.provider (optional)
|
|
39
|
-
* - `description` → ModelOption.description (optional subtitle)
|
|
40
|
-
* - `group` → ModelOption.group (optional collapsible section)
|
|
41
|
-
*/
|
|
42
|
-
export function parseKaiModelElement(n: Element): ModelOption {
|
|
43
|
-
return {
|
|
44
|
-
id: n.getAttribute('id') ?? '',
|
|
45
|
-
name: n.textContent?.trim() ?? '',
|
|
46
|
-
provider: n.getAttribute('provider') ?? undefined,
|
|
47
|
-
description: n.getAttribute('description') ?? undefined,
|
|
48
|
-
group: n.getAttribute('group') ?? undefined,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* `<kai-model-switcher>` — an event-emitting leaf element. Data in via the
|
|
54
|
-
* `models` property, selection out via a `kai-model-change` event. Mirrors the
|
|
55
|
-
* header switcher inside `<kai-chat>` as a standalone, composable piece.
|
|
56
|
-
*
|
|
57
|
-
* Note: like the underlying primitive, this only renders when more than one
|
|
58
|
-
* model is provided.
|
|
59
|
-
*
|
|
60
|
-
* **How to use:**
|
|
61
|
-
*
|
|
62
|
-
* _Property API_ — set `models` as a JS property and listen for `kai-model-change`:
|
|
63
|
-
* ```js
|
|
64
|
-
* el.models = [{ id: 'gpt-4o', name: 'GPT-4o', provider: 'OpenAI' }];
|
|
65
|
-
* el.addEventListener('kai-model-change', (e) => console.log(e.detail.modelId));
|
|
66
|
-
* ```
|
|
67
|
-
*
|
|
68
|
-
* _Declarative child API_ — compose `<kai-model>` light-DOM children (no JS needed):
|
|
69
|
-
* ```html
|
|
70
|
-
* <kai-model-switcher>
|
|
71
|
-
* <kai-model id="gpt-4o" provider="OpenAI">GPT-4o</kai-model>
|
|
72
|
-
* <kai-model id="gpt-4o-mini" provider="OpenAI">GPT-4o mini</kai-model>
|
|
73
|
-
* </kai-model-switcher>
|
|
74
|
-
* ```
|
|
75
|
-
* Each `<kai-model>` child carries `id` (required), `provider` (optional), and
|
|
76
|
-
* a text label as its `textContent`. Children are light-DOM data carriers hidden
|
|
77
|
-
* by Shadow DOM. Prop `models` items render first; declarative children follow.
|
|
78
|
-
*/
|
|
79
|
-
defineWebComponent<Props, Events>('kai-model-switcher', {
|
|
80
|
-
models: [],
|
|
81
|
-
currentModel: undefined,
|
|
82
|
-
open: undefined,
|
|
83
|
-
defaultOpen: undefined,
|
|
84
|
-
disabled: undefined,
|
|
85
|
-
}, (props, ctx) => {
|
|
86
|
-
const { dispatch, element, flag } = ctx;
|
|
87
|
-
let api: DropdownController | undefined;
|
|
88
|
-
|
|
89
|
-
// The standard overlay surface: settable+reflecting `open`, kai-open-change,
|
|
90
|
-
// show/hide/toggle, disabled-gating. See ./disclosure. When <=1 model the inner
|
|
91
|
-
// Dropdown never mounts, so `api` stays undefined and these methods no-op.
|
|
92
|
-
wireDisclosure(ctx, () => api, () => props.open);
|
|
93
|
-
|
|
94
|
-
// Read declarative <kai-model> children from light DOM.
|
|
95
|
-
// Shadow DOM with no <slot> suppresses them visually — they're invisible data carriers.
|
|
96
|
-
const [slottedModels, setSlottedModels] = createSignal<ModelOption[]>([]);
|
|
97
|
-
onMount(() => {
|
|
98
|
-
const read = () => {
|
|
99
|
-
const nodes = [...element.querySelectorAll('kai-model')];
|
|
100
|
-
setSlottedModels(nodes.map(parseKaiModelElement));
|
|
101
|
-
};
|
|
102
|
-
read();
|
|
103
|
-
const observer = new MutationObserver(read);
|
|
104
|
-
observer.observe(element, { childList: true, attributes: true, subtree: true });
|
|
105
|
-
onCleanup(() => observer.disconnect());
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// Merge prop models (first) with declarative children (after).
|
|
109
|
-
const allModels = () => [...(props.models ?? []), ...slottedModels()];
|
|
110
|
-
|
|
111
|
-
return (
|
|
112
|
-
<ModelSwitcher
|
|
113
|
-
models={allModels()}
|
|
114
|
-
currentModelId={props.currentModel ?? allModels()[0]?.id ?? ''}
|
|
115
|
-
onModelChange={(modelId) => dispatch('kai-model-change', { modelId })}
|
|
116
|
-
defaultOpen={flag('defaultOpen')}
|
|
117
|
-
disabled={flag('disabled')}
|
|
118
|
-
controllerRef={(a) => (api = a)}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
});
|
package/src/elements/nav.tsx
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { createSignal } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { Nav, type KaiNavItem } from '../ui/nav';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** The nav items. Set as a JS property (array, not an attribute). Each item may
|
|
7
|
-
* carry `children` (a collapsible group), a `status` dot, and trailing `meta`
|
|
8
|
-
* text. */
|
|
9
|
-
items?: KaiNavItem[];
|
|
10
|
-
/** Active item id (controlled). */
|
|
11
|
-
value?: string;
|
|
12
|
-
/** Initial active id when uncontrolled. */
|
|
13
|
-
defaultValue?: string;
|
|
14
|
-
/** Ids of group items collapsed on first render (groups default to expanded).
|
|
15
|
-
* Set as a JS property (array). */
|
|
16
|
-
defaultCollapsed?: string[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface Events {
|
|
20
|
-
/** A nav item was activated. */
|
|
21
|
-
'kai-nav-select': { id: string };
|
|
22
|
-
/** A row's trailing `action` button was activated (not a select). `value` is
|
|
23
|
-
* the item id; `action` echoes the item's `{ icon, label }`. */
|
|
24
|
-
'kai-nav-item-action': { value: string; action?: { icon: string; label: string } };
|
|
25
|
-
/** A `closable` row's trailing close button was activated (not a select).
|
|
26
|
-
* `value` is the item id. */
|
|
27
|
-
'kai-nav-item-close': { value: string };
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* `<kai-nav>` — a vertical navigation list driven by a JSON `items` tree
|
|
32
|
-
* (id + label + optional leading `icon`, a trailing text `badge`, a trailing
|
|
33
|
-
* icon). Items may nest via `children` (a collapsible group with a disclosure
|
|
34
|
-
* chevron), carry a `status` dot (`{ tone, label?, pulse? }`), and a trailing
|
|
35
|
-
* `meta` string (e.g. a relative time). The active item is `value`; selecting a
|
|
36
|
-
* leaf fires `kai-nav-select` (group rows toggle expand/collapse instead).
|
|
37
|
-
*
|
|
38
|
-
* Items may also carry an `action` (`{ icon, label }`) or `closable: true`, which
|
|
39
|
-
* render a trailing button — firing `kai-nav-item-action` `{ value, action }` or
|
|
40
|
-
* `kai-nav-item-close` `{ value }` (never `kai-nav-select`). Style it via
|
|
41
|
-
* `::part(item-action)`.
|
|
42
|
-
*
|
|
43
|
-
* ```html
|
|
44
|
-
* <kai-nav default-value="home"></kai-nav>
|
|
45
|
-
* <script type="module">
|
|
46
|
-
* const nav = document.querySelector('kai-nav');
|
|
47
|
-
* nav.items = [
|
|
48
|
-
* { id: 'home', label: 'New task', icon: 'plus', trailing: 'pencil' },
|
|
49
|
-
* { id: 'acme', label: 'Acme', icon: 'folder', children: [
|
|
50
|
-
* { id: 't1', label: 'Refactor auth', status: { tone: 'info', label: 'Working', pulse: true }, meta: '2m' },
|
|
51
|
-
* { id: 't2', label: 'Landing page', status: { tone: 'success', label: 'Done' }, meta: '1d' },
|
|
52
|
-
* ] },
|
|
53
|
-
* { id: 'dispatch', label: 'Dispatch', icon: 'share', badge: 'Beta' },
|
|
54
|
-
* ];
|
|
55
|
-
* nav.addEventListener('kai-nav-select', (e) => console.log(e.detail.id));
|
|
56
|
-
* </script>
|
|
57
|
-
* ```
|
|
58
|
-
* Restyle via `::part(nav)` / `::part(item)` (active items carry `aria-current`),
|
|
59
|
-
* plus `::part(group)` / `::part(chevron)` / `::part(status)` / `::part(meta)`.
|
|
60
|
-
*/
|
|
61
|
-
defineWebComponent<Props, Events>('kai-nav', {
|
|
62
|
-
items: undefined,
|
|
63
|
-
value: undefined,
|
|
64
|
-
defaultValue: undefined,
|
|
65
|
-
defaultCollapsed: undefined,
|
|
66
|
-
}, (props, { dispatch, expose }) => {
|
|
67
|
-
const [internal, setInternal] = createSignal(props.defaultValue as string | undefined);
|
|
68
|
-
const value = () => (props.value as string | undefined) ?? internal();
|
|
69
|
-
const select = (id: string) => { setInternal(id); dispatch('kai-nav-select', { id }); };
|
|
70
|
-
|
|
71
|
-
expose({
|
|
72
|
-
/** Activate an item by id (fires kai-nav-select). */
|
|
73
|
-
select: (id: string) => select(id),
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
return (
|
|
77
|
-
<Nav
|
|
78
|
-
items={props.items as KaiNavItem[] | undefined}
|
|
79
|
-
value={value()}
|
|
80
|
-
defaultCollapsed={props.defaultCollapsed as string[] | undefined}
|
|
81
|
-
onItemSelect={select}
|
|
82
|
-
onItemAction={(id, action) => dispatch('kai-nav-item-action', { value: id, action })}
|
|
83
|
-
onItemClose={(id) => dispatch('kai-nav-item-close', { value: id })}
|
|
84
|
-
part="nav"
|
|
85
|
-
/>
|
|
86
|
-
);
|
|
87
|
-
});
|
package/src/elements/notice.tsx
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { Notice, noticeIconNode } from '../ui/notice';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
|
|
4
|
-
interface Props extends Record<string, unknown> {
|
|
5
|
-
/** `neutral` (default) · `info` · `warning` · `error` · `success`. Drives the
|
|
6
|
-
* leading icon's color and the a11y role (`alert` for errors, else `status`). */
|
|
7
|
-
severity?: 'neutral' | 'info' | 'warning' | 'error' | 'success';
|
|
8
|
-
/** Leading icon: omit for the severity default, `"none"` to hide it, or a named
|
|
9
|
-
* icon to override. */
|
|
10
|
-
icon?: string;
|
|
11
|
-
/** Show a dismiss (×) that hides the notice and emits `kai-dismiss`. */
|
|
12
|
-
dismissible?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/** Events fired by `<kai-notice>`. */
|
|
16
|
-
interface Events {
|
|
17
|
-
/** The notice was dismissed via its × (it also hides itself). */
|
|
18
|
-
'kai-dismiss': void;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* `<kai-notice>` — a self-contained inline notice / alert. Put the message as
|
|
23
|
-
* light-DOM text and an optional `slot="action"` (e.g. a link); it carries the
|
|
24
|
-
* severity icon, the right a11y role, and an optional self-dismissing ×.
|
|
25
|
-
*
|
|
26
|
-
* It owns the notice box, not its placement — you position it in your own layout
|
|
27
|
-
* (above a composer, at the top of a panel, …).
|
|
28
|
-
*
|
|
29
|
-
* For a custom leading icon, slot any inline SVG via `slot="icon"` (it wins over
|
|
30
|
-
* the severity/`icon` default — the same escape hatch as `kai-button`).
|
|
31
|
-
*
|
|
32
|
-
* ```html
|
|
33
|
-
* <kai-notice severity="warning" dismissible>
|
|
34
|
-
* Claude Fable 5 is currently unavailable.
|
|
35
|
-
* <a slot="action" href="#">Learn more</a>
|
|
36
|
-
* </kai-notice>
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
defineWebComponent<Props, Events>('kai-notice', {
|
|
40
|
-
severity: 'neutral',
|
|
41
|
-
icon: undefined,
|
|
42
|
-
dismissible: false,
|
|
43
|
-
}, (props, { dispatch, flag }) => (
|
|
44
|
-
<Notice
|
|
45
|
-
severity={props.severity ?? 'neutral'}
|
|
46
|
-
iconSlot={<slot name="icon">{noticeIconNode(props.severity ?? 'neutral', props.icon)}</slot>}
|
|
47
|
-
dismissible={flag('dismissible')}
|
|
48
|
-
onDismiss={() => dispatch('kai-dismiss')}
|
|
49
|
-
action={<slot name="action" />}
|
|
50
|
-
>
|
|
51
|
-
<slot />
|
|
52
|
-
</Notice>
|
|
53
|
-
));
|