@kitn.ai/ui 0.25.2 → 0.27.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 +17 -6
- package/bin/mcp.js +16 -3
- package/bin/route.js +23 -0
- package/bin/route.test.js +58 -0
- package/dist/{elements/chunks/Icon-b5A8hlHs.js → Icon-BnFKqqtY.js} +1 -1
- package/dist/action-icons-CBskfBMz.js +1 -0
- package/dist/arrow-down-Br0qtpsz.js +1 -0
- package/dist/arrow-left-Dj7xgE12.js +1 -0
- package/dist/artifact-CvXEm1lS.js +1 -0
- package/dist/assets/dev-5XzXYR21.js +91 -0
- package/dist/attachments-C43ZegEq.js +1 -0
- package/dist/audio-visualizer-B-79y1Tj.js +1 -0
- package/dist/badge-BpUbq8c0.js +1 -0
- package/dist/bash-InADTalH.js +1 -6
- package/dist/bell-sn17Ip9v.js +1 -0
- package/dist/{elements/chunks/button-B9okqG73.js → button-BH6rN0U-.js} +1 -1
- package/dist/card-renderer-Cb1gQmth.js +1 -0
- package/dist/card-routing-DifQgS7n.js +1 -0
- package/dist/check-DPeeMUYx.js +1 -0
- package/dist/checkbox-Dc9Yov_B.js +1 -0
- package/dist/checkbox-group-B1kDLLYk.js +1 -0
- package/dist/chevron-down-CHSWk7ZT.js +1 -0
- package/dist/chevron-right-B7l_fMgx.js +1 -0
- package/dist/choice-card-BT3c1S8g.js +1 -0
- package/dist/circle-Bb0yOpqM.js +1 -0
- package/dist/circle-check-BGZpCiz7.js +1 -0
- package/dist/circle-x-wobWkoSx.js +1 -0
- package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
- package/dist/code-block-CUQ5mtv0.js +1 -0
- package/dist/collapsible-CPJbf6FM.js +1 -0
- package/dist/components/attachment-types.d.ts +53 -1
- package/dist/components/attachments.d.ts +31 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
- package/dist/components/audio-visualizer/index.d.ts +15 -1
- package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
- package/dist/components/card-renderer.d.ts +13 -0
- package/dist/components/card.d.ts +4 -0
- package/dist/components/chat-thread.d.ts +49 -42
- package/dist/components/code-block.d.ts +22 -0
- package/dist/components/conversation-item.d.ts +66 -1
- package/dist/components/conversation-list.d.ts +77 -0
- package/dist/components/form-widgets.d.ts +67 -2
- package/dist/components/form.d.ts +89 -0
- package/dist/components/message.d.ts +29 -0
- package/dist/components/reasoning.d.ts +6 -0
- package/dist/components/scroll-button.d.ts +11 -0
- package/dist/components/thread.d.ts +5 -0
- package/dist/components/toast.d.ts +2 -1
- package/dist/components/tool-types.d.ts +9 -0
- package/dist/components/voice-input.d.ts +8 -0
- package/dist/components/voice-output.d.ts +12 -1
- package/dist/components/workspace-shell.d.ts +87 -0
- package/dist/composer-CjngLzal.js +106 -0
- package/dist/confirm-card-DCx_A4bU.js +1 -0
- package/dist/construct-cli.es.js +1169 -0
- package/dist/context-BY8V-Nlp.js +1 -0
- package/dist/controllable-D43BKmtX.js +1 -0
- package/dist/conversation-list-D4lLU_yS.js +1 -0
- package/dist/copy-B6DO4PqB.js +1 -0
- package/dist/core-AYMC6_lb.js +12 -5874
- package/dist/{create-tween-CUzOlaMS.js → create-tween-BPzaefTp.js} +1 -1
- package/dist/{create-tween-B5Y4Im8G.js → create-tween-CnMHviKB.js} +1 -1
- package/dist/{create-tween-4z1XYLkR.js → create-tween-D1aiGZZh.js} +1 -1
- package/dist/{elements/chunks/create-tween-CUrM6D_o.js → create-tween-DUSQUKpr.js} +2 -2
- package/dist/css-M7EaDHN_.js +1 -6
- package/dist/custom-elements.json +3468 -1927
- package/dist/default-input-CucQEOqH.js +1 -0
- package/dist/define-CGGX-7Vg.js +1 -0
- package/dist/define.d.ts +4 -0
- package/dist/define.js +510 -0
- package/dist/define.server.d.ts +5 -0
- package/dist/define.server.js +506 -0
- package/dist/diagnostics/hook.d.ts +81 -0
- package/dist/diagnostics/index.d.ts +7 -0
- package/dist/diagnostics/report-request.d.ts +61 -0
- package/dist/diagnostics.d.ts +5 -0
- package/dist/diagnostics.js +209 -0
- package/dist/disclosure-CbLtajUQ.js +1 -0
- package/dist/dropdown-BwhViJFd.js +1 -0
- 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/autoloader.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.d.ts +1 -0
- package/dist/elements/checkbox-group.js +1 -0
- package/dist/elements/checkbox.d.ts +1 -0
- package/dist/elements/checkbox.js +1 -0
- 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.d.ts +1 -0
- package/dist/elements/conversation-item.js +1 -0
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/default-input.d.ts +3 -3
- package/dist/elements/define-entry.d.ts +12 -0
- package/dist/elements/define.d.ts +27 -0
- package/dist/elements/diagnostic-events.d.ts +74 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.d.ts +1 -0
- package/dist/elements/dock.js +243 -0
- package/dist/elements/dropdown.d.ts +1 -0
- package/dist/elements/dropdown.js +1 -0
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +37 -0
- package/dist/elements/element-diagnostics.d.ts +81 -0
- 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.d.ts +1 -0
- package/dist/elements/pane-grid.js +1 -0
- 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.d.ts +1 -0
- package/dist/elements/radio-group.js +1 -0
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/register.d.ts +2 -0
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +3 -3
- 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.d.ts +1 -0
- package/dist/elements/select.js +1 -0
- 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.d.ts +1 -0
- package/dist/elements/slider.js +1 -0
- package/dist/elements/slots.d.ts +36 -4
- 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 +589 -167
- package/dist/{elements/chunks/ellipsis-CVxqfsDZ.js → ellipsis-DFr4Vqr3.js} +1 -1
- package/dist/embed-5s_vU4J0.js +1 -0
- package/dist/engine-javascript-vq0WuIJl.js +14 -2516
- package/dist/{elements/chunks/external-link-DG2sRdQL.js → external-link-u9d85ORQ.js} +1 -1
- package/dist/file-text-CX7_x42o.js +1 -0
- package/dist/{elements/chunks/file-tree-yGWNK0Js.js → file-tree-D3kBjXI5.js} +1 -1
- package/dist/folder-V-YdIL8f.js +1 -0
- package/dist/form-BRNUMCN2.js +1 -0
- package/dist/github-dark-dimmed-DUshB20C.js +1 -4
- package/dist/github-light-JYsPkUQd.js +1 -4
- package/dist/hover-card-DaeiYrTA.js +1 -0
- package/dist/html-CPZ3oZQ7.js +1 -10
- package/dist/icon-BpixdZNq.js +1 -0
- package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +8473 -6470
- package/dist/index.server.js +6495 -4958
- package/dist/info-8mFsIjS3.js +1 -0
- package/dist/input-d1Yuu-hz.js +1 -0
- package/dist/javascript-C25yR2R2.js +1 -6
- package/dist/json-DxJze_jm.js +1 -6
- package/dist/kai-provider.es.js +40 -40
- package/dist/kai.es.js +1 -1
- package/dist/kbd-961zMPFB.js +1 -0
- package/dist/link-DlZZBGaR.js +1 -0
- package/dist/{elements/chunks/link-preview-Cf5KOP-i.js → link-preview-DIIbV2Sd.js} +1 -1
- package/dist/loader-YQszHFaW.js +1 -0
- package/dist/{elements/chunks/markdown-DbozyYqa.js → markdown-CVk1MPsj.js} +1 -1
- package/dist/mcp.es.js +3873 -544
- package/dist/message-CwKVEdZg.js +1 -0
- package/dist/message-DS8lzHc1.js +1 -0
- package/dist/message-circle-Xf8Q-vZp.js +1 -0
- package/dist/message-square-Cxnwgkns.js +1 -0
- package/dist/{elements/chunks/minimize-2-SegJ_oku.js → minimize-2-UEZmP2QT.js} +1 -1
- package/dist/{elements/chunks/model-switcher-D7JrFFHp.js → model-switcher-Kk1jEQ5t.js} +1 -1
- package/dist/{elements/chunks/overlay-CV7z2YuX.js → overlay-C1od6LOz.js} +1 -1
- package/dist/panel-right-ryET0yyn.js +1 -0
- package/dist/paperclip-BDNoZFJP.js +1 -0
- package/dist/play-OFIvYXUQ.js +1 -0
- package/dist/primitives/card-data-types.d.ts +49 -0
- package/dist/primitives/card-routing.d.ts +1 -33
- package/dist/primitives/card-validate.d.ts +2 -2
- package/dist/primitives/chat-config.d.ts +29 -2
- package/dist/primitives/field-mask.d.ts +96 -0
- package/dist/primitives/field-semantics.d.ts +36 -0
- package/dist/primitives/input-mask.d.ts +46 -0
- package/dist/primitives/url-scheme-policy.d.ts +34 -0
- package/dist/primitives/use-resize-observer.d.ts +23 -0
- package/dist/primitives/use-speech-recognition.d.ts +8 -0
- package/dist/primitives/use-text-stream.d.ts +5 -0
- package/dist/progress-bar-BvYX0aoy.js +1 -0
- package/dist/prompt-suggestion-BRFu2lcu.js +1 -0
- package/dist/radio-DcL23cNJ.js +1 -0
- package/dist/react/index.d.ts +306 -283
- package/dist/react.js +309 -247
- package/dist/reasoning-Cackq4Rh.js +1 -0
- package/dist/register-impl-C7rENvPK.js +424 -0
- package/dist/{elements/chunks/resizable-Dpzjlvp4.js → resizable-Cp9HUYih.js} +1 -1
- package/dist/rotate-ccw-0DLRDHH5.js +1 -0
- package/dist/rotate-cw-DOB9IGcU.js +1 -0
- package/dist/schemas/form.schema.json +21 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/tool-defs.d.ts +45 -0
- package/dist/schemas.js +398 -305
- package/dist/scroll-area-emVmWP4K.js +1 -0
- package/dist/scroll-button-CeP_gv1x.js +1 -0
- package/dist/select-CWmu00tS.js +1 -0
- package/dist/{elements/chunks/separator-DH2r_ZSZ.js → separator-CE6vly6z.js} +1 -1
- package/dist/{elements/chunks/settings-BFMOd6yB.js → settings-CE-78SvZ.js} +1 -1
- package/dist/{elements/chunks/settings-group-B3VZKIcz.js → settings-group-ZFWNxFQR.js} +1 -1
- package/dist/{elements/chunks/skeleton-N8BuWYmf.js → skeleton-BebdP4mf.js} +1 -1
- package/dist/slider-BAKRYUlz.js +1 -0
- package/dist/slots-DaNjX0rc.js +1 -0
- package/dist/{solid-BMuDmFo_.js → solid-BE5ui6sy.js} +10672 -8116
- package/dist/{solid-CGYNdLRR.js → solid-DFhsce3O.js} +8137 -6056
- package/dist/solid.d.ts +15 -0
- package/dist/solid.js +248 -235
- package/dist/solid.server.js +248 -235
- package/dist/source-B0FlguSx.js +1 -0
- package/dist/star-CBMZvLuN.js +1 -0
- package/dist/state/index.d.ts +5 -1
- package/dist/state/mock.d.ts +32 -2
- package/dist/state/persistence.d.ts +51 -0
- package/dist/state/stream.d.ts +50 -0
- package/dist/state/threads.d.ts +71 -0
- package/dist/state.js +297 -172
- package/dist/store-7eoadydQ.js +1 -0
- package/dist/svelte--5p79yCD.js +1 -15
- package/dist/switch-CViARZCy.js +1 -0
- package/dist/tasks-card-MjCcOhR_.js +1 -0
- package/dist/text-shimmer-DKlwRF2G.js +1 -0
- package/dist/textarea-3ay2Me2-.js +1 -0
- package/dist/theme.tokens.css +82 -13
- package/dist/{elements/chunks/thumbs-up-DQe0hvkZ.js → thumbs-up-DQcu2HMO.js} +1 -1
- package/dist/toast-store-C6yKOhbk.js +1 -0
- package/dist/{elements/chunks/tool-C1YtxwPu.js → tool-BCYNlfKy.js} +1 -1
- package/dist/{elements/chunks/tooltip-BqwnFWhn.js → tooltip-05zI4hjs.js} +1 -1
- package/dist/trash-2-BR1RxGky.js +1 -0
- package/dist/{elements/chunks/triangle-alert-B6or7F5u.js → triangle-alert-DHohDOCy.js} +1 -1
- package/dist/tsx-B8rCNbgL.js +1 -6
- package/dist/types.d.ts +4 -2
- package/dist/typescript-RycA9KXf.js +1 -6
- package/dist/ui/checkbox-group.d.ts +83 -0
- package/dist/ui/checkbox.d.ts +40 -0
- package/dist/ui/dock.d.ts +131 -0
- package/dist/ui/hover-card.d.ts +44 -0
- package/dist/ui/icon.d.ts +3 -0
- package/dist/ui/input.d.ts +48 -2
- package/dist/ui/radio.d.ts +85 -0
- package/dist/ui/select.d.ts +71 -0
- package/dist/ui/slider.d.ts +65 -0
- package/dist/ui/switch.d.ts +9 -2
- package/dist/upload-BbGW6A_u.js +1 -0
- package/dist/url-scheme-policy-DHpoTJwB.js +1 -0
- package/dist/use-card-resolution-CJW4grFa.js +1 -0
- package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-BUOVgPOB.js} +27 -27
- package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CUsUJvFI.js} +28 -28
- package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CW2i4bfr.js} +2 -2
- package/dist/{elements/chunks/variant-aurora-QXTZPyST.js → variant-aurora-xiMPty8f.js} +2 -2
- package/dist/variant-custom-BQtOnmeO.js +1 -0
- package/dist/{variant-custom-BhS9wIpU.js → variant-custom-CAm9L-E5.js} +65 -65
- package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-CAnzzppW.js} +40 -40
- package/dist/variant-custom-D91HjAKz.js +1 -0
- package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-Ca1Ls4_y.js} +21 -21
- package/dist/{variant-wave-CbVsmgwT.js → variant-wave-CxX39DKd.js} +25 -25
- package/dist/{variant-wave-BwzrHD1s.js → variant-wave-DYyzIIZv.js} +2 -2
- package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-uY5crU_K.js} +2 -2
- package/dist/vue-BmIZj4XD.js +1 -33
- package/dist/wire/chunk.d.ts +47 -0
- package/dist/wire/diagnostics.d.ts +575 -0
- package/dist/wire/encode-probe.d.ts +70 -0
- package/dist/wire/encode.d.ts +24 -0
- package/dist/wire/index.d.ts +2 -0
- package/dist/wire/sse.d.ts +10 -2
- package/dist/wire.js +917 -480
- package/dist/x-C5m1JFgi.js +1 -0
- package/frameworks/react/index.tsx +325 -108
- package/llms-full.txt +1354 -82
- package/llms.txt +6 -3
- package/package.json +39 -6
- package/src/agent-tooling/archetypes.ts +41 -9
- package/src/agent-tooling/catalog/README.md +676 -0
- package/src/agent-tooling/catalog/catalog-types.ts +231 -0
- package/src/agent-tooling/catalog/fabrications.ts +96 -0
- package/src/agent-tooling/catalog/invariants.ts +284 -0
- package/src/agent-tooling/catalog/labs-titles.ts +114 -0
- package/src/agent-tooling/catalog/scenarios.ts +87 -0
- package/src/agent-tooling/catalog/surfaces.ts +347 -0
- package/src/agent-tooling/construct/cli-entry.ts +8 -0
- package/src/agent-tooling/construct/cli.ts +131 -0
- package/src/agent-tooling/construct/codegen.ts +1353 -0
- package/src/agent-tooling/construct/construct.v1.schema.json +250 -0
- package/src/agent-tooling/construct/dev.ts +148 -0
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +23 -0
- package/src/agent-tooling/construct/schema.ts +371 -0
- package/src/agent-tooling/integrations/anthropic.ts +7 -1
- package/src/agent-tooling/integrations/cloudflare.ts +43 -2
- package/src/agent-tooling/integrations/langgraph.ts +7 -1
- package/src/agent-tooling/integrations/mastra.ts +7 -1
- package/src/agent-tooling/integrations/mock.ts +92 -17
- package/src/agent-tooling/integrations/ollama.ts +7 -1
- package/src/agent-tooling/integrations/openai.ts +7 -1
- package/src/agent-tooling/integrations/openrouter.ts +7 -1
- package/src/agent-tooling/integrations/pi.ts +56 -1
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
- package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
- package/src/agent-tooling/mcp/manifest.ts +100 -1
- package/src/agent-tooling/mcp/server.ts +63 -6
- package/src/agent-tooling/mcp/tools/construct.ts +130 -0
- package/src/agent-tooling/mcp/tools/debug.ts +126 -4
- package/src/agent-tooling/mcp/tools/reference.ts +542 -5
- package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
- package/src/agent-tooling/mcp/tools/theme.ts +146 -30
- package/src/agent-tooling/mcp/validate-args.ts +141 -0
- package/src/agent-tooling/recipes/composed-thread.ts +714 -0
- package/src/agent-tooling/recipes/index.ts +22 -0
- package/src/agent-tooling/recipes/types.ts +32 -0
- package/src/agent-tooling/registry.ts +24 -7
- package/src/agent-tooling/route-emit.ts +26 -2
- package/src/components/attachment-types.ts +54 -1
- package/src/components/attachments.tsx +169 -22
- package/src/components/audio-visualizer/fit-scale.ts +112 -0
- package/src/components/audio-visualizer/index.tsx +80 -3
- package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
- package/src/components/audio-visualizer/variant-bar.tsx +38 -6
- package/src/components/audio-visualizer/variant-custom.tsx +8 -2
- package/src/components/audio-visualizer/variant-grid.tsx +16 -11
- package/src/components/audio-visualizer/variant-radial.tsx +15 -10
- package/src/components/audio-visualizer/variant-wave.tsx +7 -2
- package/src/components/card-renderer.tsx +39 -8
- package/src/components/card.tsx +10 -2
- package/src/components/chat-container.tsx +4 -1
- package/src/components/chat-scope-picker.tsx +2 -2
- package/src/components/chat-thread.tsx +105 -13
- package/src/components/choice-card.tsx +102 -37
- package/src/components/coachmark.tsx +1 -1
- package/src/components/code-block.tsx +81 -5
- package/src/components/composer.tsx +89 -8
- package/src/components/confirm-card.tsx +20 -4
- package/src/components/conversation-item.tsx +138 -4
- package/src/components/conversation-list.tsx +230 -15
- package/src/components/embed.tsx +4 -0
- package/src/components/empty.tsx +14 -3
- package/src/components/file-tree.tsx +5 -1
- package/src/components/form-widgets.tsx +257 -195
- package/src/components/form.tsx +336 -21
- package/src/components/loader.tsx +12 -5
- package/src/components/message-skills.tsx +1 -1
- package/src/components/message.tsx +142 -12
- package/src/components/prompt-input.tsx +7 -1
- package/src/components/prompt-suggestion.tsx +4 -1
- package/src/components/reasoning.tsx +30 -3
- package/src/components/response-compare.tsx +2 -2
- package/src/components/response-stream.tsx +13 -7
- package/src/components/screen.tsx +5 -0
- package/src/components/scroll-button.tsx +63 -4
- package/src/components/source.tsx +6 -1
- package/src/components/tasks-card.tsx +58 -16
- package/src/components/thread.tsx +10 -1
- package/src/components/toast.tsx +11 -5
- package/src/components/tool-types.ts +9 -0
- package/src/components/voice-input.tsx +35 -3
- package/src/components/voice-output.tsx +46 -6
- package/src/components/workspace-shell.tsx +285 -0
- package/src/diagnostics/hook.ts +352 -0
- package/src/diagnostics/index.ts +82 -0
- package/src/diagnostics/report-request.ts +296 -0
- package/src/elements/attachments.tsx +9 -8
- package/src/elements/audio-visualizer.tsx +48 -4
- package/src/elements/chat-workspace.tsx +159 -287
- package/src/elements/chat.tsx +31 -10
- package/src/elements/checkbox-group.tsx +164 -0
- package/src/elements/checkbox.tsx +134 -0
- package/src/elements/code-block.tsx +19 -1
- package/src/elements/command.tsx +4 -1
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +12 -1
- package/src/elements/conversation-item.tsx +120 -0
- package/src/elements/conversation-list.tsx +60 -11
- package/src/elements/default-input.tsx +5 -5
- package/src/elements/define-entry.ts +12 -0
- package/src/elements/define.tsx +168 -8
- package/src/elements/diagnostic-events.ts +114 -0
- package/src/elements/dialog.tsx +47 -0
- package/src/elements/disclosure.ts +34 -12
- package/src/elements/dock.tsx +215 -0
- package/src/elements/dropdown.tsx +123 -0
- package/src/elements/element-data-types.ts +40 -0
- package/src/elements/element-diagnostics.ts +392 -0
- package/src/elements/element-manifest.json +36 -0
- package/src/elements/element-meta.json +1483 -560
- package/src/elements/element-nonscalar.json +185 -0
- package/src/elements/element-types.d.ts +589 -167
- package/src/elements/feedback-bar.tsx +5 -0
- package/src/elements/icon-names.json +29 -0
- package/src/elements/input.tsx +312 -23
- package/src/elements/menu.tsx +13 -0
- package/src/elements/message.tsx +2 -0
- package/src/elements/pane-grid.tsx +111 -0
- package/src/elements/prompt-dock.tsx +2 -1
- package/src/elements/prompt-input.tsx +16 -10
- package/src/elements/radio-group.tsx +129 -0
- package/src/elements/register-impl.ts +52 -0
- package/src/elements/register.ts +28 -0
- package/src/elements/resizable.tsx +52 -25
- package/src/elements/scroll-button.tsx +59 -6
- package/src/elements/select.tsx +165 -0
- package/src/elements/slider.tsx +171 -0
- package/src/elements/slots.ts +108 -13
- package/src/elements/styles.css +119 -9
- package/src/elements/thinking-bar.tsx +16 -7
- package/src/elements/thread.tsx +2 -0
- package/src/elements/toast.tsx +17 -1
- package/src/elements/tool.tsx +26 -5
- package/src/elements/voice-input.tsx +11 -2
- package/src/elements/voice-output.tsx +16 -3
- package/src/index.ts +4 -1
- package/src/primitives/card-data-types.ts +49 -0
- package/src/primitives/card-host.tsx +4 -2
- package/src/primitives/card-routing.ts +7 -56
- package/src/primitives/card-schemas/form.schema.json +21 -1
- package/src/primitives/card-validate.ts +10 -2
- package/src/primitives/chat-config.tsx +33 -6
- package/src/primitives/field-mask.ts +256 -0
- package/src/primitives/field-semantics.ts +115 -0
- package/src/primitives/input-mask.ts +853 -0
- package/src/primitives/toast-store.ts +66 -4
- package/src/primitives/url-scheme-policy.ts +70 -0
- package/src/primitives/use-resize-observer.ts +33 -0
- package/src/primitives/use-speech-recognition.ts +12 -1
- package/src/primitives/use-stick-to-bottom.ts +34 -2
- package/src/primitives/use-text-stream.ts +33 -2
- package/src/remote/provider-runtime.ts +6 -3
- package/src/schemas/index.ts +1 -0
- package/src/schemas/tool-defs.ts +307 -6
- package/src/solid.ts +15 -0
- package/src/state/index.ts +13 -1
- package/src/state/mock.ts +92 -6
- package/src/state/persistence.ts +180 -0
- package/src/state/stream.ts +71 -4
- package/src/state/threads.ts +142 -0
- package/src/types.ts +4 -2
- package/src/ui/agent-card.tsx +2 -2
- package/src/ui/avatar.tsx +1 -1
- package/src/ui/checkbox-group.tsx +153 -0
- package/src/ui/checkbox.tsx +63 -0
- package/src/ui/dialog.tsx +6 -0
- package/src/ui/dock.tsx +584 -0
- package/src/ui/dropdown.tsx +67 -23
- package/src/ui/hover-card.tsx +156 -6
- package/src/ui/icon.tsx +53 -0
- package/src/ui/input.tsx +275 -16
- package/src/ui/kbd.tsx +1 -1
- package/src/ui/nav.tsx +1 -1
- package/src/ui/pane-group.tsx +2 -2
- package/src/ui/radio.tsx +150 -0
- package/src/ui/resizable.tsx +11 -0
- package/src/ui/select.tsx +168 -0
- package/src/ui/slider.tsx +178 -0
- package/src/ui/switch.tsx +49 -18
- package/src/utils/cn.ts +11 -5
- package/src/wire/chunk.ts +47 -0
- package/src/wire/consume.ts +185 -26
- package/src/wire/diagnostics.ts +727 -0
- package/src/wire/encode-probe.ts +214 -0
- package/src/wire/encode.ts +267 -14
- package/src/wire/formats/anthropic.ts +8 -1
- package/src/wire/formats/openai.ts +5 -0
- package/src/wire/index.ts +22 -0
- package/src/wire/read.ts +250 -6
- package/src/wire/sse.ts +16 -3
- package/theme.css +84 -13
- package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
- package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
- package/dist/elements/chunks/artifact-BSuPYFHY.js +0 -1
- package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
- package/dist/elements/chunks/badge-TIMiJFKc.js +0 -1
- package/dist/elements/chunks/bash-InADTalH.js +0 -1
- package/dist/elements/chunks/card-renderer-CSoTL_e1.js +0 -1
- package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
- package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
- package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
- package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
- package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
- package/dist/elements/chunks/choice-card-CGMc3kek.js +0 -1
- package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
- package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
- package/dist/elements/chunks/circle-x-mhH7pOK2.js +0 -1
- package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
- package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
- package/dist/elements/chunks/composer-CZZmtYOT.js +0 -69
- package/dist/elements/chunks/confirm-card-BWjf2-xo.js +0 -1
- package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
- package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
- package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
- package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
- package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
- package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
- package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
- package/dist/elements/chunks/download-DnCyWFJE.js +0 -1
- package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
- package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
- package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
- package/dist/elements/chunks/file-text-D0J9F6M7.js +0 -1
- package/dist/elements/chunks/folder-NV1pi_ud.js +0 -1
- package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
- package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
- package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
- package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
- package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
- package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
- package/dist/elements/chunks/info-C8r5Q6cc.js +0 -1
- package/dist/elements/chunks/input-DrseEjhp.js +0 -1
- package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
- package/dist/elements/chunks/json-DxJze_jm.js +0 -1
- package/dist/elements/chunks/kbd-OGJDUT-O.js +0 -1
- package/dist/elements/chunks/link-BdsfLB7b.js +0 -1
- package/dist/elements/chunks/loader-B5QzK_8_.js +0 -1
- package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
- package/dist/elements/chunks/message-DtXKPqiR.js +0 -1
- package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
- package/dist/elements/chunks/paperclip-Bg0ITU3b.js +0 -1
- package/dist/elements/chunks/progress-bar-D1_rzt6N.js +0 -1
- package/dist/elements/chunks/prompt-suggestion-D5Sm8xF1.js +0 -1
- package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
- package/dist/elements/chunks/rotate-cw-DzVDJOA1.js +0 -1
- package/dist/elements/chunks/scroll-area-93A1bbeG.js +0 -1
- package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
- package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
- package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
- package/dist/elements/chunks/source-w9V0NnBn.js +0 -1
- package/dist/elements/chunks/star-DHvACxtm.js +0 -1
- package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
- package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
- package/dist/elements/chunks/tasks-card-lPxoodlA.js +0 -1
- package/dist/elements/chunks/text-shimmer-BY_rI3s5.js +0 -1
- package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
- package/dist/elements/chunks/toast-store-VUZZBhzH.js +0 -1
- package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
- package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
- package/dist/elements/chunks/use-card-resolution-DJg32jGH.js +0 -1
- package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
- package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
- package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
- package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
- package/dist/llms/llms-full.txt +0 -2834
- package/dist/llms/llms.txt +0 -156
- package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
- package/dist/register-impl-DGmGzrEM.js +0 -145
- package/dist/ui/stat.d.ts +0 -16
- package/dist/variant-custom-MkTNTycd.js +0 -1
- package/src/primitives/card-validate-generator.testlib.ts +0 -38
- package/src/ui/stat.tsx +0 -41
- /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
- /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createSignal, onMount, onCleanup, Index } from 'solid-js';
|
|
2
|
+
import { defineWebComponent } from './define';
|
|
3
|
+
import { PaneGrid } from '../ui/pane-grid';
|
|
4
|
+
|
|
5
|
+
interface Props extends Record<string, unknown> {
|
|
6
|
+
/** Minimum width of every pane, in px, before columns drop / the grid scrolls.
|
|
7
|
+
* Defaults to `280`. Attribute: `min-pane-width`. */
|
|
8
|
+
minPaneWidth?: number;
|
|
9
|
+
/** Minimum height of every pane, in px, before the grid scrolls vertically.
|
|
10
|
+
* Defaults to `200`. Attribute: `min-pane-height`. */
|
|
11
|
+
minPaneHeight?: number;
|
|
12
|
+
/** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
|
|
13
|
+
maxColumns?: number;
|
|
14
|
+
/** Gap between panes, any CSS length. Defaults to the kit gap
|
|
15
|
+
* (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
|
|
16
|
+
gap?: string;
|
|
17
|
+
/** When set to a valid child index, render ONLY that pane full-bleed: a simple
|
|
18
|
+
* maximize hook the consumer drives (pair it with `<kai-pane>`'s `kai-maximize`
|
|
19
|
+
* event). Clear it (or point out of range) for the full tiled grid.
|
|
20
|
+
* Attribute: `maximized-index`. */
|
|
21
|
+
maximizedIndex?: number | null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Attribute values arrive as strings; blank/invalid → undefined (the default). */
|
|
25
|
+
function num(value: unknown): number | undefined {
|
|
26
|
+
if (value == null || value === '') return undefined;
|
|
27
|
+
const n = Number(value);
|
|
28
|
+
return Number.isFinite(n) ? n : undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `<kai-pane-grid>` — an N-pane responsive tiling grid with a min-size + scroll
|
|
33
|
+
* floor. Each direct light child is one tile: the grid fills up to `max-columns`
|
|
34
|
+
* columns when wide, DROPS columns as the container narrows so panes never squish
|
|
35
|
+
* below `min-pane-width`, then SCROLLS once even one column can't fit. Rows keep
|
|
36
|
+
* at least `min-pane-height` the same way. The natural children are `<kai-pane>` /
|
|
37
|
+
* `<kai-pane-group>`, but any elements tile.
|
|
38
|
+
*
|
|
39
|
+
* ```html
|
|
40
|
+
* <kai-pane-grid max-columns="2" min-pane-width="320" style="height: 480px">
|
|
41
|
+
* <kai-pane headline="Atlas">…</kai-pane>
|
|
42
|
+
* <kai-pane headline="Otto">…</kai-pane>
|
|
43
|
+
* <kai-pane headline="Nova">…</kai-pane>
|
|
44
|
+
* </kai-pane-grid>
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* Maximize: set `maximized-index` to a child index to show only that pane
|
|
48
|
+
* full-bleed; clear it to restore. The grid never decides this itself — drive it
|
|
49
|
+
* from your own control (e.g. `<kai-pane>`'s `kai-maximize` event). Scalar
|
|
50
|
+
* attributes only; no events.
|
|
51
|
+
*
|
|
52
|
+
* Under the shadow root each pane child is projected through its own named slot
|
|
53
|
+
* (assigned automatically — an author-set `slot` attribute on a direct child is
|
|
54
|
+
* respected and left alone), so the light children become the grid tiles directly.
|
|
55
|
+
*/
|
|
56
|
+
defineWebComponent<Props>('kai-pane-grid', {
|
|
57
|
+
minPaneWidth: undefined,
|
|
58
|
+
minPaneHeight: undefined,
|
|
59
|
+
maxColumns: undefined,
|
|
60
|
+
gap: undefined,
|
|
61
|
+
maximizedIndex: undefined,
|
|
62
|
+
}, (props, { element }) => {
|
|
63
|
+
// One named slot per direct light child, in child order. The slot names are
|
|
64
|
+
// written onto the children (`pane-<i>`), the same per-child-slot pattern
|
|
65
|
+
// <kai-resizable> uses (`p0`/`p1`/…): PaneGrid tiles its JSX children, and a
|
|
66
|
+
// single default <slot> would make ALL panes one tile. A child that already
|
|
67
|
+
// carries an author-set slot attribute outside our namespace is left alone
|
|
68
|
+
// (and therefore not tiled) — authoring escape hatch, same as unslotted text.
|
|
69
|
+
const [slotNames, setSlotNames] = createSignal<string[]>([]);
|
|
70
|
+
|
|
71
|
+
onMount(() => {
|
|
72
|
+
const read = () => {
|
|
73
|
+
const names: string[] = [];
|
|
74
|
+
let i = 0;
|
|
75
|
+
for (const child of Array.from(element.children)) {
|
|
76
|
+
const existing = child.getAttribute('slot');
|
|
77
|
+
if (existing !== null && !/^pane-\d+$/.test(existing)) continue; // author-owned
|
|
78
|
+
const name = `pane-${i++}`;
|
|
79
|
+
if (existing !== name) child.setAttribute('slot', name);
|
|
80
|
+
names.push(name);
|
|
81
|
+
}
|
|
82
|
+
// Structural equality: our own setAttribute('slot') writes re-fire the
|
|
83
|
+
// observer; an unchanged name list means an unchanged layout, so skip the
|
|
84
|
+
// re-render (mirrors <kai-resizable>'s itemsChanged guard).
|
|
85
|
+
if (names.length !== slotNames().length || names.some((n, j) => n !== slotNames()[j])) {
|
|
86
|
+
setSlotNames(names);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
read();
|
|
90
|
+
const observer = new MutationObserver(read);
|
|
91
|
+
observer.observe(element, { childList: true });
|
|
92
|
+
onCleanup(() => observer.disconnect());
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<>
|
|
97
|
+
{/* A tiling grid fills its container — default the host to a stretching
|
|
98
|
+
block, same as <kai-resizable>. Give the element (or a parent) a height. */}
|
|
99
|
+
<style>{':host{display:block;height:100%;min-height:0;min-width:0}'}</style>
|
|
100
|
+
<PaneGrid
|
|
101
|
+
minPaneWidth={num(props.minPaneWidth)}
|
|
102
|
+
minPaneHeight={num(props.minPaneHeight)}
|
|
103
|
+
maxColumns={num(props.maxColumns)}
|
|
104
|
+
gap={props.gap as string | undefined}
|
|
105
|
+
maximizedIndex={num(props.maximizedIndex) ?? null}
|
|
106
|
+
>
|
|
107
|
+
<Index each={slotNames()}>{(name) => <slot name={name()} />}</Index>
|
|
108
|
+
</PaneGrid>
|
|
109
|
+
</>
|
|
110
|
+
);
|
|
111
|
+
});
|
|
@@ -23,7 +23,8 @@ type SlotName = (typeof SLOT_NAMES)[number];
|
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* `<kai-prompt-dock>` — a recessed tray that frames a prompt input and can extend
|
|
26
|
-
* with optional "lip" regions above and/or below it.
|
|
26
|
+
* with optional "lip" regions above and/or below it. It sits in the page flow and
|
|
27
|
+
* launches nothing; the floating corner launcher is `<kai-dock>`. The input is the raised card
|
|
27
28
|
* that floats on the tray; the lips sit in a slightly darker recessed band sharing
|
|
28
29
|
* the tray's rounding, so the whole thing reads as one cohesive control.
|
|
29
30
|
*
|
|
@@ -27,9 +27,9 @@ interface Props extends Record<string, unknown> {
|
|
|
27
27
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately
|
|
28
28
|
* as if typed and submitted; `'fill'` just places it in the input. */
|
|
29
29
|
suggestionMode?: 'submit' | 'fill';
|
|
30
|
-
/** Show a
|
|
31
|
-
* `search` event. */
|
|
32
|
-
|
|
30
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a
|
|
31
|
+
* `kai-web-search` event. Attribute: `web-search`. */
|
|
32
|
+
webSearch?: boolean;
|
|
33
33
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice`
|
|
34
34
|
* event. */
|
|
35
35
|
voice?: boolean;
|
|
@@ -49,7 +49,11 @@ interface Props extends Record<string, unknown> {
|
|
|
49
49
|
attach?: boolean;
|
|
50
50
|
/** Attachments to seed the input with (so a consumer can pre-populate staged
|
|
51
51
|
* files without an upload). Set as a JS property; the element then manages its
|
|
52
|
-
* own attachment state from there (add via the paperclip, remove per chip).
|
|
52
|
+
* own attachment state from there (add via the paperclip, remove per chip).
|
|
53
|
+
* Each item's `url` must be a `data:` URI or an https URL, never
|
|
54
|
+
* `URL.createObjectURL`: a `blob:` URL previews perfectly and is meaningless
|
|
55
|
+
* outside this tab, so `toOpenAIMessages`/`toAnthropicMessages` refuse it.
|
|
56
|
+
* (The built-in paperclip already stages files as `data:` URIs.) */
|
|
53
57
|
attachments?: AttachmentData[];
|
|
54
58
|
/** Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu
|
|
55
59
|
* that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins
|
|
@@ -64,7 +68,9 @@ interface Props extends Record<string, unknown> {
|
|
|
64
68
|
interface Events {
|
|
65
69
|
/** The user submitted the prompt (Enter or send button). `value` is the
|
|
66
70
|
* flattened text (back-compat); `doc` is the structured document and
|
|
67
|
-
* `entities` the inserted pills (skills/agents) for downstream expansion.
|
|
71
|
+
* `entities` the inserted pills (skills/agents) for downstream expansion.
|
|
72
|
+
* `<kai-prompt-input>` is the batteries-included composer row (send button,
|
|
73
|
+
* toolbar, attachment staging) built on `<kai-composer>`, the bare editor. */
|
|
68
74
|
'kai-submit': { value: string; doc: ComposerDoc; entities: EntityRef[]; attachments: AttachmentData[] };
|
|
69
75
|
/** The input changed (fires on every edit). Carries the flattened `value`
|
|
70
76
|
* plus the structured `doc` + `entities`. */
|
|
@@ -75,8 +81,8 @@ interface Events {
|
|
|
75
81
|
'kai-attachments-change': { attachments: AttachmentData[] };
|
|
76
82
|
/** A suggestion was clicked while `suggestion-mode="fill"`. */
|
|
77
83
|
'kai-suggestion-click': { value: string };
|
|
78
|
-
/** The
|
|
79
|
-
'kai-search': Record<string, never>;
|
|
84
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
85
|
+
'kai-web-search': Record<string, never>;
|
|
80
86
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
81
87
|
'kai-voice': Record<string, never>;
|
|
82
88
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
@@ -93,7 +99,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
|
|
|
93
99
|
loading: false,
|
|
94
100
|
suggestions: undefined,
|
|
95
101
|
suggestionMode: 'submit',
|
|
96
|
-
|
|
102
|
+
webSearch: false,
|
|
97
103
|
voice: false,
|
|
98
104
|
stoppable: false,
|
|
99
105
|
submit: 'always',
|
|
@@ -215,7 +221,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
|
|
|
215
221
|
attach={flag('attach')}
|
|
216
222
|
suggestions={props.suggestions}
|
|
217
223
|
attachments={attachments()}
|
|
218
|
-
|
|
224
|
+
webSearch={flag('webSearch')}
|
|
219
225
|
voice={flag('voice')}
|
|
220
226
|
toolbarActions={toolbarActions()}
|
|
221
227
|
triggers={props.triggers}
|
|
@@ -225,7 +231,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
|
|
|
225
231
|
onSubmit={handleSubmit}
|
|
226
232
|
onSuggestionClick={handleSuggestionClick}
|
|
227
233
|
onAttachmentsChange={(a) => { setAttachments(a); dispatch('kai-attachments-change', { attachments: a }); }}
|
|
228
|
-
|
|
234
|
+
onWebSearch={() => dispatch('kai-web-search')}
|
|
229
235
|
onVoice={() => dispatch('kai-voice')}
|
|
230
236
|
onStop={() => dispatch('kai-stop')}
|
|
231
237
|
onAction={(id) => dispatch('kai-toolbar-action', { action: id })}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createEffect, createSignal, untrack } from 'solid-js';
|
|
2
|
+
import { defineWebComponent } from './define';
|
|
3
|
+
import { RadioGroup } from '../ui/radio';
|
|
4
|
+
// Public shape of the `options` prop; lives in ./element-data-types so the ROOT
|
|
5
|
+
// entry can re-export it (see that file's header).
|
|
6
|
+
import type { KaiRadioOption } from './element-data-types';
|
|
7
|
+
|
|
8
|
+
interface Props extends Record<string, unknown> {
|
|
9
|
+
/** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
|
|
10
|
+
options: KaiRadioOption[];
|
|
11
|
+
/** Controlled selected `value`. Settable and reflected to the `value` attribute.
|
|
12
|
+
* `el.value = 'degraded'` drives it; choosing a row updates it and fires
|
|
13
|
+
* `kai-change`. Read `el.value` for live state. */
|
|
14
|
+
value?: string;
|
|
15
|
+
/** Shared form-control name for every radio in the group. Defaults to a generated
|
|
16
|
+
* id, so the group is exclusive and keyboard-navigable even when nothing is
|
|
17
|
+
* submitted. */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** Disable every row. Individual rows carry their own `disabled`. */
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/** Accessible name for the group. */
|
|
22
|
+
label?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Events fired by `<kai-radio-group>`. */
|
|
26
|
+
interface Events {
|
|
27
|
+
/** A row was chosen. */
|
|
28
|
+
'kai-change': { value: string };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `<kai-radio-group>` — the kit's "pick exactly one" control: a bordered, divided
|
|
33
|
+
* list over real `<input type="radio">`s that share a `name`, so one tab stop, arrow
|
|
34
|
+
* keys, mutual exclusion and form participation are the browser's and not a
|
|
35
|
+
* reimplementation.
|
|
36
|
+
*
|
|
37
|
+
* Feed it `options` (a JS-property array of `{ value, label, description?, disabled? }`),
|
|
38
|
+
* drive/read the selection with the `value` property (settable + reflected to the
|
|
39
|
+
* `value` attribute, so `:host([value])` and `el.value` see live state), and listen
|
|
40
|
+
* for `kai-change`.
|
|
41
|
+
*
|
|
42
|
+
* Re-rendering follows the kit's reactivity contract: hand it a NEW array reference,
|
|
43
|
+
* and a new object for any option whose content changed — the rows are a
|
|
44
|
+
* reference-keyed list, so mutating an option in place changes nothing on screen.
|
|
45
|
+
*
|
|
46
|
+
* ```html
|
|
47
|
+
* <kai-radio-group value="degraded" label="Severity"></kai-radio-group>
|
|
48
|
+
* <script type="module">
|
|
49
|
+
* import '@kitn.ai/ui/elements';
|
|
50
|
+
* const group = document.querySelector('kai-radio-group');
|
|
51
|
+
* group.options = [
|
|
52
|
+
* { value: 'blocking', label: 'Blocking', description: 'Pages the on-call' },
|
|
53
|
+
* { value: 'degraded', label: 'Degraded' },
|
|
54
|
+
* { value: 'cosmetic', label: 'Cosmetic' },
|
|
55
|
+
* ];
|
|
56
|
+
* group.addEventListener('kai-change', (e) => console.log(e.detail.value));
|
|
57
|
+
* group.value = 'cosmetic'; // drive it (no kai-change — the host already knows)
|
|
58
|
+
* </script>
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
defineWebComponent<Props, Events>('kai-radio-group', {
|
|
62
|
+
options: [],
|
|
63
|
+
value: undefined,
|
|
64
|
+
name: undefined,
|
|
65
|
+
disabled: undefined,
|
|
66
|
+
label: undefined,
|
|
67
|
+
}, (props, ctx) => {
|
|
68
|
+
const { element, dispatch, flag, expose } = ctx;
|
|
69
|
+
|
|
70
|
+
// Lift the selection into the facade and drive RadioGroup CONTROLLED so the host can
|
|
71
|
+
// read it (`el.value` / `:host([value])`) and set it after mount. Seed from the
|
|
72
|
+
// `value` property/attribute present on mount; nothing is auto-selected, because
|
|
73
|
+
// `options` normally arrives as a property AFTER upgrade (kai-segmented's structure).
|
|
74
|
+
const [value, setValue] = createSignal(
|
|
75
|
+
(props.value as string | undefined) ?? element.getAttribute('value') ?? '',
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
// Coerce anything arriving through the `value` setter (a JS assignment, or the
|
|
79
|
+
// attributeChangedCallback write-back) to a string, falling back to the live
|
|
80
|
+
// attribute when nullish so the reflect write-back equals the signal and the guards
|
|
81
|
+
// below absorb it — no attr⇄prop feedback loop.
|
|
82
|
+
const coerce = (v: unknown): string =>
|
|
83
|
+
v == null ? (element.getAttribute('value') ?? '') : String(v);
|
|
84
|
+
|
|
85
|
+
// Apply a new value and fire kai-change once (the user-choice path).
|
|
86
|
+
const apply = (next: string) => {
|
|
87
|
+
if (untrack(value) === next) return;
|
|
88
|
+
setValue(next);
|
|
89
|
+
dispatch('kai-change', { value: next });
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
Object.defineProperty(element, 'value', {
|
|
93
|
+
get: () => value(),
|
|
94
|
+
set: (v: unknown) => { const next = coerce(v); if (untrack(value) !== next) setValue(next); },
|
|
95
|
+
configurable: true,
|
|
96
|
+
enumerable: true,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Reflect internal value → the `[value]` host attribute (for `:host([value])`).
|
|
100
|
+
createEffect(() => {
|
|
101
|
+
const v = value();
|
|
102
|
+
if (v) {
|
|
103
|
+
if (element.getAttribute('value') !== v) element.setAttribute('value', v);
|
|
104
|
+
} else if (element.hasAttribute('value')) {
|
|
105
|
+
element.removeAttribute('value');
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expose({
|
|
110
|
+
/** Focus the group's tab stop. That is the selected radio, or the first row when
|
|
111
|
+
* nothing is selected yet. */
|
|
112
|
+
focus: (options?: FocusOptions) => {
|
|
113
|
+
const root = element.shadowRoot;
|
|
114
|
+
const radios = [...(root?.querySelectorAll<HTMLInputElement>('input[type="radio"]') ?? [])];
|
|
115
|
+
(radios.find((r) => r.checked) ?? radios[0])?.focus(options);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<RadioGroup
|
|
121
|
+
options={(props.options ?? []) as KaiRadioOption[]}
|
|
122
|
+
value={value()}
|
|
123
|
+
name={props.name as string | undefined}
|
|
124
|
+
disabled={flag('disabled')}
|
|
125
|
+
label={props.label as string | undefined}
|
|
126
|
+
onChange={(next) => apply(next)}
|
|
127
|
+
/>
|
|
128
|
+
);
|
|
129
|
+
});
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
// from ./register.ts so the elements entry is SSR-import-safe — see the comment
|
|
4
4
|
// there. This file is hand-maintained (the generator gen-element-api.mjs SKIPs
|
|
5
5
|
// register.ts AND this file); keep the component import list here in sync.
|
|
6
|
+
import { installKaiDevtoolsHook } from '../diagnostics/hook';
|
|
7
|
+
import { emitElementRegistry } from './element-diagnostics';
|
|
6
8
|
import './conversation-list';
|
|
9
|
+
import './conversation-item';
|
|
7
10
|
import './prompt-input';
|
|
8
11
|
import './chat';
|
|
9
12
|
import './chat-workspace';
|
|
@@ -51,6 +54,11 @@ import './artifact';
|
|
|
51
54
|
import './scroll-button';
|
|
52
55
|
import './popover';
|
|
53
56
|
import './switch';
|
|
57
|
+
import './checkbox';
|
|
58
|
+
import './checkbox-group';
|
|
59
|
+
import './radio-group';
|
|
60
|
+
import './slider';
|
|
61
|
+
import './select';
|
|
54
62
|
import './button';
|
|
55
63
|
import './avatar';
|
|
56
64
|
import './badge';
|
|
@@ -77,6 +85,10 @@ import './compare';
|
|
|
77
85
|
import './composer';
|
|
78
86
|
// W3 phase 2: cascading action menu from a JSON items-tree
|
|
79
87
|
import './menu';
|
|
88
|
+
// The same Dropdown surface with a consumer-owned body: you slot the rows
|
|
89
|
+
// instead of handing over an items tree (the shape a framework consumer needs
|
|
90
|
+
// when the rows are their own components).
|
|
91
|
+
import './dropdown';
|
|
80
92
|
// W4 phase 1: grouped filterable command/mention palette
|
|
81
93
|
import './command';
|
|
82
94
|
// Prompt dock + settings building blocks (graduated from SolidJS prototypes)
|
|
@@ -87,10 +99,50 @@ import './setting-item';
|
|
|
87
99
|
// Multi-agent workspace primitives (graduated from SolidJS prototypes)
|
|
88
100
|
import './pane';
|
|
89
101
|
import './pane-group';
|
|
102
|
+
import './pane-grid';
|
|
90
103
|
import './agent-card';
|
|
91
104
|
import './dialog';
|
|
105
|
+
import './dock';
|
|
92
106
|
// Input & search field family
|
|
93
107
|
import './input';
|
|
94
108
|
import './search';
|
|
95
109
|
import './kbd';
|
|
96
110
|
import './editable-label';
|
|
111
|
+
|
|
112
|
+
// The devtools recorder hook, installed HERE because this file is already the
|
|
113
|
+
// browser-only half of the elements entry (register.ts gates it behind a window
|
|
114
|
+
// check and a dynamic import). So an app that registers the kai-* elements gets
|
|
115
|
+
// the hook with no work, while an SSR import of the entry still touches no
|
|
116
|
+
// global.
|
|
117
|
+
//
|
|
118
|
+
// At the BOTTOM, and it makes no difference: `import` declarations are hoisted,
|
|
119
|
+
// so every element module above has already evaluated by the time any statement
|
|
120
|
+
// in this file runs. Written here anyway so the order you read is the order that
|
|
121
|
+
// happens. Nothing above emits a diagnostic event, so there is nothing to miss.
|
|
122
|
+
//
|
|
123
|
+
// Idempotent and near-free: with no activation signal it allocates no buffer,
|
|
124
|
+
// makes no subscription, and leaves emission a guarded no-op. An app importing
|
|
125
|
+
// the SolidJS components directly never runs this file and must call
|
|
126
|
+
// `installKaiDevtoolsHook()` itself -- see the docblock in ../diagnostics/index.
|
|
127
|
+
installKaiDevtoolsHook();
|
|
128
|
+
|
|
129
|
+
// One registry snapshot, right after the hook installs and therefore after every
|
|
130
|
+
// element above has registered (import declarations are hoisted, so they all ran
|
|
131
|
+
// before this line).
|
|
132
|
+
//
|
|
133
|
+
// WHY HERE AND NOT INSIDE THE HOOK. The hook lives in ../diagnostics, which is
|
|
134
|
+
// its own rollup bundle and must stay free of any element import -- pulling the
|
|
135
|
+
// manifest in there would drag element bytes into a consumer who only parses
|
|
136
|
+
// streams. The dependency goes elements -> diagnostics, never back.
|
|
137
|
+
//
|
|
138
|
+
// WHY EMIT AT ALL WHEN A PANEL IS USUALLY NOT THERE YET. On the recording branch
|
|
139
|
+
// the hook has already subscribed by this point, so this snapshot lands in the
|
|
140
|
+
// history buffer and a panel attaching seconds later still sees the state at
|
|
141
|
+
// load -- which is the state that answers the hydration question. On the dormant
|
|
142
|
+
// branch `emitElementRegistry()` short-circuits on the active check and costs a
|
|
143
|
+
// symbol read.
|
|
144
|
+
//
|
|
145
|
+
// A panel attaching mid-session with no history gets no snapshot from here and
|
|
146
|
+
// should ask for a fresh one: `emitElementRegistry()` is exported from
|
|
147
|
+
// @kitn.ai/ui/elements for exactly that.
|
|
148
|
+
emitElementRegistry();
|
package/src/elements/register.ts
CHANGED
|
@@ -38,6 +38,34 @@ export type { CodeHighlightingOptions } from '../primitives/highlighter';
|
|
|
38
38
|
export { classifyTool } from '../components/tool-classify';
|
|
39
39
|
export type { ToolKind } from '../components/tool-classify';
|
|
40
40
|
|
|
41
|
+
// Element-layer diagnostics. `emitElementRegistry()` re-emits the which-elements-
|
|
42
|
+
// are-defined snapshot on demand, for a panel that attached mid-session and so
|
|
43
|
+
// missed the one register-impl emits at load. SSR-safe and a no-op with no
|
|
44
|
+
// subscriber, so calling it unconditionally is fine.
|
|
45
|
+
//
|
|
46
|
+
// WHY THIS ONE PRODUCER IS PUBLIC while `@kitn.ai/ui/diagnostics` deliberately
|
|
47
|
+
// keeps `emitWireDiagnostic`, `nextStreamId` and `setWirePayloadCapture`
|
|
48
|
+
// internal. That rule exists because a consumer able to forge events or reset
|
|
49
|
+
// the stream counter can make a panel lie about a stream that never happened,
|
|
50
|
+
// and one able to flip payload capture can start recording an app's users'
|
|
51
|
+
// conversations without the app deciding to. This function takes no arguments
|
|
52
|
+
// and reports nothing but `customElements.get()` over the manifest: there is no
|
|
53
|
+
// value to forge, no counter to move and no capture to arm. It can only tell the
|
|
54
|
+
// truth about the registry, which is the one thing a late-attaching panel cannot
|
|
55
|
+
// find out for itself.
|
|
56
|
+
//
|
|
57
|
+
// The event TYPES are re-exported here as well as from @kitn.ai/ui/diagnostics:
|
|
58
|
+
// a consumer already importing the elements entry should not have to add a
|
|
59
|
+
// second specifier to name the events it is handed.
|
|
60
|
+
export { emitElementRegistry } from './element-diagnostics';
|
|
61
|
+
export type {
|
|
62
|
+
ElementDiagnosticBase,
|
|
63
|
+
ElementDiagnosticEvent,
|
|
64
|
+
ElementRegistryEvent,
|
|
65
|
+
ElementViolationEvent,
|
|
66
|
+
ElementViolationKind,
|
|
67
|
+
} from './diagnostic-events';
|
|
68
|
+
|
|
41
69
|
// Imperative toast API — usable directly from the elements entry so consumers
|
|
42
70
|
// who only import the web-components bundle still get `toast()`. The store is
|
|
43
71
|
// SSR-safe (no DOM touched until the first toast is raised on the client).
|
|
@@ -129,9 +129,16 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
|
|
|
129
129
|
min: el.getAttribute('min') ?? undefined,
|
|
130
130
|
max: el.getAttribute('max') ?? undefined,
|
|
131
131
|
locked: el.hasAttribute('locked') && el.getAttribute('locked') !== 'false',
|
|
132
|
-
// Honour both the `hidden`
|
|
133
|
-
//
|
|
134
|
-
//
|
|
132
|
+
// Honour both the `hidden` attribute and the property, because on THIS element
|
|
133
|
+
// they are two independent halves of the state and either can be the only one
|
|
134
|
+
// set. Not a fact about custom elements in general — a custom element that does
|
|
135
|
+
// not declare a `hidden` prop keeps the native reflecting accessor. It is a fact
|
|
136
|
+
// about this one: `<kai-resizable-item>` declares `hidden: false`, so
|
|
137
|
+
// component-register owns the property and nothing reflects. Measured:
|
|
138
|
+
// `el.hidden = true` writes no attribute, and after maximize writes the
|
|
139
|
+
// attribute `el.hidden` reads `undefined`. This union is what absorbs that, and
|
|
140
|
+
// it is why `hidden` is exempt from the reflectFlag migration rather than broken
|
|
141
|
+
// by it — see reflectItemConfig's doc below.
|
|
135
142
|
hidden: el.hidden || (el.hasAttribute('hidden') && el.getAttribute('hidden') !== 'false'),
|
|
136
143
|
collapsed,
|
|
137
144
|
};
|
|
@@ -543,10 +550,22 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
|
|
|
543
550
|
* *properties* — `el.size = "280px"` — but component-register only mirrors
|
|
544
551
|
* attribute→property, never the reverse, so a property-set size never becomes an
|
|
545
552
|
* attribute and the parent silently falls back to a flexible split. This is the
|
|
546
|
-
* exact class of bug the `collapsed` reflection already fixed;
|
|
547
|
-
* `size`/`min`/`max` (
|
|
548
|
-
*
|
|
549
|
-
*
|
|
553
|
+
* exact class of bug the `collapsed` reflection already fixed; handled here for
|
|
554
|
+
* `size`/`min`/`max` (the STRINGS). The booleans — `collapsed` and `locked` — go
|
|
555
|
+
* through `reflectFlag` in the facade body instead, which reflects AND keeps the
|
|
556
|
+
* property readable; see WebComponentContext.reflectFlag.
|
|
557
|
+
*
|
|
558
|
+
* `hidden` is deliberately NOT reflected, and NOT because it is already fine — it is
|
|
559
|
+
* split exactly like the others, and measurably so: `el.hidden = true` leaves no
|
|
560
|
+
* attribute (a plain `<div>` gets one), and after maximize writes the attribute
|
|
561
|
+
* `el.hidden` reads `undefined`. Declaring `hidden: false` is what does it — it makes
|
|
562
|
+
* `hidden` a component-register prop, whose non-reflecting accessor shadows the native
|
|
563
|
+
* reflecting one. What makes the split HARMLESS here is that both readers take the
|
|
564
|
+
* union, `el.hidden || el.hasAttribute('hidden')`, so neither half can be missed.
|
|
565
|
+
* Routing it through `reflectFlag` would put a second writer on an attribute the
|
|
566
|
+
* maximize/restore path already owns, so it is a behaviour decision of its own rather
|
|
567
|
+
* than part of the read-back fix. See the exemption in
|
|
568
|
+
* tests/elements/reflected-boolean-coverage.test.ts.
|
|
550
569
|
*
|
|
551
570
|
* Durability (don't fight drags): the parent WRITES `size` back to the live percent
|
|
552
571
|
* during a drag (`persistSizes` → `setAttribute('size', …)`), and that attribute
|
|
@@ -568,7 +587,6 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
|
|
|
568
587
|
export function reflectItemConfig(
|
|
569
588
|
element: HTMLElement,
|
|
570
589
|
props: { readonly size?: string; readonly min?: string; readonly max?: string },
|
|
571
|
-
flag: (name: string) => boolean,
|
|
572
590
|
) {
|
|
573
591
|
const norm = (v: unknown): string | null => (v == null || v === '' ? null : String(v));
|
|
574
592
|
const reflectString = (name: 'size' | 'min' | 'max') => {
|
|
@@ -591,11 +609,11 @@ export function reflectItemConfig(
|
|
|
591
609
|
reflectString('size');
|
|
592
610
|
reflectString('min');
|
|
593
611
|
reflectString('max');
|
|
594
|
-
//
|
|
595
|
-
//
|
|
596
|
-
// `
|
|
597
|
-
//
|
|
598
|
-
|
|
612
|
+
// `locked` used to be reflected here too. It is a BOOLEAN, so it now goes through
|
|
613
|
+
// `reflectFlag` in the facade body next to `collapsed` — a boolean reflected with a
|
|
614
|
+
// bare `toggleAttribute` reads back `undefined` (see WebComponentContext.reflectFlag),
|
|
615
|
+
// and `reflectFlag` is only reachable from the facade's context. What is left here is
|
|
616
|
+
// the string props, which is this helper's real subject: the drag-durability guard.
|
|
599
617
|
}
|
|
600
618
|
|
|
601
619
|
interface ItemProps extends Record<string, unknown> {
|
|
@@ -633,23 +651,32 @@ defineWebComponent<ItemProps>('kai-resizable-item', {
|
|
|
633
651
|
locked: false,
|
|
634
652
|
hidden: false,
|
|
635
653
|
collapsed: false,
|
|
636
|
-
}, (props, { element,
|
|
654
|
+
}, (props, { element, reflectFlag }) => {
|
|
637
655
|
// Reflect the reactive `collapsed` prop to the `collapsed` ATTRIBUTE the parent
|
|
638
656
|
// <kai-resizable> reads (and observes). This is what makes a bare JSX boolean
|
|
639
657
|
// collapse the panel at INITIAL render from any framework: component-register
|
|
640
658
|
// parses `<kai-resizable-item collapsed>` to `undefined` (not `true`), and a JSX
|
|
641
|
-
// boolean sets neither `hidden` nor the IDL property — so
|
|
642
|
-
// (which also honours the attribute) is the reliable source, and
|
|
643
|
-
//
|
|
644
|
-
// pattern as <kai-chat>'s `loading` reflection
|
|
645
|
-
// `
|
|
646
|
-
//
|
|
647
|
-
|
|
648
|
-
//
|
|
649
|
-
//
|
|
650
|
-
//
|
|
659
|
+
// boolean sets neither `hidden` nor the IDL property — so the flag resolution
|
|
660
|
+
// (which also honours the attribute) is the reliable source, and the attribute is
|
|
661
|
+
// mirrored back so the parent's readItems()/MutationObserver lay it out. Same
|
|
662
|
+
// pattern as <kai-chat>'s `loading` reflection, and now literally the same code:
|
|
663
|
+
// `reflectFlag` also makes `el.collapsed` READ BACK, which a hand-rolled
|
|
664
|
+
// toggleAttribute effect does not (WebComponentContext.reflectFlag).
|
|
665
|
+
//
|
|
666
|
+
// We touch only `collapsed` and `locked`, never `hidden`, so the back-compat hidden
|
|
667
|
+
// path and maximize (which drive `hidden`) are untouched — see the named exemption
|
|
668
|
+
// in tests/elements/reflected-boolean-coverage.test.ts for why `hidden` is a
|
|
669
|
+
// separate decision rather than an oversight.
|
|
670
|
+
reflectFlag('collapsed');
|
|
671
|
+
// `locked` is the parent's other boolean input; the parent also writes it during
|
|
672
|
+
// maximize/restore, and because the flag resolution re-derives from that same
|
|
673
|
+
// attribute state the reflection stays self-consistent (no fight).
|
|
674
|
+
reflectFlag('locked');
|
|
675
|
+
// Reflect the STRING config props (`size`/`min`/`max`) property→attribute for the
|
|
676
|
+
// SAME reason — a framework that sets them as DOM properties (React et al.) would
|
|
677
|
+
// otherwise be invisible to the parent. See reflectItemConfig for the
|
|
651
678
|
// drag-durability guard on `size`.
|
|
652
|
-
reflectItemConfig(element, props
|
|
679
|
+
reflectItemConfig(element, props);
|
|
653
680
|
return (
|
|
654
681
|
<>
|
|
655
682
|
{/* The item host fills the panel's single grid cell (the panel stretches it on
|