@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
package/src/elements/card.tsx
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { createSignal, onCleanup, onMount } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { Card, type CardAppearance, type CardOrientation } from '../ui/card';
|
|
4
|
-
|
|
5
|
-
interface Props extends Record<string, unknown> {
|
|
6
|
-
/** Surface treatment: `outlined` (default) | `filled` | `plain` | `accent`.
|
|
7
|
-
* Attribute: `appearance`. */
|
|
8
|
-
appearance?: CardAppearance;
|
|
9
|
-
/** `vertical` (default, media on top) | `horizontal` (media at the start) |
|
|
10
|
-
* `responsive` (horizontal when the card's container is wide enough, else vertical,
|
|
11
|
-
* via a container query on the card's own width). Attribute: `orientation`. */
|
|
12
|
-
orientation?: CardOrientation;
|
|
13
|
-
/** The card width below which a `responsive` card collapses to vertical and the
|
|
14
|
-
* footer actions stack. A CSS length; default `28rem`. Attribute: `collapse`. */
|
|
15
|
-
collapse?: string;
|
|
16
|
-
/** Tighter spacing for dense lists. Attribute: `dense`. */
|
|
17
|
-
dense?: boolean;
|
|
18
|
-
/** Show a close (×) that hides the card and emits `kai-dismiss`. Attribute:
|
|
19
|
-
* `dismissible`. Off by default. */
|
|
20
|
-
dismissible?: boolean;
|
|
21
|
-
/** Render the whole card as a link. Attribute: `href`. Wins over `clickable`. */
|
|
22
|
-
href?: string;
|
|
23
|
-
/** `target` for the `href` anchor. Attribute: `target`. */
|
|
24
|
-
target?: string;
|
|
25
|
-
/** `rel` for the `href` anchor. Attribute: `rel`. */
|
|
26
|
-
rel?: string;
|
|
27
|
-
/** Make the whole card a button (`role="button"`, Enter/Space, hover affordance)
|
|
28
|
-
* that emits `kai-card-click`. Attribute: `clickable`. Ignored when `href` is set. */
|
|
29
|
-
clickable?: boolean;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Events fired by `<kai-card>`. */
|
|
33
|
-
interface Events {
|
|
34
|
-
/** The card was dismissed via its × (it also hides itself). */
|
|
35
|
-
'kai-dismiss': void;
|
|
36
|
-
/** A `clickable`/`href` card was activated (click, or Enter/Space). */
|
|
37
|
-
'kai-card-click': void;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** The named slots whose occupancy gates a card region. An empty `<slot>` is
|
|
41
|
-
* always a truthy node, so the facade tracks which are actually filled and only
|
|
42
|
-
* passes those regions to the primitive. */
|
|
43
|
-
const SLOT_NAMES = ['media', 'header', 'header-actions', 'footer', 'footer-actions'] as const;
|
|
44
|
-
type SlotName = (typeof SLOT_NAMES)[number];
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* `<kai-card>` — the kit's presentational card, modeled on the WebAwesome card:
|
|
48
|
-
* ONE element whose flexibility comes from a few structural slots, `appearance`
|
|
49
|
-
* and `orientation` variants, themeable `::part`s, and a single
|
|
50
|
-
* `--kai-card-spacing` knob. The title/description are not slots — they are body
|
|
51
|
-
* (default slot) or `slot="header"` content you mark up yourself.
|
|
52
|
-
*
|
|
53
|
-
* Slots: `media` (full-bleed image/video/illustration), `header` + `header-actions`,
|
|
54
|
-
* the default slot (body), `footer` + `footer-actions`.
|
|
55
|
-
*
|
|
56
|
-
* Behaviors (all OFF by default): `dismissible` (× → `kai-dismiss`), and
|
|
57
|
-
* `href`/`clickable` (whole card a link/button → `kai-card-click`). A
|
|
58
|
-
* clickable/href card must NOT also contain action buttons.
|
|
59
|
-
*
|
|
60
|
-
* ```html
|
|
61
|
-
* <kai-card appearance="filled" dismissible>
|
|
62
|
-
* <div slot="media"><img src="…" alt="…" /></div>
|
|
63
|
-
* <h3 slot="header">2× usage</h3>
|
|
64
|
-
* Do more with a higher session limit.
|
|
65
|
-
* <kai-button slot="footer-actions">Start task</kai-button>
|
|
66
|
-
* </kai-card>
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
defineWebComponent<Props, Events>('kai-card', {
|
|
70
|
-
appearance: 'outlined',
|
|
71
|
-
orientation: 'vertical',
|
|
72
|
-
collapse: '28rem',
|
|
73
|
-
dense: false,
|
|
74
|
-
dismissible: false,
|
|
75
|
-
href: undefined,
|
|
76
|
-
target: undefined,
|
|
77
|
-
rel: undefined,
|
|
78
|
-
clickable: false,
|
|
79
|
-
}, (props, { element, dispatch, flag }) => {
|
|
80
|
-
// Track which named slots are filled, plus whether the default slot (body) has
|
|
81
|
-
// any content. Re-read on child mutations so streamed/late content lights up
|
|
82
|
-
// its region. An unfilled region is never rendered (no stray padding/divider).
|
|
83
|
-
const [filled, setFilled] = createSignal<Record<SlotName, boolean>>({
|
|
84
|
-
'media': false, 'header': false, 'header-actions': false, 'footer': false, 'footer-actions': false,
|
|
85
|
-
});
|
|
86
|
-
const [hasBody, setHasBody] = createSignal(false);
|
|
87
|
-
|
|
88
|
-
onMount(() => {
|
|
89
|
-
const read = () => {
|
|
90
|
-
const next = {} as Record<SlotName, boolean>;
|
|
91
|
-
for (const name of SLOT_NAMES) next[name] = !!element.querySelector(`:scope > [slot="${name}"]`);
|
|
92
|
-
setFilled(next);
|
|
93
|
-
// Body = any direct child without a slot attribute (element, or non-blank text).
|
|
94
|
-
setHasBody(
|
|
95
|
-
Array.from(element.childNodes).some(
|
|
96
|
-
(n) =>
|
|
97
|
-
(n.nodeType === Node.ELEMENT_NODE && !(n as Element).hasAttribute('slot')) ||
|
|
98
|
-
(n.nodeType === Node.TEXT_NODE && (n.textContent ?? '').trim() !== ''),
|
|
99
|
-
),
|
|
100
|
-
);
|
|
101
|
-
};
|
|
102
|
-
read();
|
|
103
|
-
const observer = new MutationObserver(read);
|
|
104
|
-
observer.observe(element, { childList: true, characterData: true, subtree: true });
|
|
105
|
-
onCleanup(() => observer.disconnect());
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const region = (name: SlotName) => (filled()[name] ? <slot name={name} /> : undefined);
|
|
109
|
-
|
|
110
|
-
return (
|
|
111
|
-
<Card
|
|
112
|
-
appearance={props.appearance as CardAppearance}
|
|
113
|
-
orientation={props.orientation as CardOrientation}
|
|
114
|
-
collapse={props.collapse as string}
|
|
115
|
-
dense={flag('dense')}
|
|
116
|
-
dismissible={flag('dismissible')}
|
|
117
|
-
href={props.href}
|
|
118
|
-
target={props.target}
|
|
119
|
-
rel={props.rel}
|
|
120
|
-
clickable={flag('clickable')}
|
|
121
|
-
onDismiss={() => dispatch('kai-dismiss')}
|
|
122
|
-
onCardClick={() => dispatch('kai-card-click')}
|
|
123
|
-
media={region('media')}
|
|
124
|
-
header={region('header')}
|
|
125
|
-
headerActions={region('header-actions')}
|
|
126
|
-
footer={region('footer')}
|
|
127
|
-
footerActions={region('footer-actions')}
|
|
128
|
-
hasBody={hasBody()}
|
|
129
|
-
>
|
|
130
|
-
<slot />
|
|
131
|
-
</Card>
|
|
132
|
-
);
|
|
133
|
-
});
|
package/src/elements/cards.tsx
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
// src/elements/cards.tsx
|
|
2
|
-
// <kai-cards> — the web-component list dispatcher. Renders one child kai-* element per
|
|
3
|
-
// envelope (by type→tag), propagates its theme, and routes children's bubbling
|
|
4
|
-
// `kai-card` events through an optional `policy`. The raw events keep bubbling past
|
|
5
|
-
// <kai-cards> (composed) so document-level listeners still work. Unknown types render
|
|
6
|
-
// the Solid CardFallback inline and emit a contract `error`.
|
|
7
|
-
import { For, Show, createEffect, createMemo, createSignal, on, onCleanup, onMount, type JSX } from 'solid-js';
|
|
8
|
-
import { Dynamic } from 'solid-js/web';
|
|
9
|
-
import { defineWebComponent } from './define';
|
|
10
|
-
import type { CardEnvelope, CardEvent, CardPolicy, CardResolution } from '../primitives/card-contract';
|
|
11
|
-
import { CARD_EVENT_NAME, emitCardEvent, routeCardEvent } from '../primitives/card-routing';
|
|
12
|
-
import { BUILTIN_CARD_TAGS, mergeCardTags } from '../primitives/card-registry';
|
|
13
|
-
import type { JsonSchema } from '../primitives/card-validate';
|
|
14
|
-
import { cardValidationMessage, validateCardData, type CardValidationReport } from '../primitives/card-validate-cards';
|
|
15
|
-
import { hasConsumerSchema } from '../components/card-renderer';
|
|
16
|
-
import { CardFallback } from '../components/card-fallback';
|
|
17
|
-
// Register the built-in child card elements so that importing <kai-cards> is self-contained.
|
|
18
|
-
import './form';
|
|
19
|
-
import './confirm-card';
|
|
20
|
-
import './tasks';
|
|
21
|
-
import './choice';
|
|
22
|
-
import './link-preview';
|
|
23
|
-
import './embed';
|
|
24
|
-
|
|
25
|
-
interface Props extends Record<string, unknown> {
|
|
26
|
-
/** The stream of card envelopes to render. Set as a JS PROPERTY: `el.cards = [...]`. */
|
|
27
|
-
cards?: CardEnvelope[];
|
|
28
|
-
/** Optional type→tag overrides/additions (merged over the built-ins). Property: `el.types`.
|
|
29
|
-
* Typed as a plain string map (not the `CardTagMap` alias) so the generated React
|
|
30
|
-
* wrapper inlines it instead of emitting an unresolved named type. */
|
|
31
|
-
types?: Record<string, string>;
|
|
32
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type. The
|
|
33
|
-
* companion of `types`, which says what DRAWS a card while this says what a
|
|
34
|
-
* VALID one looks like. An OBJECT, so it is a JS property only: `el.schemas = {
|
|
35
|
-
* 'pricing-table': pricingSchema }`, never an attribute.
|
|
36
|
-
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
37
|
-
*
|
|
38
|
-
* Without it the kit validates its own seven built-ins and leaves your own card
|
|
39
|
-
* type, the one your app actually cares about, as the only unchecked thing on
|
|
40
|
-
* screen. A schema here WINS over a built-in of the same name, matching
|
|
41
|
-
* `mergeCardTags`, where your entry is spread over ours.
|
|
42
|
-
*
|
|
43
|
-
* Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
|
|
44
|
-
* deliberately: an imported `.json` schema widens `"type"` to `string`, and an
|
|
45
|
-
* authored one carries `$schema`/`title`/`description`/`additionalProperties`,
|
|
46
|
-
* so the tighter type would reject both of the normal ways to supply one. See
|
|
47
|
-
* `CardSchemaMap` in components/card-renderer.tsx. */
|
|
48
|
-
schemas?: Record<string, object>;
|
|
49
|
-
/** Optional CardPolicy handling child events. Property: `el.policy`. */
|
|
50
|
-
policy?: CardPolicy;
|
|
51
|
-
/** Validate each envelope's `data` against the schema for its type before
|
|
52
|
-
* rendering it, using a built-in's own schema or yours from `schemas`. Default
|
|
53
|
-
* `true`; set `validate-cards="false"` (or `el.validateCards = false`) to opt
|
|
54
|
-
* out. A hard failure (wrong type, a missing required field) renders a
|
|
55
|
-
* diagnostic naming the field instead of the card; a soft failure (bounds)
|
|
56
|
-
* renders the card unchanged. Both emit a contract `error` event. On in
|
|
57
|
-
* production too: a model emitting a bad shape is a production failure mode,
|
|
58
|
-
* so stripping the check there would hide it from exactly the person who needs
|
|
59
|
-
* to see it. */
|
|
60
|
-
validateCards?: boolean;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** Events fired by `<kai-cards>`. */
|
|
64
|
-
interface Events {
|
|
65
|
-
/** A child card transitioned to a resolved/deferred state (an action was chosen, a
|
|
66
|
-
* form/tasks submission landed, or it was dismissed). Re-emitted off the host as
|
|
67
|
-
* a non-bubbling convenience event so a consumer can observe resolution centrally
|
|
68
|
-
* without diffing the cards array. `detail` = `{ cardId, resolution }`. (A
|
|
69
|
-
* `reopen` un-resolves a card and has no `CardResolution`, so it does NOT fire
|
|
70
|
-
* this; observe reopen via the underlying bubbling `kai-card` event.) */
|
|
71
|
-
'kai-card-resolved': { cardId: string; resolution: CardResolution };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Map a terminal/deferred child CardEvent to the CardResolution it produces. Returns
|
|
75
|
-
* `undefined` for events that don't resolve a card (ready/error/etc.) and for
|
|
76
|
-
* `reopen` (which clears resolution → no CardResolution to convey). */
|
|
77
|
-
function resolutionFromEvent(e: CardEvent): CardResolution | undefined {
|
|
78
|
-
switch (e.kind) {
|
|
79
|
-
case 'action':
|
|
80
|
-
return { kind: 'action', action: e.action, payload: e.payload };
|
|
81
|
-
case 'submit':
|
|
82
|
-
return { kind: 'submit', data: e.data };
|
|
83
|
-
case 'dismiss':
|
|
84
|
-
return { kind: 'dismissed' };
|
|
85
|
-
default:
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** A single resolved child: a known kai-* tag (props set imperatively), a diagnostic
|
|
91
|
-
* for data that cannot render, or the unknown-type fallback. */
|
|
92
|
-
function CardSlot(props: {
|
|
93
|
-
envelope: CardEnvelope;
|
|
94
|
-
tag?: string;
|
|
95
|
-
theme: string;
|
|
96
|
-
validate: boolean;
|
|
97
|
-
schemas?: Record<string, object>;
|
|
98
|
-
emit: (e: CardEvent) => void;
|
|
99
|
-
}): JSX.Element {
|
|
100
|
-
let ref: HTMLElement | undefined;
|
|
101
|
-
|
|
102
|
-
// MIRRORS src/remote/provider-runtime.ts:139-147, the same way
|
|
103
|
-
// components/card-renderer.tsx does. The remote (iframe) transport has validated
|
|
104
|
-
// every incoming envelope since the contract landed and this native one did not,
|
|
105
|
-
// so the same bad payload was caught in one transport and rendered silently in the
|
|
106
|
-
// other. Two tiers: `hard` (nothing to render) replaces the card with a diagnostic
|
|
107
|
-
// naming the field, `soft` (bounds) renders the card untouched. Both emit `error`.
|
|
108
|
-
//
|
|
109
|
-
// OUR schema applies only to OUR element: `types` lets a consumer point a built-in
|
|
110
|
-
// card type at their own element (`el.types = { confirm: 'my-confirm-el' }`), and
|
|
111
|
-
// our schema describes our element's data, not theirs.
|
|
112
|
-
//
|
|
113
|
-
// A schema the CONSUMER registered through `el.schemas` runs the other way: they
|
|
114
|
-
// wrote it about their own card, and it is the shape their model was told to
|
|
115
|
-
// emit, so it applies whichever element draws the type. That is what validates a
|
|
116
|
-
// `pricing-table` — nobody's built-in, and until this prop existed the one card in
|
|
117
|
-
// the app that nothing checked. Same rule as components/card-renderer.tsx, which
|
|
118
|
-
// compares component identity where this compares tag identity; `hasConsumerSchema`
|
|
119
|
-
// is shared with it so the gate is spelled once.
|
|
120
|
-
const report = createMemo<CardValidationReport | null>(() => {
|
|
121
|
-
if (!props.validate) return null;
|
|
122
|
-
if (!hasConsumerSchema(props.schemas, props.envelope.type) && props.tag !== BUILTIN_CARD_TAGS[props.envelope.type]) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
// `schemas` is passed even when the gate opened on tag identity, so a consumer
|
|
126
|
-
// schema for a built-in type wins over ours — `schemaFor`'s rule.
|
|
127
|
-
return validateCardData(props.envelope.type, props.envelope.data, props.schemas as Record<string, JsonSchema> | undefined);
|
|
128
|
-
});
|
|
129
|
-
const invalid = () => report()?.tier === 'hard';
|
|
130
|
-
|
|
131
|
-
// Set object/string props as DOM properties on the custom element (reactive).
|
|
132
|
-
createEffect(() => {
|
|
133
|
-
if (!ref) return;
|
|
134
|
-
(ref as unknown as { data: unknown }).data = props.envelope.data;
|
|
135
|
-
(ref as unknown as { cardId: string }).cardId = props.envelope.id;
|
|
136
|
-
if (props.envelope.title != null) (ref as unknown as { heading: string }).heading = props.envelope.title;
|
|
137
|
-
(ref as unknown as { resolution: unknown }).resolution = props.envelope.resolution;
|
|
138
|
-
ref.setAttribute('theme', props.theme);
|
|
139
|
-
// Stable, queryable id so the host's getCard()/resolve() can find this child
|
|
140
|
-
// node without relying on the (private, scalar-only) cardId property reflecting.
|
|
141
|
-
ref.setAttribute('data-card-id', props.envelope.id);
|
|
142
|
-
});
|
|
143
|
-
// Hoist the unknown-type error emit to onMount to avoid side-effect-in-JSX lint issue
|
|
144
|
-
// and to ensure exactly one error fires.
|
|
145
|
-
onMount(() => {
|
|
146
|
-
if (!props.tag) {
|
|
147
|
-
props.emit({ kind: 'error', cardId: props.envelope.id, message: `Unsupported card type: ${props.envelope.type}` });
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
// One `error` per distinct problem, both tiers. Keyed on the message, not on
|
|
151
|
-
// mount: a consumer re-assigning `el.cards` per stream chunk hands this a new
|
|
152
|
-
// envelope object each time, so an identity-triggered emit would fire per chunk.
|
|
153
|
-
let lastEmitted: string | null = null;
|
|
154
|
-
createEffect(() => {
|
|
155
|
-
const r = report();
|
|
156
|
-
if (!props.tag) return; // an unknown TYPE already reported itself in onMount
|
|
157
|
-
if (!r || r.ok) {
|
|
158
|
-
lastEmitted = null;
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
const message = cardValidationMessage(r);
|
|
162
|
-
if (message === lastEmitted) return;
|
|
163
|
-
lastEmitted = message;
|
|
164
|
-
props.emit({ kind: 'error', cardId: props.envelope.id, message });
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
return (
|
|
168
|
-
<Show
|
|
169
|
-
when={props.tag}
|
|
170
|
-
fallback={<CardFallback type={props.envelope.type} cardId={props.envelope.id} />}
|
|
171
|
-
>
|
|
172
|
-
{(tag) => (
|
|
173
|
-
<Show
|
|
174
|
-
when={invalid()}
|
|
175
|
-
// SOFT and valid both take this branch: the card renders as it does today.
|
|
176
|
-
fallback={<Dynamic component={tag()} ref={ref} />}
|
|
177
|
-
>
|
|
178
|
-
<CardFallback type={props.envelope.type} cardId={props.envelope.id} reason={report()!.summary} />
|
|
179
|
-
</Show>
|
|
180
|
-
)}
|
|
181
|
-
</Show>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
defineWebComponent<Props, Events>(
|
|
186
|
-
'kai-cards',
|
|
187
|
-
{ cards: undefined, types: undefined, schemas: undefined, policy: undefined, validateCards: true },
|
|
188
|
-
(props, { element, dispatch, expose }) => {
|
|
189
|
-
// Local working copy of the card list. The `cards` PROP still drives rendering
|
|
190
|
-
// (a new prop array re-seeds this), but holding a settable copy lets the
|
|
191
|
-
// imperative resolve()/dismiss() methods flip one envelope's resolution and
|
|
192
|
-
// re-render the matching child — the imperative twin of a consumer cloning +
|
|
193
|
-
// reassigning the whole cards array. `on(..., { defer: true })` re-seeds only on
|
|
194
|
-
// a genuine prop change (mount uses the createSignal seed below), preserving any
|
|
195
|
-
// pending imperative resolution until the consumer supplies a new prop array.
|
|
196
|
-
const [cards, setCards] = createSignal<CardEnvelope[]>(props.cards ?? []);
|
|
197
|
-
createEffect(on(() => props.cards, (next) => setCards(next ?? []), { defer: true }));
|
|
198
|
-
|
|
199
|
-
// Route children's bubbling kai-card events through the policy. Attached to the host
|
|
200
|
-
// element so composed events from each child's shadow root are caught as they bubble.
|
|
201
|
-
// The handler reads `props.policy` at EVENT time (not mount time) so setting
|
|
202
|
-
// `el.policy` after the element is in the DOM — the standard host pattern — works.
|
|
203
|
-
onMount(() => {
|
|
204
|
-
const handler = (e: Event) => {
|
|
205
|
-
const detail = (e as CustomEvent<CardEvent>).detail;
|
|
206
|
-
routeCardEvent(props.policy ?? {}, detail);
|
|
207
|
-
// Additionally re-emit the non-bubbling convenience event when a child
|
|
208
|
-
// transitions to a resolved/deferred state — alongside (not instead of) the
|
|
209
|
-
// existing policy routing + the raw bubbling kai-card event.
|
|
210
|
-
const resolution = resolutionFromEvent(detail);
|
|
211
|
-
if (resolution) dispatch('kai-card-resolved', { cardId: detail.cardId, resolution });
|
|
212
|
-
};
|
|
213
|
-
element.addEventListener(CARD_EVENT_NAME, handler as EventListener);
|
|
214
|
-
onCleanup(() => element.removeEventListener(CARD_EVENT_NAME, handler as EventListener));
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
// ── Imperative API (instance methods on the host) ──────────────────────────
|
|
218
|
-
// Pattern B: the methods operate on the facade's own working copy + the rendered
|
|
219
|
-
// child DOM nodes. Resolving an envelope sets its `resolution`, which flows down
|
|
220
|
-
// through CardSlot's effect (sets the child's `resolution` prop) so the child
|
|
221
|
-
// re-renders into its chromed read-only view.
|
|
222
|
-
const resolveCard = (cardId: string, resolution: CardResolution) =>
|
|
223
|
-
setCards((list) =>
|
|
224
|
-
list.some((env) => env.id === cardId)
|
|
225
|
-
? list.map((env) => (env.id === cardId ? { ...env, resolution } : env))
|
|
226
|
-
: list,
|
|
227
|
-
);
|
|
228
|
-
expose({
|
|
229
|
-
/** Programmatically resolve a child card by id: set that envelope's
|
|
230
|
-
* `resolution` so the child re-renders into its read-only/resolved view. The
|
|
231
|
-
* imperative twin of the consumer mutating the cards array. No-op for an
|
|
232
|
-
* unknown id. */
|
|
233
|
-
resolve: (cardId: string, resolution: CardResolution) => resolveCard(cardId, resolution),
|
|
234
|
-
/** Collapse a card to its re-openable stub from the host side. Convenience for
|
|
235
|
-
* `resolve(cardId, { kind: 'dismissed' })`. */
|
|
236
|
-
dismiss: (cardId: string) => resolveCard(cardId, { kind: 'dismissed' }),
|
|
237
|
-
/** Return the live child element node for a card id (or null) so consumers can
|
|
238
|
-
* call that card's own methods (focus/expand/…) without a shadow-DOM query. */
|
|
239
|
-
getCard: (cardId: string): HTMLElement | null =>
|
|
240
|
-
element.shadowRoot?.querySelector<HTMLElement>(`[data-card-id="${CSS.escape(cardId)}"]`) ?? null,
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
// Read the facade's REACTIVE `theme` prop, not element.getAttribute (which is
|
|
244
|
-
// not a tracked dependency) — otherwise a theme change on <kai-cards> after the
|
|
245
|
-
// children first render never propagates, leaving each child card stuck on its
|
|
246
|
-
// initial 'auto' (which follows the OS, so cards looked "always dark").
|
|
247
|
-
const theme = () => ((props as { theme?: string }).theme ?? 'auto');
|
|
248
|
-
const tags = () => mergeCardTags(props.types);
|
|
249
|
-
return (
|
|
250
|
-
<div class="flex flex-col gap-3">
|
|
251
|
-
<For each={cards()}>
|
|
252
|
-
{(env) => (
|
|
253
|
-
<CardSlot
|
|
254
|
-
envelope={env}
|
|
255
|
-
tag={tags()[env.type]}
|
|
256
|
-
theme={theme()}
|
|
257
|
-
validate={props.validateCards !== false}
|
|
258
|
-
schemas={props.schemas}
|
|
259
|
-
emit={(e) => emitCardEvent(element, e)}
|
|
260
|
-
/>
|
|
261
|
-
)}
|
|
262
|
-
</For>
|
|
263
|
-
</div>
|
|
264
|
-
);
|
|
265
|
-
},
|
|
266
|
-
);
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { createSignal, onMount, onCleanup } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import {
|
|
4
|
-
ChainOfThoughtAccordion,
|
|
5
|
-
type ChainOfThoughtController,
|
|
6
|
-
type ChainOfThoughtStepData,
|
|
7
|
-
type ChainOfThoughtType,
|
|
8
|
-
} from '../components/chain-of-thought';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* A reasoning step descriptor.
|
|
12
|
-
*
|
|
13
|
-
* `id` is an OPTIONAL stable key. The Accordion's open-set keys (used by `value`,
|
|
14
|
-
* `defaultValue`, the `kai-value-change` payload, and the index→key resolution
|
|
15
|
-
* behind the methods) are `step.id` when present, else `String(index)`. Set `id`
|
|
16
|
-
* if you want to drive/observe a step by a meaningful key rather than position.
|
|
17
|
-
*/
|
|
18
|
-
type Step = ChainOfThoughtStepData;
|
|
19
|
-
|
|
20
|
-
interface Props extends Record<string, unknown> {
|
|
21
|
-
/** The reasoning steps. Set as a JS property. Compound sub-parts collapse to
|
|
22
|
-
* this one data model (Route 1). Each `{ label, content?, id? }`. Omit to
|
|
23
|
-
* supply the steps as `<kai-step>` light-DOM children instead; when both are
|
|
24
|
-
* present the property's steps come first. */
|
|
25
|
-
steps?: Step[];
|
|
26
|
-
/** Open mode: `'multiple'` (default, any number of steps open at once) or
|
|
27
|
-
* `'single'` (at most one open; opening a step closes the others). */
|
|
28
|
-
type?: ChainOfThoughtType;
|
|
29
|
-
/** Controlled open step key(s). When set, it WINS over user interaction (the
|
|
30
|
-
* consumer owns the open set). String in `single` mode, string[] in
|
|
31
|
-
* `multiple` mode. Set as a JS property. */
|
|
32
|
-
value?: string | string[];
|
|
33
|
-
/** Uncontrolled INITIAL open step key(s), seeding which steps render
|
|
34
|
-
* expanded. Ignored once `value` is provided. Set as a JS property. */
|
|
35
|
-
defaultValue?: string | string[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** Events fired by `<kai-chain-of-thought>`. */
|
|
39
|
-
interface Events {
|
|
40
|
-
/** The open set changed, by user click OR an expand()/collapse()/toggle()
|
|
41
|
-
* call. `value` is a string in `single` mode, a string[] in `multiple` mode.
|
|
42
|
-
* (Maps Radix Accordion's onValueChange.) */
|
|
43
|
-
'kai-value-change': { value: string | string[] };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** Parse a single light-DOM `<kai-step>` element into a `Step` descriptor.
|
|
47
|
-
* Attribute mapping:
|
|
48
|
-
* - `label` → Step.label (the always-visible heading)
|
|
49
|
-
* - `step-id` → Step.id (optional stable open-set key)
|
|
50
|
-
* - textContent → Step.content (optional expandable detail)
|
|
51
|
-
*/
|
|
52
|
-
export function parseKaiStepElement(n: Element): Step {
|
|
53
|
-
return {
|
|
54
|
-
label: n.getAttribute('label') ?? '',
|
|
55
|
-
content: n.textContent?.trim() || undefined,
|
|
56
|
-
id: n.getAttribute('step-id') ?? undefined,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* `<kai-chain-of-thought>` — step-by-step reasoning with connectors and
|
|
62
|
-
* per-step collapsible detail. An Accordion: by default every step is
|
|
63
|
-
* independently collapsible (`type="multiple"`, all closed); set
|
|
64
|
-
* `type="single"` for one-open-at-a-time.
|
|
65
|
-
*
|
|
66
|
-
* **Route 1 — JS property:** set the `steps` property to an array of
|
|
67
|
-
* `{ label, content?, id? }` objects.
|
|
68
|
-
*
|
|
69
|
-
* **Route 2 — declarative children:** compose `<kai-step>` child elements in
|
|
70
|
-
* light DOM (hidden by the Shadow DOM — pure data carriers). The `label`
|
|
71
|
-
* attribute becomes the step heading; `textContent` becomes the expandable
|
|
72
|
-
* detail; an optional `step-id` becomes the open-set key. Children are merged
|
|
73
|
-
* after any prop steps.
|
|
74
|
-
*
|
|
75
|
-
* ```html
|
|
76
|
-
* <kai-chain-of-thought>
|
|
77
|
-
* <kai-step label="Understand the request">The user wants composable web components.</kai-step>
|
|
78
|
-
* <kai-step label="Design the API">Route 1: variant + flags; rich data via properties.</kai-step>
|
|
79
|
-
* <kai-step label="Build & verify"></kai-step>
|
|
80
|
-
* </kai-chain-of-thought>
|
|
81
|
-
* ```
|
|
82
|
-
*/
|
|
83
|
-
defineWebComponent<Props, Events>('kai-chain-of-thought', {
|
|
84
|
-
steps: [],
|
|
85
|
-
type: undefined,
|
|
86
|
-
value: undefined,
|
|
87
|
-
defaultValue: undefined,
|
|
88
|
-
}, (props, { element, dispatch, expose }) => {
|
|
89
|
-
// Read declarative <kai-step> children from light DOM.
|
|
90
|
-
// Shadow DOM with no <slot> suppresses them visually — they're invisible data carriers.
|
|
91
|
-
const [slottedSteps, setSlottedSteps] = createSignal<Step[]>([]);
|
|
92
|
-
onMount(() => {
|
|
93
|
-
const read = () => {
|
|
94
|
-
const nodes = [...element.querySelectorAll('kai-step')];
|
|
95
|
-
setSlottedSteps(nodes.map(parseKaiStepElement));
|
|
96
|
-
};
|
|
97
|
-
read();
|
|
98
|
-
const observer = new MutationObserver(read);
|
|
99
|
-
observer.observe(element, { childList: true, attributes: true, subtree: true });
|
|
100
|
-
onCleanup(() => observer.disconnect());
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// Prop steps first; declarative children appended after.
|
|
104
|
-
const allSteps = () => [...(props.steps ?? []), ...slottedSteps()];
|
|
105
|
-
|
|
106
|
-
// ── Imperative API (instance methods on the host) ──────────────────────────
|
|
107
|
-
// Pattern C: the Accordion component owns the open-set; the facade captures its
|
|
108
|
-
// controller and exposes index-based methods. Every setter routes through the
|
|
109
|
-
// component's onValueChange (handleValueChange below) — the single emit point —
|
|
110
|
-
// so user clicks AND method calls both fire kai-value-change. No prop collisions:
|
|
111
|
-
// the only props are steps/type/value/defaultValue.
|
|
112
|
-
let controller: ChainOfThoughtController | undefined;
|
|
113
|
-
expose({
|
|
114
|
-
/** Open one step's detail by index, or ALL steps when called with no arg. In
|
|
115
|
-
* `single` mode opening one step closes the others (expand-all keeps the
|
|
116
|
-
* last). */
|
|
117
|
-
expand: (index?: number) => controller?.expand(index),
|
|
118
|
-
/** Close one step's detail by index, or ALL steps when called with no
|
|
119
|
-
* arg. */
|
|
120
|
-
collapse: (index?: number) => controller?.collapse(index),
|
|
121
|
-
/** Flip one step's open state by index. */
|
|
122
|
-
toggle: (index?: number) => controller?.toggle(index),
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Single emit point for the open set — both user clicks and the methods above
|
|
126
|
-
// flow through the component's onValueChange to here.
|
|
127
|
-
const handleValueChange = (value: string | string[]) => {
|
|
128
|
-
dispatch('kai-value-change', { value });
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
return (
|
|
132
|
-
<ChainOfThoughtAccordion
|
|
133
|
-
steps={allSteps()}
|
|
134
|
-
type={props.type as ChainOfThoughtType | undefined}
|
|
135
|
-
value={props.value as string | string[] | undefined}
|
|
136
|
-
defaultValue={props.defaultValue as string | string[] | undefined}
|
|
137
|
-
onValueChange={handleValueChange}
|
|
138
|
-
controllerRef={(c) => (controller = c)}
|
|
139
|
-
/>
|
|
140
|
-
);
|
|
141
|
-
});
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { defineWebComponent } from './define';
|
|
2
|
-
import { ChatScopePicker } from '../components/chat-scope-picker';
|
|
3
|
-
import { wireDisclosure } from './disclosure';
|
|
4
|
-
import type { DropdownController } from '../ui/dropdown';
|
|
5
|
-
import type { SearchFilters } from '../types';
|
|
6
|
-
|
|
7
|
-
interface Props extends Record<string, unknown> {
|
|
8
|
-
/** Authors to offer as scope filters. Omit to drop the Authors section (for a
|
|
9
|
-
* tag-only picker). Set as a JS property. */
|
|
10
|
-
availableAuthors?: string[];
|
|
11
|
-
/** Tags to offer as scope filters. Omit to drop the Tags section (for an
|
|
12
|
-
* author-only picker). Set as a JS property. */
|
|
13
|
-
availableTags?: string[];
|
|
14
|
-
/** The label shown on the trigger for the active scope. */
|
|
15
|
-
currentLabel?: string;
|
|
16
|
-
/** Drive/observe the dropdown's open state (Shoelace-style: settable + reflected
|
|
17
|
-
* to the `open` attribute, the dropdown still self-manages on click/keyboard).
|
|
18
|
-
* Set `el.open = true`, or `<kai-scope-picker open>`; listen for `kai-open-change`. */
|
|
19
|
-
open?: boolean;
|
|
20
|
-
/** Initial open state on mount (uncontrolled seed). */
|
|
21
|
-
defaultOpen?: boolean;
|
|
22
|
-
/** Disable the trigger: click/keyboard and `show()` no longer open the dropdown. */
|
|
23
|
-
disabled?: boolean;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Events fired by `<kai-scope-picker>`. */
|
|
27
|
-
interface Events {
|
|
28
|
-
/** A scope was chosen (`undefined` filters = "All Content"). */
|
|
29
|
-
'kai-scope-change': { filters: SearchFilters | undefined };
|
|
30
|
-
/** The scope dropdown opened or closed (by click, keyboard, Escape, outside-click, or a method). */
|
|
31
|
-
'kai-open-change': { open: boolean };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* `<kai-scope-picker>` — a dropdown to scope a chat by author or tag.
|
|
36
|
-
* Options via `available-authors`/`available-tags` properties; emits
|
|
37
|
-
* `kai-scope-change`.
|
|
38
|
-
*/
|
|
39
|
-
defineWebComponent<Props, Events>('kai-scope-picker', {
|
|
40
|
-
availableAuthors: [],
|
|
41
|
-
availableTags: [],
|
|
42
|
-
currentLabel: 'All Content',
|
|
43
|
-
open: undefined,
|
|
44
|
-
defaultOpen: undefined,
|
|
45
|
-
disabled: undefined,
|
|
46
|
-
}, (props, ctx) => {
|
|
47
|
-
const { dispatch, flag } = ctx;
|
|
48
|
-
let api: DropdownController | undefined;
|
|
49
|
-
|
|
50
|
-
// The standard overlay surface: settable+reflecting `open`, kai-open-change,
|
|
51
|
-
// show/hide/toggle, disabled-gating. See ./disclosure.
|
|
52
|
-
wireDisclosure(ctx, () => api, () => props.open);
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<ChatScopePicker
|
|
56
|
-
currentLabel={props.currentLabel ?? 'All Content'}
|
|
57
|
-
availableAuthors={props.availableAuthors ?? []}
|
|
58
|
-
availableTags={props.availableTags ?? []}
|
|
59
|
-
onScopeChange={(filters) => dispatch('kai-scope-change', { filters })}
|
|
60
|
-
defaultOpen={flag('defaultOpen')}
|
|
61
|
-
disabled={flag('disabled')}
|
|
62
|
-
controllerRef={(a) => (api = a)}
|
|
63
|
-
/>
|
|
64
|
-
);
|
|
65
|
-
});
|