@kitn.ai/ui 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
- package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/arrow-down-CjRU3JgV.js +1 -0
- package/dist/arrow-left-Bnpb1UEW.js +1 -0
- package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
- package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
- package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
- package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
- package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
- package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
- package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
- package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
- package/dist/check-njkVdZu2.js +1 -0
- package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
- package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
- package/dist/chevron-down-B72s6PXR.js +1 -0
- package/dist/chevron-right-BatuHzUm.js +1 -0
- package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
- package/dist/circle-check-B62pODB3.js +1 -0
- package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
- package/dist/circle-zx0ByzY9.js +1 -0
- package/dist/code-block-ClMLKb7C.js +1 -0
- package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
- package/dist/components/chat-thread.d.ts +89 -1
- package/dist/components/conversation-item.d.ts +16 -0
- package/dist/components/conversation-panel.d.ts +29 -0
- package/dist/components/home-panel.d.ts +34 -0
- package/dist/components/widget-tab-bar.d.ts +16 -0
- package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
- package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
- package/dist/construct-cli.es.js +185 -17
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
- package/dist/controllable-CnGpMF6r.js +1 -0
- package/dist/conversation-item-BxwQLaFJ.js +1 -0
- package/dist/conversation-list-BCfGN1JU.js +1 -0
- package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
- package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
- package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
- package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
- package/dist/custom-elements.json +51 -2
- package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
- package/dist/define-By-uL588.js +1 -0
- package/dist/define.js +2 -2
- package/dist/define.server.js +2 -2
- package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
- package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.js +1 -1
- package/dist/elements/checkbox.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +3 -3
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-grid.js +1 -1
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/radio-group.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +1 -1
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/select.js +1 -1
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slider.js +1 -1
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +20 -4
- package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
- package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
- package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
- package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
- package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
- package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
- package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
- package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2842 -2703
- package/dist/index.server.js +2820 -2681
- package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
- package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
- package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
- package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
- package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
- package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
- package/dist/mcp.es.js +79 -5
- package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
- package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
- package/dist/message-circle-DruwObfX.js +1 -0
- package/dist/message-square-BG6q6mlm.js +1 -0
- package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
- package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
- package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
- package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
- package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
- package/dist/play-BvKKq3fX.js +1 -0
- package/dist/primitives/conversation-store.d.ts +54 -0
- package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
- package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
- package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
- package/dist/react/index.d.ts +393 -0
- package/dist/react.js +20 -20
- package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
- package/dist/register-impl-B1hLkrI8.js +424 -0
- package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
- package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
- package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
- package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
- package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
- package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
- package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
- package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
- package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
- package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
- package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
- package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
- package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
- package/dist/solid.d.ts +6 -2
- package/dist/solid.js +217 -210
- package/dist/solid.server.js +217 -210
- package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
- package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
- package/dist/store-Ciyk6eZG.js +1 -0
- package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
- package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
- package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
- package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
- package/dist/theme.tokens.css +28 -0
- package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
- package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
- package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
- package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
- package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
- package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/ui/dock.d.ts +29 -0
- package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
- package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
- package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
- package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
- package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
- package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
- package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
- package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
- package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
- package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
- package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
- package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
- package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
- package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
- package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
- package/dist/x-Z5UntkIJ.js +1 -0
- package/frameworks/react/index.tsx +14 -4
- package/llms-full.txt +7 -2
- package/package.json +16 -16
- package/src/elements/element-meta.json +49 -6
- package/theme.css +28 -0
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-Br0qtpsz.js +0 -1
- package/dist/arrow-left-Dj7xgE12.js +0 -1
- package/dist/check-DPeeMUYx.js +0 -1
- package/dist/chevron-down-CHSWk7ZT.js +0 -1
- package/dist/chevron-right-B7l_fMgx.js +0 -1
- package/dist/circle-Bb0yOpqM.js +0 -1
- package/dist/circle-check-BGZpCiz7.js +0 -1
- package/dist/code-block-CUQ5mtv0.js +0 -1
- package/dist/controllable-D43BKmtX.js +0 -1
- package/dist/conversation-list-D4lLU_yS.js +0 -1
- package/dist/define-CGGX-7Vg.js +0 -1
- package/dist/message-circle-Xf8Q-vZp.js +0 -1
- package/dist/message-square-Cxnwgkns.js +0 -1
- package/dist/play-OFIvYXUQ.js +0 -1
- package/dist/register-impl-C7rENvPK.js +0 -424
- package/dist/store-7eoadydQ.js +0 -1
- package/dist/x-C5m1JFgi.js +0 -1
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -131
- package/src/agent-tooling/construct/codegen.ts +0 -1353
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
- package/src/agent-tooling/construct/schema.ts +0 -371
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -518
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -218
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -212
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -185
- package/src/elements/element-types.d.ts +0 -4337
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/styles.css +0 -328
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -428
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -165
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -53
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -584
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
// src/components/card-renderer.tsx
|
|
2
|
-
// The Solid single-envelope dispatcher: pick the card for envelope.type and render it
|
|
3
|
-
// with the envelope spread onto its props. Routing uses the ambient CardProvider
|
|
4
|
-
// (useCardHost). Unknown type → CardFallback + a one-shot contract `error` emit.
|
|
5
|
-
// Invalid data → two-tier validation, mirroring the remote transport; see below.
|
|
6
|
-
import { createEffect, createMemo, untrack, Show, type JSX } from 'solid-js';
|
|
7
|
-
import { Dynamic } from 'solid-js/web';
|
|
8
|
-
import type { CardContext, CardEnvelope, CardHost } from '../primitives/card-contract';
|
|
9
|
-
import { useCardHost } from '../primitives/card-host';
|
|
10
|
-
import { emitCardEvent } from '../primitives/card-routing';
|
|
11
|
-
import { BUILTIN_CARD_COMPONENTS, mergeCardComponents, type CardComponentMap } from '../primitives/card-registry';
|
|
12
|
-
import type { JsonSchema } from '../primitives/card-validate';
|
|
13
|
-
import { cardValidationMessage, validateCardData, type CardValidationReport } from '../primitives/card-validate-cards';
|
|
14
|
-
import { CardFallback } from './card-fallback';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Consumer card schemas by envelope type: `{ 'pricing-table': pricingSchema }`.
|
|
18
|
-
*
|
|
19
|
-
* `object`, NOT `JsonSchema`, and that is measured rather than lazy. A real schema
|
|
20
|
-
* is either imported from a `.json` file — where TypeScript widens `"type": "object"`
|
|
21
|
-
* to `string`, which `JsonSchema`'s literal union rejects — or written out with the
|
|
22
|
-
* `$schema` / `title` / `description` / `additionalProperties` keywords that
|
|
23
|
-
* `JsonSchema` does not describe at all, which excess-property checking rejects.
|
|
24
|
-
* Both are the ordinary case, so the tighter type would make the normal way of
|
|
25
|
-
* supplying a schema a compile error. `src/schemas/index.ts` widens `CardSchema`
|
|
26
|
-
* for exactly this reason and says so at length (lines 92-110 there).
|
|
27
|
-
*
|
|
28
|
-
* The value is handed straight to `validateCardData`, which reads only the keywords
|
|
29
|
-
* `validateAgainstSchema` implements and ignores the rest.
|
|
30
|
-
*/
|
|
31
|
-
export type CardSchemaMap = Record<string, object>;
|
|
32
|
-
|
|
33
|
-
export interface CardRendererProps {
|
|
34
|
-
envelope: CardEnvelope;
|
|
35
|
-
/** Add/override type→component entries (merged over the built-ins). */
|
|
36
|
-
types?: CardComponentMap;
|
|
37
|
-
/**
|
|
38
|
-
* JSON Schemas for the card types this app renders, keyed by `envelope.type`.
|
|
39
|
-
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
40
|
-
*
|
|
41
|
-
* The companion of `types`, and the half that was missing: `types` says WHAT
|
|
42
|
-
* draws a `pricing-table`, `schemas` says what a VALID one looks like. Without it
|
|
43
|
-
* the kit checks its own seven built-ins and leaves the developer's own card —
|
|
44
|
-
* the one the app actually cares about — as the only unvalidated thing on screen.
|
|
45
|
-
*
|
|
46
|
-
* A schema given here WINS over a built-in of the same name, matching
|
|
47
|
-
* `mergeCardComponents`, where the consumer's entry is spread over ours.
|
|
48
|
-
*/
|
|
49
|
-
schemas?: CardSchemaMap;
|
|
50
|
-
/**
|
|
51
|
-
* Validate `envelope.data` against the built-in schema for `envelope.type` before
|
|
52
|
-
* rendering. Default `true`.
|
|
53
|
-
*
|
|
54
|
-
* ON IN PRODUCTION TOO, DELIBERATELY. The obvious alternative, stripping the check
|
|
55
|
-
* from production builds, inverts the point: a model emitting a bad shape is a
|
|
56
|
-
* production failure mode, so stripping it means the developer's USERS get the
|
|
57
|
-
* broken card while the developer's laptop looks fine. The cost is the projected
|
|
58
|
-
* schema data for all seven card types, measured by building this package twice
|
|
59
|
-
* (once with the projection stubbed to `{}`) rather than estimated: +834 B gzip on
|
|
60
|
-
* `dist/index.js` and +775 B gzip on the elements register bundle. That is below
|
|
61
|
-
* the noise floor of a package that already ships a Solid runtime and `marked`.
|
|
62
|
-
*
|
|
63
|
-
* Set `false` to opt out. A type with no schema at all — no built-in, and none
|
|
64
|
-
* supplied through `schemas` — is never validated either way.
|
|
65
|
-
*/
|
|
66
|
-
validateCards?: boolean;
|
|
67
|
-
/**
|
|
68
|
-
* The custom-element host node to emit off when no `CardProvider` is above this
|
|
69
|
-
* renderer: events leave as the bubbling, composed `kai-card` CustomEvent
|
|
70
|
-
* (`emitCardEvent`), so `listenForCardEvents(element)` — or a plain
|
|
71
|
-
* `addEventListener('kai-card', …)` on the element — receives them.
|
|
72
|
-
*
|
|
73
|
-
* This is what makes cards INSIDE `<kai-chat>`/`<kai-message>`/`<kai-thread>`
|
|
74
|
-
* interactive: those facades pass their own host element down here, and
|
|
75
|
-
* with neither this nor a `CardProvider` every emit — ready/action/submit/
|
|
76
|
-
* dismiss/reopen and the contract `error` — used to be silently discarded.
|
|
77
|
-
* An ambient `CardProvider` still wins when present.
|
|
78
|
-
*/
|
|
79
|
-
hostElement?: HTMLElement;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* The effective CardHost: an ambient `CardProvider` when present, otherwise a
|
|
84
|
-
* bubbling-`kai-card` host over `hostElement`, otherwise none (a truly bare card).
|
|
85
|
-
*
|
|
86
|
-
* The fallback's `context()` mirrors the remote transport's `defaultContext()`
|
|
87
|
-
* (`remote/provider-runtime.ts`): the contract return is non-optional, but no
|
|
88
|
-
* native card reads it today — the element facades own theme/locale through
|
|
89
|
-
* `ChatConfig`, not through card context.
|
|
90
|
-
*/
|
|
91
|
-
function resolveHost(ctxHost: CardHost | undefined, hostElement: HTMLElement | undefined): CardHost | undefined {
|
|
92
|
-
if (ctxHost) return ctxHost;
|
|
93
|
-
if (!hostElement) return undefined;
|
|
94
|
-
const context = (): CardContext => ({ theme: { mode: 'light' }, locale: 'en' });
|
|
95
|
-
return { context, emit: (event) => emitCardEvent(hostElement, event) };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* True when the consumer registered a schema for this type.
|
|
100
|
-
*
|
|
101
|
-
* Spelled out rather than left to `validateCardData` because it is a GATE, not a
|
|
102
|
-
* lookup: a consumer schema is the one thing that authorises validating a renderer
|
|
103
|
-
* that is not ours. `hasOwnProperty` (not `in`) so a type named `toString` cannot
|
|
104
|
-
* pick up `Object.prototype`, and the `typeof` check so a `{ 'x': null }` entry
|
|
105
|
-
* reads as "not registered" instead of matching and then validating against
|
|
106
|
-
* nothing. The same predicate lives in elements/cards.tsx for `<kai-cards>`; the
|
|
107
|
-
* two dispatchers already duplicate this rule (they compare component identity vs
|
|
108
|
-
* tag identity), so keep them in step.
|
|
109
|
-
*/
|
|
110
|
-
export function hasConsumerSchema(schemas: CardSchemaMap | undefined, type: string): boolean {
|
|
111
|
-
if (!schemas || !Object.prototype.hasOwnProperty.call(schemas, type)) return false;
|
|
112
|
-
const s = schemas[type];
|
|
113
|
-
return typeof s === 'object' && s !== null;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
export function CardRenderer(props: CardRendererProps): JSX.Element {
|
|
117
|
-
const ctxHost = useCardHost();
|
|
118
|
-
const host = createMemo(() => resolveHost(ctxHost, props.hostElement));
|
|
119
|
-
const map = createMemo(() => mergeCardComponents(props.types));
|
|
120
|
-
const entry = createMemo(() => map()[props.envelope.type]);
|
|
121
|
-
|
|
122
|
-
// MIRRORS src/remote/provider-runtime.ts:139-147. That transport runs
|
|
123
|
-
// `validateAgainstSchema(renderer.schema, envelope.data)` and, on failure, renders
|
|
124
|
-
// a placeholder and emits `{ kind: 'error', cardId, message }`. This is the same
|
|
125
|
-
// behaviour on the native path, split into two tiers so a card that renders
|
|
126
|
-
// acceptably today is reported without being replaced. Keep the two in step.
|
|
127
|
-
//
|
|
128
|
-
// WHAT AUTHORISES A CHECK IS A SCHEMA THAT DESCRIBES WHAT IS ON SCREEN.
|
|
129
|
-
//
|
|
130
|
-
// `types` lets a consumer replace a built-in type's renderer with their own
|
|
131
|
-
// (`types={{ confirm: MyConfirm }}`), and `confirm.schema.json` describes OUR
|
|
132
|
-
// ConfirmCard's data, not theirs. Validating a replaced renderer's payload against
|
|
133
|
-
// our schema would reject shapes that are correct for the component actually on
|
|
134
|
-
// screen. So OUR schema applies only to OUR component: the identity check is
|
|
135
|
-
// against BUILTIN_CARD_COMPONENTS, the same object `mergeCardComponents` puts in
|
|
136
|
-
// the map when nothing overrode the type, and the same one elements/message.tsx
|
|
137
|
-
// reuses for a non-overridden built-in.
|
|
138
|
-
//
|
|
139
|
-
// A schema the CONSUMER registered is the other way round: they wrote it about
|
|
140
|
-
// their own card, and it is the shape their model was told to emit, so it applies
|
|
141
|
-
// whichever component draws the type. That covers the case the identity check can
|
|
142
|
-
// never reach — a `pricing-table` that is nobody's built-in — and it re-enables
|
|
143
|
-
// the check on an overridden built-in, where the objection was our schema and not
|
|
144
|
-
// the checking.
|
|
145
|
-
const report = createMemo<CardValidationReport | null>(() => {
|
|
146
|
-
if (props.validateCards === false) return null;
|
|
147
|
-
if (
|
|
148
|
-
!hasConsumerSchema(props.schemas, props.envelope.type) &&
|
|
149
|
-
entry() !== BUILTIN_CARD_COMPONENTS[props.envelope.type]
|
|
150
|
-
) {
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
// `schemas` is passed even when the gate opened on renderer identity, so a
|
|
154
|
-
// consumer schema for a built-in type wins over ours — `schemaFor`'s rule.
|
|
155
|
-
return validateCardData(props.envelope.type, props.envelope.data, props.schemas as Record<string, JsonSchema> | undefined);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
// One `error` per distinct problem, both tiers. Keyed on the message rather than
|
|
159
|
-
// on mount because streaming hands this component a NEW envelope object per chunk
|
|
160
|
-
// (that is the documented way to re-render), so an identity-triggered emit would
|
|
161
|
-
// fire once per chunk for one bad card.
|
|
162
|
-
let lastEmitted: string | null = null;
|
|
163
|
-
createEffect(() => {
|
|
164
|
-
const r = report();
|
|
165
|
-
if (!entry()) return; // an unknown TYPE reports itself, once, in UnknownCard
|
|
166
|
-
if (!r || r.ok) {
|
|
167
|
-
lastEmitted = null;
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const message = cardValidationMessage(r);
|
|
171
|
-
if (message === lastEmitted) return;
|
|
172
|
-
lastEmitted = message;
|
|
173
|
-
host()?.emit({ kind: 'error', cardId: props.envelope.id, message });
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
return (
|
|
177
|
-
<Show when={entry()} fallback={<UnknownCard envelope={props.envelope} hostElement={props.hostElement} />}>
|
|
178
|
-
{(comp) => (
|
|
179
|
-
<Show
|
|
180
|
-
when={report()?.tier === 'hard'}
|
|
181
|
-
// SOFT and valid both take this branch: the card renders exactly as it
|
|
182
|
-
// does today. The soft failure is reported through the effect above and
|
|
183
|
-
// changes nothing on screen, which is the whole point of the tiering.
|
|
184
|
-
fallback={<Dynamic component={comp()} envelope={props.envelope} host={host()} />}
|
|
185
|
-
>
|
|
186
|
-
{/* HARD: there is nothing to draw, so name the field instead. */}
|
|
187
|
-
<CardFallback type={props.envelope.type} cardId={props.envelope.id} reason={report()!.summary} />
|
|
188
|
-
</Show>
|
|
189
|
-
)}
|
|
190
|
-
</Show>
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/** Renders the fallback and emits exactly one `error` (untracked, on first render). */
|
|
195
|
-
function UnknownCard(props: { envelope: CardEnvelope; hostElement?: HTMLElement }): JSX.Element {
|
|
196
|
-
const ctxHost = useCardHost();
|
|
197
|
-
untrack(() =>
|
|
198
|
-
resolveHost(ctxHost, props.hostElement)?.emit({
|
|
199
|
-
kind: 'error',
|
|
200
|
-
cardId: props.envelope.id,
|
|
201
|
-
message: `Unsupported card type: ${props.envelope.type}`,
|
|
202
|
-
}),
|
|
203
|
-
);
|
|
204
|
-
return <CardFallback type={props.envelope.type} cardId={props.envelope.id} />;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** Function sugar: renderCard(env) ≡ <CardRenderer envelope={env} />. */
|
|
208
|
-
export function renderCard(
|
|
209
|
-
envelope: CardEnvelope,
|
|
210
|
-
opts?: { types?: CardComponentMap; schemas?: CardSchemaMap; validateCards?: boolean },
|
|
211
|
-
): JSX.Element {
|
|
212
|
-
return (
|
|
213
|
-
<CardRenderer
|
|
214
|
-
envelope={envelope}
|
|
215
|
-
types={opts?.types}
|
|
216
|
-
schemas={opts?.schemas}
|
|
217
|
-
validateCards={opts?.validateCards}
|
|
218
|
-
/>
|
|
219
|
-
);
|
|
220
|
-
}
|
package/src/components/card.tsx
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import { type JSX, Show, splitProps, mergeProps, createSignal, createUniqueId } from 'solid-js';
|
|
2
|
-
import { Dynamic } from 'solid-js/web';
|
|
3
|
-
import { cn } from '../utils/cn';
|
|
4
|
-
import { AlertTriangle, X } from 'lucide-solid';
|
|
5
|
-
|
|
6
|
-
export interface CardProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
7
|
-
/** Heading rendered in the card chrome (the contract's CardEnvelope.title).
|
|
8
|
-
* NB: NOT `title` — `title` is a reserved IDL attr (see define.tsx RESERVED). */
|
|
9
|
-
heading?: string;
|
|
10
|
-
/** Optional supporting text under the heading. */
|
|
11
|
-
description?: string;
|
|
12
|
-
/** Media region (image/icon) rendered above the heading. */
|
|
13
|
-
media?: JSX.Element;
|
|
14
|
-
/** Footer action region (buttons). */
|
|
15
|
-
actions?: JSX.Element;
|
|
16
|
-
/** When set, the card renders its standard inline error state INSTEAD of body. */
|
|
17
|
-
errorMessage?: string;
|
|
18
|
-
/** Compact spacing for dense lists of cards. */
|
|
19
|
-
dense?: boolean;
|
|
20
|
-
/** Stable id for the heading (so composing cards can `aria-labelledby` it).
|
|
21
|
-
* Auto-generated when omitted. */
|
|
22
|
-
headingId?: string;
|
|
23
|
-
/** Stable id for the description (so composing cards can `aria-describedby` it
|
|
24
|
-
* — e.g. `kai-choice`'s radiogroup points at its prompt). Auto-generated when
|
|
25
|
-
* omitted, mirroring `headingId`. */
|
|
26
|
-
descriptionId?: string;
|
|
27
|
-
/** Render a dismiss (×) button that hides the card and calls `onDismiss`.
|
|
28
|
-
* Opt-in, OFF by default — the contract cards never set it, so they are
|
|
29
|
-
* unaffected. */
|
|
30
|
-
dismissible?: boolean;
|
|
31
|
-
/** Called after the card is dismissed via its ×. */
|
|
32
|
-
onDismiss?: () => void;
|
|
33
|
-
/** Render the whole card as a link (`<a>`). Wins over `clickable`. */
|
|
34
|
-
href?: string;
|
|
35
|
-
/** `target` for the `href` anchor. */
|
|
36
|
-
target?: string;
|
|
37
|
-
/** `rel` for the `href` anchor (default `noopener noreferrer` when `target="_blank"`). */
|
|
38
|
-
rel?: string;
|
|
39
|
-
/** Make the whole card behave like a button: `role="button"`, a tabindex, and
|
|
40
|
-
* Enter/Space activation, firing `onCardClick`. Ignored when `href` is set.
|
|
41
|
-
* A clickable/href card must NOT also contain footer action buttons — that
|
|
42
|
-
* nests interactive elements. Use `actions` OR clickable, never both. */
|
|
43
|
-
clickable?: boolean;
|
|
44
|
-
/** Called when a `clickable` (or `href`) card is activated (click, or Enter/Space). */
|
|
45
|
-
onCardClick?: (event: MouseEvent | KeyboardEvent) => void;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* `Card` — the shared presentational chrome every native card composes from:
|
|
50
|
-
* an optional media region, a heading + description, a body (default slot), an
|
|
51
|
-
* actions footer, and one consistent inline **error** state (the contract's
|
|
52
|
-
* "never a broken/partial card" rule). It is intentionally chrome-only: it reads
|
|
53
|
-
* no `CardContext` and emits no `CardEvent` — the cards that compose it (e.g.
|
|
54
|
-
* `kai-form`) own the contract interaction.
|
|
55
|
-
*
|
|
56
|
-
* The optional `dismissible` / `href` / `clickable` behaviors are all OFF by
|
|
57
|
-
* default, so the contract cards (which set none of them) keep their original
|
|
58
|
-
* presentational behavior unchanged.
|
|
59
|
-
*
|
|
60
|
-
* a11y: a `clickable` or `href` card MUST NOT also contain footer action buttons
|
|
61
|
-
* — that nests interactive controls inside a button/link. Use `actions` OR
|
|
62
|
-
* make the card clickable, never both.
|
|
63
|
-
*/
|
|
64
|
-
export function Card(props: CardProps): JSX.Element {
|
|
65
|
-
const merged = mergeProps({ dense: false }, props);
|
|
66
|
-
const [local, rest] = splitProps(merged, [
|
|
67
|
-
'heading',
|
|
68
|
-
'description',
|
|
69
|
-
'media',
|
|
70
|
-
'actions',
|
|
71
|
-
'errorMessage',
|
|
72
|
-
'dense',
|
|
73
|
-
'headingId',
|
|
74
|
-
'descriptionId',
|
|
75
|
-
'dismissible',
|
|
76
|
-
'onDismiss',
|
|
77
|
-
'href',
|
|
78
|
-
'target',
|
|
79
|
-
'rel',
|
|
80
|
-
'clickable',
|
|
81
|
-
'onCardClick',
|
|
82
|
-
'class',
|
|
83
|
-
'children',
|
|
84
|
-
]);
|
|
85
|
-
|
|
86
|
-
const autoId = createUniqueId();
|
|
87
|
-
const headingId = () => local.headingId ?? `kai-card-heading-${autoId}`;
|
|
88
|
-
const descriptionId = () => local.descriptionId ?? `kai-card-description-${autoId}`;
|
|
89
|
-
const hasError = () => local.errorMessage !== undefined && local.errorMessage !== '';
|
|
90
|
-
const hasHeader = () => Boolean(local.heading) || Boolean(local.description);
|
|
91
|
-
|
|
92
|
-
const [open, setOpen] = createSignal(true);
|
|
93
|
-
const dismiss = (event: MouseEvent) => {
|
|
94
|
-
// Don't let the × activate a clickable/href card underneath it.
|
|
95
|
-
event.stopPropagation();
|
|
96
|
-
setOpen(false);
|
|
97
|
-
local.onDismiss?.();
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
const isLink = () => Boolean(local.href);
|
|
101
|
-
const isButton = () => !isLink() && Boolean(local.clickable);
|
|
102
|
-
const isInteractive = () => isLink() || isButton();
|
|
103
|
-
|
|
104
|
-
const activate = (event: MouseEvent | KeyboardEvent) => local.onCardClick?.(event);
|
|
105
|
-
const onKeyDown = (event: KeyboardEvent) => {
|
|
106
|
-
if (!isButton()) return;
|
|
107
|
-
if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {
|
|
108
|
-
event.preventDefault();
|
|
109
|
-
activate(event);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
// The interactive elements (`<a>` / role="button") get keyboard + hover/focus
|
|
114
|
-
// affordances; the plain card is a `<div>`. Anchors carry a safe default `rel`
|
|
115
|
-
// when opening a new tab.
|
|
116
|
-
const rel = () =>
|
|
117
|
-
local.rel ?? (local.target === '_blank' ? 'noopener noreferrer' : undefined);
|
|
118
|
-
|
|
119
|
-
// The card's heading + body + actions column.
|
|
120
|
-
const inner = (
|
|
121
|
-
<>
|
|
122
|
-
<Show when={hasHeader()}>
|
|
123
|
-
<div
|
|
124
|
-
class={cn(
|
|
125
|
-
'flex flex-col border-b border-border',
|
|
126
|
-
local.dense ? 'gap-0.5 pb-2.5' : 'gap-1 pb-4',
|
|
127
|
-
)}
|
|
128
|
-
>
|
|
129
|
-
<Show when={local.heading}>
|
|
130
|
-
<h3
|
|
131
|
-
id={headingId()}
|
|
132
|
-
class="text-title font-semibold tracking-tight text-foreground"
|
|
133
|
-
>
|
|
134
|
-
{local.heading}
|
|
135
|
-
</h3>
|
|
136
|
-
</Show>
|
|
137
|
-
<Show when={local.description}>
|
|
138
|
-
<p id={descriptionId()} class="text-body text-muted-foreground">
|
|
139
|
-
{local.description}
|
|
140
|
-
</p>
|
|
141
|
-
</Show>
|
|
142
|
-
</div>
|
|
143
|
-
</Show>
|
|
144
|
-
|
|
145
|
-
<Show
|
|
146
|
-
when={hasError()}
|
|
147
|
-
fallback={
|
|
148
|
-
<>
|
|
149
|
-
<Show when={local.children}>
|
|
150
|
-
<div class="text-sm text-foreground">{local.children}</div>
|
|
151
|
-
</Show>
|
|
152
|
-
<Show when={local.actions}>
|
|
153
|
-
<div class="flex flex-wrap items-center justify-end gap-2 pt-1">
|
|
154
|
-
{local.actions}
|
|
155
|
-
</div>
|
|
156
|
-
</Show>
|
|
157
|
-
</>
|
|
158
|
-
}
|
|
159
|
-
>
|
|
160
|
-
<div
|
|
161
|
-
role="alert"
|
|
162
|
-
class="flex items-start gap-2 rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/15 dark:text-red-400"
|
|
163
|
-
>
|
|
164
|
-
<AlertTriangle size={16} class="mt-0.5 shrink-0" aria-hidden="true" />
|
|
165
|
-
<span>{local.errorMessage}</span>
|
|
166
|
-
</div>
|
|
167
|
-
</Show>
|
|
168
|
-
</>
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
return (
|
|
172
|
-
<Show when={open()}>
|
|
173
|
-
<Dynamic
|
|
174
|
-
component={isLink() ? 'a' : 'div'}
|
|
175
|
-
part="card"
|
|
176
|
-
href={isLink() ? local.href : undefined}
|
|
177
|
-
target={isLink() ? local.target : undefined}
|
|
178
|
-
rel={isLink() ? rel() : undefined}
|
|
179
|
-
role={isButton() ? 'button' : undefined}
|
|
180
|
-
tabindex={isButton() ? 0 : undefined}
|
|
181
|
-
onClick={isInteractive() ? activate : undefined}
|
|
182
|
-
onKeyDown={isButton() ? onKeyDown : undefined}
|
|
183
|
-
class={cn(
|
|
184
|
-
'relative flex flex-col rounded-xl border border-border bg-card text-card-foreground kai-elevation-sm',
|
|
185
|
-
local.dense ? 'gap-2.5 p-3.5' : 'gap-4 p-5',
|
|
186
|
-
isInteractive() &&
|
|
187
|
-
'cursor-pointer no-underline transition-colors hover:border-ring hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
|
|
188
|
-
local.class,
|
|
189
|
-
)}
|
|
190
|
-
{...rest}
|
|
191
|
-
>
|
|
192
|
-
<Show when={local.dismissible}>
|
|
193
|
-
<button
|
|
194
|
-
type="button"
|
|
195
|
-
part="dismiss"
|
|
196
|
-
aria-label="Dismiss"
|
|
197
|
-
onClick={dismiss}
|
|
198
|
-
class="absolute right-2.5 top-2.5 z-10 shrink-0 rounded p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
|
|
199
|
-
>
|
|
200
|
-
<X class="size-3.5" aria-hidden="true" />
|
|
201
|
-
</button>
|
|
202
|
-
</Show>
|
|
203
|
-
|
|
204
|
-
<Show when={local.media}>
|
|
205
|
-
<div class="overflow-hidden rounded-lg">{local.media}</div>
|
|
206
|
-
</Show>
|
|
207
|
-
|
|
208
|
-
{inner}
|
|
209
|
-
</Dynamic>
|
|
210
|
-
</Show>
|
|
211
|
-
);
|
|
212
|
-
}
|