@kitn.ai/ui 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -7
- package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
- package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/arrow-down-D783iMJj.js +1 -0
- package/dist/arrow-left-0VLM5kyg.js +1 -0
- package/dist/artifact-DGjzHYUT.js +1 -0
- package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
- package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
- package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
- package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
- package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
- package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
- package/dist/check-CiEOVnEN.js +1 -0
- package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
- package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
- package/dist/chevron-down-CSobuZRG.js +1 -0
- package/dist/chevron-right-DR9ZAP-2.js +1 -0
- package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
- package/dist/circle-BC66EYF7.js +1 -0
- package/dist/circle-check-BqmahW0O.js +1 -0
- package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
- package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
- package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
- package/dist/components/builder-composer-triggers.d.ts +62 -0
- package/dist/components/builder-layout.d.ts +54 -0
- package/dist/components/builder-message-actions.d.ts +72 -0
- package/dist/components/builder-panel.d.ts +189 -0
- package/dist/components/builder-preview.d.ts +11 -0
- package/dist/components/builder-shell-controls.d.ts +69 -0
- package/dist/components/builder-skeleton.d.ts +58 -0
- package/dist/components/builder-start.d.ts +75 -0
- package/dist/components/builder-workspace-variants.d.ts +23 -0
- package/dist/components/captions.d.ts +66 -0
- package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
- package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
- package/dist/construct-cli.es.js +3 -3
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
- package/dist/controllable-BagRpyHv.js +1 -0
- package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
- package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
- package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
- package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
- package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
- package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
- package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
- package/dist/define-CI0y3eE4.js +1 -0
- package/dist/define.js +40 -40
- package/dist/define.server.js +45 -45
- package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
- package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.js +1 -1
- package/dist/elements/checkbox.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +1 -1
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-grid.js +1 -1
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/radio-group.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +1 -1
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/select.js +1 -1
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slider.js +1 -1
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
- package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
- package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
- package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
- package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
- package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
- package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
- package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
- package/dist/index.js +1741 -1725
- package/dist/index.server.js +1582 -1566
- package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
- package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
- package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
- package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
- package/dist/loader-KvJB6NrT.js +1 -0
- package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
- package/dist/mcp.es.js +9 -5
- package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
- package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
- package/dist/message-circle-BPpp5QKv.js +1 -0
- package/dist/message-square-BLbsd9BJ.js +1 -0
- package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
- package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
- package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
- package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
- package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
- package/dist/play-BXy1u7rW.js +1 -0
- package/dist/primitives/use-auto-resize.d.ts +11 -0
- package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
- package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
- package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
- package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
- package/dist/register-impl-DvEnhIxx.js +424 -0
- package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
- package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
- package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
- package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
- package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
- package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
- package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
- package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
- package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
- package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
- package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
- package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
- package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
- package/dist/solid.d.ts +6 -0
- package/dist/solid.js +259 -254
- package/dist/solid.server.js +259 -254
- package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
- package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
- package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
- package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
- package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
- package/dist/text-shimmer-BSzgEnDH.js +1 -0
- package/dist/textarea-DrYNt_0z.js +1 -0
- package/dist/theme.tokens.css +22 -21
- package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
- package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
- package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
- package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
- package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
- package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
- package/dist/ui/color-field.d.ts +48 -0
- package/dist/ui/textarea.d.ts +4 -0
- package/dist/ui/toggle-chip.d.ts +40 -0
- package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
- package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
- package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
- package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
- package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
- package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
- package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
- package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
- package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
- package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
- package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
- package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
- package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
- package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
- package/dist/x-eiO9V6J6.js +1 -0
- package/{src/elements/styles.css → kit-base.css} +27 -44
- package/package.json +32 -17
- package/solid.css +33 -0
- package/theme.css +39 -23
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-CjRU3JgV.js +0 -1
- package/dist/arrow-left-Bnpb1UEW.js +0 -1
- package/dist/artifact-Bwt7OgcR.js +0 -1
- package/dist/check-njkVdZu2.js +0 -1
- package/dist/chevron-down-B72s6PXR.js +0 -1
- package/dist/chevron-right-BatuHzUm.js +0 -1
- package/dist/circle-check-B62pODB3.js +0 -1
- package/dist/circle-zx0ByzY9.js +0 -1
- package/dist/controllable-CnGpMF6r.js +0 -1
- package/dist/define-By-uL588.js +0 -1
- package/dist/loader-BM4CEz4G.js +0 -1
- package/dist/message-circle-DruwObfX.js +0 -1
- package/dist/message-square-BG6q6mlm.js +0 -1
- package/dist/play-BvKKq3fX.js +0 -1
- package/dist/register-impl-B1hLkrI8.js +0 -424
- package/dist/text-shimmer-Dcj1MHuq.js +0 -1
- package/dist/textarea-Dpvbngbg.js +0 -1
- package/dist/x-Z5UntkIJ.js +0 -1
- package/src/agent-tooling/README.md +0 -192
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -147
- package/src/agent-tooling/construct/codegen.ts +0 -1635
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
- package/src/agent-tooling/construct/schema.ts +0 -452
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -1014
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -241
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/conversation-panel.tsx +0 -118
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/home-panel.tsx +0 -159
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/widget-tab-bar.tsx +0 -73
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -304
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -187
- package/src/elements/element-types.d.ts +0 -4353
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -430
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/conversation-store.ts +0 -248
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -173
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -95
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -630
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
package/src/elements/define.tsx
DELETED
|
@@ -1,563 +0,0 @@
|
|
|
1
|
-
import { customElement } from 'solid-element';
|
|
2
|
-
import { ChatConfig } from '../primitives/chat-config';
|
|
3
|
-
import { ELEMENT_CSS } from './css';
|
|
4
|
-
import { elementDiagnosticsWanted, installElementDiagnostics } from './element-diagnostics';
|
|
5
|
-
import { createEffect, createSignal, onCleanup, Show, type JSX } from 'solid-js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Shared constructable stylesheet, built once and adopted by every element's
|
|
9
|
-
* shadow root. This avoids duplicating the full compiled kit CSS (~77 KB) as an
|
|
10
|
-
* inline `<style>` in each instance — important now that composing many small
|
|
11
|
-
* elements on a page is a supported pattern. Falls back to `null` where
|
|
12
|
-
* Constructable Stylesheets aren't available, in which case the facade renders
|
|
13
|
-
* an inline `<style>` instead (see below).
|
|
14
|
-
*/
|
|
15
|
-
let sharedSheet: CSSStyleSheet | null | undefined;
|
|
16
|
-
function getSharedSheet(): CSSStyleSheet | null {
|
|
17
|
-
if (sharedSheet !== undefined) return sharedSheet;
|
|
18
|
-
try {
|
|
19
|
-
if (typeof CSSStyleSheet === 'undefined') throw new Error('no CSSStyleSheet');
|
|
20
|
-
const sheet = new CSSStyleSheet();
|
|
21
|
-
sheet.replaceSync(ELEMENT_CSS);
|
|
22
|
-
sharedSheet = sheet;
|
|
23
|
-
} catch {
|
|
24
|
-
sharedSheet = null;
|
|
25
|
-
}
|
|
26
|
-
return sharedSheet;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Resolve whether the element should render dark, given its `theme` and the
|
|
30
|
-
* system preference. `auto` (the default) follows `prefers-color-scheme`. */
|
|
31
|
-
function createDarkMode(getTheme: () => string | undefined) {
|
|
32
|
-
const [systemDark, setSystemDark] = createSignal(false);
|
|
33
|
-
if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
|
|
34
|
-
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
35
|
-
setSystemDark(mq.matches);
|
|
36
|
-
const onChange = (e: MediaQueryListEvent) => setSystemDark(e.matches);
|
|
37
|
-
mq.addEventListener('change', onChange);
|
|
38
|
-
onCleanup(() => mq.removeEventListener('change', onChange));
|
|
39
|
-
}
|
|
40
|
-
return () => {
|
|
41
|
-
const theme = getTheme() ?? 'auto';
|
|
42
|
-
return theme === 'dark' || (theme === 'auto' && systemDark());
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Context handed to every element facade. `E` is the element's event map —
|
|
48
|
-
* `{ eventName: detailType }` — which types `dispatch` so a facade can only fire
|
|
49
|
-
* its declared events with the right `detail` shape.
|
|
50
|
-
*/
|
|
51
|
-
export interface WebComponentContext<E = Record<string, unknown>> {
|
|
52
|
-
/** The custom-element host node. */
|
|
53
|
-
element: HTMLElement;
|
|
54
|
-
/** Fire a non-bubbling, non-composed CustomEvent off the host. Consumers
|
|
55
|
-
* listen directly on the element (`el.addEventListener(...)`). Typed by the
|
|
56
|
-
* element's event map `E`. */
|
|
57
|
-
dispatch: <K extends keyof E & string>(type: K, detail?: E[K]) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Resolve a boolean flag from a prop the way HTML authors expect.
|
|
60
|
-
*
|
|
61
|
-
* `component-register` parses a *bare* boolean attribute (`<el removable>`) to
|
|
62
|
-
* `undefined`, not `true` — so a facade can't rely on the prop value alone.
|
|
63
|
-
* `flag('removable')` returns ON when the property is `true`, OR when the
|
|
64
|
-
* matching attribute is present and not explicitly `="false"`. So all of
|
|
65
|
-
* `<el removable>`, `<el removable="true">`, and `el.removable = true` turn it
|
|
66
|
-
* on; `<el removable="false">`, absent, and `el.removable = false` turn it off.
|
|
67
|
-
*
|
|
68
|
-
* `name` is the camelCase prop name; the matching kebab attribute is derived.
|
|
69
|
-
*/
|
|
70
|
-
flag: (name: string) => boolean;
|
|
71
|
-
/**
|
|
72
|
-
* Expose imperative methods on the host element instance — the input half of a
|
|
73
|
-
* component's interaction surface (`el.focus()`, `el.clear()`, `el.scrollToBottom()`,
|
|
74
|
-
* …), the counterpart to the events `dispatch` fires. Call once from the facade
|
|
75
|
-
* with closures over its internal state/refs; each entry is assigned to the host,
|
|
76
|
-
* so a consumer calls it directly: `document.querySelector('kai-prompt-input').focus()`.
|
|
77
|
-
* Overriding a native method name (e.g. `focus`) shadows it on the instance so it
|
|
78
|
-
* can target the right control inside the shadow root (the WebAwesome/Shoelace
|
|
79
|
-
* convention). Methods are attached when the facade renders (on element upgrade).
|
|
80
|
-
*/
|
|
81
|
-
expose: (methods: Record<string, (...args: never[]) => unknown>) => void;
|
|
82
|
-
/**
|
|
83
|
-
* Reflect a boolean prop to its host attribute AND make that prop read back what
|
|
84
|
-
* was set. Use this instead of hand-rolling
|
|
85
|
-
* `createEffect(() => element.toggleAttribute('x', flag('x')))`.
|
|
86
|
-
*
|
|
87
|
-
* WHY IT IS ONE CALL AND NOT TWO. The reflection is what BREAKS the read-back, so
|
|
88
|
-
* the fix has to be attached to it or it gets forgotten — and it was, three times.
|
|
89
|
-
* `toggleAttribute(name, true)` sets the attribute to the EMPTY STRING;
|
|
90
|
-
* component-register's `attributeChangedCallback` then writes the prop back as
|
|
91
|
-
* `this[name] = parseAttributeValue("")`, and `parseAttributeValue` returns
|
|
92
|
-
* `undefined` for the empty string. So a reflected flag became write-only:
|
|
93
|
-
* `el.loading = true` left `el.loading === undefined` while `[loading]` was on the
|
|
94
|
-
* host. The element kept BEHAVING correctly, because `flag()` reads the attribute —
|
|
95
|
-
* which is precisely why nobody noticed until a consumer tried to read the property
|
|
96
|
-
* back (findings G-05).
|
|
97
|
-
*
|
|
98
|
-
* What this installs is an instance-level wrapper around the accessor
|
|
99
|
-
* component-register already created, coercing every incoming value through the
|
|
100
|
-
* same `flag()` policy (`resolveFlag`) — so the `undefined` write-back resolves to
|
|
101
|
-
* the attribute that caused it, and the property and the attribute can no longer
|
|
102
|
-
* disagree. It delegates to the underlying setter, so reactivity is untouched.
|
|
103
|
-
*
|
|
104
|
-
* `source` overrides where the ON/OFF value comes from, for an element whose truth
|
|
105
|
-
* is an internal controller rather than the prop (see `wireDisclosure`). Returning
|
|
106
|
-
* `undefined` from it means "not ready, leave the attribute alone".
|
|
107
|
-
*/
|
|
108
|
-
reflectFlag: (name: string, source?: () => boolean | undefined) => void;
|
|
109
|
-
/**
|
|
110
|
-
* Whether the element should currently render its dark-mode look --
|
|
111
|
-
* exactly the SAME resolved value that already drives the `.dark` class
|
|
112
|
-
* every facade's content sits inside (not a second computation of the
|
|
113
|
-
* `theme='light'|'dark'|'auto'` rule; see `createDarkMode` above). Most
|
|
114
|
-
* facades never need this directly, since the injected kit CSS already
|
|
115
|
-
* flips its custom properties under `.dark`. It exists for content that
|
|
116
|
-
* cannot read CSS at all -- e.g. a WebGL shader baking a colour choice
|
|
117
|
-
* into a GLSL uniform, which is why `kai-audio-visualizer` reads it.
|
|
118
|
-
*/
|
|
119
|
-
dark: () => boolean;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** camelCase prop name → kebab-case attribute (`hoverCard` → `hover-card`). */
|
|
123
|
-
function toAttr(name: string): string {
|
|
124
|
-
return name.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Every property name the built-in element prototype chain exposes as an ACCESSOR
|
|
129
|
-
* — `role`, `hidden`, `autofocus`, `dir`, `title`, `className`, … — i.e. the
|
|
130
|
-
* reflected IDL attributes plus the handful of read-only accessors. Methods
|
|
131
|
-
* (`focus`, `append`) are plain data properties and are deliberately not included:
|
|
132
|
-
* assigning over one shadows it on the instance but destroys nothing on the DOM.
|
|
133
|
-
*
|
|
134
|
-
* DERIVED, not listed. A hand-written list is a list someone has to remember to
|
|
135
|
-
* extend: the collision set is (this element's prop names) × (whatever the browser
|
|
136
|
-
* reflects), and both sides move — the kit adds props, and the platform keeps
|
|
137
|
-
* adding globals (`inert`, `popover`, `writingSuggestions` are all recent). Reading
|
|
138
|
-
* it off the live prototype chain means a prop that starts colliding tomorrow is
|
|
139
|
-
* protected the day it lands, in whichever engines have shipped the accessor,
|
|
140
|
-
* without a code change. It also self-limits: in an engine that has NOT shipped a
|
|
141
|
-
* given accessor (jsdom has no `autofocus`) the name is simply not a collision
|
|
142
|
-
* there, which is exactly right.
|
|
143
|
-
*
|
|
144
|
-
* Computed once — the chain does not change at runtime.
|
|
145
|
-
*/
|
|
146
|
-
let globalAccessorNames: Set<string> | undefined;
|
|
147
|
-
export function reflectedGlobalPropNames(): Set<string> {
|
|
148
|
-
if (globalAccessorNames) return globalAccessorNames;
|
|
149
|
-
const names = new Set<string>();
|
|
150
|
-
let proto: object | null =
|
|
151
|
-
typeof HTMLElement === 'undefined' ? null : (HTMLElement.prototype as object);
|
|
152
|
-
while (proto && proto !== Object.prototype) {
|
|
153
|
-
for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(proto))) {
|
|
154
|
-
if (descriptor.get || descriptor.set) names.add(name);
|
|
155
|
-
}
|
|
156
|
-
proto = Object.getPrototypeOf(proto) as object | null;
|
|
157
|
-
}
|
|
158
|
-
globalAccessorNames = names;
|
|
159
|
-
return names;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Replace inherited reflected accessors with plain, non-reflecting per-instance
|
|
164
|
-
* stores on this element class's prototype. Setting the property then only STORES
|
|
165
|
-
* the value — component-register still reads it back to seed the styling prop, and
|
|
166
|
-
* later shadows this with its own (also non-reflecting) instance accessor — and it
|
|
167
|
-
* can never touch a host attribute.
|
|
168
|
-
*/
|
|
169
|
-
function installNonReflectingProps(proto: object, keys: readonly string[]): void {
|
|
170
|
-
for (const key of keys) {
|
|
171
|
-
const store = Symbol(`kai-prop:${key}`);
|
|
172
|
-
Object.defineProperty(proto, key, {
|
|
173
|
-
get(this: Record<symbol, unknown>) {
|
|
174
|
-
return this[store];
|
|
175
|
-
},
|
|
176
|
-
set(this: Record<symbol, unknown>, value: unknown) {
|
|
177
|
-
this[store] = value;
|
|
178
|
-
},
|
|
179
|
-
enumerable: true,
|
|
180
|
-
configurable: true,
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Run `define` (solid-element's `customElement`, which calls
|
|
187
|
-
* `customElements.define` internally) with `keys` already shadowed on the element
|
|
188
|
-
* class — BEFORE the registry ever sees it.
|
|
189
|
-
*
|
|
190
|
-
* THE ORDER IS THE WHOLE POINT. `customElements.define()` synchronously upgrades
|
|
191
|
-
* every matching element the parser has already produced, and component-register's
|
|
192
|
-
* constructor runs `this[prop] = undefined` for every declared prop. If the
|
|
193
|
-
* non-reflecting accessor is installed AFTER the define call, that assignment lands
|
|
194
|
-
* on the NATIVE setter, which for a reflected IDL attribute means the author's
|
|
195
|
-
* markup is destroyed before a line of facade code runs — `undefined` coerces to
|
|
196
|
-
* `null`/`false` and the setter removes the attribute. Measured in chromium from
|
|
197
|
-
* parsed HTML (`node scripts/probe-upgrade-attribute-loss.mjs`):
|
|
198
|
-
*
|
|
199
|
-
* <kai-message role="user"> → role attr gone, el.role "assistant",
|
|
200
|
-
* the row renders as "Assistant message"
|
|
201
|
-
* <kai-resizable-item hidden> → hidden attr gone, el.hidden false, the
|
|
202
|
-
* panel is slotted and RENDERS VISIBLE
|
|
203
|
-
* <kai-confirm autofocus> → autofocus attr gone, nothing focused
|
|
204
|
-
*
|
|
205
|
-
* Two of those are silent: `hidden` and `autofocus` are legitimate global
|
|
206
|
-
* attributes, so no a11y rule and no console warning fires — the value simply
|
|
207
|
-
* evaporates. Only `role` was loud enough to get noticed.
|
|
208
|
-
*
|
|
209
|
-
* WHY A TRANSIENT REGISTRY WRAP and not something tidier: the class does not exist
|
|
210
|
-
* until `register()` builds it, and `register()` defines it in the same statement.
|
|
211
|
-
* component-register can take a `BaseElement` (a prototype we control) or a
|
|
212
|
-
* `customElements`-alike (a registry we control) via its third argument — either
|
|
213
|
-
* would be cleaner — but solid-element's `customElement()` calls `register(tag,
|
|
214
|
-
* props)` with no options and forwards nothing, and `component-register` is not a
|
|
215
|
-
* declared dependency of this package, so reaching past solid-element to call
|
|
216
|
-
* `register` ourselves would ship an undeclared import to consumers. Intercepting
|
|
217
|
-
* the one `define` call is the smallest seam that exists.
|
|
218
|
-
*
|
|
219
|
-
* The wrap is synchronous, restored in a `finally`, delegates to whatever was
|
|
220
|
-
* installed (so a polyfilled or consumer-wrapped registry keeps working), acts only
|
|
221
|
-
* on OUR tag, and is re-entrancy safe: a facade that defines another element during
|
|
222
|
-
* its upgrade nests a second wrap and unwinds it in order.
|
|
223
|
-
*/
|
|
224
|
-
function defineWithNonReflectingProps<T>(
|
|
225
|
-
tag: string,
|
|
226
|
-
keys: readonly string[],
|
|
227
|
-
define: () => T,
|
|
228
|
-
/**
|
|
229
|
-
* Anything else that must be on the prototype BEFORE the registry sees the
|
|
230
|
-
* class. Today that is the element-layer diagnostics, and it needs this seam
|
|
231
|
-
* for a reason that is adjacent to the one above but not the same: `define()`
|
|
232
|
-
* SNAPSHOTS the lifecycle callbacks (`connectedCallback`,
|
|
233
|
-
* `attributeChangedCallback`, …) off the prototype into the custom-element
|
|
234
|
-
* definition, and the browser invokes the snapshot. A wrapper installed
|
|
235
|
-
* afterwards is present on the prototype, passes `hasOwnProperty`, and is
|
|
236
|
-
* never called. See `installElementDiagnostics`.
|
|
237
|
-
*/
|
|
238
|
-
alsoPatch?: (proto: object) => void,
|
|
239
|
-
): { result: T; handled: boolean } {
|
|
240
|
-
// `handled` = nothing more for the caller to do. With no colliding props and
|
|
241
|
-
// nothing else to patch there is nothing to install at all, so that case is
|
|
242
|
-
// trivially handled.
|
|
243
|
-
if (keys.length === 0 && !alsoPatch) return { result: define(), handled: true };
|
|
244
|
-
const registry = customElements;
|
|
245
|
-
const hadOwnDefine = Object.prototype.hasOwnProperty.call(registry, 'define');
|
|
246
|
-
const inner = registry.define;
|
|
247
|
-
let handled = false;
|
|
248
|
-
let restore: (() => void) | undefined;
|
|
249
|
-
try {
|
|
250
|
-
registry.define = function (
|
|
251
|
-
this: CustomElementRegistry,
|
|
252
|
-
name: string,
|
|
253
|
-
constructor: CustomElementConstructor,
|
|
254
|
-
options?: ElementDefinitionOptions,
|
|
255
|
-
) {
|
|
256
|
-
if (name === tag) {
|
|
257
|
-
if (keys.length) installNonReflectingProps(constructor.prototype, keys);
|
|
258
|
-
alsoPatch?.(constructor.prototype);
|
|
259
|
-
handled = true;
|
|
260
|
-
}
|
|
261
|
-
return inner.call(this, name, constructor, options);
|
|
262
|
-
};
|
|
263
|
-
restore = () => {
|
|
264
|
-
if (hadOwnDefine) registry.define = inner;
|
|
265
|
-
else delete (registry as unknown as Record<string, unknown>).define;
|
|
266
|
-
};
|
|
267
|
-
} catch {
|
|
268
|
-
// A frozen registry (SES lockdown, a sealed polyfill, a hardened extension
|
|
269
|
-
// page): we cannot get ahead of define() there. Leave `handled` false so the
|
|
270
|
-
// caller installs on the returned class instead — the OLD, too-late timing, but
|
|
271
|
-
// registration itself still succeeds. Getting this wrong the other way would
|
|
272
|
-
// take all 80 elements down in that environment to fix three props in it.
|
|
273
|
-
}
|
|
274
|
-
try {
|
|
275
|
-
return { result: define(), handled };
|
|
276
|
-
} finally {
|
|
277
|
-
restore?.();
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Marks a setter as one of ours, so the wrap is idempotent WITHOUT being permanent.
|
|
283
|
-
*
|
|
284
|
-
* The mark goes on the setter function rather than on the element, and that is the
|
|
285
|
-
* whole subtlety: component-register installs a FRESH instance accessor from
|
|
286
|
-
* `initializeProps` on every (re)connect after a release, which throws our wrapper
|
|
287
|
-
* away. An element-level "already done" flag would then skip re-wrapping and the
|
|
288
|
-
* property would quietly go write-only again on the second mount. An unmarked setter
|
|
289
|
-
* is by definition a new one, so it gets wrapped again.
|
|
290
|
-
*/
|
|
291
|
-
const FLAG_READ_BACK = Symbol('kai-flag-read-back');
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Wrap the instance accessor component-register created for `name` so every value
|
|
295
|
-
* written to it — a consumer's assignment, or the `undefined` write-back that
|
|
296
|
-
* `attributeChangedCallback` performs after a `toggleAttribute` — is resolved through
|
|
297
|
-
* the same policy `flag()` uses.
|
|
298
|
-
*
|
|
299
|
-
* TIMING. This must run from the facade body, i.e. during `connectedCallback` AFTER
|
|
300
|
-
* `initializeProps`, and that is not a detail: `initializeProps` harvests any value
|
|
301
|
-
* set on the element BEFORE upgrade (`value = element[key]`) and only then installs
|
|
302
|
-
* the accessor. Wrapping earlier (on the prototype, the way `installNonReflectingProps`
|
|
303
|
-
* does) would be shadowed by that accessor and would also sit in front of the harvest —
|
|
304
|
-
* the same class of defect `define-upgrade-ordering.test.tsx` pins for attributes.
|
|
305
|
-
*/
|
|
306
|
-
function installFlagReadBack(element: HTMLElement, name: string, attribute: string): void {
|
|
307
|
-
const inner = Object.getOwnPropertyDescriptor(element, name);
|
|
308
|
-
if (!inner?.get || !inner.set) {
|
|
309
|
-
// Reached only if `name` is not a declared prop of this element — a typo, or a
|
|
310
|
-
// facade reflecting something it never declared. Warn rather than no-op silently;
|
|
311
|
-
// a silent skip here would look exactly like a working read-back.
|
|
312
|
-
console.warn(
|
|
313
|
-
`reflectFlag("${name}"): no such declared prop on <${element.localName}> — ` +
|
|
314
|
-
`the attribute will still reflect, but the property will not read back.`,
|
|
315
|
-
);
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
const { get, set } = inner;
|
|
319
|
-
if ((set as { [FLAG_READ_BACK]?: true })[FLAG_READ_BACK]) return;
|
|
320
|
-
|
|
321
|
-
const wrapped = function (this: HTMLElement, value: unknown) {
|
|
322
|
-
set.call(this, resolveFlag(this, value, attribute));
|
|
323
|
-
} as ((value: unknown) => void) & { [FLAG_READ_BACK]?: true };
|
|
324
|
-
wrapped[FLAG_READ_BACK] = true;
|
|
325
|
-
|
|
326
|
-
Object.defineProperty(element, name, {
|
|
327
|
-
get,
|
|
328
|
-
set: wrapped,
|
|
329
|
-
enumerable: inner.enumerable ?? true,
|
|
330
|
-
configurable: true,
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
// Seed, but ONLY upwards. The value sitting in the prop store right now may already
|
|
334
|
-
// be the broken one: `<el loading>` parses to `undefined` in `initializeProps`
|
|
335
|
-
// exactly as it does in the write-back, so without this the bare-attribute case
|
|
336
|
-
// would still read back `undefined` until something else wrote to the prop.
|
|
337
|
-
//
|
|
338
|
-
// WHY NOT SEED `false` TOO. Writing `false` over an `undefined` would look tidier
|
|
339
|
-
// and is wrong: for props declared with an `undefined` default, `undefined` MEANS
|
|
340
|
-
// "the consumer has not set this", and at least one caller depends on telling that
|
|
341
|
-
// apart from an explicit `false` — `wireDisclosure` seeds from `defaultOpen` only
|
|
342
|
-
// while `open` is unset, so a blanket `false` seed would clobber
|
|
343
|
-
// `<el default-open>` on every mount. Promoting only a present attribute to `true`
|
|
344
|
-
// fixes the read-back without inventing an opinion the author never expressed.
|
|
345
|
-
const current = get.call(element);
|
|
346
|
-
if (typeof current !== 'boolean' && resolveFlag(element, current, attribute)) {
|
|
347
|
-
wrapped.call(element, true);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/** Underlying flag resolution; see `WebComponentContext.flag`. */
|
|
352
|
-
function resolveFlag(element: HTMLElement, value: unknown, attribute: string): boolean {
|
|
353
|
-
if (value === true) return true;
|
|
354
|
-
// An explicit JS false wins over a present attribute (see WebComponentContext.flag); this also prevents a feedback loop when an effect writes the attribute it reads.
|
|
355
|
-
if (value === false) return false;
|
|
356
|
-
return element.hasAttribute(attribute) && element.getAttribute(attribute) !== 'false';
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
type FacadeComponent<P, E> = (props: P, ctx: WebComponentContext<E>) => JSX.Element;
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Register a Solid facade as a Shadow-DOM custom element.
|
|
363
|
-
*
|
|
364
|
-
* - Renders into the element's shadow root (solid-element's default), with the
|
|
365
|
-
* compiled kit CSS injected via a `<style>` so Tailwind classes apply inside.
|
|
366
|
-
* - Creates a portal mount node inside the shadow root and provides it through
|
|
367
|
-
* `ChatConfig` so the kit's overlays stay inside the shadow root.
|
|
368
|
-
* - Gives the facade a `dispatch(type, detail)` helper that fires non-bubbling,
|
|
369
|
-
* non-composed CustomEvents off the host element (consumers listen directly on
|
|
370
|
-
* the element, so bubbling/composed would only cause consumer collisions).
|
|
371
|
-
* - Idempotent: redefining an already-registered tag is a no-op.
|
|
372
|
-
*/
|
|
373
|
-
export function defineWebComponent<P extends Record<string, unknown>, E = Record<string, unknown>>(
|
|
374
|
-
tag: string,
|
|
375
|
-
propDefaults: P,
|
|
376
|
-
Facade: FacadeComponent<P, E>,
|
|
377
|
-
): void {
|
|
378
|
-
// SSR-safe: skip registration when the Custom Elements API is not available
|
|
379
|
-
// (Node.js / edge runtimes during SSR/prerender). Importing this module in a
|
|
380
|
-
// server context will silently no-op rather than throwing "customElements is
|
|
381
|
-
// not defined" or "window is not defined". The element registers on the client
|
|
382
|
-
// when the browser loads the bundle.
|
|
383
|
-
if (typeof customElements === 'undefined') return;
|
|
384
|
-
if (customElements.get(tag)) return;
|
|
385
|
-
|
|
386
|
-
// Guard against prop names that collide with global reflected HTMLElement IDL
|
|
387
|
-
// attributes. component-register sets `this[prop] = undefined` in the element
|
|
388
|
-
// constructor; for these, the native setter coerces undefined → "undefined"
|
|
389
|
-
// and reflects it to an attribute — which is illegal in a CE constructor and
|
|
390
|
-
// throws a cryptic "result must not have attributes". Fail loud and early with
|
|
391
|
-
// a name + fix instead. (Use a prefixed attribute, e.g. `bar-title`/`headline`.)
|
|
392
|
-
const RESERVED = ['title', 'id', 'slot', 'lang'];
|
|
393
|
-
for (const key of Object.keys(propDefaults)) {
|
|
394
|
-
if (RESERVED.includes(key)) {
|
|
395
|
-
throw new Error(
|
|
396
|
-
`defineWebComponent(${tag}): prop "${key}" collides with a global HTMLElement ` +
|
|
397
|
-
`attribute and will break the element constructor. Rename it (e.g. ` +
|
|
398
|
-
`"bar-title" → barTitle, a source title → headline).`,
|
|
399
|
-
);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Every element gets a `theme` property/attribute. It drives a `.dark` class on
|
|
404
|
-
// an inner wrapper, which the injected kit CSS already styles — so dark mode
|
|
405
|
-
// works in standalone Shadow-DOM usage with no token duplication.
|
|
406
|
-
//
|
|
407
|
-
// The `as` annotation is load-bearing, not decoration: scripts/gen-element-api.mjs
|
|
408
|
-
// reads THIS object literal to learn which props every element gets for free, and
|
|
409
|
-
// takes each one's type and doc comment off the checker. Without it the inferred
|
|
410
|
-
// type is the literal `"auto"`. Add a universal prop here and it appears in
|
|
411
|
-
// element-meta.json, the generated .d.ts, custom-elements.json and llms-full.txt
|
|
412
|
-
// for all 79 elements, with no second list to update.
|
|
413
|
-
const defaults = {
|
|
414
|
-
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
415
|
-
theme: 'auto' as 'light' | 'dark' | 'auto',
|
|
416
|
-
...propDefaults,
|
|
417
|
-
};
|
|
418
|
-
|
|
419
|
-
// Props that NAME a reflected global IDL accessor (today, across all 80 elements:
|
|
420
|
-
// `role` on kai-message, `hidden` on kai-resizable-item, `autofocus` on
|
|
421
|
-
// kai-confirm). Unlike RESERVED (which throws), these are legitimate domain props
|
|
422
|
-
// — `role` is the SPEAKER, `hidden` and `autofocus` mean what they say — and they
|
|
423
|
-
// stay usable, but the native accessor must not be the one that receives them.
|
|
424
|
-
// See defineWithNonReflectingProps for what the native setter does to the author's
|
|
425
|
-
// markup if it is, and why the shadowing has to be in place before the registry
|
|
426
|
-
// sees the class. RESERVED names never get here; they already threw above.
|
|
427
|
-
const shadowedProps = Object.keys(defaults).filter((key) => reflectedGlobalPropNames().has(key));
|
|
428
|
-
|
|
429
|
-
const renderFacade = (props: typeof defaults, options: { element: object }) => {
|
|
430
|
-
const element = options.element as HTMLElement;
|
|
431
|
-
let portalNode!: HTMLDivElement;
|
|
432
|
-
|
|
433
|
-
const dispatch = ((type: string, detail?: unknown) =>
|
|
434
|
-
element.dispatchEvent(
|
|
435
|
-
new CustomEvent(type, { detail, bubbles: false, composed: false }),
|
|
436
|
-
)) as WebComponentContext<E>['dispatch'];
|
|
437
|
-
|
|
438
|
-
// Reads `props[name]` (reactive) and falls back to attribute presence so
|
|
439
|
-
// bare boolean attributes behave like normal HTML. See WebComponentContext.
|
|
440
|
-
const flag = (name: string) =>
|
|
441
|
-
resolveFlag(element, (props as Record<string, unknown>)[name], toAttr(name));
|
|
442
|
-
|
|
443
|
-
// Reflect a boolean prop to its attribute and keep the property readable. See
|
|
444
|
-
// WebComponentContext.reflectFlag for the defect this exists to close.
|
|
445
|
-
const reflectFlag: WebComponentContext<E>['reflectFlag'] = (name, source) => {
|
|
446
|
-
const attribute = toAttr(name);
|
|
447
|
-
installFlagReadBack(element, name, attribute);
|
|
448
|
-
createEffect(() => {
|
|
449
|
-
const on = source ? source() : flag(name);
|
|
450
|
-
// `undefined` means the caller's source is not ready yet (a controller a
|
|
451
|
-
// primitive has not handed up). Leave the author's attribute alone rather
|
|
452
|
-
// than writing a guessed OFF over it.
|
|
453
|
-
if (on === undefined) return;
|
|
454
|
-
element.toggleAttribute(attribute, on);
|
|
455
|
-
});
|
|
456
|
-
};
|
|
457
|
-
|
|
458
|
-
// Attach imperative methods onto the host instance. See WebComponentContext.expose.
|
|
459
|
-
// Uses defineProperty so a method can shadow an inherited getter-only accessor
|
|
460
|
-
// (e.g. `focus`/`blur`) which a plain assignment would throw on. A method name
|
|
461
|
-
// must NOT collide with a declared prop (the prop's accessor would be clobbered)
|
|
462
|
-
// — pick a distinct verb (e.g. `send()` next to a `submit` prop). Failures warn
|
|
463
|
-
// and skip rather than breaking the element's render.
|
|
464
|
-
const expose: WebComponentContext<E>['expose'] = (methods) => {
|
|
465
|
-
for (const [name, fn] of Object.entries(methods)) {
|
|
466
|
-
try {
|
|
467
|
-
Object.defineProperty(element, name, { value: fn, writable: true, configurable: true });
|
|
468
|
-
} catch (err) {
|
|
469
|
-
console.warn(`defineWebComponent(${tag}): could not expose method "${name}"`, err);
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
|
|
474
|
-
const isDark = createDarkMode(() => props.theme as string | undefined);
|
|
475
|
-
|
|
476
|
-
// Prefer a single shared stylesheet adopted into this shadow root; only emit
|
|
477
|
-
// an inline <style> when Constructable Stylesheets aren't supported.
|
|
478
|
-
//
|
|
479
|
-
// Adopt SYNCHRONOUSLY, before solid-element inserts the rendered content into
|
|
480
|
-
// the shadow root. component-register attaches the shadow root lazily on first
|
|
481
|
-
// `renderRoot` access — which happens during that insert, AFTER this facade
|
|
482
|
-
// function returns. So we pre-attach the shadow root here (with the same
|
|
483
|
-
// `mode: 'open'` the renderRoot getter would use, making it a no-op for
|
|
484
|
-
// solid-element) and adopt the sheet now. If we deferred to onMount instead,
|
|
485
|
-
// the content would paint UNSTYLED and then animate from that bare state to
|
|
486
|
-
// its resting style once the sheet landed — every `transition-colors` button
|
|
487
|
-
// and menu/dropdown trigger flashing as if hovered-then-un-hovered on first
|
|
488
|
-
// render. Adopting first means the very first computed style of every node is
|
|
489
|
-
// already the resting style, so no transition can fire on load.
|
|
490
|
-
const sheet = getSharedSheet();
|
|
491
|
-
if (sheet) {
|
|
492
|
-
const root = element.shadowRoot ?? element.attachShadow({ mode: 'open' });
|
|
493
|
-
if ('adoptedStyleSheets' in root && !root.adoptedStyleSheets.includes(sheet)) {
|
|
494
|
-
root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
return (
|
|
499
|
-
<>
|
|
500
|
-
<Show when={!sheet}>
|
|
501
|
-
<style>{ELEMENT_CSS}</style>
|
|
502
|
-
</Show>
|
|
503
|
-
{/* display:contents — no layout box; carries the .dark token scope and
|
|
504
|
-
re-roots the inherited `color` to the active mode's foreground, so text
|
|
505
|
-
without an explicit color class (e.g. attachment filename labels) follows
|
|
506
|
-
light/dark instead of inheriting the host page's color. */}
|
|
507
|
-
<div classList={{ dark: isDark() }} style={{ display: 'contents', color: 'var(--color-foreground)' }}>
|
|
508
|
-
<div ref={portalNode} />
|
|
509
|
-
<ChatConfig portalMount={portalNode}>
|
|
510
|
-
{Facade(props as unknown as P, {
|
|
511
|
-
element,
|
|
512
|
-
dispatch,
|
|
513
|
-
flag,
|
|
514
|
-
reflectFlag,
|
|
515
|
-
expose,
|
|
516
|
-
dark: isDark,
|
|
517
|
-
})}
|
|
518
|
-
</ChatConfig>
|
|
519
|
-
</div>
|
|
520
|
-
</>
|
|
521
|
-
);
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
// Element-layer diagnostics: report the three `kai-` contract violations that
|
|
525
|
-
// are otherwise silent (an array or object prop set as an HTML attribute, the
|
|
526
|
-
// same array reference handed back, a new array of the same item objects).
|
|
527
|
-
//
|
|
528
|
-
// HERE because this function is the single choke point — every kai-* element
|
|
529
|
-
// registers through it, which `elements/slots.test.ts` already enforces — so
|
|
530
|
-
// one call covers every element with no per-element work and no second list.
|
|
531
|
-
//
|
|
532
|
-
// Through the pre-define seam, not after the fact, because the registry
|
|
533
|
-
// snapshots lifecycle callbacks at definition time; see `alsoPatch` above.
|
|
534
|
-
// `elementDiagnosticsWanted` is asked first so a tag with no non-scalar prop
|
|
535
|
-
// (37 of the 80) does not even pay for the registry interception.
|
|
536
|
-
const wantsDiagnostics = elementDiagnosticsWanted(tag);
|
|
537
|
-
|
|
538
|
-
const { result: Ctor, handled } = defineWithNonReflectingProps(
|
|
539
|
-
tag,
|
|
540
|
-
shadowedProps,
|
|
541
|
-
() => customElement(tag, defaults, renderFacade),
|
|
542
|
-
wantsDiagnostics ? (proto) => installElementDiagnostics(tag, proto) : undefined,
|
|
543
|
-
);
|
|
544
|
-
|
|
545
|
-
// Belt and braces for the one path the wrap cannot see: if `customElements.define`
|
|
546
|
-
// was never reached for this tag (a registry that defines lazily, or a future
|
|
547
|
-
// solid-element that stops calling it synchronously), install on the returned class
|
|
548
|
-
// instead. That is the OLD, too-late timing — it still protects every element
|
|
549
|
-
// constructed from here on, it just cannot rescue an already-upgraded one. Skipped
|
|
550
|
-
// in the normal case, where the accessors are already on this same prototype.
|
|
551
|
-
const proto = (Ctor as unknown as { prototype?: object } | undefined)?.prototype;
|
|
552
|
-
if (!handled && proto) installNonReflectingProps(proto, shadowedProps);
|
|
553
|
-
|
|
554
|
-
// NOTE the diagnostics have no equivalent late fallback, and must not get one.
|
|
555
|
-
// The non-reflecting props still work when installed late (they only have to
|
|
556
|
-
// beat the NEXT constructor); the diagnostics do not, because the registry has
|
|
557
|
-
// already snapshotted the lifecycle callbacks it will invoke. Installing them
|
|
558
|
-
// here would produce a wrapper that is visibly present and never called —
|
|
559
|
-
// which is worse than not installing it, since it would read as coverage. So
|
|
560
|
-
// in the one environment the pre-define seam cannot reach (a frozen registry:
|
|
561
|
-
// SES lockdown, a sealed polyfill), element diagnostics are simply absent, and
|
|
562
|
-
// every other element behaviour is unaffected.
|
|
563
|
-
}
|