@elabs-ai/components-ai 4.1.0 → 5.0.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 +3 -3
- 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-AXMNJMMH.js +984 -0
- package/dist/chunk-AXMNJMMH.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-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-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-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-SPQIU7GA.js +236 -0
- package/dist/chunk-SPQIU7GA.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-XNBKO32Y.js +174 -0
- package/dist/chunk-XNBKO32Y.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 +403 -108
- package/dist/index.js +671 -13205
- 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 +12 -10
- package/schemas/a2ui-surface.v1.schema.json +5425 -0
- package/src/__contract__/audio-visualizer.contract.test.tsx +49 -0
- package/src/__contract__/chat-shell.contract.test.tsx +49 -0
- package/src/__contract__/grouped-parts.contract.test.tsx +49 -0
- package/src/__contract__/image.contract.test.tsx +49 -0
- package/src/__contract__/markdown-view.contract.test.tsx +49 -0
- package/src/__contract__/message-feedback.contract.test.tsx +49 -0
- package/src/__contract__/message-form.contract.test.tsx +49 -0
- package/src/__contract__/message-table.contract.test.tsx +49 -0
- package/src/__contract__/model-provider-logo.contract.test.tsx +49 -0
- package/src/__contract__/persona.contract.test.tsx +49 -0
- package/src/__contract__/prompt-input-effort.contract.test.tsx +49 -0
- package/src/__contract__/prompt-input-mode.contract.test.tsx +49 -0
- package/src/_chat-shell-rail.tsx +4 -2
- package/src/_flow-boundary.tsx +2 -2
- package/src/_lazy-cjk.test.ts +43 -0
- package/src/_lazy-cjk.ts +73 -0
- package/src/_lazy-math.test.ts +63 -0
- package/src/_lazy-math.ts +90 -0
- package/src/_persona-rive.tsx +27 -41
- package/src/_streamdown-i18n.ts +73 -21
- package/src/_streamdown-safety.ts +2 -2
- package/src/_theme-scope-store.test.ts +83 -0
- package/src/_theme-scope-store.ts +103 -0
- 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 +1006 -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/agent-event.tsx +1 -1
- package/src/agent.tsx +18 -13
- package/src/agentic-workspace.stories.tsx +6 -45
- package/src/artifact.tsx +2 -2
- package/src/asset-preview.test.tsx +40 -0
- package/src/asset-preview.tsx +83 -12
- package/src/attachments.tsx +7 -4
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/code-block.test.tsx +100 -1
- package/src/code-block.tsx +166 -103
- package/src/commit.tsx +30 -41
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/confirmation.tsx +1 -1
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +2 -2
- package/src/conversation.stories.tsx +24 -0
- package/src/conversation.test.tsx +69 -0
- package/src/conversation.tsx +47 -8
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.test.tsx +52 -2
- package/src/diff-view.tsx +92 -36
- package/src/environment-variables.tsx +20 -37
- package/src/file-tree.test.tsx +21 -0
- package/src/file-tree.tsx +33 -16
- 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/inline-citation.tsx +5 -5
- package/src/jsx-preview.tsx +151 -43
- package/src/markdown-view.test.tsx +7 -3
- package/src/markdown-view.tsx +8 -1
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.stories.tsx +36 -3
- package/src/message-form.test.tsx +8 -2
- package/src/message-form.tsx +16 -8
- package/src/message-table.stories.tsx +26 -2
- package/src/message-table.test.tsx +7 -0
- package/src/message-table.tsx +9 -5
- package/src/message.test.tsx +73 -3
- package/src/message.tsx +36 -12
- package/src/model-provider-logo.test.tsx +57 -3
- package/src/model-provider-logo.tsx +45 -11
- package/src/open-in-chat.tsx +50 -29
- package/src/package-info.tsx +23 -20
- package/src/prompt-input-slash.stories.tsx +1 -1
- package/src/prompt-input.test.tsx +67 -1
- package/src/prompt-input.tsx +42 -4
- package/src/queue.tsx +4 -4
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +17 -6
- package/src/sandbox.tsx +3 -3
- package/src/schema-display.test.tsx +56 -0
- package/src/schema-display.tsx +68 -37
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/snippet.test.tsx +6 -2
- package/src/snippet.tsx +14 -34
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/speech-input.test.tsx +109 -0
- package/src/speech-input.tsx +31 -3
- package/src/stack-trace.tsx +20 -36
- package/src/streamdown-i18n.test.tsx +23 -0
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/test-results.tsx +47 -27
- package/src/token-usage.tsx +6 -6
- package/src/tool.stories.tsx +39 -0
- package/src/tool.test.tsx +65 -0
- package/src/tool.tsx +61 -25
- package/src/toolbar.tsx +0 -10
- package/src/transcription.tsx +1 -1
- package/src/voice-selector.tsx +5 -5
- package/src/web-preview.test.tsx +51 -1
- package/src/web-preview.tsx +39 -8
- 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,87 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/snippet.tsx
|
|
4
|
+
import {
|
|
5
|
+
InputGroup,
|
|
6
|
+
InputGroupAddon,
|
|
7
|
+
InputGroupButton,
|
|
8
|
+
InputGroupInput,
|
|
9
|
+
InputGroupText
|
|
10
|
+
} from "@elabs-ai/components-ui";
|
|
11
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
12
|
+
import { useCopyToClipboard, useLocale } from "@elabs-ai/components-ui";
|
|
13
|
+
import { CheckIcon, CopyIcon } from "lucide-react";
|
|
14
|
+
import { createContext, useCallback, useContext, useMemo } from "react";
|
|
15
|
+
import { jsx } from "react/jsx-runtime";
|
|
16
|
+
var SnippetContext = createContext({
|
|
17
|
+
code: ""
|
|
18
|
+
});
|
|
19
|
+
var Snippet = ({ code, className, children, ...props }) => {
|
|
20
|
+
const contextValue = useMemo(() => ({ code }), [code]);
|
|
21
|
+
return /* @__PURE__ */ jsx(SnippetContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(InputGroup, { className: cn("font-mono", className), ...props, children }) });
|
|
22
|
+
};
|
|
23
|
+
var SnippetAddon = (props) => /* @__PURE__ */ jsx(InputGroupAddon, { ...props });
|
|
24
|
+
var SnippetText = ({ className, ...props }) => /* @__PURE__ */ jsx(InputGroupText, { className: cn("ps-2 font-normal text-muted-foreground", className), ...props });
|
|
25
|
+
var SnippetInput = ({ className, ...props }) => {
|
|
26
|
+
const { code } = useContext(SnippetContext);
|
|
27
|
+
return /* @__PURE__ */ jsx(
|
|
28
|
+
InputGroupInput,
|
|
29
|
+
{
|
|
30
|
+
className: cn("text-foreground", className),
|
|
31
|
+
readOnly: true,
|
|
32
|
+
value: code,
|
|
33
|
+
...props
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
var SnippetCopyButton = ({
|
|
38
|
+
onCopy,
|
|
39
|
+
onError,
|
|
40
|
+
timeout,
|
|
41
|
+
children,
|
|
42
|
+
className,
|
|
43
|
+
...props
|
|
44
|
+
}) => {
|
|
45
|
+
const { t } = useLocale();
|
|
46
|
+
const { code } = useContext(SnippetContext);
|
|
47
|
+
const { copied: isCopied, copy } = useCopyToClipboard(
|
|
48
|
+
timeout === void 0 ? void 0 : { resetAfterMs: timeout }
|
|
49
|
+
);
|
|
50
|
+
const copyToClipboard = useCallback(async () => {
|
|
51
|
+
const ok = await copy(code);
|
|
52
|
+
if (ok) {
|
|
53
|
+
onCopy?.();
|
|
54
|
+
} else {
|
|
55
|
+
onError?.(new Error("Clipboard API not available"));
|
|
56
|
+
}
|
|
57
|
+
}, [copy, code, onCopy, onError]);
|
|
58
|
+
const Icon = isCopied ? CheckIcon : CopyIcon;
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
InputGroupButton,
|
|
61
|
+
{
|
|
62
|
+
"aria-label": t("copy"),
|
|
63
|
+
className,
|
|
64
|
+
onClick: copyToClipboard,
|
|
65
|
+
size: "icon-sm",
|
|
66
|
+
title: t("copy"),
|
|
67
|
+
...props,
|
|
68
|
+
children: children ?? /* @__PURE__ */ jsx(
|
|
69
|
+
"span",
|
|
70
|
+
{
|
|
71
|
+
className: "flex animate-in fade-in-0 zoom-in-95 duration-fast ease-entrance",
|
|
72
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "size-3.5", size: 14 })
|
|
73
|
+
},
|
|
74
|
+
isCopied ? "check" : "copy"
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
Snippet,
|
|
82
|
+
SnippetAddon,
|
|
83
|
+
SnippetText,
|
|
84
|
+
SnippetInput,
|
|
85
|
+
SnippetCopyButton
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=chunk-EY7LVUKQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/snippet.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupInput,\n InputGroupText,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useCopyToClipboard, useLocale } from \"@elabs-ai/components-ui\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\ninterface SnippetContextType {\n code: string;\n}\n\nconst SnippetContext = createContext<SnippetContextType>({\n code: \"\",\n});\n\nexport type SnippetProps = ComponentProps<typeof InputGroup> & {\n code: string;\n};\n\nexport const Snippet = ({ code, className, children, ...props }: SnippetProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n\n return (\n <SnippetContext.Provider value={contextValue}>\n <InputGroup className={cn(\"font-mono\", className)} {...props}>\n {children}\n </InputGroup>\n </SnippetContext.Provider>\n );\n};\n\nexport type SnippetAddonProps = ComponentProps<typeof InputGroupAddon>;\n\nexport const SnippetAddon = (props: SnippetAddonProps) => <InputGroupAddon {...props} />;\n\nexport type SnippetTextProps = ComponentProps<typeof InputGroupText>;\n\nexport const SnippetText = ({ className, ...props }: SnippetTextProps) => (\n <InputGroupText className={cn(\"ps-2 font-normal text-muted-foreground\", className)} {...props} />\n);\n\nexport type SnippetInputProps = Omit<ComponentProps<typeof InputGroupInput>, \"readOnly\" | \"value\">;\n\nexport const SnippetInput = ({ className, ...props }: SnippetInputProps) => {\n const { code } = useContext(SnippetContext);\n\n return (\n <InputGroupInput\n className={cn(\"text-foreground\", className)}\n readOnly\n value={code}\n {...props}\n />\n );\n};\n\nexport type SnippetCopyButtonProps = ComponentProps<typeof InputGroupButton> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const SnippetCopyButton = ({\n onCopy,\n onError,\n timeout,\n children,\n className,\n ...props\n}: SnippetCopyButtonProps) => {\n const { t } = useLocale();\n const { code } = useContext(SnippetContext);\n // Shared implementation (`@elabs-ai/components-ui`) instead of a private\n // copy of the same copy-to-clipboard state machine (issue-workflow.md\n // dedupe finding) — see `CodeBlockCopyButton` for the reference usage.\n const { copied: isCopied, copy } = useCopyToClipboard(\n timeout === undefined ? undefined : { resetAfterMs: timeout },\n );\n\n const copyToClipboard = useCallback(async () => {\n const ok = await copy(code);\n if (ok) {\n onCopy?.();\n } else {\n onError?.(new Error(\"Clipboard API not available\"));\n }\n }, [copy, code, onCopy, onError]);\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <InputGroupButton\n aria-label={t(\"copy\")}\n className={className}\n onClick={copyToClipboard}\n size=\"icon-sm\"\n title={t(\"copy\")}\n {...props}\n >\n {children ?? (\n <span\n key={isCopied ? \"check\" : \"copy\"}\n className=\"flex animate-in fade-in-0 zoom-in-95 duration-fast ease-entrance\"\n >\n <Icon className=\"size-3.5\" size={14} />\n </span>\n )}\n </InputGroupButton>\n );\n};\n"],"mappings":";;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AACnB,SAAS,oBAAoB,iBAAiB;AAC9C,SAAS,WAAW,gBAAgB;AAEpC,SAAS,eAAe,aAAa,YAAY,eAAe;AAmB1D;AAbN,IAAM,iBAAiB,cAAkC;AAAA,EACvD,MAAM;AACR,CAAC;AAMM,IAAM,UAAU,CAAC,EAAE,MAAM,WAAW,UAAU,GAAG,MAAM,MAAoB;AAChF,QAAM,eAAe,QAAQ,OAAO,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AAErD,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B,8BAAC,cAAW,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,OACpD,UACH,GACF;AAEJ;AAIO,IAAM,eAAe,CAAC,UAA6B,oBAAC,mBAAiB,GAAG,OAAO;AAI/E,IAAM,cAAc,CAAC,EAAE,WAAW,GAAG,MAAM,MAChD,oBAAC,kBAAe,WAAW,GAAG,0CAA0C,SAAS,GAAI,GAAG,OAAO;AAK1F,IAAM,eAAe,CAAC,EAAE,WAAW,GAAG,MAAM,MAAyB;AAC1E,QAAM,EAAE,KAAK,IAAI,WAAW,cAAc;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,mBAAmB,SAAS;AAAA,MAC1C,UAAQ;AAAA,MACR,OAAO;AAAA,MACN,GAAG;AAAA;AAAA,EACN;AAEJ;AAQO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA8B;AAC5B,QAAM,EAAE,EAAE,IAAI,UAAU;AACxB,QAAM,EAAE,KAAK,IAAI,WAAW,cAAc;AAI1C,QAAM,EAAE,QAAQ,UAAU,KAAK,IAAI;AAAA,IACjC,YAAY,SAAY,SAAY,EAAE,cAAc,QAAQ;AAAA,EAC9D;AAEA,QAAM,kBAAkB,YAAY,YAAY;AAC9C,UAAM,KAAK,MAAM,KAAK,IAAI;AAC1B,QAAI,IAAI;AACN,eAAS;AAAA,IACX,OAAO;AACL,gBAAU,IAAI,MAAM,6BAA6B,CAAC;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,QAAQ,OAAO,CAAC;AAEhC,QAAM,OAAO,WAAW,YAAY;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,MAAM;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAO,EAAE,MAAM;AAAA,MACd,GAAG;AAAA,MAEH,sBACC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UAEV,8BAAC,QAAK,WAAU,YAAW,MAAM,IAAI;AAAA;AAAA,QAHhC,WAAW,UAAU;AAAA,MAI5B;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/test-results.tsx
|
|
4
|
+
import { StatusBadge, StatusIcon, useLocale } from "@elabs-ai/components-ui";
|
|
5
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
|
|
6
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
7
|
+
import { ChevronRightIcon } from "lucide-react";
|
|
8
|
+
import { createContext, useContext, useMemo } from "react";
|
|
9
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
var testStatusToCanonical = {
|
|
11
|
+
passed: "complete",
|
|
12
|
+
failed: "failed",
|
|
13
|
+
running: "running",
|
|
14
|
+
skipped: "skipped"
|
|
15
|
+
};
|
|
16
|
+
var TestResultsContext = createContext({});
|
|
17
|
+
var formatDuration = (ms) => {
|
|
18
|
+
if (ms < 1e3) {
|
|
19
|
+
return `${ms}ms`;
|
|
20
|
+
}
|
|
21
|
+
return `${(ms / 1e3).toFixed(2)}s`;
|
|
22
|
+
};
|
|
23
|
+
var TestResultsHeader = ({ className, children, ...props }) => /* @__PURE__ */ jsx(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
className: cn("flex min-w-0 items-center justify-between border-b px-4 py-3", className),
|
|
27
|
+
...props,
|
|
28
|
+
children
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
var TestResultsDuration = ({
|
|
32
|
+
className,
|
|
33
|
+
children,
|
|
34
|
+
...props
|
|
35
|
+
}) => {
|
|
36
|
+
const { summary } = useContext(TestResultsContext);
|
|
37
|
+
if (!summary?.duration) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return /* @__PURE__ */ jsx(
|
|
41
|
+
"span",
|
|
42
|
+
{
|
|
43
|
+
className: cn("shrink-0 text-muted-foreground text-body tabular-nums", className),
|
|
44
|
+
...props,
|
|
45
|
+
children: children ?? formatDuration(summary.duration)
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
var TestResultsSummary = ({ className, children, ...props }) => {
|
|
50
|
+
const { summary } = useContext(TestResultsContext);
|
|
51
|
+
const { t } = useLocale();
|
|
52
|
+
if (!summary) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-2", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
56
|
+
/* @__PURE__ */ jsx(StatusBadge, { size: "sm", status: "complete", children: t("ai.testResults.passedCount", { count: summary.passed }) }),
|
|
57
|
+
summary.failed > 0 && /* @__PURE__ */ jsx(StatusBadge, { size: "sm", status: "failed", children: t("ai.testResults.failedCount", { count: summary.failed }) }),
|
|
58
|
+
summary.skipped > 0 && /* @__PURE__ */ jsx(StatusBadge, { size: "sm", status: "skipped", children: t("ai.testResults.skippedCount", { count: summary.skipped }) })
|
|
59
|
+
] }) });
|
|
60
|
+
};
|
|
61
|
+
var TestResults = ({ summary, className, children, ...props }) => {
|
|
62
|
+
const contextValue = useMemo(() => ({ summary }), [summary]);
|
|
63
|
+
return /* @__PURE__ */ jsx(TestResultsContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-lg border bg-background", className), ...props, children: children ?? (summary && /* @__PURE__ */ jsxs(TestResultsHeader, { children: [
|
|
64
|
+
/* @__PURE__ */ jsx(TestResultsSummary, {}),
|
|
65
|
+
/* @__PURE__ */ jsx(TestResultsDuration, {})
|
|
66
|
+
] })) }) });
|
|
67
|
+
};
|
|
68
|
+
var TestResultsProgress = ({
|
|
69
|
+
className,
|
|
70
|
+
children,
|
|
71
|
+
...props
|
|
72
|
+
}) => {
|
|
73
|
+
const { summary } = useContext(TestResultsContext);
|
|
74
|
+
const { t, formatNumber } = useLocale();
|
|
75
|
+
if (!summary) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const passedPercent = summary.passed / summary.total * 100;
|
|
79
|
+
const failedPercent = summary.failed / summary.total * 100;
|
|
80
|
+
return /* @__PURE__ */ jsx("div", { className: cn("space-y-1.5", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsxs("div", { className: "flex h-1.5 overflow-hidden rounded-full bg-muted", children: [
|
|
82
|
+
/* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
className: "bg-success transition-[width] duration-base ease-standard motion-reduce:transition-none",
|
|
86
|
+
style: { width: `${passedPercent}%` }
|
|
87
|
+
}
|
|
88
|
+
),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
className: "bg-destructive transition-[width] duration-base ease-standard motion-reduce:transition-none",
|
|
93
|
+
style: { width: `${failedPercent}%` }
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] }),
|
|
97
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between text-muted-foreground text-meta tabular-nums", children: [
|
|
98
|
+
/* @__PURE__ */ jsx("span", { children: t("ai.testResults.testsPassed", { passed: summary.passed, total: summary.total }) }),
|
|
99
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
100
|
+
formatNumber(passedPercent, { maximumFractionDigits: 0 }),
|
|
101
|
+
"%"
|
|
102
|
+
] })
|
|
103
|
+
] })
|
|
104
|
+
] }) });
|
|
105
|
+
};
|
|
106
|
+
var TestResultsMeta = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("space-y-3 px-4 pb-4 pt-3", className), ...props, children });
|
|
107
|
+
var TestResultsContent = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
|
|
108
|
+
var TestSuiteContext = createContext({
|
|
109
|
+
name: "",
|
|
110
|
+
status: "passed"
|
|
111
|
+
});
|
|
112
|
+
var TestStatusIcon = ({ status }) => /* @__PURE__ */ jsx(StatusIcon, { className: "shrink-0", status: testStatusToCanonical[status] });
|
|
113
|
+
var TestSuite = ({ name, status, className, children, ...props }) => {
|
|
114
|
+
const contextValue = useMemo(() => ({ name, status }), [name, status]);
|
|
115
|
+
return /* @__PURE__ */ jsx(TestSuiteContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(Collapsible, { className: cn("group/suite", className), ...props, children }) });
|
|
116
|
+
};
|
|
117
|
+
var TestSuiteName = ({ className, children, ...props }) => {
|
|
118
|
+
const { name, status } = useContext(TestSuiteContext);
|
|
119
|
+
return /* @__PURE__ */ jsxs(
|
|
120
|
+
CollapsibleTrigger,
|
|
121
|
+
{
|
|
122
|
+
className: cn(
|
|
123
|
+
"group flex w-full items-center gap-2 px-4 py-2.5 text-start transition-colors duration-fast ease-standard motion-reduce:transition-none hover:bg-muted/50",
|
|
124
|
+
className
|
|
125
|
+
),
|
|
126
|
+
...props,
|
|
127
|
+
children: [
|
|
128
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform duration-fast ease-standard motion-reduce:transition-none group-data-[state=open]:rotate-90" }),
|
|
129
|
+
/* @__PURE__ */ jsx(TestStatusIcon, { status }),
|
|
130
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-medium text-body", children: children ?? name })
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
var TestSuiteStats = ({
|
|
136
|
+
passed = 0,
|
|
137
|
+
failed = 0,
|
|
138
|
+
skipped = 0,
|
|
139
|
+
className,
|
|
140
|
+
children,
|
|
141
|
+
...props
|
|
142
|
+
}) => {
|
|
143
|
+
const { t } = useLocale();
|
|
144
|
+
return /* @__PURE__ */ jsx(
|
|
145
|
+
"div",
|
|
146
|
+
{
|
|
147
|
+
className: cn("ms-auto flex shrink-0 items-center gap-3 text-meta tabular-nums", className),
|
|
148
|
+
...props,
|
|
149
|
+
children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
150
|
+
passed > 0 && /* @__PURE__ */ jsx("span", { className: "text-success-text", children: t("ai.testResults.passedCount", { count: passed }) }),
|
|
151
|
+
failed > 0 && /* @__PURE__ */ jsx("span", { className: "text-destructive-text", children: t("ai.testResults.failedCount", { count: failed }) }),
|
|
152
|
+
skipped > 0 && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: t("ai.testResults.skippedCount", { count: skipped }) })
|
|
153
|
+
] })
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
var TestSuiteContent = ({ className, children, ...props }) => /* @__PURE__ */ jsx(CollapsibleContent, { className: cn("border-t", className), ...props, children: /* @__PURE__ */ jsx("div", { className: "divide-y", children }) });
|
|
158
|
+
var TestContext = createContext({
|
|
159
|
+
name: "",
|
|
160
|
+
status: "passed"
|
|
161
|
+
});
|
|
162
|
+
var TestName = ({ className, children, ...props }) => {
|
|
163
|
+
const { name } = useContext(TestContext);
|
|
164
|
+
return /* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate", className), ...props, children: children ?? name });
|
|
165
|
+
};
|
|
166
|
+
var TestDuration = ({ className, children, ...props }) => {
|
|
167
|
+
const { duration } = useContext(TestContext);
|
|
168
|
+
if (duration === void 0) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return /* @__PURE__ */ jsx(
|
|
172
|
+
"span",
|
|
173
|
+
{
|
|
174
|
+
className: cn("shrink-0 text-muted-foreground text-meta tabular-nums", className),
|
|
175
|
+
...props,
|
|
176
|
+
children: children ?? `${duration}ms`
|
|
177
|
+
}
|
|
178
|
+
);
|
|
179
|
+
};
|
|
180
|
+
var TestStatus = ({ className, children, ...props }) => {
|
|
181
|
+
const { status } = useContext(TestContext);
|
|
182
|
+
return /* @__PURE__ */ jsx("span", { className: cn("shrink-0", className), ...props, children: children ?? /* @__PURE__ */ jsx(StatusIcon, { status: testStatusToCanonical[status] }) });
|
|
183
|
+
};
|
|
184
|
+
var Test = ({ name, status, duration, className, children, ...props }) => {
|
|
185
|
+
const contextValue = useMemo(() => ({ duration, name, status }), [duration, name, status]);
|
|
186
|
+
return /* @__PURE__ */ jsx(TestContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
187
|
+
"div",
|
|
188
|
+
{
|
|
189
|
+
className: cn("flex min-w-0 items-center gap-2 ps-10 pe-4 py-2 text-body", className),
|
|
190
|
+
...props,
|
|
191
|
+
children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
192
|
+
/* @__PURE__ */ jsx(TestStatus, {}),
|
|
193
|
+
/* @__PURE__ */ jsx(TestName, {}),
|
|
194
|
+
duration !== void 0 && /* @__PURE__ */ jsx(TestDuration, {})
|
|
195
|
+
] })
|
|
196
|
+
}
|
|
197
|
+
) });
|
|
198
|
+
};
|
|
199
|
+
var TestError = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("rounded-md bg-destructive/10 p-3", className), ...props, children });
|
|
200
|
+
var TestErrorMessage = ({ className, children, ...props }) => /* @__PURE__ */ jsx("p", { className: cn("font-medium text-destructive-text text-body", className), ...props, children });
|
|
201
|
+
var TestErrorStack = ({ className, children, ...props }) => /* @__PURE__ */ jsx(
|
|
202
|
+
"pre",
|
|
203
|
+
{
|
|
204
|
+
className: cn("mt-2 overflow-auto font-mono text-destructive-text text-meta", className),
|
|
205
|
+
...props,
|
|
206
|
+
children
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
export {
|
|
211
|
+
TestResultsHeader,
|
|
212
|
+
TestResultsDuration,
|
|
213
|
+
TestResultsSummary,
|
|
214
|
+
TestResults,
|
|
215
|
+
TestResultsProgress,
|
|
216
|
+
TestResultsMeta,
|
|
217
|
+
TestResultsContent,
|
|
218
|
+
TestSuite,
|
|
219
|
+
TestSuiteName,
|
|
220
|
+
TestSuiteStats,
|
|
221
|
+
TestSuiteContent,
|
|
222
|
+
TestName,
|
|
223
|
+
TestDuration,
|
|
224
|
+
TestStatus,
|
|
225
|
+
Test,
|
|
226
|
+
TestError,
|
|
227
|
+
TestErrorMessage,
|
|
228
|
+
TestErrorStack
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=chunk-F4C74F7M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/test-results.tsx"],"sourcesContent":["\"use client\";\n\nimport { StatusBadge, StatusIcon, useLocale, type Status } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype TestStatus = \"passed\" | \"failed\" | \"skipped\" | \"running\";\n\n/** Test status → the canonical 7-state vocabulary (#189, research 10 §B.1). */\nconst testStatusToCanonical: Record<TestStatus, Status> = {\n passed: \"complete\",\n failed: \"failed\",\n running: \"running\",\n skipped: \"skipped\",\n};\n\ninterface TestResultsSummary {\n passed: number;\n failed: number;\n skipped: number;\n total: number;\n duration?: number;\n}\n\ninterface TestResultsContextType {\n summary?: TestResultsSummary;\n}\n\nconst TestResultsContext = createContext<TestResultsContextType>({});\n\nconst formatDuration = (ms: number) => {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(2)}s`;\n};\n\nexport type TestResultsHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestResultsHeader = ({ className, children, ...props }: TestResultsHeaderProps) => (\n <div\n className={cn(\"flex min-w-0 items-center justify-between border-b px-4 py-3\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type TestResultsDurationProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const TestResultsDuration = ({\n className,\n children,\n ...props\n}: TestResultsDurationProps) => {\n const { summary } = useContext(TestResultsContext);\n\n if (!summary?.duration) {\n return null;\n }\n\n return (\n <span\n className={cn(\"shrink-0 text-muted-foreground text-body tabular-nums\", className)}\n {...props}\n >\n {children ?? formatDuration(summary.duration)}\n </span>\n );\n};\n\nexport type TestResultsSummaryProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestResultsSummary = ({ className, children, ...props }: TestResultsSummaryProps) => {\n const { summary } = useContext(TestResultsContext);\n const { t } = useLocale();\n\n if (!summary) {\n return null;\n }\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children ?? (\n <>\n <StatusBadge size=\"sm\" status=\"complete\">\n {t(\"ai.testResults.passedCount\", { count: summary.passed })}\n </StatusBadge>\n {summary.failed > 0 && (\n <StatusBadge size=\"sm\" status=\"failed\">\n {t(\"ai.testResults.failedCount\", { count: summary.failed })}\n </StatusBadge>\n )}\n {summary.skipped > 0 && (\n <StatusBadge size=\"sm\" status=\"skipped\">\n {t(\"ai.testResults.skippedCount\", { count: summary.skipped })}\n </StatusBadge>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport type TestResultsProps = HTMLAttributes<HTMLDivElement> & {\n summary?: TestResultsSummary;\n};\n\nexport const TestResults = ({ summary, className, children, ...props }: TestResultsProps) => {\n const contextValue = useMemo(() => ({ summary }), [summary]);\n\n return (\n <TestResultsContext.Provider value={contextValue}>\n <div className={cn(\"overflow-hidden rounded-lg border bg-background\", className)} {...props}>\n {children ??\n (summary && (\n <TestResultsHeader>\n <TestResultsSummary />\n <TestResultsDuration />\n </TestResultsHeader>\n ))}\n </div>\n </TestResultsContext.Provider>\n );\n};\n\nexport type TestResultsProgressProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestResultsProgress = ({\n className,\n children,\n ...props\n}: TestResultsProgressProps) => {\n const { summary } = useContext(TestResultsContext);\n const { t, formatNumber } = useLocale();\n\n if (!summary) {\n return null;\n }\n\n const passedPercent = (summary.passed / summary.total) * 100;\n const failedPercent = (summary.failed / summary.total) * 100;\n\n return (\n <div className={cn(\"space-y-1.5\", className)} {...props}>\n {children ?? (\n <>\n <div className=\"flex h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"bg-success transition-[width] duration-base ease-standard motion-reduce:transition-none\"\n style={{ width: `${passedPercent}%` }}\n />\n <div\n className=\"bg-destructive transition-[width] duration-base ease-standard motion-reduce:transition-none\"\n style={{ width: `${failedPercent}%` }}\n />\n </div>\n <div className=\"flex justify-between text-muted-foreground text-meta tabular-nums\">\n <span>\n {t(\"ai.testResults.testsPassed\", { passed: summary.passed, total: summary.total })}\n </span>\n <span>\n {formatNumber(passedPercent, { maximumFractionDigits: 0 })}\n {\"%\"}\n </span>\n </div>\n </>\n )}\n </div>\n );\n};\n\n/**\n * TestResultsMeta — the summary badges + progress bar block that sits between\n * the header and the suite list. Provides consistent `px-4 pt-3 pb-4` padding\n * so callers do not need ad-hoc wrapper divs.\n */\nexport type TestResultsMetaProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestResultsMeta = ({ className, children, ...props }: TestResultsMetaProps) => (\n <div className={cn(\"space-y-3 px-4 pb-4 pt-3\", className)} {...props}>\n {children}\n </div>\n);\n\n/**\n * TestResultsContent — the suite list. Uses `divide-y` instead of `space-y`\n * so suites are separated by a single structural divider, not nested boxes.\n */\nexport type TestResultsContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestResultsContent = ({ className, children, ...props }: TestResultsContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\ninterface TestSuiteContextType {\n name: string;\n status: TestStatus;\n}\n\nconst TestSuiteContext = createContext<TestSuiteContextType>({\n name: \"\",\n status: \"passed\",\n});\n\n// The local status icon/color records were the 5th status idiom (#189);\n// re-pointed to the canonical `StatusIcon` vocabulary from @elabs-ai/components-ui.\nconst TestStatusIcon = ({ status }: { status: TestStatus }) => (\n <StatusIcon className=\"shrink-0\" status={testStatusToCanonical[status]} />\n);\n\nexport type TestSuiteProps = ComponentProps<typeof Collapsible> & {\n name: string;\n status: TestStatus;\n};\n\n/**\n * TestSuite — one expandable file/suite row. Uses a quiet left rail\n * (`border-s-2`) as the sole focal separation gesture inside the divider-\n * separated list. No nested rounded box: that was redundant border-on-region\n * with no fill change (separation grammar).\n */\nexport const TestSuite = ({ name, status, className, children, ...props }: TestSuiteProps) => {\n const contextValue = useMemo(() => ({ name, status }), [name, status]);\n\n return (\n <TestSuiteContext.Provider value={contextValue}>\n <Collapsible className={cn(\"group/suite\", className)} {...props}>\n {children}\n </Collapsible>\n </TestSuiteContext.Provider>\n );\n};\n\nexport type TestSuiteNameProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const TestSuiteName = ({ className, children, ...props }: TestSuiteNameProps) => {\n const { name, status } = useContext(TestSuiteContext);\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 px-4 py-2.5 text-start transition-colors duration-fast ease-standard motion-reduce:transition-none hover:bg-muted/50\",\n className,\n )}\n {...props}\n >\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform duration-fast ease-standard motion-reduce:transition-none group-data-[state=open]:rotate-90\" />\n <TestStatusIcon status={status} />\n <span className=\"min-w-0 flex-1 truncate font-medium text-body\">{children ?? name}</span>\n </CollapsibleTrigger>\n );\n};\n\nexport type TestSuiteStatsProps = HTMLAttributes<HTMLDivElement> & {\n passed?: number;\n failed?: number;\n skipped?: number;\n};\n\nexport const TestSuiteStats = ({\n passed = 0,\n failed = 0,\n skipped = 0,\n className,\n children,\n ...props\n}: TestSuiteStatsProps) => {\n const { t } = useLocale();\n return (\n <div\n className={cn(\"ms-auto flex shrink-0 items-center gap-3 text-meta tabular-nums\", className)}\n {...props}\n >\n {children ?? (\n <>\n {passed > 0 && (\n <span className=\"text-success-text\">\n {t(\"ai.testResults.passedCount\", { count: passed })}\n </span>\n )}\n {failed > 0 && (\n <span className=\"text-destructive-text\">\n {t(\"ai.testResults.failedCount\", { count: failed })}\n </span>\n )}\n {skipped > 0 && (\n <span className=\"text-muted-foreground\">\n {t(\"ai.testResults.skippedCount\", { count: skipped })}\n </span>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport type TestSuiteContentProps = ComponentProps<typeof CollapsibleContent>;\n\n/**\n * TestSuiteContent — the rows inside an expanded suite. A left rail\n * (`border-s-2 border-s-border ms-6`) indents the block under the suite\n * trigger and separates it structurally without a box. Rows are divided by\n * `divide-y`.\n */\nexport const TestSuiteContent = ({ className, children, ...props }: TestSuiteContentProps) => (\n <CollapsibleContent className={cn(\"border-t\", className)} {...props}>\n <div className=\"divide-y\">{children}</div>\n </CollapsibleContent>\n);\n\ninterface TestContextType {\n name: string;\n status: TestStatus;\n duration?: number;\n}\n\nconst TestContext = createContext<TestContextType>({\n name: \"\",\n status: \"passed\",\n});\n\nexport type TestNameProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const TestName = ({ className, children, ...props }: TestNameProps) => {\n const { name } = useContext(TestContext);\n\n return (\n <span className={cn(\"min-w-0 flex-1 truncate\", className)} {...props}>\n {children ?? name}\n </span>\n );\n};\n\nexport type TestDurationProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const TestDuration = ({ className, children, ...props }: TestDurationProps) => {\n const { duration } = useContext(TestContext);\n\n if (duration === undefined) {\n return null;\n }\n\n return (\n <span\n className={cn(\"shrink-0 text-muted-foreground text-meta tabular-nums\", className)}\n {...props}\n >\n {children ?? `${duration}ms`}\n </span>\n );\n};\n\nexport type TestStatusProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const TestStatus = ({ className, children, ...props }: TestStatusProps) => {\n const { status } = useContext(TestContext);\n\n return (\n <span className={cn(\"shrink-0\", className)} {...props}>\n {children ?? <StatusIcon status={testStatusToCanonical[status]} />}\n </span>\n );\n};\n\nexport type TestProps = HTMLAttributes<HTMLDivElement> & {\n name: string;\n status: TestStatus;\n duration?: number;\n};\n\n/**\n * Test — a single test-case row. `ps-10` aligns the status icon with the\n * suite's status icon (after the trigger's chevron + gap), giving a clean\n * left-column across the expansion.\n */\nexport const Test = ({ name, status, duration, className, children, ...props }: TestProps) => {\n const contextValue = useMemo(() => ({ duration, name, status }), [duration, name, status]);\n\n return (\n <TestContext.Provider value={contextValue}>\n <div\n className={cn(\"flex min-w-0 items-center gap-2 ps-10 pe-4 py-2 text-body\", className)}\n {...props}\n >\n {children ?? (\n <>\n <TestStatus />\n <TestName />\n {duration !== undefined && <TestDuration />}\n </>\n )}\n </div>\n </TestContext.Provider>\n );\n};\n\nexport type TestErrorProps = HTMLAttributes<HTMLDivElement>;\n\nexport const TestError = ({ className, children, ...props }: TestErrorProps) => (\n <div className={cn(\"rounded-md bg-destructive/10 p-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type TestErrorMessageProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const TestErrorMessage = ({ className, children, ...props }: TestErrorMessageProps) => (\n <p className={cn(\"font-medium text-destructive-text text-body\", className)} {...props}>\n {children}\n </p>\n);\n\nexport type TestErrorStackProps = HTMLAttributes<HTMLPreElement>;\n\nexport const TestErrorStack = ({ className, children, ...props }: TestErrorStackProps) => (\n <pre\n className={cn(\"mt-2 overflow-auto font-mono text-destructive-text text-meta\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
getStatusBadge
|
|
4
|
+
} from "./chunk-PTWCTSZL.js";
|
|
5
|
+
|
|
6
|
+
// src/sandbox.tsx
|
|
7
|
+
import {
|
|
8
|
+
Collapsible,
|
|
9
|
+
CollapsibleContent,
|
|
10
|
+
CollapsibleTrigger,
|
|
11
|
+
Skeleton,
|
|
12
|
+
Tabs,
|
|
13
|
+
TabsContent,
|
|
14
|
+
TabsList,
|
|
15
|
+
TabsTrigger,
|
|
16
|
+
useLocale
|
|
17
|
+
} from "@elabs-ai/components-ui";
|
|
18
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
19
|
+
import { ChevronDownIcon, Code } from "lucide-react";
|
|
20
|
+
import { createContext, use, useMemo } from "react";
|
|
21
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
+
var SandboxContext = createContext({ loading: false });
|
|
23
|
+
var Sandbox = ({ className, loading = false, children, ...props }) => {
|
|
24
|
+
const contextValue = useMemo(() => ({ loading }), [loading]);
|
|
25
|
+
return /* @__PURE__ */ jsx(SandboxContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
|
|
26
|
+
Collapsible,
|
|
27
|
+
{
|
|
28
|
+
className: cn("not-prose group mb-4 w-full overflow-hidden rounded-md border", className),
|
|
29
|
+
defaultOpen: true,
|
|
30
|
+
...props,
|
|
31
|
+
children
|
|
32
|
+
}
|
|
33
|
+
) });
|
|
34
|
+
};
|
|
35
|
+
var SandboxHeader = ({ className, title, state, ...props }) => /* @__PURE__ */ jsxs(
|
|
36
|
+
CollapsibleTrigger,
|
|
37
|
+
{
|
|
38
|
+
className: cn("flex w-full items-center justify-between gap-4 p-3", className),
|
|
39
|
+
...props,
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Code, { className: "size-4 text-muted-foreground" }),
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: title }),
|
|
44
|
+
getStatusBadge(state)
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
var SandboxContent = ({ className, children, ...props }) => {
|
|
51
|
+
const { loading } = use(SandboxContext);
|
|
52
|
+
const { t } = useLocale();
|
|
53
|
+
return /* @__PURE__ */ jsx(
|
|
54
|
+
CollapsibleContent,
|
|
55
|
+
{
|
|
56
|
+
className: cn(
|
|
57
|
+
"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",
|
|
58
|
+
className
|
|
59
|
+
),
|
|
60
|
+
...props,
|
|
61
|
+
children: loading ? /* @__PURE__ */ jsxs("div", { className: "space-y-2 p-3", role: "status", "aria-live": "polite", children: [
|
|
62
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: t("loading") }),
|
|
63
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-1/3" }),
|
|
64
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
|
|
65
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
|
|
66
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-2/3" })
|
|
67
|
+
] }) : children
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
var SandboxTabs = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs, { className: cn("w-full gap-0", className), ...props });
|
|
72
|
+
var SandboxTabsBar = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
className: cn("flex w-full items-center border-border border-t border-b", className),
|
|
76
|
+
...props
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
var SandboxTabsList = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
80
|
+
TabsList,
|
|
81
|
+
{
|
|
82
|
+
className: cn("h-auto rounded-none border-0 bg-transparent p-0", className),
|
|
83
|
+
...props
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
var SandboxTabsTrigger = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
87
|
+
TabsTrigger,
|
|
88
|
+
{
|
|
89
|
+
className: cn(
|
|
90
|
+
"rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-body transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none",
|
|
91
|
+
className
|
|
92
|
+
),
|
|
93
|
+
...props
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
var SandboxTabContent = ({ className, ...props }) => /* @__PURE__ */ jsx(TabsContent, { className: cn("mt-0 text-body", className), ...props });
|
|
97
|
+
|
|
98
|
+
export {
|
|
99
|
+
Sandbox,
|
|
100
|
+
SandboxHeader,
|
|
101
|
+
SandboxContent,
|
|
102
|
+
SandboxTabs,
|
|
103
|
+
SandboxTabsBar,
|
|
104
|
+
SandboxTabsList,
|
|
105
|
+
SandboxTabsTrigger,
|
|
106
|
+
SandboxTabContent
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-FERYDFZA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sandbox.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Skeleton,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n useLocale,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, Code } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, use, useMemo } from \"react\";\n\nimport { getStatusBadge } from \"./tool\";\n\n/**\n * Shared loading state (composition-patterns — lifted into the provider),\n * mirroring Artifact: Sandbox is the only place that knows whether the run\n * body has arrived; SandboxContent reads the interface and renders a\n * skeleton, while SandboxHeader (an ordinary child of Sandbox) keeps\n * rendering as passed.\n */\nconst SandboxContext = createContext<{ loading: boolean }>({ loading: false });\n\nexport type SandboxProps = ComponentProps<typeof Collapsible> & {\n /**\n * The run output has not arrived yet (loading-states.md loading signal).\n * SandboxContent renders a layout-shaped skeleton instead of its children;\n * SandboxHeader keeps rendering as passed.\n * @default false\n */\n loading?: boolean;\n};\n\n/** @deprecated Renamed to `SandboxProps`. */\nexport type SandboxRootProps = SandboxProps;\n\nexport const Sandbox = ({ className, loading = false, children, ...props }: SandboxProps) => {\n const contextValue = useMemo(() => ({ loading }), [loading]);\n\n return (\n <SandboxContext.Provider value={contextValue}>\n <Collapsible\n className={cn(\"not-prose group mb-4 w-full overflow-hidden rounded-md border\", className)}\n defaultOpen\n {...props}\n >\n {children}\n </Collapsible>\n </SandboxContext.Provider>\n );\n};\n\nexport interface SandboxHeaderProps {\n title?: string;\n state: ToolUIPart[\"state\"];\n className?: string;\n}\n\nexport const SandboxHeader = ({ className, title, state, ...props }: SandboxHeaderProps) => (\n <CollapsibleTrigger\n className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <Code className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-body\">{title}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n);\n\nexport type SandboxContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SandboxContent = ({ className, children, ...props }: SandboxContentProps) => {\n const { loading } = use(SandboxContext);\n const { t } = useLocale();\n\n return (\n <CollapsibleContent\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className,\n )}\n {...props}\n >\n {loading ? (\n <div className=\"space-y-2 p-3\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n ) : (\n children\n )}\n </CollapsibleContent>\n );\n};\n\nexport type SandboxTabsProps = ComponentProps<typeof Tabs>;\n\nexport const SandboxTabs = ({ className, ...props }: SandboxTabsProps) => (\n <Tabs className={cn(\"w-full gap-0\", className)} {...props} />\n);\n\nexport type SandboxTabsBarProps = ComponentProps<\"div\">;\n\nexport const SandboxTabsBar = ({ className, ...props }: SandboxTabsBarProps) => (\n <div\n className={cn(\"flex w-full items-center border-border border-t border-b\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsListProps = ComponentProps<typeof TabsList>;\n\nexport const SandboxTabsList = ({ className, ...props }: SandboxTabsListProps) => (\n <TabsList\n className={cn(\"h-auto rounded-none border-0 bg-transparent p-0\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsTriggerProps = ComponentProps<typeof TabsTrigger>;\n\nexport const SandboxTabsTrigger = ({ className, ...props }: SandboxTabsTriggerProps) => (\n <TabsTrigger\n className={cn(\n \"rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-body transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none\",\n className,\n )}\n {...props}\n />\n);\n\nexport type SandboxTabContentProps = ComponentProps<typeof TabsContent>;\n\nexport const SandboxTabContent = ({ className, ...props }: SandboxTabContentProps) => (\n <TabsContent className={cn(\"mt-0 text-body\", className)} {...props} />\n);\n"],"mappings":";;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AAEnB,SAAS,iBAAiB,YAAY;AAEtC,SAAS,eAAe,KAAK,eAAe;AA+BtC,cAsBF,YAtBE;AApBN,IAAM,iBAAiB,cAAoC,EAAE,SAAS,MAAM,CAAC;AAetE,IAAM,UAAU,CAAC,EAAE,WAAW,UAAU,OAAO,UAAU,GAAG,MAAM,MAAoB;AAC3F,QAAM,eAAe,QAAQ,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC;AAE3D,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iEAAiE,SAAS;AAAA,MACxF,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA;AAAA,EACH,GACF;AAEJ;AAQO,IAAM,gBAAgB,CAAC,EAAE,WAAW,OAAO,OAAO,GAAG,MAAM,MAChE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,sDAAsD,SAAS;AAAA,IAC5E,GAAG;AAAA,IAEJ;AAAA,2BAAC,SAAI,WAAU,2BACb;AAAA,4BAAC,QAAK,WAAU,gCAA+B;AAAA,QAC/C,oBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,QAC9C,eAAe,KAAK;AAAA,SACvB;AAAA,MACA,oBAAC,mBAAgB,WAAU,wFAAuF;AAAA;AAAA;AACpH;AAKK,IAAM,iBAAiB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAA2B;AACxF,QAAM,EAAE,QAAQ,IAAI,IAAI,cAAc;AACtC,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,oBACC,qBAAC,SAAI,WAAU,iBAAgB,MAAK,UAAS,aAAU,UACrD;AAAA,4BAAC,UAAK,WAAU,WAAW,YAAE,SAAS,GAAE;AAAA,QACxC,oBAAC,YAAS,WAAU,aAAY;AAAA,QAChC,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC,IAEA;AAAA;AAAA,EAEJ;AAEJ;AAIO,IAAM,cAAc,CAAC,EAAE,WAAW,GAAG,MAAM,MAChD,oBAAC,QAAK,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,OAAO;AAKtD,IAAM,iBAAiB,CAAC,EAAE,WAAW,GAAG,MAAM,MACnD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,4DAA4D,SAAS;AAAA,IAClF,GAAG;AAAA;AACN;AAKK,IAAM,kBAAkB,CAAC,EAAE,WAAW,GAAG,MAAM,MACpD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,mDAAmD,SAAS;AAAA,IACzE,GAAG;AAAA;AACN;AAKK,IAAM,qBAAqB,CAAC,EAAE,WAAW,GAAG,MAAM,MACvD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAKK,IAAM,oBAAoB,CAAC,EAAE,WAAW,GAAG,MAAM,MACtD,oBAAC,eAAY,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,OAAO;","names":[]}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Shimmer
|
|
4
|
+
} from "./chunk-3YPT3V7L.js";
|
|
5
|
+
|
|
6
|
+
// src/plan.tsx
|
|
7
|
+
import { Button } from "@elabs-ai/components-ui";
|
|
8
|
+
import {
|
|
9
|
+
Card,
|
|
10
|
+
CardAction,
|
|
11
|
+
CardContent,
|
|
12
|
+
CardDescription,
|
|
13
|
+
CardFooter,
|
|
14
|
+
CardHeader,
|
|
15
|
+
CardTitle
|
|
16
|
+
} from "@elabs-ai/components-ui";
|
|
17
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
|
|
18
|
+
import { StatusBadge } from "@elabs-ai/components-ui";
|
|
19
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
20
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
21
|
+
import { CheckCircle2, ChevronsUpDownIcon, Clock, PencilLine } from "lucide-react";
|
|
22
|
+
import { createContext, useContext, useId, useMemo } from "react";
|
|
23
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
24
|
+
var PlanContext = createContext(null);
|
|
25
|
+
var usePlan = () => {
|
|
26
|
+
const context = useContext(PlanContext);
|
|
27
|
+
if (!context) {
|
|
28
|
+
throw new Error("Plan components must be used within Plan");
|
|
29
|
+
}
|
|
30
|
+
return context;
|
|
31
|
+
};
|
|
32
|
+
var Plan = ({
|
|
33
|
+
className,
|
|
34
|
+
isStreaming = false,
|
|
35
|
+
status,
|
|
36
|
+
role,
|
|
37
|
+
children,
|
|
38
|
+
...props
|
|
39
|
+
}) => {
|
|
40
|
+
const titleId = useId();
|
|
41
|
+
const hasStatus = status !== void 0;
|
|
42
|
+
const resolvedIsStreaming = hasStatus ? status === "streaming" : isStreaming;
|
|
43
|
+
const isPending = status === "awaiting";
|
|
44
|
+
const isSettled = status === "approved" || status === "changes-requested";
|
|
45
|
+
const resolvedRole = hasStatus ? isPending ? "group" : isSettled ? "alert" : void 0 : void 0;
|
|
46
|
+
const railClass = !hasStatus ? void 0 : status === "approved" ? "border-s-4 border-s-success" : status === "changes-requested" ? "border-s-4 border-s-warning" : isPending ? "border-s-4 border-s-border-strong" : void 0;
|
|
47
|
+
const contextValue = useMemo(
|
|
48
|
+
() => ({
|
|
49
|
+
isStreaming: resolvedIsStreaming,
|
|
50
|
+
status: hasStatus ? status : void 0,
|
|
51
|
+
titleId: hasStatus ? titleId : void 0
|
|
52
|
+
}),
|
|
53
|
+
[resolvedIsStreaming, hasStatus, status, titleId]
|
|
54
|
+
);
|
|
55
|
+
return /* @__PURE__ */ jsx(PlanContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(Collapsible, { asChild: true, "data-slot": "plan", ...props, children: /* @__PURE__ */ jsx(
|
|
56
|
+
Card,
|
|
57
|
+
{
|
|
58
|
+
role: role ?? resolvedRole,
|
|
59
|
+
"aria-labelledby": isPending ? titleId : void 0,
|
|
60
|
+
className: cn("shadow-none", railClass, className),
|
|
61
|
+
children
|
|
62
|
+
}
|
|
63
|
+
) }) });
|
|
64
|
+
};
|
|
65
|
+
var PlanHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
66
|
+
CardHeader,
|
|
67
|
+
{
|
|
68
|
+
className: cn("flex items-start justify-between", className),
|
|
69
|
+
"data-slot": "plan-header",
|
|
70
|
+
...props
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
var PlanTitle = ({ id, children, ...props }) => {
|
|
74
|
+
const { isStreaming, titleId } = usePlan();
|
|
75
|
+
return /* @__PURE__ */ jsx(CardTitle, { id: id ?? titleId, "data-slot": "plan-title", ...props, children: isStreaming ? /* @__PURE__ */ jsx(Shimmer, { children }) : children });
|
|
76
|
+
};
|
|
77
|
+
var PlanDescription = ({ className, children, ...props }) => {
|
|
78
|
+
const { isStreaming } = usePlan();
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
CardDescription,
|
|
81
|
+
{
|
|
82
|
+
className: cn("text-balance", className),
|
|
83
|
+
"data-slot": "plan-description",
|
|
84
|
+
...props,
|
|
85
|
+
children: isStreaming ? /* @__PURE__ */ jsx(Shimmer, { children }) : children
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
var PlanAction = (props) => /* @__PURE__ */ jsx(CardAction, { "data-slot": "plan-action", ...props });
|
|
90
|
+
var PlanContent = ({ className, ...props }) => /* @__PURE__ */ jsx(CollapsibleContent, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
91
|
+
CardContent,
|
|
92
|
+
{
|
|
93
|
+
className: cn(
|
|
94
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:slide-in-from-top-2 data-[state=closed]:slide-out-to-top-2 data-[state=closed]:fade-out-0 data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)] outline-none",
|
|
95
|
+
className
|
|
96
|
+
),
|
|
97
|
+
"data-slot": "plan-content",
|
|
98
|
+
...props
|
|
99
|
+
}
|
|
100
|
+
) });
|
|
101
|
+
var PlanFooter = (props) => /* @__PURE__ */ jsx(CardFooter, { "data-slot": "plan-footer", ...props });
|
|
102
|
+
var PlanTrigger = ({ className, ...props }) => {
|
|
103
|
+
const { t } = useLocale();
|
|
104
|
+
return /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
105
|
+
Button,
|
|
106
|
+
{
|
|
107
|
+
className: cn("size-8", className),
|
|
108
|
+
"data-slot": "plan-trigger",
|
|
109
|
+
size: "icon",
|
|
110
|
+
variant: "ghost",
|
|
111
|
+
...props,
|
|
112
|
+
children: [
|
|
113
|
+
/* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: "size-4" }),
|
|
114
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: t("ai.plan.togglePlan") })
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
) });
|
|
118
|
+
};
|
|
119
|
+
var PLAN_STATUS_CONTENT = {
|
|
120
|
+
awaiting: { label: "Waiting on plan approval", tone: "warning", icon: Clock },
|
|
121
|
+
approved: { label: "Approved", tone: "success", icon: CheckCircle2 },
|
|
122
|
+
"changes-requested": { label: "Changes requested", tone: "warning", icon: PencilLine }
|
|
123
|
+
};
|
|
124
|
+
var PlanStatusLine = ({ className, children, ...props }) => {
|
|
125
|
+
const { status } = usePlan();
|
|
126
|
+
if (!status || status === "streaming") {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const { label, tone, icon } = PLAN_STATUS_CONTENT[status];
|
|
130
|
+
return /* @__PURE__ */ jsx(
|
|
131
|
+
StatusBadge,
|
|
132
|
+
{
|
|
133
|
+
"data-slot": "plan-status-line",
|
|
134
|
+
className: cn("self-start", className),
|
|
135
|
+
status: { label, tone, icon },
|
|
136
|
+
...props,
|
|
137
|
+
children
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
};
|
|
141
|
+
var PlanDecisionAction = ({ className, ...props }) => {
|
|
142
|
+
const { status } = usePlan();
|
|
143
|
+
if (status !== "awaiting") {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return /* @__PURE__ */ jsx(Button, { className: cn("h-8 px-3 text-body", className), type: "button", ...props });
|
|
147
|
+
};
|
|
148
|
+
var PlanApprove = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-approve", variant: "default", ...props });
|
|
149
|
+
var PlanRequestChanges = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-request-changes", variant: "outline", ...props });
|
|
150
|
+
var PlanComment = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-comment", variant: "ghost", ...props });
|
|
151
|
+
|
|
152
|
+
export {
|
|
153
|
+
Plan,
|
|
154
|
+
PlanHeader,
|
|
155
|
+
PlanTitle,
|
|
156
|
+
PlanDescription,
|
|
157
|
+
PlanAction,
|
|
158
|
+
PlanContent,
|
|
159
|
+
PlanFooter,
|
|
160
|
+
PlanTrigger,
|
|
161
|
+
PlanStatusLine,
|
|
162
|
+
PlanApprove,
|
|
163
|
+
PlanRequestChanges,
|
|
164
|
+
PlanComment
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=chunk-FUIYG2DS.js.map
|