@kitn.ai/ui 0.27.0 → 0.29.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 +10 -2
- package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
- package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.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-CjRU3JgV.js +1 -0
- package/dist/arrow-left-Bnpb1UEW.js +1 -0
- package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
- package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
- package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
- package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
- package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
- package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
- package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
- package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
- package/dist/check-njkVdZu2.js +1 -0
- package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
- package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
- package/dist/chevron-down-B72s6PXR.js +1 -0
- package/dist/chevron-right-BatuHzUm.js +1 -0
- package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
- package/dist/circle-check-B62pODB3.js +1 -0
- package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
- package/dist/circle-zx0ByzY9.js +1 -0
- package/dist/code-block-ClMLKb7C.js +1 -0
- package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
- package/dist/components/chat-thread.d.ts +89 -1
- package/dist/components/conversation-item.d.ts +16 -0
- package/dist/components/conversation-panel.d.ts +29 -0
- package/dist/components/home-panel.d.ts +34 -0
- package/dist/components/widget-tab-bar.d.ts +16 -0
- package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
- package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
- package/dist/construct-cli.es.js +185 -17
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
- package/dist/controllable-CnGpMF6r.js +1 -0
- package/dist/conversation-item-BxwQLaFJ.js +1 -0
- package/dist/conversation-list-BCfGN1JU.js +1 -0
- package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
- package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
- package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
- package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
- package/dist/custom-elements.json +51 -2
- package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
- package/dist/define-By-uL588.js +1 -0
- package/dist/define.js +2 -2
- package/dist/define.server.js +2 -2
- package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
- package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.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 +3 -3
- 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/elements.d.ts +20 -4
- package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
- package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
- package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
- package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
- package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
- package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
- package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
- package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2842 -2703
- package/dist/index.server.js +2820 -2681
- package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
- package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
- package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
- package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
- package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
- package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
- package/dist/mcp.es.js +79 -5
- package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
- package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
- package/dist/message-circle-DruwObfX.js +1 -0
- package/dist/message-square-BG6q6mlm.js +1 -0
- package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
- package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
- package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
- package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
- package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
- package/dist/play-BvKKq3fX.js +1 -0
- package/dist/primitives/conversation-store.d.ts +54 -0
- package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
- package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
- package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
- package/dist/react/index.d.ts +393 -0
- package/dist/react.js +20 -20
- package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
- package/dist/register-impl-B1hLkrI8.js +424 -0
- package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
- package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
- package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
- package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
- package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
- package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
- package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
- package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
- package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
- package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
- package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
- package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
- package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
- package/dist/solid.d.ts +6 -2
- package/dist/solid.js +217 -210
- package/dist/solid.server.js +217 -210
- package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
- package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
- package/dist/store-Ciyk6eZG.js +1 -0
- package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
- package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
- package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
- package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
- package/dist/theme.tokens.css +28 -0
- package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
- package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
- package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
- package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
- package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
- package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/ui/dock.d.ts +29 -0
- package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
- package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
- package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
- package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
- package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
- package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
- package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
- package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
- package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
- package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
- package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
- package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
- package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
- package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
- package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
- package/dist/x-Z5UntkIJ.js +1 -0
- package/frameworks/react/index.tsx +14 -4
- package/llms-full.txt +7 -2
- package/package.json +16 -16
- package/src/elements/element-meta.json +49 -6
- package/theme.css +28 -0
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-Br0qtpsz.js +0 -1
- package/dist/arrow-left-Dj7xgE12.js +0 -1
- package/dist/check-DPeeMUYx.js +0 -1
- package/dist/chevron-down-CHSWk7ZT.js +0 -1
- package/dist/chevron-right-B7l_fMgx.js +0 -1
- package/dist/circle-Bb0yOpqM.js +0 -1
- package/dist/circle-check-BGZpCiz7.js +0 -1
- package/dist/code-block-CUQ5mtv0.js +0 -1
- package/dist/controllable-D43BKmtX.js +0 -1
- package/dist/conversation-list-D4lLU_yS.js +0 -1
- package/dist/define-CGGX-7Vg.js +0 -1
- package/dist/message-circle-Xf8Q-vZp.js +0 -1
- package/dist/message-square-Cxnwgkns.js +0 -1
- package/dist/play-OFIvYXUQ.js +0 -1
- package/dist/register-impl-C7rENvPK.js +0 -424
- package/dist/store-7eoadydQ.js +0 -1
- package/dist/x-C5m1JFgi.js +0 -1
- 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 -131
- package/src/agent-tooling/construct/codegen.ts +0 -1353
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
- 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 -23
- package/src/agent-tooling/construct/schema.ts +0 -371
- 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 -518
- 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 -218
- package/src/components/conversation-list.tsx +0 -429
- 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/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/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 -212
- 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 -185
- package/src/elements/element-types.d.ts +0 -4337
- 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/styles.css +0 -328
- 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 -428
- 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/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 -165
- 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 -53
- 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 -584
- 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,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
|
-
});
|
package/src/elements/command.tsx
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { createEffect, createMemo, createSignal, createUniqueId, on } from 'solid-js';
|
|
2
|
-
import { CommandList, type CommandGroup } from '../ui/command';
|
|
3
|
-
import { defineWebComponent } from './define';
|
|
4
|
-
import type { KaiCommandItem } from './element-data-types';
|
|
5
|
-
|
|
6
|
-
// The item shape lives in ./element-data-types so the ROOT entry can re-export it
|
|
7
|
-
// (a per-element module's shipped .d.ts is `export {};`). Re-exported here so
|
|
8
|
-
// `import type { KaiCommandItem } from './command'` keeps working.
|
|
9
|
-
export type { KaiCommandItem } from './element-data-types';
|
|
10
|
-
|
|
11
|
-
interface Props extends Record<string, unknown> {
|
|
12
|
-
/** Flat list of items. Set as a JS property, not an HTML attribute. */
|
|
13
|
-
items?: KaiCommandItem[];
|
|
14
|
-
/** Placeholder text for the search input. */
|
|
15
|
-
placeholder?: string;
|
|
16
|
-
/** Label shown when no items match the current query. */
|
|
17
|
-
emptyLabel?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface Events {
|
|
21
|
-
/** Fired when the user selects an item (click or Enter). */
|
|
22
|
-
'kai-select': { id: string };
|
|
23
|
-
/** Fired on every keystroke in the search input. */
|
|
24
|
-
'kai-query-change': { value: string };
|
|
25
|
-
/** Fired when the highlighted/active item changes, via Arrow keys or when
|
|
26
|
-
* filtering re-clamps the active row. `id` is the newly active item's id, or
|
|
27
|
-
* `undefined` when no item is active (e.g. the filtered list is empty). Lets a
|
|
28
|
-
* host preview the active item without committing a selection. */
|
|
29
|
-
'kai-active-change': { id: string | undefined };
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* `<kai-command>` — a grouped, filterable command/mention palette.
|
|
34
|
-
*
|
|
35
|
-
* Set the `items` property in JavaScript (array, not attribute), listen for
|
|
36
|
-
* `kai-select` to know which item was picked, and `kai-query-change` to mirror
|
|
37
|
-
* the search query to your own logic (e.g. async server-side filtering).
|
|
38
|
-
*
|
|
39
|
-
* ```html
|
|
40
|
-
* <kai-command placeholder="Search…"></kai-command>
|
|
41
|
-
* <script type="module">
|
|
42
|
-
* import '@kitn.ai/ui/elements';
|
|
43
|
-
* const el = document.querySelector('kai-command');
|
|
44
|
-
* el.items = [
|
|
45
|
-
* { id: 'foo', label: 'Foo', icon: 'search', shortcut: 'Mod+K', group: 'Recent' },
|
|
46
|
-
* ];
|
|
47
|
-
* el.addEventListener('kai-select', (e) => console.log(e.detail.id));
|
|
48
|
-
* </script>
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
defineWebComponent<Props, Events>('kai-command', {
|
|
52
|
-
items: undefined,
|
|
53
|
-
placeholder: undefined,
|
|
54
|
-
emptyLabel: undefined,
|
|
55
|
-
}, (props, { dispatch, element, expose }) => {
|
|
56
|
-
const listboxId = createUniqueId();
|
|
57
|
-
const [query, setQuery] = createSignal('');
|
|
58
|
-
const [activeId, setActiveId] = createSignal<string | undefined>(undefined);
|
|
59
|
-
|
|
60
|
-
/** Items cast to the correct type; defaults to empty array. */
|
|
61
|
-
const allItems = () => (props.items as KaiCommandItem[] | undefined) ?? [];
|
|
62
|
-
|
|
63
|
-
/** Items filtered by the current query (label or description, case-insensitive). */
|
|
64
|
-
const filteredItems = createMemo<KaiCommandItem[]>(() => {
|
|
65
|
-
const q = query().toLowerCase();
|
|
66
|
-
if (!q) return allItems();
|
|
67
|
-
return allItems().filter(
|
|
68
|
-
(item) =>
|
|
69
|
-
item.label.toLowerCase().includes(q) ||
|
|
70
|
-
(item.description?.toLowerCase().includes(q) ?? false),
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
/** Filtered items grouped by `group`, preserving first-appearance order. */
|
|
75
|
-
const groupedItems = createMemo<CommandGroup[]>(() => {
|
|
76
|
-
const groups: CommandGroup[] = [];
|
|
77
|
-
for (const item of filteredItems()) {
|
|
78
|
-
let g = groups.find((x) => x.group === item.group);
|
|
79
|
-
if (!g) {
|
|
80
|
-
g = { group: item.group, items: [] };
|
|
81
|
-
groups.push(g);
|
|
82
|
-
}
|
|
83
|
-
g.items.push({ id: item.id, label: item.label, icon: item.icon, description: item.description, shortcut: item.shortcut });
|
|
84
|
-
}
|
|
85
|
-
return groups;
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
/** Flat ordered array of filtered item ids — used for keyboard navigation. */
|
|
89
|
-
const flatIds = createMemo<string[]>(() => filteredItems().map((item) => item.id));
|
|
90
|
-
|
|
91
|
-
/** Clamp/reset activeId when the filtered list changes. */
|
|
92
|
-
createEffect(() => {
|
|
93
|
-
const ids = flatIds();
|
|
94
|
-
const current = activeId();
|
|
95
|
-
if (!current || !ids.includes(current)) {
|
|
96
|
-
setActiveId(ids[0]);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
/** Mirror the active/highlighted item out as `kai-active-change` whenever it
|
|
101
|
-
* changes (Arrow keys or a filter-driven re-clamp). Skips the initial settle
|
|
102
|
-
* by only firing when the value actually differs from the previous one. */
|
|
103
|
-
createEffect(on(activeId, (id, prev) => {
|
|
104
|
-
if (id !== prev) dispatch('kai-active-change', { id });
|
|
105
|
-
}));
|
|
106
|
-
|
|
107
|
-
function select(id: string) {
|
|
108
|
-
dispatch('kai-select', { id });
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function handleInput(e: Event) {
|
|
112
|
-
const value = (e.currentTarget as HTMLInputElement).value;
|
|
113
|
-
setQuery(value);
|
|
114
|
-
dispatch('kai-query-change', { value });
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function handleKeyDown(e: KeyboardEvent) {
|
|
118
|
-
const ids = flatIds();
|
|
119
|
-
if (!ids.length) return;
|
|
120
|
-
|
|
121
|
-
const current = activeId();
|
|
122
|
-
const idx = current !== undefined ? ids.indexOf(current) : -1;
|
|
123
|
-
|
|
124
|
-
if (e.key === 'ArrowDown') {
|
|
125
|
-
e.preventDefault();
|
|
126
|
-
setActiveId(ids[(idx + 1) % ids.length]);
|
|
127
|
-
} else if (e.key === 'ArrowUp') {
|
|
128
|
-
e.preventDefault();
|
|
129
|
-
setActiveId(ids[(idx - 1 + ids.length) % ids.length]);
|
|
130
|
-
} else if (e.key === 'Enter') {
|
|
131
|
-
e.preventDefault();
|
|
132
|
-
const id = activeId();
|
|
133
|
-
if (id !== undefined) select(id);
|
|
134
|
-
} else if (e.key === 'Escape') {
|
|
135
|
-
e.preventDefault();
|
|
136
|
-
setQuery('');
|
|
137
|
-
dispatch('kai-query-change', { value: '' });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ── Imperative API (instance methods on the host) ──────────────────────────
|
|
142
|
-
// Counterpart to the kai-* events: lets a host make the palette type-ready and
|
|
143
|
-
// reset its query without reaching into the shadow root.
|
|
144
|
-
expose({
|
|
145
|
-
/** Focus the search combobox input inside the shadow root so the palette is
|
|
146
|
-
* type-ready on demand (Shadow-DOM autofocus is unreliable, so hosts call
|
|
147
|
-
* this after opening the palette). */
|
|
148
|
-
focus: (options?: FocusOptions) =>
|
|
149
|
-
element.shadowRoot
|
|
150
|
-
?.querySelector<HTMLInputElement>('input[role="combobox"], input')
|
|
151
|
-
?.focus(options),
|
|
152
|
-
/** Blur the focused search input. */
|
|
153
|
-
blur: () =>
|
|
154
|
-
element.shadowRoot
|
|
155
|
-
?.querySelector<HTMLInputElement>('input[role="combobox"], input')
|
|
156
|
-
?.blur(),
|
|
157
|
-
/** Reset the search query to empty, re-showing all items, and fire
|
|
158
|
-
* `kai-query-change` with `''`. Mirrors the Escape-key behavior. */
|
|
159
|
-
clear: () => {
|
|
160
|
-
setQuery('');
|
|
161
|
-
dispatch('kai-query-change', { value: '' });
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
return (
|
|
166
|
-
<div class="flex flex-col overflow-hidden">
|
|
167
|
-
<div class="border-b border-border px-3 py-2">
|
|
168
|
-
<input
|
|
169
|
-
type="text"
|
|
170
|
-
role="combobox"
|
|
171
|
-
aria-expanded="true"
|
|
172
|
-
aria-haspopup="listbox"
|
|
173
|
-
aria-autocomplete="list"
|
|
174
|
-
aria-controls={listboxId}
|
|
175
|
-
value={query()}
|
|
176
|
-
placeholder={(props.placeholder as string | undefined) ?? 'Search…'}
|
|
177
|
-
// No `focus-visible:outline-none` here. It used to suppress the base
|
|
178
|
-
// focus ring and put nothing in its place, so keyboard users had no
|
|
179
|
-
// indication of where they were in the palette.
|
|
180
|
-
class="w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground"
|
|
181
|
-
onInput={handleInput}
|
|
182
|
-
onKeyDown={handleKeyDown}
|
|
183
|
-
/>
|
|
184
|
-
</div>
|
|
185
|
-
<div class="overflow-y-auto max-h-[320px]">
|
|
186
|
-
<CommandList
|
|
187
|
-
id={listboxId}
|
|
188
|
-
ariaLabel="Results"
|
|
189
|
-
groups={groupedItems()}
|
|
190
|
-
activeId={activeId()}
|
|
191
|
-
onSelect={select}
|
|
192
|
-
emptyLabel={(props.emptyLabel as string | undefined) ?? 'No results'}
|
|
193
|
-
/>
|
|
194
|
-
</div>
|
|
195
|
-
</div>
|
|
196
|
-
);
|
|
197
|
-
});
|