@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,164 +0,0 @@
|
|
|
1
|
-
import { createEffect, createSignal, untrack } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { CheckboxGroup } from '../ui/checkbox-group';
|
|
4
|
-
// Public shape of the `options` prop; lives in ./element-data-types so the ROOT
|
|
5
|
-
// entry can re-export it (see that file's header).
|
|
6
|
-
import type { KaiCheckboxOption } from './element-data-types';
|
|
7
|
-
|
|
8
|
-
interface Props extends Record<string, unknown> {
|
|
9
|
-
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute.
|
|
10
|
-
* Rendered in full: the kit never truncates, re-orders or de-duplicates them. */
|
|
11
|
-
options: KaiCheckboxOption[];
|
|
12
|
-
/** The FIRST selected value. Settable and reflected to the `value` attribute, so
|
|
13
|
-
* `:host([value])` and `el.value` see live state, and a seed can be written in
|
|
14
|
-
* markup. Writing it makes that the whole selection; to read or drive the rest,
|
|
15
|
-
* use `el.values`. */
|
|
16
|
-
value?: string;
|
|
17
|
-
/**
|
|
18
|
-
* The shared form-control name every box carries, so `FormData.getAll(name)` reads
|
|
19
|
-
* the whole selection back under one key.
|
|
20
|
-
*
|
|
21
|
-
* NO DEFAULT, unlike `<kai-radio-group>`. A radio set needs a shared `name` for the
|
|
22
|
-
* browser to make it exclusive and arrow-navigable, so one is generated when none is
|
|
23
|
-
* given; checkboxes are independent controls and behave correctly with no name at
|
|
24
|
-
* all. Generating one here would submit the selection under a random key, which is
|
|
25
|
-
* worse than submitting nothing.
|
|
26
|
-
*
|
|
27
|
-
* The element is NOT form-associated (no `ElementInternals`, no `setFormValue()`),
|
|
28
|
-
* the same known gap `<kai-input>` records: the boxes live in a shadow root, so a
|
|
29
|
-
* surrounding `<form>` collects nothing from them whether or not `name` is set. Read
|
|
30
|
-
* `el.values`. The name still lands on every inner input, so it is right the day form
|
|
31
|
-
* association arrives.
|
|
32
|
-
*/
|
|
33
|
-
name?: string;
|
|
34
|
-
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
35
|
-
disabled?: boolean;
|
|
36
|
-
/** Accessible name for the group. */
|
|
37
|
-
label?: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Events fired by `<kai-checkbox-group>`. */
|
|
41
|
-
interface Events {
|
|
42
|
-
/** A row was ticked or unticked. `values` is the whole selection after the change,
|
|
43
|
-
* which is what a multi-select control needs; `value` is the first of them (empty
|
|
44
|
-
* when nothing is selected). Both are always present, so neither shape silently
|
|
45
|
-
* loses the other. This is `<kai-select>`'s detail, deliberately. */
|
|
46
|
-
'kai-change': { value: string; values: string[] };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* `<kai-checkbox-group>` — the kit's "pick any number" control, and
|
|
51
|
-
* `<kai-radio-group>`'s sibling: the same options shape and the same divided row
|
|
52
|
-
* chrome over real `<input type="checkbox">`es, multi-value instead of exclusive. A
|
|
53
|
-
* box per tab stop, Space to toggle and correct announcement are the browser's, not a
|
|
54
|
-
* reimplementation.
|
|
55
|
-
*
|
|
56
|
-
* Feed it `options` (a JS-property array of `{ value, label, description?, disabled? }`),
|
|
57
|
-
* drive and read the selection with the `values` property, and listen for `kai-change`.
|
|
58
|
-
* `value` is the first selected option and is reflected to the `value` attribute.
|
|
59
|
-
*
|
|
60
|
-
* Re-rendering follows the kit's reactivity contract: hand it a NEW array reference,
|
|
61
|
-
* and a new object for any option whose content changed — the rows are a
|
|
62
|
-
* reference-keyed list, so mutating an option in place changes nothing on screen.
|
|
63
|
-
*
|
|
64
|
-
* No validation and no limits: "at least one", "at most three" and anything else that
|
|
65
|
-
* lands in a policy document is the application's rule, not the kit's.
|
|
66
|
-
*
|
|
67
|
-
* ```html
|
|
68
|
-
* <kai-checkbox-group label="Environments" name="env"></kai-checkbox-group>
|
|
69
|
-
* <script type="module">
|
|
70
|
-
* import '@kitn.ai/ui/elements';
|
|
71
|
-
* const group = document.querySelector('kai-checkbox-group');
|
|
72
|
-
* // ARRAY prop — a JS property, never an attribute.
|
|
73
|
-
* group.options = [
|
|
74
|
-
* { value: 'prod', label: 'Production', description: 'Pages the on-call' },
|
|
75
|
-
* { value: 'staging', label: 'Staging' },
|
|
76
|
-
* { value: 'dev', label: 'Development' },
|
|
77
|
-
* ];
|
|
78
|
-
* group.addEventListener('kai-change', (e) => console.log(e.detail.values));
|
|
79
|
-
* group.values = ['prod', 'dev']; // drive it (no kai-change — the host already knows)
|
|
80
|
-
* </script>
|
|
81
|
-
* ```
|
|
82
|
-
*/
|
|
83
|
-
defineWebComponent<Props, Events>('kai-checkbox-group', {
|
|
84
|
-
options: [],
|
|
85
|
-
value: undefined,
|
|
86
|
-
name: undefined,
|
|
87
|
-
disabled: undefined,
|
|
88
|
-
label: undefined,
|
|
89
|
-
}, (props, ctx) => {
|
|
90
|
-
const { element, dispatch, flag, expose } = ctx;
|
|
91
|
-
|
|
92
|
-
// Lift the selection into the facade and drive CheckboxGroup CONTROLLED so the host
|
|
93
|
-
// can read it (`el.values` / `:host([value])`) and set it after mount. Seed from the
|
|
94
|
-
// `value` property/attribute present on mount; nothing is auto-selected, because
|
|
95
|
-
// `options` normally arrives as a property AFTER upgrade (kai-select's structure).
|
|
96
|
-
const seed = (props.value as string | undefined) ?? element.getAttribute('value') ?? '';
|
|
97
|
-
const [values, setValues] = createSignal<string[]>(seed ? [seed] : []);
|
|
98
|
-
const first = () => values()[0] ?? '';
|
|
99
|
-
|
|
100
|
-
// Coerce anything arriving through the `value` setter (a JS assignment, or the
|
|
101
|
-
// attributeChangedCallback write-back the reflect effect below triggers) to a string,
|
|
102
|
-
// falling back to the live attribute when nullish so the write-back equals the signal
|
|
103
|
-
// and the guard absorbs it — no attr⇄prop feedback loop.
|
|
104
|
-
const coerce = (v: unknown): string =>
|
|
105
|
-
v == null ? (element.getAttribute('value') ?? '') : String(v);
|
|
106
|
-
|
|
107
|
-
// Apply a new selection and fire kai-change once (the user-toggle path).
|
|
108
|
-
const apply = (next: string[]) => {
|
|
109
|
-
const prev = untrack(values);
|
|
110
|
-
if (prev.length === next.length && prev.every((v, i) => v === next[i])) return;
|
|
111
|
-
setValues(next);
|
|
112
|
-
dispatch('kai-change', { value: next[0] ?? '', values: next });
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
Object.defineProperty(element, 'value', {
|
|
116
|
-
get: () => first(),
|
|
117
|
-
set: (v: unknown) => {
|
|
118
|
-
const next = coerce(v);
|
|
119
|
-
if (untrack(first) !== next) setValues(next ? [next] : []);
|
|
120
|
-
},
|
|
121
|
-
configurable: true,
|
|
122
|
-
enumerable: true,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// The multi-selection read/write side, spelled exactly as `<kai-select multiple>`
|
|
126
|
-
// spells it. `value` alone cannot represent a checkbox group's selection, and
|
|
127
|
-
// returning only the first ticked box would be a silent drop.
|
|
128
|
-
Object.defineProperty(element, 'values', {
|
|
129
|
-
get: () => values(),
|
|
130
|
-
set: (v: unknown) => setValues(Array.isArray(v) ? v.map(String) : []),
|
|
131
|
-
configurable: true,
|
|
132
|
-
enumerable: true,
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// Reflect the first value → the `[value]` host attribute (for `:host([value])`).
|
|
136
|
-
createEffect(() => {
|
|
137
|
-
const v = first();
|
|
138
|
-
if (v) {
|
|
139
|
-
if (element.getAttribute('value') !== v) element.setAttribute('value', v);
|
|
140
|
-
} else if (element.hasAttribute('value')) {
|
|
141
|
-
element.removeAttribute('value');
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
expose({
|
|
146
|
-
/** Focus the group's first box. Not "the first ticked one", which is
|
|
147
|
-
* `<kai-radio-group>`'s rule: a radio group is ONE tab stop that lands on the
|
|
148
|
-
* selection, while every checkbox here is its own tab stop, so the entry point is
|
|
149
|
-
* simply the top of the list. */
|
|
150
|
-
focus: (options?: FocusOptions) =>
|
|
151
|
-
element.shadowRoot?.querySelector<HTMLInputElement>('input[type="checkbox"]')?.focus(options),
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
return (
|
|
155
|
-
<CheckboxGroup
|
|
156
|
-
options={(props.options ?? []) as KaiCheckboxOption[]}
|
|
157
|
-
value={values()}
|
|
158
|
-
name={props.name as string | undefined}
|
|
159
|
-
disabled={flag('disabled')}
|
|
160
|
-
label={props.label as string | undefined}
|
|
161
|
-
onChange={(next) => apply(next)}
|
|
162
|
-
/>
|
|
163
|
-
);
|
|
164
|
-
});
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { createEffect, createSignal, untrack } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { Checkbox } from '../ui/checkbox';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** Controlled checked state. Settable and reflected to the `checked` attribute.
|
|
7
|
-
* `el.checked = true` (or `<kai-checkbox checked>`) drives it; ticking the box
|
|
8
|
-
* updates it and fires `kai-change`. Read `el.checked` for live state. */
|
|
9
|
-
checked?: boolean;
|
|
10
|
-
/** Initial checked state on mount (uncontrolled seed). Bare attribute
|
|
11
|
-
* (`<kai-checkbox default-checked>`) turns it on. */
|
|
12
|
-
defaultChecked?: boolean;
|
|
13
|
-
/** The mixed state, for a parent box whose children are partly ticked. Visual
|
|
14
|
-
* plus an accessibility hint: the box still reports `checked === false`. */
|
|
15
|
-
indeterminate?: boolean;
|
|
16
|
-
/** Disable interaction. */
|
|
17
|
-
disabled?: boolean;
|
|
18
|
-
/** Set the native `required` attribute, and nothing more. Whether an unticked box
|
|
19
|
-
* is an error is the application's rule, not the kit's. */
|
|
20
|
-
required?: boolean;
|
|
21
|
-
/** Accessible label. The visible text beside the box is the consumer's to render. */
|
|
22
|
-
label?: string;
|
|
23
|
-
/** Form-control name (paired with `value`). */
|
|
24
|
-
name?: string;
|
|
25
|
-
/** Submitted value when checked (paired with `name`). Defaults to `'on'`. */
|
|
26
|
-
value?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Events fired by `<kai-checkbox>`. */
|
|
30
|
-
interface Events {
|
|
31
|
-
/** The box was ticked or unticked. */
|
|
32
|
-
'kai-change': { checked: boolean };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* `<kai-checkbox>` — a checkbox over a real `<input type="checkbox">`. Drive/read
|
|
37
|
-
* its state with the `checked` property (settable + reflected to the `checked`
|
|
38
|
-
* attribute, so `:host([checked])` and `el.checked` see live state); seed the
|
|
39
|
-
* initial state with `default-checked` and read changes from `kai-change`.
|
|
40
|
-
*
|
|
41
|
-
* ```html
|
|
42
|
-
* <label>
|
|
43
|
-
* <kai-checkbox default-checked label="Stream responses"></kai-checkbox>
|
|
44
|
-
* Stream responses
|
|
45
|
-
* </label>
|
|
46
|
-
* <script type="module">
|
|
47
|
-
* import '@kitn.ai/ui/elements';
|
|
48
|
-
* const box = document.querySelector('kai-checkbox');
|
|
49
|
-
* box.addEventListener('kai-change', (e) => console.log(e.detail.checked));
|
|
50
|
-
* box.checked = false; // drive it (no kai-change — the host already knows)
|
|
51
|
-
* box.indeterminate = true;
|
|
52
|
-
* box.toggle(); // flip it (fires kai-change)
|
|
53
|
-
* </script>
|
|
54
|
-
* ```
|
|
55
|
-
*/
|
|
56
|
-
defineWebComponent<Props, Events>('kai-checkbox', {
|
|
57
|
-
checked: undefined,
|
|
58
|
-
defaultChecked: undefined,
|
|
59
|
-
indeterminate: undefined,
|
|
60
|
-
disabled: undefined,
|
|
61
|
-
required: undefined,
|
|
62
|
-
label: undefined,
|
|
63
|
-
name: undefined,
|
|
64
|
-
value: undefined,
|
|
65
|
-
}, (props, ctx) => {
|
|
66
|
-
const { element, dispatch, flag, expose } = ctx;
|
|
67
|
-
|
|
68
|
-
// Lift the on/off state into the facade and drive Checkbox CONTROLLED so the host
|
|
69
|
-
// can read it (`el.checked` / `:host([checked])`) and set it after mount. Seed from
|
|
70
|
-
// `defaultChecked` (or a bare `checked` attribute present on mount). This is
|
|
71
|
-
// kai-switch's structure, deliberately — same contract, same failure modes.
|
|
72
|
-
const [checked, setChecked] = createSignal(flag('defaultChecked') || flag('checked'));
|
|
73
|
-
|
|
74
|
-
// Coerce anything arriving through the `checked` setter (a JS assignment, or the
|
|
75
|
-
// write-back `attributeChangedCallback` fires when the attribute changes) to a
|
|
76
|
-
// boolean, falling back to attribute presence to match `flag`'s semantics. The
|
|
77
|
-
// `undefined` write-back `toggleAttribute` triggers thus resolves to the attribute
|
|
78
|
-
// just written, equals the signal, and is absorbed by the guard below — no attr⇄prop
|
|
79
|
-
// feedback loop.
|
|
80
|
-
const coerce = (v: unknown): boolean =>
|
|
81
|
-
v === true ? true
|
|
82
|
-
: v === false ? false
|
|
83
|
-
: element.hasAttribute('checked') && element.getAttribute('checked') !== 'false';
|
|
84
|
-
|
|
85
|
-
// Apply a new checked state and fire kai-change once (the user path). No-op while
|
|
86
|
-
// disabled.
|
|
87
|
-
const apply = (next: boolean) => {
|
|
88
|
-
if (flag('disabled')) return;
|
|
89
|
-
if (untrack(checked) === next) return;
|
|
90
|
-
setChecked(next);
|
|
91
|
-
dispatch('kai-change', { checked: next });
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
// Reads return LIVE state; host writes drive it WITHOUT firing kai-change — the
|
|
95
|
-
// host already knows what it set. The equality guard kills the reflect write-back.
|
|
96
|
-
Object.defineProperty(element, 'checked', {
|
|
97
|
-
get: () => checked(),
|
|
98
|
-
set: (v: unknown) => { const next = coerce(v); if (untrack(checked) !== next) setChecked(next); },
|
|
99
|
-
configurable: true,
|
|
100
|
-
enumerable: true,
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// Reflect internal checked → the `[checked]` host attribute (for `:host([checked])`).
|
|
104
|
-
createEffect(() => {
|
|
105
|
-
const c = checked();
|
|
106
|
-
if (c !== element.hasAttribute('checked')) element.toggleAttribute('checked', c);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
expose({
|
|
110
|
-
/** Flip the box and fire `kai-change` (no-op while disabled). */
|
|
111
|
-
toggle: () => apply(!untrack(checked)),
|
|
112
|
-
/** Focus the inner input (the host element can't reach it). */
|
|
113
|
-
focus: (options?: FocusOptions) =>
|
|
114
|
-
element.shadowRoot?.querySelector<HTMLInputElement>('input[type="checkbox"]')?.focus(options),
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
return (
|
|
118
|
-
<>
|
|
119
|
-
{/* Base sets `:host{display:block}`; a checkbox flows inline beside its text. */}
|
|
120
|
-
<style>{':host{display:inline-flex}'}</style>
|
|
121
|
-
<Checkbox
|
|
122
|
-
checked={checked()}
|
|
123
|
-
indeterminate={flag('indeterminate')}
|
|
124
|
-
disabled={flag('disabled')}
|
|
125
|
-
required={flag('required')}
|
|
126
|
-
aria-label={props.label as string | undefined}
|
|
127
|
-
aria-checked={flag('indeterminate') ? 'mixed' : undefined}
|
|
128
|
-
name={props.name as string | undefined}
|
|
129
|
-
value={(props.value as string | undefined) ?? 'on'}
|
|
130
|
-
onChange={(e) => apply(e.currentTarget.checked)}
|
|
131
|
-
/>
|
|
132
|
-
</>
|
|
133
|
-
);
|
|
134
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Show } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { Checkpoint, CheckpointIcon, CheckpointTrigger } from '../components/checkpoint';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** Optional text beside the icon. */
|
|
7
|
-
label?: string;
|
|
8
|
-
/** Tooltip on hover. */
|
|
9
|
-
tooltip?: string;
|
|
10
|
-
/** Visual button style. */
|
|
11
|
-
variant?: 'ghost' | 'default' | 'outline';
|
|
12
|
-
/** Button size (use an `icon*` size for an icon-only checkpoint). */
|
|
13
|
-
size?: 'sm' | 'md' | 'lg' | 'icon' | 'icon-sm';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** Events fired by `<kai-checkpoint>`. */
|
|
17
|
-
interface Events {
|
|
18
|
-
/** The checkpoint was clicked. */
|
|
19
|
-
'kai-select': void;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* `<kai-checkpoint>` — a bookmark/checkpoint button (optional tooltip + label).
|
|
24
|
-
* Emits `select`.
|
|
25
|
-
*/
|
|
26
|
-
defineWebComponent<Props, Events>('kai-checkpoint', {
|
|
27
|
-
label: undefined,
|
|
28
|
-
tooltip: undefined,
|
|
29
|
-
variant: 'ghost',
|
|
30
|
-
size: 'sm',
|
|
31
|
-
}, (props, { dispatch }) => (
|
|
32
|
-
<Checkpoint>
|
|
33
|
-
<CheckpointTrigger
|
|
34
|
-
tooltip={props.tooltip}
|
|
35
|
-
// Icon-only (no visible label) needs an accessible name: prefer the
|
|
36
|
-
// tooltip text, else a sensible default. With a visible label, the text
|
|
37
|
-
// is the name — leave aria-label unset so it isn't duplicated.
|
|
38
|
-
aria-label={props.label ? undefined : (props.tooltip ?? 'Checkpoint')}
|
|
39
|
-
variant={props.variant}
|
|
40
|
-
size={props.size}
|
|
41
|
-
onClick={() => dispatch('kai-select')}
|
|
42
|
-
>
|
|
43
|
-
<CheckpointIcon />
|
|
44
|
-
<Show when={props.label}><span class="ml-1.5">{props.label}</span></Show>
|
|
45
|
-
</CheckpointTrigger>
|
|
46
|
-
</Checkpoint>
|
|
47
|
-
));
|
package/src/elements/choice.tsx
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { defineWebComponent } from './define';
|
|
2
|
-
import { ChoiceCard, type ChoiceCardData, type ChoiceController } from '../components/choice-card';
|
|
3
|
-
import type { CardResolution } from '../primitives/card-contract';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** The choice definition (the CardEnvelope.data). Set as a JS PROPERTY:
|
|
7
|
-
* `el.data = { prompt, options:[…], allowOther?, submitLabel? }`. Import
|
|
8
|
-
* `ChoiceCardData` from `@kitn.ai/ui` for the full shape. */
|
|
9
|
-
data?: ChoiceCardData;
|
|
10
|
-
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
11
|
-
cardId?: string;
|
|
12
|
-
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
13
|
-
heading?: string;
|
|
14
|
-
/** Set when the user resolved this card; renders the read-only view. Property:
|
|
15
|
-
* `el.resolution = { kind:'action', action:'…' }`. */
|
|
16
|
-
resolution?: Record<string, unknown>;
|
|
17
|
-
/** Controlled selection: the selected option id. When set, the consumer owns
|
|
18
|
-
* the current pick (RadioGroup `value`). Attribute: `value`. */
|
|
19
|
-
value?: string;
|
|
20
|
-
/** Option id to pre-select on mount (uncontrolled seed). Attribute: `default-value`. */
|
|
21
|
-
defaultValue?: string;
|
|
22
|
-
/** Disable the whole radiogroup + Submit (e.g. while the agent is busy).
|
|
23
|
-
* Attribute: `disabled`. */
|
|
24
|
-
disabled?: boolean;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Events fired by `<kai-choice>`. (The terminal submit/dismiss/reopen flow is
|
|
28
|
-
* emitted via the bubbling `kai-card` contract event — listen for `kai-card`.) */
|
|
29
|
-
interface Events {
|
|
30
|
-
/** The selection changed BEFORE submit (a row click or the `select()` method).
|
|
31
|
-
* Distinct from the terminal `action` verb on the `kai-card` contract event. */
|
|
32
|
-
'kai-value-change': { value: string };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* `<kai-choice>` — a single-select **"pick one of N rich options"** card (set via the
|
|
37
|
-
* `data` property): a prompt + a radiogroup of list rows. Clicking a row **selects** it
|
|
38
|
-
* (no emit, fires `kai-value-change`); the **Submit** button below then emits the Card
|
|
39
|
-
* contract's **`action`** verb up a bubbling **`kai-card`** CustomEvent (`{ kind:'action',
|
|
40
|
-
* cardId, action: option.id, payload? }`) and resolves the card so the same pick can't
|
|
41
|
-
* double-fire. An optional `allowOther` free-text escape appends a selectable "Other…" row
|
|
42
|
-
* that reveals an inline input; the same Submit emits `action:'__other__'` with `{ text }`.
|
|
43
|
-
* Also emits `ready` on mount and `error` for a malformed definition (inline error). Routes
|
|
44
|
-
* through a `CardProvider` when present, else the bubbling `kai-card` event. Isolated in
|
|
45
|
-
* Shadow DOM; theme-aware via the shared tokens.
|
|
46
|
-
*
|
|
47
|
-
* Supports controlled selection (`value`), an uncontrolled seed (`defaultValue`), a
|
|
48
|
-
* group-level `disabled`, and instance methods `focus()`/`select(id)`/`send()`/
|
|
49
|
-
* `dismiss()`/`reopen()`.
|
|
50
|
-
*/
|
|
51
|
-
defineWebComponent<Props, Events>(
|
|
52
|
-
'kai-choice',
|
|
53
|
-
{
|
|
54
|
-
data: undefined,
|
|
55
|
-
cardId: undefined,
|
|
56
|
-
heading: undefined,
|
|
57
|
-
resolution: undefined,
|
|
58
|
-
value: undefined,
|
|
59
|
-
defaultValue: undefined,
|
|
60
|
-
disabled: undefined,
|
|
61
|
-
},
|
|
62
|
-
(props, { element, dispatch, flag, expose }) => {
|
|
63
|
-
// Pattern C: the ChoiceCard owns selection/submit/dismiss state and hands up a
|
|
64
|
-
// controller; the facade captures it and exposes delegating methods. The card's
|
|
65
|
-
// own paths still fire (select → kai-value-change; send → kai-card `action`;
|
|
66
|
-
// dismiss/reopen → kai-card `dismiss`/`reopen`).
|
|
67
|
-
let controller: ChoiceController | undefined;
|
|
68
|
-
expose({
|
|
69
|
-
/** Focus the radiogroup roving tab stop (or the Other input when selected). */
|
|
70
|
-
focus: (options?: FocusOptions) => controller?.focus(options),
|
|
71
|
-
/** Select an option by id locally: no emit, fires kai-value-change (same as a
|
|
72
|
-
* row click). Lets a consumer pre-highlight or drive selection externally. */
|
|
73
|
-
select: (optionId: string) => controller?.select(optionId),
|
|
74
|
-
/** Submit the current selection: emits the `action` verb on kai-card and
|
|
75
|
-
* resolves the card (single-shot). Named `send`, not `submit`, per the shared
|
|
76
|
-
* vocabulary. */
|
|
77
|
-
send: () => controller?.send(),
|
|
78
|
-
/** Trigger the dismiss path: emits `dismiss` on kai-card and optimistically
|
|
79
|
-
* collapses the card to its re-openable stub. */
|
|
80
|
-
dismiss: () => controller?.dismiss(),
|
|
81
|
-
/** Re-open a dismissed card from its stub: emits `reopen` on kai-card. */
|
|
82
|
-
reopen: () => controller?.reopen(),
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<ChoiceCard
|
|
87
|
-
data={props.data}
|
|
88
|
-
cardId={props.cardId ?? (element.id || 'kai-choice')}
|
|
89
|
-
heading={props.heading}
|
|
90
|
-
resolution={props.resolution as CardResolution | undefined}
|
|
91
|
-
value={props.value}
|
|
92
|
-
defaultValue={props.defaultValue}
|
|
93
|
-
disabled={flag('disabled')}
|
|
94
|
-
onValueChange={(value) => dispatch('kai-value-change', { value })}
|
|
95
|
-
controllerRef={(c) => (controller = c)}
|
|
96
|
-
hostElement={element}
|
|
97
|
-
/>
|
|
98
|
-
);
|
|
99
|
-
},
|
|
100
|
-
);
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { defineWebComponent } from './define';
|
|
2
|
-
import { Coachmark, type CoachmarkController } from '../components/coachmark';
|
|
3
|
-
import { wireDisclosure } from './disclosure';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
|
|
7
|
-
* attribute; the element still self-manages). Set `el.open = true`, or
|
|
8
|
-
* `<kai-coachmark open>`; listen for `kai-open-change`. */
|
|
9
|
-
open?: boolean;
|
|
10
|
-
/** Initial open state on mount (uncontrolled seed). */
|
|
11
|
-
defaultOpen?: boolean;
|
|
12
|
-
/** The bold title. Named `headline` because `title` collides with the global
|
|
13
|
-
* `HTMLElement.title` attribute (it throws at registration). */
|
|
14
|
-
headline?: string;
|
|
15
|
-
/** A small badge pill beside the headline (e.g. "New"). */
|
|
16
|
-
badge?: string;
|
|
17
|
-
/** Floating placement relative to the anchor (default `bottom`). */
|
|
18
|
-
placement?: string;
|
|
19
|
-
/** Color tone: `primary` (default, theme accent), `info` (blue), `success`
|
|
20
|
-
* (green), `warning` (amber), or `error` (red), reusing the kit's tool hues. */
|
|
21
|
-
tone?: 'primary' | 'info' | 'success' | 'warning' | 'error';
|
|
22
|
-
/** Render the arrow that points at the anchor (default `true`). Set
|
|
23
|
-
* `arrow="false"` for a plain bubble with no pointer. */
|
|
24
|
-
arrow?: boolean;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Events fired by `<kai-coachmark>`. */
|
|
28
|
-
interface Events {
|
|
29
|
-
/** The × dismiss button was pressed. The consumer records that this hint was
|
|
30
|
-
* seen so it won't show again. */
|
|
31
|
-
'kai-dismiss': Record<string, never>;
|
|
32
|
-
/** The coachmark opened or closed (a method, the ×, or a driven `open`). */
|
|
33
|
-
'kai-open-change': { open: boolean };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* `<kai-coachmark>` — an anchored onboarding hint bubble with an arrow. It WRAPS
|
|
38
|
-
* a trigger (the default slot) and points a primary-colored bubble at it: a small
|
|
39
|
-
* `badge` pill, a bold `headline`, the `content` slot body, and a dismiss ×.
|
|
40
|
-
*
|
|
41
|
-
* ```html
|
|
42
|
-
* <kai-coachmark default-open headline="Cowork has a new home" badge="New">
|
|
43
|
-
* <button>Cowork</button>
|
|
44
|
-
* <span slot="content">Chat with Claude or switch to Cowork from here.</span>
|
|
45
|
-
* </kai-coachmark>
|
|
46
|
-
* <script type="module">
|
|
47
|
-
* document.querySelector('kai-coachmark')
|
|
48
|
-
* .addEventListener('kai-dismiss', () => localStorage.setItem('cowork-hint', 'seen'));
|
|
49
|
-
* </script>
|
|
50
|
-
* ```
|
|
51
|
-
*
|
|
52
|
-
* Open state is the standard disclosure surface: settable+reflecting `open`,
|
|
53
|
-
* `kai-open-change`, and `show()`/`hide()`/`toggle()`; seed with `default-open`.
|
|
54
|
-
* Parts: `bubble` · `arrow` · `badge` · `title` · `dismiss`.
|
|
55
|
-
*/
|
|
56
|
-
defineWebComponent<Props, Events>('kai-coachmark', {
|
|
57
|
-
open: undefined,
|
|
58
|
-
defaultOpen: undefined,
|
|
59
|
-
headline: undefined,
|
|
60
|
-
badge: undefined,
|
|
61
|
-
placement: undefined,
|
|
62
|
-
tone: undefined,
|
|
63
|
-
arrow: true,
|
|
64
|
-
}, (props, ctx) => {
|
|
65
|
-
const { flag, dispatch } = ctx;
|
|
66
|
-
let api: CoachmarkController | undefined;
|
|
67
|
-
|
|
68
|
-
// The standard disclosure surface: settable+reflecting `open`, kai-open-change,
|
|
69
|
-
// show/hide/toggle. See ./disclosure. This is the SOLE emitter of kai-open-change.
|
|
70
|
-
wireDisclosure(ctx, () => api, () => props.open);
|
|
71
|
-
|
|
72
|
-
// headline/badge are scalar string props (NOT slots) — pass through directly so
|
|
73
|
-
// the component's own `Show when={…}` gating drives whether each region renders.
|
|
74
|
-
// The body is the `content` slot; an empty `<slot>` renders nothing.
|
|
75
|
-
return (
|
|
76
|
-
<Coachmark
|
|
77
|
-
defaultOpen={flag('defaultOpen')}
|
|
78
|
-
arrow={flag('arrow')}
|
|
79
|
-
placement={props.placement as never}
|
|
80
|
-
tone={props.tone as 'primary' | 'info' | 'success' | 'warning' | 'error' | undefined}
|
|
81
|
-
headline={props.headline as string | undefined}
|
|
82
|
-
badge={props.badge as string | undefined}
|
|
83
|
-
content={<slot name="content" />}
|
|
84
|
-
controllerRef={(a) => (api = a)}
|
|
85
|
-
onDismiss={() => dispatch('kai-dismiss', {})}
|
|
86
|
-
>
|
|
87
|
-
<slot />
|
|
88
|
-
</Coachmark>
|
|
89
|
-
);
|
|
90
|
-
});
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { defineWebComponent } from './define';
|
|
2
|
-
import { CodeBlock, CodeBlockCode } from '../components/code-block';
|
|
3
|
-
import { ChatConfig, useChatConfig, type ProseSize } from '../primitives/chat-config';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** The source code to render. */
|
|
7
|
-
code: string;
|
|
8
|
-
/** Language grammar (e.g. `js`, `python`). Defaults to `tsx`. */
|
|
9
|
-
language?: string;
|
|
10
|
-
/** Shiki theme name. */
|
|
11
|
-
codeTheme?: string;
|
|
12
|
-
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
13
|
-
codeHighlight?: boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Show the copy button. **Defaults to ON**, because this element is documented
|
|
16
|
-
* as shipping one. Opt out with `copy="false"` or `el.copy = false`.
|
|
17
|
-
*/
|
|
18
|
-
copy?: boolean;
|
|
19
|
-
/** Code text sizing. */
|
|
20
|
-
proseSize?: ProseSize;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* `<kai-code-block>` — one syntax-highlighted code block (with a copy button).
|
|
25
|
-
* Code via the `code` property; `language`/`code-theme` via attributes.
|
|
26
|
-
*
|
|
27
|
-
* The copy button is ON by default and writes the raw `code` property, never the
|
|
28
|
-
* highlighted markup. Turn it off with `copy="false"`. Style it via
|
|
29
|
-
* `kai-code-block::part(copy)`.
|
|
30
|
-
*/
|
|
31
|
-
defineWebComponent<Props>('kai-code-block', {
|
|
32
|
-
code: '',
|
|
33
|
-
language: undefined,
|
|
34
|
-
codeTheme: 'github-dark-dimmed',
|
|
35
|
-
codeHighlight: true,
|
|
36
|
-
copy: true,
|
|
37
|
-
proseSize: 'sm',
|
|
38
|
-
}, (props, { flag }) => {
|
|
39
|
-
const outer = useChatConfig();
|
|
40
|
-
return (
|
|
41
|
-
<ChatConfig
|
|
42
|
-
proseSize={props.proseSize}
|
|
43
|
-
codeTheme={props.codeTheme}
|
|
44
|
-
codeHighlight={flag('codeHighlight')}
|
|
45
|
-
portalMount={outer.portalMount()}
|
|
46
|
-
>
|
|
47
|
-
{/* The ELEMENT opts in; the Solid `CodeBlock` default stays OFF so markdown and
|
|
48
|
-
artifact are untouched. `copyText` is the raw property — the button must
|
|
49
|
-
never copy what Shiki produced. `copy` is NOT reflected, matching
|
|
50
|
-
`codeHighlight` beside it: reflecting a default-ON flag would stamp `copy=""`
|
|
51
|
-
on every instance for no benefit, and the runtime-attribute hazard that
|
|
52
|
-
earned `reflectFlag` elsewhere needs a BARE attribute, which is a no-op on a
|
|
53
|
-
flag that is already on. The meaningful spelling, `copy="false"`, is a real
|
|
54
|
-
prop change and is pinned as one. */}
|
|
55
|
-
<CodeBlock copy={flag('copy')} copyText={props.code}>
|
|
56
|
-
<CodeBlockCode code={props.code} language={props.language} />
|
|
57
|
-
</CodeBlock>
|
|
58
|
-
</ChatConfig>
|
|
59
|
-
);
|
|
60
|
-
});
|