@elabs-ai/components-ai 4.2.0 → 5.1.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 +1 -1
- package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
- package/dist/_code-block-theme.js +12 -0
- package/dist/_code-block-theme.js.map +1 -0
- package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
- package/dist/_flow-boundary.js.map +1 -0
- package/dist/_flow-lazy.js +8 -0
- package/dist/_flow-lazy.js.map +1 -0
- package/dist/_lazy-boundary-conformance.js +2 -0
- package/dist/_lazy-boundary-conformance.js.map +1 -0
- package/dist/_lazy-cjk.js +13 -0
- package/dist/_lazy-cjk.js.map +1 -0
- package/dist/_lazy-engine-boundary.js +9 -0
- package/dist/_lazy-engine-boundary.js.map +1 -0
- package/dist/_lazy-math.js +13 -0
- package/dist/_lazy-math.js.map +1 -0
- package/dist/_lazy-mermaid.js +12 -0
- package/dist/_lazy-mermaid.js.map +1 -0
- package/dist/_mermaid-error-panel.js +9 -0
- package/dist/_mermaid-error-panel.js.map +1 -0
- package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
- package/dist/_persona-rive.js.map +1 -0
- package/dist/_streamdown-i18n.js +21 -0
- package/dist/_streamdown-i18n.js.map +1 -0
- package/dist/_streamdown-safety.js +10 -0
- package/dist/_streamdown-safety.js.map +1 -0
- package/dist/_theme-scope-store.js +13 -0
- package/dist/_theme-scope-store.js.map +1 -0
- package/dist/a2ui/a2ui-surface.js +17 -0
- package/dist/a2ui/a2ui-surface.js.map +1 -0
- package/dist/a2ui/core/catalog.generated.js +10 -0
- package/dist/a2ui/core/catalog.generated.js.map +1 -0
- package/dist/a2ui/core/complete-json.js +10 -0
- package/dist/a2ui/core/complete-json.js.map +1 -0
- package/dist/a2ui/core/index.js +37 -0
- package/dist/a2ui/core/index.js.map +1 -0
- package/dist/a2ui/core/schema.js +11 -0
- package/dist/a2ui/core/schema.js.map +1 -0
- package/dist/a2ui/core/spec.js +10 -0
- package/dist/a2ui/core/spec.js.map +1 -0
- package/dist/a2ui/core/validate.js +16 -0
- package/dist/a2ui/core/validate.js.map +1 -0
- package/dist/a2ui/index.js +54 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/ui-catalog.js +18 -0
- package/dist/a2ui/ui-catalog.js.map +1 -0
- package/dist/agent-event.js +10 -0
- package/dist/agent-event.js.map +1 -0
- package/dist/agent-timeline.js +11 -0
- package/dist/agent-timeline.js.map +1 -0
- package/dist/agent.js +25 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.js +23 -0
- package/dist/artifact.js.map +1 -0
- package/dist/asset-preview.js +22 -0
- package/dist/asset-preview.js.map +1 -0
- package/dist/attachments.js +33 -0
- package/dist/attachments.js.map +1 -0
- package/dist/audio-player.js +30 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-visualizer.js +9 -0
- package/dist/audio-visualizer.js.map +1 -0
- package/dist/canvas.js +10 -0
- package/dist/canvas.js.map +1 -0
- package/dist/chain-of-thought.js +22 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/chat-greeting.js +8 -0
- package/dist/chat-greeting.js.map +1 -0
- package/dist/chat-shell.js +9 -0
- package/dist/chat-shell.js.map +1 -0
- package/dist/checkpoint.js +13 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/chunk-2XOIG5TG.js +72 -0
- package/dist/chunk-2XOIG5TG.js.map +1 -0
- package/dist/chunk-34CQ2VHM.js +172 -0
- package/dist/chunk-34CQ2VHM.js.map +1 -0
- package/dist/chunk-3TDHPXZZ.js +60 -0
- package/dist/chunk-3TDHPXZZ.js.map +1 -0
- package/dist/chunk-3XNPMDZY.js +478 -0
- package/dist/chunk-3XNPMDZY.js.map +1 -0
- package/dist/chunk-3YPT3V7L.js +56 -0
- package/dist/chunk-3YPT3V7L.js.map +1 -0
- package/dist/chunk-475UEU2Q.js +87 -0
- package/dist/chunk-475UEU2Q.js.map +1 -0
- package/dist/chunk-4CBTII2I.js +95 -0
- package/dist/chunk-4CBTII2I.js.map +1 -0
- package/dist/chunk-4XRNIZMG.js +22 -0
- package/dist/chunk-4XRNIZMG.js.map +1 -0
- package/dist/chunk-5NNWUKK5.js +2 -0
- package/dist/chunk-5NNWUKK5.js.map +1 -0
- package/dist/chunk-5UOMU27Z.js +164 -0
- package/dist/chunk-5UOMU27Z.js.map +1 -0
- package/dist/chunk-5VGYZ62I.js +264 -0
- package/dist/chunk-5VGYZ62I.js.map +1 -0
- package/dist/chunk-6IQPH2OS.js +21 -0
- package/dist/chunk-6IQPH2OS.js.map +1 -0
- package/dist/chunk-6PB2MXCI.js +482 -0
- package/dist/chunk-6PB2MXCI.js.map +1 -0
- package/dist/chunk-7FD5CZEU.js +215 -0
- package/dist/chunk-7FD5CZEU.js.map +1 -0
- package/dist/chunk-7RL6KZDF.js +266 -0
- package/dist/chunk-7RL6KZDF.js.map +1 -0
- package/dist/chunk-ADOYAGGK.js +482 -0
- package/dist/chunk-ADOYAGGK.js.map +1 -0
- package/dist/chunk-BA3AEMOU.js +21 -0
- package/dist/chunk-BA3AEMOU.js.map +1 -0
- package/dist/chunk-BBHFOYML.js +336 -0
- package/dist/chunk-BBHFOYML.js.map +1 -0
- package/dist/chunk-BHUVISIY.js +221 -0
- package/dist/chunk-BHUVISIY.js.map +1 -0
- package/dist/chunk-BM2LWERA.js +100 -0
- package/dist/chunk-BM2LWERA.js.map +1 -0
- package/dist/chunk-CMOYXNPJ.js +211 -0
- package/dist/chunk-CMOYXNPJ.js.map +1 -0
- package/dist/chunk-CZP3RHC4.js +74 -0
- package/dist/chunk-CZP3RHC4.js.map +1 -0
- package/dist/chunk-DDG5JHQT.js +112 -0
- package/dist/chunk-DDG5JHQT.js.map +1 -0
- package/dist/chunk-DJODXO7I.js +38 -0
- package/dist/chunk-DJODXO7I.js.map +1 -0
- package/dist/chunk-DWJDJLPU.js +192 -0
- package/dist/chunk-DWJDJLPU.js.map +1 -0
- package/dist/chunk-DZW6LM22.js +45 -0
- package/dist/chunk-DZW6LM22.js.map +1 -0
- package/dist/chunk-ELGCZLZF.js +305 -0
- package/dist/chunk-ELGCZLZF.js.map +1 -0
- package/dist/chunk-EV3U6ZZB.js +209 -0
- package/dist/chunk-EV3U6ZZB.js.map +1 -0
- package/dist/chunk-EY7LVUKQ.js +87 -0
- package/dist/chunk-EY7LVUKQ.js.map +1 -0
- package/dist/chunk-F4C74F7M.js +230 -0
- package/dist/chunk-F4C74F7M.js.map +1 -0
- package/dist/chunk-FERYDFZA.js +108 -0
- package/dist/chunk-FERYDFZA.js.map +1 -0
- package/dist/chunk-FUIYG2DS.js +166 -0
- package/dist/chunk-FUIYG2DS.js.map +1 -0
- package/dist/chunk-GA7M34KU.js +236 -0
- package/dist/chunk-GA7M34KU.js.map +1 -0
- package/dist/chunk-GKYZT3LA.js +136 -0
- package/dist/chunk-GKYZT3LA.js.map +1 -0
- package/dist/chunk-H42LRUQ4.js +102 -0
- package/dist/chunk-H42LRUQ4.js.map +1 -0
- package/dist/chunk-HVXM2G5F.js +222 -0
- package/dist/chunk-HVXM2G5F.js.map +1 -0
- package/dist/chunk-I4RDAGVY.js +53 -0
- package/dist/chunk-I4RDAGVY.js.map +1 -0
- package/dist/chunk-IQJG4IDX.js +208 -0
- package/dist/chunk-IQJG4IDX.js.map +1 -0
- package/dist/chunk-IX2PXG4Y.js +144 -0
- package/dist/chunk-IX2PXG4Y.js.map +1 -0
- package/dist/chunk-IXICSOOP.js +287 -0
- package/dist/chunk-IXICSOOP.js.map +1 -0
- package/dist/chunk-JY5HSN4D.js +84 -0
- package/dist/chunk-JY5HSN4D.js.map +1 -0
- package/dist/chunk-L4SU3QJV.js +174 -0
- package/dist/chunk-L4SU3QJV.js.map +1 -0
- package/dist/chunk-LMNSBOBG.js +19 -0
- package/dist/chunk-LMNSBOBG.js.map +1 -0
- package/dist/chunk-MBI7D6IL.js +42 -0
- package/dist/chunk-MBI7D6IL.js.map +1 -0
- package/dist/chunk-MLFMYCPH.js +192 -0
- package/dist/chunk-MLFMYCPH.js.map +1 -0
- package/dist/chunk-MOK66734.js +33 -0
- package/dist/chunk-MOK66734.js.map +1 -0
- package/dist/chunk-MXTAWPYM.js +196 -0
- package/dist/chunk-MXTAWPYM.js.map +1 -0
- package/dist/chunk-NCL2UZKI.js +96 -0
- package/dist/chunk-NCL2UZKI.js.map +1 -0
- package/dist/chunk-NET4YLRY.js +107 -0
- package/dist/chunk-NET4YLRY.js.map +1 -0
- package/dist/chunk-NIG67CFM.js +329 -0
- package/dist/chunk-NIG67CFM.js.map +1 -0
- package/dist/chunk-NMVNNO3L.js +10 -0
- package/dist/chunk-NMVNNO3L.js.map +1 -0
- package/dist/chunk-NP7VID4K.js +2 -0
- package/dist/chunk-NP7VID4K.js.map +1 -0
- package/dist/chunk-NPUCMAG2.js +382 -0
- package/dist/chunk-NPUCMAG2.js.map +1 -0
- package/dist/chunk-NSCLRHES.js +102 -0
- package/dist/chunk-NSCLRHES.js.map +1 -0
- package/dist/chunk-OEUXHVFW.js +86 -0
- package/dist/chunk-OEUXHVFW.js.map +1 -0
- package/dist/chunk-ONBHFIMZ.js +137 -0
- package/dist/chunk-ONBHFIMZ.js.map +1 -0
- package/dist/chunk-OPH2HHL2.js +228 -0
- package/dist/chunk-OPH2HHL2.js.map +1 -0
- package/dist/chunk-OQERHIQP.js +287 -0
- package/dist/chunk-OQERHIQP.js.map +1 -0
- package/dist/chunk-P6YJAZFG.js +103 -0
- package/dist/chunk-P6YJAZFG.js.map +1 -0
- package/dist/chunk-PG7ERDOD.js +65 -0
- package/dist/chunk-PG7ERDOD.js.map +1 -0
- package/dist/chunk-PIB5JBMA.js +90 -0
- package/dist/chunk-PIB5JBMA.js.map +1 -0
- package/dist/chunk-PQ5BPIWQ.js +22 -0
- package/dist/chunk-PQ5BPIWQ.js.map +1 -0
- package/dist/chunk-PQBF6ZIQ.js +55 -0
- package/dist/chunk-PQBF6ZIQ.js.map +1 -0
- package/dist/chunk-PTWCTSZL.js +173 -0
- package/dist/chunk-PTWCTSZL.js.map +1 -0
- package/dist/chunk-QJUNPVOS.js +101 -0
- package/dist/chunk-QJUNPVOS.js.map +1 -0
- package/dist/chunk-QOBSEGCG.js +996 -0
- package/dist/chunk-QOBSEGCG.js.map +1 -0
- package/dist/chunk-QUDZOTRV.js +43 -0
- package/dist/chunk-QUDZOTRV.js.map +1 -0
- package/dist/chunk-RB7G65JC.js +213 -0
- package/dist/chunk-RB7G65JC.js.map +1 -0
- package/dist/chunk-RPHAOR7P.js +45 -0
- package/dist/chunk-RPHAOR7P.js.map +1 -0
- package/dist/chunk-RTCSH2AN.js +331 -0
- package/dist/chunk-RTCSH2AN.js.map +1 -0
- package/dist/chunk-S3ISPW3A.js +28 -0
- package/dist/chunk-S3ISPW3A.js.map +1 -0
- package/dist/chunk-SEVN656N.js +36 -0
- package/dist/chunk-SEVN656N.js.map +1 -0
- package/dist/chunk-SKVG672B.js +64 -0
- package/dist/chunk-SKVG672B.js.map +1 -0
- package/dist/chunk-SSGJ6MEM.js +1076 -0
- package/dist/chunk-SSGJ6MEM.js.map +1 -0
- package/dist/chunk-SSKZ2AED.js +118 -0
- package/dist/chunk-SSKZ2AED.js.map +1 -0
- package/dist/chunk-T56JFGXI.js +561 -0
- package/dist/chunk-T56JFGXI.js.map +1 -0
- package/dist/chunk-TCB6O74A.js +137 -0
- package/dist/chunk-TCB6O74A.js.map +1 -0
- package/dist/chunk-TTEYPO6X.js +57 -0
- package/dist/chunk-TTEYPO6X.js.map +1 -0
- package/dist/chunk-TWPHAJNM.js +462 -0
- package/dist/chunk-TWPHAJNM.js.map +1 -0
- package/dist/chunk-TXJJLP4O.js +336 -0
- package/dist/chunk-TXJJLP4O.js.map +1 -0
- package/dist/chunk-TZ6TB7VM.js +245 -0
- package/dist/chunk-TZ6TB7VM.js.map +1 -0
- package/dist/chunk-UBLKJJ7K.js +278 -0
- package/dist/chunk-UBLKJJ7K.js.map +1 -0
- package/dist/chunk-UCJ6IUFS.js +52 -0
- package/dist/chunk-UCJ6IUFS.js.map +1 -0
- package/dist/chunk-UCKFJ3QF.js +197 -0
- package/dist/chunk-UCKFJ3QF.js.map +1 -0
- package/dist/chunk-UPXSLILN.js +20 -0
- package/dist/chunk-UPXSLILN.js.map +1 -0
- package/dist/chunk-V4DORGWJ.js +92 -0
- package/dist/chunk-V4DORGWJ.js.map +1 -0
- package/dist/chunk-V6E5DYZD.js +80 -0
- package/dist/chunk-V6E5DYZD.js.map +1 -0
- package/dist/chunk-VLLYKF3P.js +96 -0
- package/dist/chunk-VLLYKF3P.js.map +1 -0
- package/dist/chunk-VLNBTOH6.js +43 -0
- package/dist/chunk-VLNBTOH6.js.map +1 -0
- package/dist/chunk-WMDSMSPL.js +303 -0
- package/dist/chunk-WMDSMSPL.js.map +1 -0
- package/dist/chunk-WU5BLGTF.js +149 -0
- package/dist/chunk-WU5BLGTF.js.map +1 -0
- package/dist/chunk-WYTZVSGK.js +245 -0
- package/dist/chunk-WYTZVSGK.js.map +1 -0
- package/dist/chunk-X47QMM6K.js +187 -0
- package/dist/chunk-X47QMM6K.js.map +1 -0
- package/dist/chunk-YHUSW7D2.js +40 -0
- package/dist/chunk-YHUSW7D2.js.map +1 -0
- package/dist/chunk-YSKD7UXX.js +126 -0
- package/dist/chunk-YSKD7UXX.js.map +1 -0
- package/dist/chunk-YYRDGWOU.js +72 -0
- package/dist/chunk-YYRDGWOU.js.map +1 -0
- package/dist/chunk-ZIGZMWM7.js +19 -0
- package/dist/chunk-ZIGZMWM7.js.map +1 -0
- package/dist/chunk-ZKRTUKNP.js +40 -0
- package/dist/chunk-ZKRTUKNP.js.map +1 -0
- package/dist/code-block.js +38 -0
- package/dist/code-block.js.map +1 -0
- package/dist/commit.js +51 -0
- package/dist/commit.js.map +1 -0
- package/dist/composer.js +15 -0
- package/dist/composer.js.map +1 -0
- package/dist/confirmation.js +53 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/connection.js +8 -0
- package/dist/connection.js.map +1 -0
- package/dist/context-panel.js +25 -0
- package/dist/context-panel.js.map +1 -0
- package/dist/controls.js +10 -0
- package/dist/controls.js.map +1 -0
- package/dist/conversation.js +19 -0
- package/dist/conversation.js.map +1 -0
- package/dist/diff-view.js +15 -0
- package/dist/diff-view.js.map +1 -0
- package/dist/edge.js +10 -0
- package/dist/edge.js.map +1 -0
- package/dist/environment-variables.js +29 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/file-tree.js +23 -0
- package/dist/file-tree.js.map +1 -0
- package/dist/gallery.js +9 -0
- package/dist/gallery.js.map +1 -0
- package/dist/grouped-parts.js +21 -0
- package/dist/grouped-parts.js.map +1 -0
- package/dist/image.js +9 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +366 -98
- package/dist/index.js +672 -13577
- package/dist/index.js.map +1 -1
- package/dist/inline-citation.js +39 -0
- package/dist/inline-citation.js.map +1 -0
- package/dist/jsx-preview.js +17 -0
- package/dist/jsx-preview.js.map +1 -0
- package/dist/markdown-view.js +17 -0
- package/dist/markdown-view.js.map +1 -0
- package/dist/message-compare.js +12 -0
- package/dist/message-compare.js.map +1 -0
- package/dist/message-edit.js +19 -0
- package/dist/message-edit.js.map +1 -0
- package/dist/message-feedback.js +11 -0
- package/dist/message-feedback.js.map +1 -0
- package/dist/message-form-spec.js +38 -0
- package/dist/message-form-spec.js.map +1 -0
- package/dist/message-form.js +26 -0
- package/dist/message-form.js.map +1 -0
- package/dist/message-table-spec.js +26 -0
- package/dist/message-table-spec.js.map +1 -0
- package/dist/message-table.js +12 -0
- package/dist/message-table.js.map +1 -0
- package/dist/message.js +51 -0
- package/dist/message.js.map +1 -0
- package/dist/mic-selector.js +27 -0
- package/dist/mic-selector.js.map +1 -0
- package/dist/model-provider-logo.js +13 -0
- package/dist/model-provider-logo.js.map +1 -0
- package/dist/motion-config.js +9 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/open-in-chat.js +31 -0
- package/dist/open-in-chat.js.map +1 -0
- package/dist/package-info.js +25 -0
- package/dist/package-info.js.map +1 -0
- package/dist/panel.js +10 -0
- package/dist/panel.js.map +1 -0
- package/dist/part-groups.js +18 -0
- package/dist/part-groups.js.map +1 -0
- package/dist/permission-mode-select.js +9 -0
- package/dist/permission-mode-select.js.map +1 -0
- package/dist/persona-sources.js +8 -0
- package/dist/persona-sources.js.map +1 -0
- package/dist/persona.js +14 -0
- package/dist/persona.js.map +1 -0
- package/dist/plan.js +32 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompt-input-effort.js +9 -0
- package/dist/prompt-input-effort.js.map +1 -0
- package/dist/prompt-input-mode.js +10 -0
- package/dist/prompt-input-mode.js.map +1 -0
- package/dist/prompt-input-slash.js +12 -0
- package/dist/prompt-input-slash.js.map +1 -0
- package/dist/prompt-input.js +89 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/queue.js +37 -0
- package/dist/queue.js.map +1 -0
- package/dist/reasoning.js +23 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/sandbox.js +28 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-display.js +33 -0
- package/dist/schema-display.js.map +1 -0
- package/dist/selection-toolbar.js +11 -0
- package/dist/selection-toolbar.js.map +1 -0
- package/dist/session-header.js +9 -0
- package/dist/session-header.js.map +1 -0
- package/dist/session-status-bar.js +9 -0
- package/dist/session-status-bar.js.map +1 -0
- package/dist/shimmer.js +9 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/snippet.js +17 -0
- package/dist/snippet.js.map +1 -0
- package/dist/sources.js +17 -0
- package/dist/sources.js.map +1 -0
- package/dist/speech-input.js +9 -0
- package/dist/speech-input.js.map +1 -0
- package/dist/stack-trace.js +27 -0
- package/dist/stack-trace.js.map +1 -0
- package/dist/suggestion.js +16 -0
- package/dist/suggestion.js.map +1 -0
- package/dist/task.js +18 -0
- package/dist/task.js.map +1 -0
- package/dist/test-results.js +43 -0
- package/dist/test-results.js.map +1 -0
- package/dist/token-usage.js +27 -0
- package/dist/token-usage.js.map +1 -0
- package/dist/tool-result-card.js +9 -0
- package/dist/tool-result-card.js.map +1 -0
- package/dist/tool.js +27 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolbar.js +10 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/transcription.js +11 -0
- package/dist/transcription.js.map +1 -0
- package/dist/turn-status.js +9 -0
- package/dist/turn-status.js.map +1 -0
- package/dist/use-audio-level.js +9 -0
- package/dist/use-audio-level.js.map +1 -0
- package/dist/voice-selector.js +47 -0
- package/dist/voice-selector.js.map +1 -0
- package/dist/web-preview.js +19 -0
- package/dist/web-preview.js.map +1 -0
- package/package.json +11 -9
- package/schemas/a2ui-surface.v1.schema.json +5434 -0
- package/src/_chat-shell-rail.tsx +3 -1
- package/src/_flow-boundary.tsx +2 -2
- package/src/_persona-rive.tsx +27 -41
- package/src/a2ui/a2ui-surface.stories.tsx +662 -0
- package/src/a2ui/a2ui-surface.test.tsx +201 -0
- package/src/a2ui/a2ui-surface.tsx +354 -0
- package/src/a2ui/catalog.source.json +772 -0
- package/src/a2ui/core/a2ui-core.test.ts +178 -0
- package/src/a2ui/core/catalog.generated.ts +1019 -0
- package/src/a2ui/core/complete-json.ts +81 -0
- package/src/a2ui/core/index.ts +10 -0
- package/src/a2ui/core/schema.ts +111 -0
- package/src/a2ui/core/spec.ts +148 -0
- package/src/a2ui/core/validate.ts +266 -0
- package/src/a2ui/index.ts +7 -0
- package/src/a2ui/ui-catalog.tsx +225 -0
- package/src/a2ui/wave1-chart-spec.test.ts +87 -0
- package/src/a2ui/wave2-chart-spec.test.ts +108 -0
- package/src/agentic-workspace.stories.tsx +6 -45
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +1 -1
- package/src/conversation.stories.tsx +1 -0
- package/src/conversation.test.tsx +16 -0
- package/src/conversation.tsx +16 -2
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.tsx +3 -2
- package/src/file-tree.tsx +24 -17
- package/src/gallery.stories.tsx +42 -0
- package/src/gallery.tsx +2 -2
- package/src/grouped-parts.stories.tsx +23 -0
- package/src/grouped-parts.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.tsx +1 -1
- package/src/message-table.stories.tsx +24 -0
- package/src/message-table.tsx +1 -1
- package/src/package-info.tsx +12 -9
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +1 -1
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/tool.stories.tsx +39 -0
- package/src/tool.tsx +3 -3
- package/src/toolbar.tsx +0 -10
- package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
- package/dist/_persona-rive-JEG44YHX.js.map +0 -1
- /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/schema-display.tsx
|
|
4
|
+
import { Badge } from "@elabs-ai/components-ui";
|
|
5
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
|
|
6
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
7
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
8
|
+
import { ChevronRightIcon } from "lucide-react";
|
|
9
|
+
import { createContext, Fragment, useContext, useMemo } from "react";
|
|
10
|
+
import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var SchemaDisplayContext = createContext({
|
|
12
|
+
method: "GET",
|
|
13
|
+
path: ""
|
|
14
|
+
});
|
|
15
|
+
var methodStyles = {
|
|
16
|
+
DELETE: "border-destructive/40 bg-destructive/10 text-destructive-text",
|
|
17
|
+
GET: "border-success/40 bg-success/10 text-success-text",
|
|
18
|
+
PATCH: "border-warning/40 bg-warning/10 text-warning-text",
|
|
19
|
+
POST: "border-info/40 bg-info/10 text-info-text",
|
|
20
|
+
PUT: "border-warning/40 bg-warning/10 text-warning-text"
|
|
21
|
+
};
|
|
22
|
+
function splitSchemaPath(path) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
const regex = /\{([^}]+)\}/g;
|
|
25
|
+
let lastIndex = 0;
|
|
26
|
+
let match = regex.exec(path);
|
|
27
|
+
while (match !== null) {
|
|
28
|
+
if (match.index > lastIndex) {
|
|
29
|
+
parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });
|
|
30
|
+
}
|
|
31
|
+
parts.push({ isParam: true, text: match[0] });
|
|
32
|
+
lastIndex = match.index + match[0].length;
|
|
33
|
+
match = regex.exec(path);
|
|
34
|
+
}
|
|
35
|
+
if (lastIndex < path.length) {
|
|
36
|
+
parts.push({ isParam: false, text: path.slice(lastIndex) });
|
|
37
|
+
}
|
|
38
|
+
return parts;
|
|
39
|
+
}
|
|
40
|
+
var SchemaDisplayHeader = ({
|
|
41
|
+
className,
|
|
42
|
+
children,
|
|
43
|
+
...props
|
|
44
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-3 border-b px-4 py-3", className), ...props, children });
|
|
45
|
+
var SchemaDisplayMethod = ({
|
|
46
|
+
className,
|
|
47
|
+
children,
|
|
48
|
+
...props
|
|
49
|
+
}) => {
|
|
50
|
+
const { method } = useContext(SchemaDisplayContext);
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
Badge,
|
|
53
|
+
{
|
|
54
|
+
className: cn("font-mono text-meta", methodStyles[method], className),
|
|
55
|
+
variant: "secondary",
|
|
56
|
+
...props,
|
|
57
|
+
children: children ?? method
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
var SchemaDisplayPath = ({ className, children, ...props }) => {
|
|
62
|
+
const { path } = useContext(SchemaDisplayContext);
|
|
63
|
+
const pathNodes = useMemo(
|
|
64
|
+
() => splitSchemaPath(path).map(
|
|
65
|
+
(part, index) => part.isParam ? /* @__PURE__ */ jsx("span", { className: "text-info-text", children: part.text }, `${part.text}-${index}`) : /* @__PURE__ */ jsx(Fragment, { children: part.text }, `${part.text}-${index}`)
|
|
66
|
+
),
|
|
67
|
+
[path]
|
|
68
|
+
);
|
|
69
|
+
return /* @__PURE__ */ jsx("span", { className: cn("font-mono text-body", className), ...props, children: children ?? pathNodes });
|
|
70
|
+
};
|
|
71
|
+
var SchemaDisplayDescription = ({
|
|
72
|
+
className,
|
|
73
|
+
children,
|
|
74
|
+
...props
|
|
75
|
+
}) => {
|
|
76
|
+
const { description } = useContext(SchemaDisplayContext);
|
|
77
|
+
return /* @__PURE__ */ jsx("p", { className: cn("border-b px-4 py-3 text-muted-foreground text-body", className), ...props, children: children ?? description });
|
|
78
|
+
};
|
|
79
|
+
var SchemaDisplayContent = ({
|
|
80
|
+
className,
|
|
81
|
+
children,
|
|
82
|
+
...props
|
|
83
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
|
|
84
|
+
var SchemaDisplayParameter = ({
|
|
85
|
+
name,
|
|
86
|
+
type,
|
|
87
|
+
required,
|
|
88
|
+
description,
|
|
89
|
+
location,
|
|
90
|
+
className,
|
|
91
|
+
...props
|
|
92
|
+
}) => /* @__PURE__ */ jsxs("div", { className: cn("px-4 py-3 ps-10", className), ...props, children: [
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
95
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
96
|
+
location && /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "secondary", children: location }),
|
|
97
|
+
required && /* @__PURE__ */ jsx(
|
|
98
|
+
Badge,
|
|
99
|
+
{
|
|
100
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
101
|
+
variant: "secondary",
|
|
102
|
+
children: "required"
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
] }),
|
|
106
|
+
description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-muted-foreground text-body", children: description })
|
|
107
|
+
] });
|
|
108
|
+
var SchemaDisplayParameters = ({
|
|
109
|
+
className,
|
|
110
|
+
children,
|
|
111
|
+
...props
|
|
112
|
+
}) => {
|
|
113
|
+
const { parameters } = useContext(SchemaDisplayContext);
|
|
114
|
+
const { t } = useLocale();
|
|
115
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
116
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
117
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
118
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.parameters") }),
|
|
119
|
+
/* @__PURE__ */ jsx(Badge, { className: "ms-auto text-meta", variant: "secondary", children: parameters?.length })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "divide-y border-t", children: children ?? parameters?.map((param) => /* @__PURE__ */ jsx(SchemaDisplayParameter, { ...param }, param.name)) }) })
|
|
122
|
+
] });
|
|
123
|
+
};
|
|
124
|
+
var SchemaDisplayProperty = ({
|
|
125
|
+
name,
|
|
126
|
+
type,
|
|
127
|
+
required,
|
|
128
|
+
description,
|
|
129
|
+
properties,
|
|
130
|
+
items,
|
|
131
|
+
depth = 0,
|
|
132
|
+
className,
|
|
133
|
+
...props
|
|
134
|
+
}) => {
|
|
135
|
+
const hasChildren = properties || items;
|
|
136
|
+
const paddingLeft = 40 + depth * 16;
|
|
137
|
+
if (hasChildren) {
|
|
138
|
+
return /* @__PURE__ */ jsxs(Collapsible, { defaultOpen: depth < 2, children: [
|
|
139
|
+
/* @__PURE__ */ jsxs(
|
|
140
|
+
CollapsibleTrigger,
|
|
141
|
+
{
|
|
142
|
+
className: cn(
|
|
143
|
+
"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50",
|
|
144
|
+
className
|
|
145
|
+
),
|
|
146
|
+
style: { paddingLeft },
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
149
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
150
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
151
|
+
required && /* @__PURE__ */ jsx(
|
|
152
|
+
Badge,
|
|
153
|
+
{
|
|
154
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
155
|
+
variant: "secondary",
|
|
156
|
+
children: "required"
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
description && /* @__PURE__ */ jsx(
|
|
163
|
+
"p",
|
|
164
|
+
{
|
|
165
|
+
className: "pb-2 text-muted-foreground text-body",
|
|
166
|
+
style: { paddingLeft: paddingLeft + 24 },
|
|
167
|
+
children: description
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxs("div", { className: "divide-y border-t", children: [
|
|
171
|
+
properties?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: depth + 1 }, prop.name)),
|
|
172
|
+
items && /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...items, depth: depth + 1, name: `${name}[]` })
|
|
173
|
+
] }) })
|
|
174
|
+
] });
|
|
175
|
+
}
|
|
176
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("py-3 pe-4", className), style: { paddingLeft }, ...props, children: [
|
|
177
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "size-4" }),
|
|
179
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
180
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
181
|
+
required && /* @__PURE__ */ jsx(
|
|
182
|
+
Badge,
|
|
183
|
+
{
|
|
184
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
185
|
+
variant: "secondary",
|
|
186
|
+
children: "required"
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
] }),
|
|
190
|
+
description && /* @__PURE__ */ jsx("p", { className: "mt-1 ps-6 text-muted-foreground text-body", children: description })
|
|
191
|
+
] });
|
|
192
|
+
};
|
|
193
|
+
var SchemaDisplayRequest = ({
|
|
194
|
+
className,
|
|
195
|
+
children,
|
|
196
|
+
...props
|
|
197
|
+
}) => {
|
|
198
|
+
const { requestBody } = useContext(SchemaDisplayContext);
|
|
199
|
+
const { t } = useLocale();
|
|
200
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
201
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
202
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
203
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.requestBody") })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? requestBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
|
|
206
|
+
] });
|
|
207
|
+
};
|
|
208
|
+
var SchemaDisplayResponse = ({
|
|
209
|
+
className,
|
|
210
|
+
children,
|
|
211
|
+
...props
|
|
212
|
+
}) => {
|
|
213
|
+
const { responseBody } = useContext(SchemaDisplayContext);
|
|
214
|
+
const { t } = useLocale();
|
|
215
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
216
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
217
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
218
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.response") })
|
|
219
|
+
] }),
|
|
220
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? responseBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
|
|
221
|
+
] });
|
|
222
|
+
};
|
|
223
|
+
var SchemaDisplay = ({
|
|
224
|
+
method,
|
|
225
|
+
path,
|
|
226
|
+
description,
|
|
227
|
+
parameters,
|
|
228
|
+
requestBody,
|
|
229
|
+
responseBody,
|
|
230
|
+
className,
|
|
231
|
+
children,
|
|
232
|
+
...props
|
|
233
|
+
}) => {
|
|
234
|
+
const contextValue = useMemo(
|
|
235
|
+
() => ({
|
|
236
|
+
description,
|
|
237
|
+
method,
|
|
238
|
+
parameters,
|
|
239
|
+
path,
|
|
240
|
+
requestBody,
|
|
241
|
+
responseBody
|
|
242
|
+
}),
|
|
243
|
+
[description, method, parameters, path, requestBody, responseBody]
|
|
244
|
+
);
|
|
245
|
+
return /* @__PURE__ */ jsx(SchemaDisplayContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-lg border bg-background", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
246
|
+
/* @__PURE__ */ jsx(SchemaDisplayHeader, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
247
|
+
/* @__PURE__ */ jsx(SchemaDisplayMethod, {}),
|
|
248
|
+
/* @__PURE__ */ jsx(SchemaDisplayPath, {})
|
|
249
|
+
] }) }),
|
|
250
|
+
description && /* @__PURE__ */ jsx(SchemaDisplayDescription, {}),
|
|
251
|
+
/* @__PURE__ */ jsxs(SchemaDisplayContent, { children: [
|
|
252
|
+
parameters && parameters.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayParameters, {}),
|
|
253
|
+
requestBody && requestBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayRequest, {}),
|
|
254
|
+
responseBody && responseBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayResponse, {})
|
|
255
|
+
] })
|
|
256
|
+
] }) }) });
|
|
257
|
+
};
|
|
258
|
+
var SchemaDisplayBody = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
|
|
259
|
+
var SchemaDisplayExample = ({
|
|
260
|
+
className,
|
|
261
|
+
children,
|
|
262
|
+
...props
|
|
263
|
+
}) => /* @__PURE__ */ jsx(
|
|
264
|
+
"pre",
|
|
265
|
+
{
|
|
266
|
+
className: cn("mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body", className),
|
|
267
|
+
...props,
|
|
268
|
+
children
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
export {
|
|
273
|
+
SchemaDisplayHeader,
|
|
274
|
+
SchemaDisplayMethod,
|
|
275
|
+
SchemaDisplayPath,
|
|
276
|
+
SchemaDisplayDescription,
|
|
277
|
+
SchemaDisplayContent,
|
|
278
|
+
SchemaDisplayParameter,
|
|
279
|
+
SchemaDisplayParameters,
|
|
280
|
+
SchemaDisplayProperty,
|
|
281
|
+
SchemaDisplayRequest,
|
|
282
|
+
SchemaDisplayResponse,
|
|
283
|
+
SchemaDisplay,
|
|
284
|
+
SchemaDisplayBody,
|
|
285
|
+
SchemaDisplayExample
|
|
286
|
+
};
|
|
287
|
+
//# sourceMappingURL=chunk-IXICSOOP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, Fragment, useContext, useMemo } from \"react\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ninterface SchemaParameter {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n location?: \"path\" | \"query\" | \"header\";\n}\n\ninterface SchemaProperty {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n properties?: SchemaProperty[];\n items?: SchemaProperty;\n}\n\ninterface SchemaDisplayContextType {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n}\n\nconst SchemaDisplayContext = createContext<SchemaDisplayContextType>({\n method: \"GET\",\n path: \"\",\n});\n\nconst methodStyles: Record<HttpMethod, string> = {\n DELETE: \"border-destructive/40 bg-destructive/10 text-destructive-text\",\n GET: \"border-success/40 bg-success/10 text-success-text\",\n PATCH: \"border-warning/40 bg-warning/10 text-warning-text\",\n POST: \"border-info/40 bg-info/10 text-info-text\",\n PUT: \"border-warning/40 bg-warning/10 text-warning-text\",\n};\n\n/** Splits a `{param}` path into plain-text and parameter segments for safe rendering. */\nfunction splitSchemaPath(path: string): Array<{ text: string; isParam: boolean }> {\n const parts: Array<{ text: string; isParam: boolean }> = [];\n const regex = /\\{([^}]+)\\}/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null = regex.exec(path);\n\n while (match !== null) {\n if (match.index > lastIndex) {\n parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });\n }\n parts.push({ isParam: true, text: match[0] });\n lastIndex = match.index + match[0].length;\n match = regex.exec(path);\n }\n\n if (lastIndex < path.length) {\n parts.push({ isParam: false, text: path.slice(lastIndex) });\n }\n\n return parts;\n}\n\nexport type SchemaDisplayHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayHeader = ({\n className,\n children,\n ...props\n}: SchemaDisplayHeaderProps) => (\n <div className={cn(\"flex items-center gap-3 border-b px-4 py-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayMethodProps = ComponentProps<typeof Badge>;\n\nexport const SchemaDisplayMethod = ({\n className,\n children,\n ...props\n}: SchemaDisplayMethodProps) => {\n const { method } = useContext(SchemaDisplayContext);\n\n return (\n <Badge\n className={cn(\"font-mono text-meta\", methodStyles[method], className)}\n variant=\"secondary\"\n {...props}\n >\n {children ?? method}\n </Badge>\n );\n};\n\nexport type SchemaDisplayPathProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const SchemaDisplayPath = ({ className, children, ...props }: SchemaDisplayPathProps) => {\n const { path } = useContext(SchemaDisplayContext);\n\n // Highlight path parameters as real elements — the path is untrusted\n // (tool/model output) and must never reach dangerouslySetInnerHTML.\n const pathNodes = useMemo<ReactNode>(\n () =>\n splitSchemaPath(path).map((part, index) =>\n part.isParam ? (\n <span className=\"text-info-text\" key={`${part.text}-${index}`}>\n {part.text}\n </span>\n ) : (\n <Fragment key={`${part.text}-${index}`}>{part.text}</Fragment>\n ),\n ),\n [path],\n );\n\n return (\n <span className={cn(\"font-mono text-body\", className)} {...props}>\n {children ?? pathNodes}\n </span>\n );\n};\n\nexport type SchemaDisplayDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const SchemaDisplayDescription = ({\n className,\n children,\n ...props\n}: SchemaDisplayDescriptionProps) => {\n const { description } = useContext(SchemaDisplayContext);\n\n return (\n <p className={cn(\"border-b px-4 py-3 text-muted-foreground text-body\", className)} {...props}>\n {children ?? description}\n </p>\n );\n};\n\nexport type SchemaDisplayContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayContent = ({\n className,\n children,\n ...props\n}: SchemaDisplayContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayParameterProps = HTMLAttributes<HTMLDivElement> & SchemaParameter;\n\nexport const SchemaDisplayParameter = ({\n name,\n type,\n required,\n description,\n location,\n className,\n ...props\n}: SchemaDisplayParameterProps) => (\n <div className={cn(\"px-4 py-3 ps-10\", className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {location && (\n <Badge className=\"text-meta\" variant=\"secondary\">\n {location}\n </Badge>\n )}\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 text-muted-foreground text-body\">{description}</p>}\n </div>\n);\n\nexport type SchemaDisplayParametersProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayParameters = ({\n className,\n children,\n ...props\n}: SchemaDisplayParametersProps) => {\n const { parameters } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.parameters\")}</span>\n <Badge className=\"ms-auto text-meta\" variant=\"secondary\">\n {parameters?.length}\n </Badge>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {children ??\n parameters?.map((param) => <SchemaDisplayParameter key={param.name} {...param} />)}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayPropertyProps = HTMLAttributes<HTMLDivElement> &\n SchemaProperty & {\n depth?: number;\n };\n\nexport const SchemaDisplayProperty = ({\n name,\n type,\n required,\n description,\n properties,\n items,\n depth = 0,\n className,\n ...props\n}: SchemaDisplayPropertyProps) => {\n const hasChildren = properties || items;\n const paddingLeft = 40 + depth * 16;\n\n if (hasChildren) {\n return (\n <Collapsible defaultOpen={depth < 2}>\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n style={{ paddingLeft }}\n >\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </CollapsibleTrigger>\n {description && (\n <p\n className=\"pb-2 text-muted-foreground text-body\"\n style={{ paddingLeft: paddingLeft + 24 }}\n >\n {description}\n </p>\n )}\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {properties?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={depth + 1} />\n ))}\n {items && <SchemaDisplayProperty {...items} depth={depth + 1} name={`${name}[]`} />}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n }\n\n return (\n <div className={cn(\"py-3 pe-4\", className)} style={{ paddingLeft }} {...props}>\n <div className=\"flex items-center gap-2\">\n {/* Spacer for alignment */}\n <span className=\"size-4\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 ps-6 text-muted-foreground text-body\">{description}</p>}\n </div>\n );\n};\n\nexport type SchemaDisplayRequestProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayRequest = ({\n className,\n children,\n ...props\n}: SchemaDisplayRequestProps) => {\n const { requestBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.requestBody\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n requestBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayResponseProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayResponse = ({\n className,\n children,\n ...props\n}: SchemaDisplayResponseProps) => {\n const { responseBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.response\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n responseBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayProps = HTMLAttributes<HTMLDivElement> & {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n};\n\nexport const SchemaDisplay = ({\n method,\n path,\n description,\n parameters,\n requestBody,\n responseBody,\n className,\n children,\n ...props\n}: SchemaDisplayProps) => {\n const contextValue = useMemo(\n () => ({\n description,\n method,\n parameters,\n path,\n requestBody,\n responseBody,\n }),\n [description, method, parameters, path, requestBody, responseBody],\n );\n\n return (\n <SchemaDisplayContext.Provider value={contextValue}>\n <div className={cn(\"overflow-hidden rounded-lg border bg-background\", className)} {...props}>\n {children ?? (\n <>\n <SchemaDisplayHeader>\n <div className=\"flex items-center gap-3\">\n <SchemaDisplayMethod />\n <SchemaDisplayPath />\n </div>\n </SchemaDisplayHeader>\n {description && <SchemaDisplayDescription />}\n <SchemaDisplayContent>\n {parameters && parameters.length > 0 && <SchemaDisplayParameters />}\n {requestBody && requestBody.length > 0 && <SchemaDisplayRequest />}\n {responseBody && responseBody.length > 0 && <SchemaDisplayResponse />}\n </SchemaDisplayContent>\n </>\n )}\n </div>\n </SchemaDisplayContext.Provider>\n );\n};\n\nexport type SchemaDisplayBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayBody = ({ className, children, ...props }: SchemaDisplayBodyProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayExampleProps = HTMLAttributes<HTMLPreElement>;\n\nexport const SchemaDisplayExample = ({\n className,\n children,\n ...props\n}: SchemaDisplayExampleProps) => (\n <pre\n className={cn(\"mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n"],"mappings":"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","names":["Fragment"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/message-feedback.tsx
|
|
4
|
+
import { forwardRef, useState } from "react";
|
|
5
|
+
import { ThumbsDown, ThumbsUp } from "lucide-react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { Button } from "@elabs-ai/components-ui";
|
|
8
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
9
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var messageFeedbackVariants = cva("inline-flex items-center", {
|
|
12
|
+
variants: {
|
|
13
|
+
compact: { true: "gap-0.5", false: "gap-1" }
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: { compact: false }
|
|
16
|
+
});
|
|
17
|
+
var MessageFeedback = forwardRef(
|
|
18
|
+
function MessageFeedback2({
|
|
19
|
+
value: valueProp,
|
|
20
|
+
defaultValue = null,
|
|
21
|
+
onSubmit,
|
|
22
|
+
disabled = false,
|
|
23
|
+
compact = false,
|
|
24
|
+
positiveLabel = "Good response",
|
|
25
|
+
negativeLabel = "Bad response",
|
|
26
|
+
className,
|
|
27
|
+
...props
|
|
28
|
+
}, ref) {
|
|
29
|
+
const { t } = useLocale();
|
|
30
|
+
const isControlled = valueProp !== void 0;
|
|
31
|
+
const [internal, setInternal] = useState(defaultValue);
|
|
32
|
+
const selected = isControlled ? valueProp : internal;
|
|
33
|
+
const submitted = selected != null;
|
|
34
|
+
const choose = (type) => {
|
|
35
|
+
if (submitted || disabled) return;
|
|
36
|
+
if (!isControlled) setInternal(type);
|
|
37
|
+
onSubmit?.({ type });
|
|
38
|
+
};
|
|
39
|
+
const compactBtn = compact ? "size-7 [&_svg]:size-3.5" : void 0;
|
|
40
|
+
const renderButton = (type, label, Icon) => {
|
|
41
|
+
const active = selected === type;
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
Button,
|
|
44
|
+
{
|
|
45
|
+
type: "button",
|
|
46
|
+
variant: "ghost",
|
|
47
|
+
size: "icon-sm",
|
|
48
|
+
"aria-label": label,
|
|
49
|
+
"aria-pressed": active,
|
|
50
|
+
disabled: disabled || submitted,
|
|
51
|
+
onClick: () => choose(type),
|
|
52
|
+
className: cn(
|
|
53
|
+
"text-muted-foreground hover:text-foreground",
|
|
54
|
+
active && "text-primary disabled:opacity-100 [&_svg]:fill-current",
|
|
55
|
+
compactBtn
|
|
56
|
+
),
|
|
57
|
+
children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ jsxs(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
ref,
|
|
65
|
+
role: "group",
|
|
66
|
+
"aria-label": t("ai.message.feedback"),
|
|
67
|
+
"data-submitted": submitted || void 0,
|
|
68
|
+
"data-feedback": selected ?? void 0,
|
|
69
|
+
className: cn(messageFeedbackVariants({ compact }), className),
|
|
70
|
+
...props,
|
|
71
|
+
children: [
|
|
72
|
+
renderButton("positive", positiveLabel, ThumbsUp),
|
|
73
|
+
renderButton("negative", negativeLabel, ThumbsDown)
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
messageFeedbackVariants,
|
|
82
|
+
MessageFeedback
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=chunk-JY5HSN4D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/message-feedback.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageFeedback — thumbs up / down for a single assistant message.\n *\n * Presentational only: it emits `onSubmit({ type })` and reflects the chosen\n * state; it does NOT persist anything (the host owns storage). After a choice\n * the buttons auto-disable (feedback is submit-once) and the root carries\n * `data-submitted` + `data-feedback`. Controlled (`value`) or uncontrolled.\n */\n\nimport { forwardRef, useState, type HTMLAttributes } from \"react\";\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nexport type FeedbackType = \"positive\" | \"negative\";\n\nexport const messageFeedbackVariants = cva(\"inline-flex items-center\", {\n variants: {\n compact: { true: \"gap-0.5\", false: \"gap-1\" },\n },\n defaultVariants: { compact: false },\n});\n\nexport interface MessageFeedbackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\" | \"defaultValue\">,\n VariantProps<typeof messageFeedbackVariants> {\n /** Controlled selected feedback. When set, `onSubmit` is the only updater. */\n value?: FeedbackType | null;\n /** Uncontrolled initial selection. @default null */\n defaultValue?: FeedbackType | null;\n /** Called once with the chosen feedback. No persistence — host-owned. */\n onSubmit?: (feedback: { type: FeedbackType }) => void;\n /** Force-disable both controls (e.g. while the message is still streaming). */\n disabled?: boolean;\n /** aria-label for the positive control. @default \"Good response\" */\n positiveLabel?: string;\n /** aria-label for the negative control. @default \"Bad response\" */\n negativeLabel?: string;\n}\n\n/**\n * Two icon buttons. The chosen one stays prominent after submit; the other\n * recedes. `compact` tightens spacing/size for message toolbars.\n */\nexport const MessageFeedback = forwardRef<HTMLDivElement, MessageFeedbackProps>(\n function MessageFeedback(\n {\n value: valueProp,\n defaultValue = null,\n onSubmit,\n disabled = false,\n compact = false,\n positiveLabel = \"Good response\",\n negativeLabel = \"Bad response\",\n className,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const isControlled = valueProp !== undefined;\n const [internal, setInternal] = useState<FeedbackType | null>(defaultValue);\n const selected = isControlled ? (valueProp as FeedbackType | null) : internal;\n const submitted = selected != null;\n\n const choose = (type: FeedbackType) => {\n if (submitted || disabled) return;\n if (!isControlled) setInternal(type);\n onSubmit?.({ type });\n };\n\n const compactBtn = compact ? \"size-7 [&_svg]:size-3.5\" : undefined;\n\n const renderButton = (type: FeedbackType, label: string, Icon: typeof ThumbsUp) => {\n const active = selected === type;\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n aria-pressed={active}\n // After submit both are inert; keep the chosen one at full opacity.\n disabled={disabled || submitted}\n onClick={() => choose(type)}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n active && \"text-primary disabled:opacity-100 [&_svg]:fill-current\",\n compactBtn,\n )}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={t(\"ai.message.feedback\")}\n data-submitted={submitted || undefined}\n data-feedback={selected ?? undefined}\n className={cn(messageFeedbackVariants({ compact }), className)}\n {...props}\n >\n {renderButton(\"positive\", positiveLabel, ThumbsUp)}\n {renderButton(\"negative\", negativeLabel, ThumbsDown)}\n </div>\n );\n },\n);\n"],"mappings":";;;AAWA,SAAS,YAAY,gBAAqC;AAC1D,SAAS,YAAY,gBAAgB;AACrC,SAAS,WAA8B;AACvC,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAgFhB,cAMJ,YANI;AA5EH,IAAM,0BAA0B,IAAI,4BAA4B;AAAA,EACrE,UAAU;AAAA,IACR,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ;AAAA,EAC7C;AAAA,EACA,iBAAiB,EAAE,SAAS,MAAM;AACpC,CAAC;AAwBM,IAAM,kBAAkB;AAAA,EAC7B,SAASA,iBACP;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,EAAE,EAAE,IAAI,UAAU;AACxB,UAAM,eAAe,cAAc;AACnC,UAAM,CAAC,UAAU,WAAW,IAAI,SAA8B,YAAY;AAC1E,UAAM,WAAW,eAAgB,YAAoC;AACrE,UAAM,YAAY,YAAY;AAE9B,UAAM,SAAS,CAAC,SAAuB;AACrC,UAAI,aAAa,SAAU;AAC3B,UAAI,CAAC,aAAc,aAAY,IAAI;AACnC,iBAAW,EAAE,KAAK,CAAC;AAAA,IACrB;AAEA,UAAM,aAAa,UAAU,4BAA4B;AAEzD,UAAM,eAAe,CAAC,MAAoB,OAAe,SAA0B;AACjF,YAAM,SAAS,aAAa;AAC5B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,gBAAc;AAAA,UAEd,UAAU,YAAY;AAAA,UACtB,SAAS,MAAM,OAAO,IAAI;AAAA,UAC1B,WAAW;AAAA,YACT;AAAA,YACA,UAAU;AAAA,YACV;AAAA,UACF;AAAA,UAEA,8BAAC,QAAK,eAAY,QAAO;AAAA;AAAA,MAC3B;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,EAAE,qBAAqB;AAAA,QACnC,kBAAgB,aAAa;AAAA,QAC7B,iBAAe,YAAY;AAAA,QAC3B,WAAW,GAAG,wBAAwB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,QAC5D,GAAG;AAAA,QAEH;AAAA,uBAAa,YAAY,eAAe,QAAQ;AAAA,UAChD,aAAa,YAAY,eAAe,UAAU;AAAA;AAAA;AAAA,IACrD;AAAA,EAEJ;AACF;","names":["MessageFeedback"]}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
A2UI_CATALOG_SCHEMA
|
|
4
|
+
} from "./chunk-QOBSEGCG.js";
|
|
5
|
+
|
|
6
|
+
// src/a2ui/ui-catalog.tsx
|
|
7
|
+
import {
|
|
8
|
+
Accordion,
|
|
9
|
+
AccordionContent,
|
|
10
|
+
AccordionItem,
|
|
11
|
+
AccordionTrigger,
|
|
12
|
+
Alert,
|
|
13
|
+
AlertDescription,
|
|
14
|
+
AlertTitle,
|
|
15
|
+
Avatar,
|
|
16
|
+
AvatarFallback,
|
|
17
|
+
Badge,
|
|
18
|
+
BentoGrid,
|
|
19
|
+
BentoGridItem,
|
|
20
|
+
Button,
|
|
21
|
+
ButtonGroup,
|
|
22
|
+
Card,
|
|
23
|
+
CardAction,
|
|
24
|
+
CardContent,
|
|
25
|
+
CardDescription,
|
|
26
|
+
CardFooter,
|
|
27
|
+
CardHeader,
|
|
28
|
+
CardTitle,
|
|
29
|
+
Checkbox,
|
|
30
|
+
Collapsible,
|
|
31
|
+
CollapsibleContent,
|
|
32
|
+
CollapsibleTrigger,
|
|
33
|
+
Descriptions,
|
|
34
|
+
DescriptionsItem,
|
|
35
|
+
EmptyState,
|
|
36
|
+
Heading,
|
|
37
|
+
Input,
|
|
38
|
+
Kbd,
|
|
39
|
+
Label,
|
|
40
|
+
MetricCard,
|
|
41
|
+
Progress,
|
|
42
|
+
RadioGroup,
|
|
43
|
+
RadioGroupItem,
|
|
44
|
+
SectionHeader,
|
|
45
|
+
Select,
|
|
46
|
+
SelectContent,
|
|
47
|
+
SelectItem,
|
|
48
|
+
SelectTrigger,
|
|
49
|
+
SelectValue,
|
|
50
|
+
Separator,
|
|
51
|
+
Slider,
|
|
52
|
+
StatePanel,
|
|
53
|
+
StatusBadge,
|
|
54
|
+
Switch,
|
|
55
|
+
Table,
|
|
56
|
+
TableBody,
|
|
57
|
+
TableCaption,
|
|
58
|
+
TableCell,
|
|
59
|
+
TableFooter,
|
|
60
|
+
TableHead,
|
|
61
|
+
TableHeader,
|
|
62
|
+
TableRow,
|
|
63
|
+
Tabs,
|
|
64
|
+
TabsContent,
|
|
65
|
+
TabsList,
|
|
66
|
+
TabsTrigger,
|
|
67
|
+
Text,
|
|
68
|
+
Textarea,
|
|
69
|
+
Timeline
|
|
70
|
+
} from "@elabs-ai/components-ui";
|
|
71
|
+
import { jsx } from "react/jsx-runtime";
|
|
72
|
+
var SurfaceAlertTitle = (props) => /* @__PURE__ */ jsx(AlertTitle, { ...props, as: "div" });
|
|
73
|
+
var UI_CATALOG_BINDINGS = {
|
|
74
|
+
Accordion,
|
|
75
|
+
AccordionContent,
|
|
76
|
+
AccordionItem,
|
|
77
|
+
AccordionTrigger,
|
|
78
|
+
Alert,
|
|
79
|
+
AlertDescription,
|
|
80
|
+
AlertTitle: SurfaceAlertTitle,
|
|
81
|
+
Avatar,
|
|
82
|
+
AvatarFallback,
|
|
83
|
+
Badge,
|
|
84
|
+
BentoGrid,
|
|
85
|
+
BentoGridItem,
|
|
86
|
+
Button,
|
|
87
|
+
ButtonGroup,
|
|
88
|
+
Card,
|
|
89
|
+
CardAction,
|
|
90
|
+
CardContent,
|
|
91
|
+
CardDescription,
|
|
92
|
+
CardFooter,
|
|
93
|
+
CardHeader,
|
|
94
|
+
CardTitle,
|
|
95
|
+
Checkbox,
|
|
96
|
+
Collapsible,
|
|
97
|
+
CollapsibleContent,
|
|
98
|
+
CollapsibleTrigger,
|
|
99
|
+
Descriptions,
|
|
100
|
+
DescriptionsItem,
|
|
101
|
+
EmptyState,
|
|
102
|
+
Heading,
|
|
103
|
+
Input,
|
|
104
|
+
Kbd,
|
|
105
|
+
Label,
|
|
106
|
+
MetricCard,
|
|
107
|
+
Progress,
|
|
108
|
+
RadioGroup,
|
|
109
|
+
RadioGroupItem,
|
|
110
|
+
SectionHeader,
|
|
111
|
+
Select,
|
|
112
|
+
SelectContent,
|
|
113
|
+
SelectItem,
|
|
114
|
+
SelectTrigger,
|
|
115
|
+
SelectValue,
|
|
116
|
+
Separator,
|
|
117
|
+
Slider,
|
|
118
|
+
StatePanel,
|
|
119
|
+
StatusBadge,
|
|
120
|
+
Switch,
|
|
121
|
+
Table,
|
|
122
|
+
TableBody,
|
|
123
|
+
TableCaption,
|
|
124
|
+
TableCell,
|
|
125
|
+
TableFooter,
|
|
126
|
+
TableHead,
|
|
127
|
+
TableHeader,
|
|
128
|
+
TableRow,
|
|
129
|
+
Tabs,
|
|
130
|
+
TabsContent,
|
|
131
|
+
TabsList,
|
|
132
|
+
TabsTrigger,
|
|
133
|
+
Text,
|
|
134
|
+
Textarea,
|
|
135
|
+
Timeline
|
|
136
|
+
};
|
|
137
|
+
function createA2uiCatalog(bindings, schema = A2UI_CATALOG_SCHEMA) {
|
|
138
|
+
const catalog = {};
|
|
139
|
+
for (const [type, typeSchema] of Object.entries(schema)) {
|
|
140
|
+
if (typeSchema.builtin) {
|
|
141
|
+
catalog[type] = { schema: typeSchema };
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const component = bindings[type];
|
|
145
|
+
if (!component) {
|
|
146
|
+
throw new Error(`createA2uiCatalog: catalog type "${type}" has no component binding`);
|
|
147
|
+
}
|
|
148
|
+
catalog[type] = { schema: typeSchema, component };
|
|
149
|
+
}
|
|
150
|
+
return catalog;
|
|
151
|
+
}
|
|
152
|
+
function defineA2uiType(partial) {
|
|
153
|
+
return {
|
|
154
|
+
children: partial.children ?? false,
|
|
155
|
+
props: partial.props ?? {},
|
|
156
|
+
events: partial.events ?? {},
|
|
157
|
+
source: partial.source ?? "app",
|
|
158
|
+
...partial.summary ? { summary: partial.summary } : {},
|
|
159
|
+
...partial.builtin ? { builtin: true } : {}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function catalogSchema(catalog) {
|
|
163
|
+
return Object.fromEntries(Object.entries(catalog).map(([t, e]) => [t, e.schema]));
|
|
164
|
+
}
|
|
165
|
+
var uiCatalog = createA2uiCatalog(UI_CATALOG_BINDINGS);
|
|
166
|
+
|
|
167
|
+
export {
|
|
168
|
+
UI_CATALOG_BINDINGS,
|
|
169
|
+
createA2uiCatalog,
|
|
170
|
+
defineA2uiType,
|
|
171
|
+
catalogSchema,
|
|
172
|
+
uiCatalog
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=chunk-L4SU3QJV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a2ui/ui-catalog.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * ui-catalog.tsx — the shipped A2UI catalog: every non-builtin type in\n * `catalog.source.json` bound to its `@elabs-ai/components-ui` component. The\n * schema half (`A2UI_CATALOG_SCHEMA`, generated) says what an agent MAY emit; this\n * half says what it renders AS. A test asserts the two key sets are identical, so\n * a type cannot be validatable-but-unrenderable or the reverse.\n *\n * Apps extend it (`createA2uiCatalog`) with their own types — a chart from\n * `@elabs-ai/components-charts`, a domain card — because `ai` may not import its\n * sibling packages (one-way dependency graph) and an app composes freely.\n */\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Alert,\n AlertDescription,\n AlertTitle,\n Avatar,\n AvatarFallback,\n Badge,\n BentoGrid,\n BentoGridItem,\n Button,\n ButtonGroup,\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n Checkbox,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Descriptions,\n DescriptionsItem,\n EmptyState,\n Heading,\n Input,\n Kbd,\n Label,\n MetricCard,\n Progress,\n RadioGroup,\n RadioGroupItem,\n SectionHeader,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n Slider,\n StatePanel,\n StatusBadge,\n Switch,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Text,\n Textarea,\n Timeline,\n} from \"@elabs-ai/components-ui\";\nimport type { AlertTitleProps } from \"@elabs-ai/components-ui\";\nimport type { ComponentType } from \"react\";\n\nimport { A2UI_CATALOG_SCHEMA } from \"./core/catalog.generated\";\nimport type { A2uiCatalogSchema, A2uiCatalogTypeSchema } from \"./core/spec\";\n\n/** One renderable catalog type: its schema plus the component that draws it. */\nexport interface A2uiCatalogEntry {\n schema: A2uiCatalogTypeSchema;\n /** Absent for builtins (`Stack`, `Grid`), which the surface draws itself. */\n component?: ComponentType<Record<string, unknown>>;\n}\n\nexport type A2uiCatalog = Record<string, A2uiCatalogEntry>;\n\n// `ComponentType<Record<string, unknown>>` is the erased shape the renderer calls\n// with validated, catalog-shaped props; each binding is a real ui component.\ntype AnyComponent = ComponentType<any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- erased at the catalog boundary; props are validated against the schema\n\n/**\n * `AlertTitle` inside a surface, as a `<div>` rather than its default `<h5>`.\n *\n * A surface is rendered into a host page whose heading outline the agent cannot see, so a\n * fixed `h5` fails axe's `heading-order` under any host with no `h4` above it — which is\n * most of them. The alert's `role=\"alert\"` announces the title either way, so the heading\n * adds nothing here; `CardTitle` defaults to `div` for the same reason. A host writing real\n * code composes `<AlertTitle as=\"h3\">`, where the level is knowable.\n */\nconst SurfaceAlertTitle = (props: AlertTitleProps) => <AlertTitle {...props} as=\"div\" />;\n\n/** The `@elabs-ai/components-ui` bindings, one per non-builtin catalog type. */\nexport const UI_CATALOG_BINDINGS: Record<string, AnyComponent> = {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Alert,\n AlertDescription,\n AlertTitle: SurfaceAlertTitle,\n Avatar,\n AvatarFallback,\n Badge,\n BentoGrid,\n BentoGridItem,\n Button,\n ButtonGroup,\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n Checkbox,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Descriptions,\n DescriptionsItem,\n EmptyState,\n Heading,\n Input,\n Kbd,\n Label,\n MetricCard,\n Progress,\n RadioGroup,\n RadioGroupItem,\n SectionHeader,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n Slider,\n StatePanel,\n StatusBadge,\n Switch,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Text,\n Textarea,\n Timeline,\n};\n\n/**\n * Build a catalog from component bindings + a schema. Every schema type that is\n * not a builtin must have a binding; a binding without a schema is ignored (it\n * would be unvalidatable). Extend the shipped one:\n *\n * ```ts\n * const catalog = createA2uiCatalog(\n * { ...UI_CATALOG_BINDINGS, RevenueChart },\n * { ...A2UI_CATALOG_SCHEMA, RevenueChart: defineA2uiType({ props: { series: { type: \"array\", required: true } } }) },\n * );\n * ```\n */\nexport function createA2uiCatalog(\n bindings: Record<string, AnyComponent>,\n schema: A2uiCatalogSchema = A2UI_CATALOG_SCHEMA,\n): A2uiCatalog {\n const catalog: A2uiCatalog = {};\n for (const [type, typeSchema] of Object.entries(schema)) {\n if (typeSchema.builtin) {\n catalog[type] = { schema: typeSchema };\n continue;\n }\n const component = bindings[type];\n if (!component) {\n throw new Error(`createA2uiCatalog: catalog type \"${type}\" has no component binding`);\n }\n catalog[type] = { schema: typeSchema, component };\n }\n return catalog;\n}\n\n/** Author a schema entry for an app-provided type with sensible defaults. */\nexport function defineA2uiType(\n partial: Partial<A2uiCatalogTypeSchema> & { source?: string },\n): A2uiCatalogTypeSchema {\n return {\n children: partial.children ?? false,\n props: partial.props ?? {},\n events: partial.events ?? {},\n source: partial.source ?? \"app\",\n ...(partial.summary ? { summary: partial.summary } : {}),\n ...(partial.builtin ? { builtin: true } : {}),\n };\n}\n\n/** The schema half of a catalog (what `validateA2uiSurface` takes). */\nexport function catalogSchema(catalog: A2uiCatalog): A2uiCatalogSchema {\n return Object.fromEntries(Object.entries(catalog).map(([t, e]) => [t, e.schema]));\n}\n\n/** The shipped catalog: builtins + every `@elabs-ai/components-ui` type above. */\nexport const uiCatalog: A2uiCatalog = createA2uiCatalog(UI_CATALOG_BINDINGS);\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
lazyFlowPart
|
|
4
|
+
} from "./chunk-NMVNNO3L.js";
|
|
5
|
+
|
|
6
|
+
// src/panel.tsx
|
|
7
|
+
import { Suspense } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
var PanelImpl = lazyFlowPart((m) => m.Panel);
|
|
10
|
+
var Panel = (props) => (
|
|
11
|
+
// An overlay inside an already-loaded `<Canvas>`, so there is no box to
|
|
12
|
+
// reserve — the engine chunk it needs is the one the canvas already fetched.
|
|
13
|
+
/* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(PanelImpl, { ...props }) })
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
Panel
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=chunk-LMNSBOBG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/panel.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Panel as PanelPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type PanelProps = ComponentProps<typeof PanelPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst PanelImpl = lazyFlowPart<PanelProps>((m) => m.Panel);\n\nexport const Panel = (props: PanelProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <PanelImpl {...props} />\n </Suspense>\n);\n"],"mappings":";;;;;;AAIA,SAAS,gBAAgB;AAarB;AANJ,IAAM,YAAY,aAAyB,CAAC,MAAM,EAAE,KAAK;AAElD,IAAM,QAAQ,CAAC;AAAA;AAAA;AAAA,EAGpB,oBAAC,YAAS,UAAU,MAClB,8BAAC,aAAW,GAAG,OAAO,GACxB;AAAA;","names":[]}
|