@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,209 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/message-edit.tsx
|
|
4
|
+
import {
|
|
5
|
+
createContext,
|
|
6
|
+
forwardRef,
|
|
7
|
+
use,
|
|
8
|
+
useCallback,
|
|
9
|
+
useEffect,
|
|
10
|
+
useId,
|
|
11
|
+
useMemo,
|
|
12
|
+
useRef,
|
|
13
|
+
useState
|
|
14
|
+
} from "react";
|
|
15
|
+
import { Check, Pencil, X } from "lucide-react";
|
|
16
|
+
import { Button, Textarea } from "@elabs-ai/components-ui";
|
|
17
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
18
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
19
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
+
var MessageEditContext = createContext(null);
|
|
21
|
+
function useMessageEditContext() {
|
|
22
|
+
const ctx = use(MessageEditContext);
|
|
23
|
+
if (!ctx) {
|
|
24
|
+
throw new Error("MessageEdit sub-components must be rendered inside <MessageEditProvider>.");
|
|
25
|
+
}
|
|
26
|
+
return ctx;
|
|
27
|
+
}
|
|
28
|
+
function useMessageEdit() {
|
|
29
|
+
const { editing, draft, beginEdit, cancel, submit } = useMessageEditContext();
|
|
30
|
+
return { editing, draft, beginEdit, cancel, submit };
|
|
31
|
+
}
|
|
32
|
+
function MessageEditProvider({
|
|
33
|
+
value,
|
|
34
|
+
onEditSubmit,
|
|
35
|
+
editing: editingProp,
|
|
36
|
+
defaultEditing = false,
|
|
37
|
+
onEditingChange,
|
|
38
|
+
children
|
|
39
|
+
}) {
|
|
40
|
+
const editorId = useId();
|
|
41
|
+
const isControlled = editingProp !== void 0;
|
|
42
|
+
const [internalEditing, setInternalEditing] = useState(defaultEditing);
|
|
43
|
+
const editing = isControlled ? editingProp : internalEditing;
|
|
44
|
+
const [draft, setDraft] = useState(value);
|
|
45
|
+
const triggerRef = useRef(null);
|
|
46
|
+
const restoreFocus = useRef(false);
|
|
47
|
+
const setEditing = useCallback(
|
|
48
|
+
(next) => {
|
|
49
|
+
if (!isControlled) setInternalEditing(next);
|
|
50
|
+
onEditingChange?.(next);
|
|
51
|
+
},
|
|
52
|
+
[isControlled, onEditingChange]
|
|
53
|
+
);
|
|
54
|
+
const beginEdit = useCallback(() => {
|
|
55
|
+
setDraft(value);
|
|
56
|
+
setEditing(true);
|
|
57
|
+
}, [value, setEditing]);
|
|
58
|
+
const cancel = useCallback(() => {
|
|
59
|
+
setDraft(value);
|
|
60
|
+
restoreFocus.current = true;
|
|
61
|
+
setEditing(false);
|
|
62
|
+
}, [value, setEditing]);
|
|
63
|
+
const submit = useCallback(() => {
|
|
64
|
+
onEditSubmit?.(draft);
|
|
65
|
+
restoreFocus.current = true;
|
|
66
|
+
setEditing(false);
|
|
67
|
+
}, [draft, onEditSubmit, setEditing]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!editing && restoreFocus.current) {
|
|
70
|
+
restoreFocus.current = false;
|
|
71
|
+
triggerRef.current?.focus();
|
|
72
|
+
}
|
|
73
|
+
}, [editing]);
|
|
74
|
+
const contextValue = useMemo(
|
|
75
|
+
() => ({ editing, draft, setDraft, beginEdit, cancel, submit, triggerRef, editorId }),
|
|
76
|
+
[editing, draft, beginEdit, cancel, submit, editorId]
|
|
77
|
+
);
|
|
78
|
+
return /* @__PURE__ */ jsx(MessageEditContext.Provider, { value: contextValue, children });
|
|
79
|
+
}
|
|
80
|
+
var MessageEditForm = forwardRef(
|
|
81
|
+
function MessageEditForm2({ className, saveLabel = "Save", cancelLabel = "Cancel", ...props }, ref) {
|
|
82
|
+
const { t } = useLocale();
|
|
83
|
+
const { draft, setDraft, cancel, submit, editorId } = useMessageEditContext();
|
|
84
|
+
const textareaRef = useRef(null);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
const el = textareaRef.current;
|
|
87
|
+
if (el) {
|
|
88
|
+
el.focus();
|
|
89
|
+
el.setSelectionRange(el.value.length, el.value.length);
|
|
90
|
+
}
|
|
91
|
+
}, []);
|
|
92
|
+
const handleSubmit = (e) => {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
submit();
|
|
95
|
+
};
|
|
96
|
+
const handleKeyDown = (e) => {
|
|
97
|
+
if (e.key === "Escape") {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
cancel();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (e.key === "Enter" && !e.shiftKey && e.target === textareaRef.current) {
|
|
103
|
+
e.preventDefault();
|
|
104
|
+
submit();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return /* @__PURE__ */ jsxs(
|
|
108
|
+
"form",
|
|
109
|
+
{
|
|
110
|
+
ref,
|
|
111
|
+
onSubmit: handleSubmit,
|
|
112
|
+
onKeyDown: handleKeyDown,
|
|
113
|
+
className: cn("flex w-full flex-col gap-2", className),
|
|
114
|
+
...props,
|
|
115
|
+
children: [
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
Textarea,
|
|
118
|
+
{
|
|
119
|
+
ref: textareaRef,
|
|
120
|
+
id: editorId,
|
|
121
|
+
value: draft,
|
|
122
|
+
"aria-label": t("ai.message.editMessage"),
|
|
123
|
+
onChange: (e) => setDraft(e.target.value),
|
|
124
|
+
className: "min-h-16"
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-2", children: [
|
|
128
|
+
/* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", size: "sm", onClick: cancel, children: [
|
|
129
|
+
/* @__PURE__ */ jsx(X, { "aria-hidden": "true", className: "size-4" }),
|
|
130
|
+
cancelLabel
|
|
131
|
+
] }),
|
|
132
|
+
/* @__PURE__ */ jsxs(Button, { type: "submit", size: "sm", disabled: draft.trim().length === 0, children: [
|
|
133
|
+
/* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "size-4" }),
|
|
134
|
+
saveLabel
|
|
135
|
+
] })
|
|
136
|
+
] })
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
var MessageEditContent = forwardRef(
|
|
143
|
+
function MessageEditContent2({ className, children, ...props }, ref) {
|
|
144
|
+
const { editing } = useMessageEditContext();
|
|
145
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("w-full", className), ...props, children: editing ? /* @__PURE__ */ jsx(MessageEditForm, {}) : children });
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
var MessageEditTrigger = forwardRef(
|
|
149
|
+
function MessageEditTrigger2({ className, children, variant = "ghost", size = "sm", onClick, ...props }, ref) {
|
|
150
|
+
const { editing, beginEdit, triggerRef } = useMessageEditContext();
|
|
151
|
+
if (editing) return null;
|
|
152
|
+
return /* @__PURE__ */ jsx(
|
|
153
|
+
Button,
|
|
154
|
+
{
|
|
155
|
+
ref: (node) => {
|
|
156
|
+
triggerRef.current = node;
|
|
157
|
+
if (typeof ref === "function") ref(node);
|
|
158
|
+
else if (ref) ref.current = node;
|
|
159
|
+
},
|
|
160
|
+
variant,
|
|
161
|
+
size,
|
|
162
|
+
className,
|
|
163
|
+
onClick: (e) => {
|
|
164
|
+
onClick?.(e);
|
|
165
|
+
beginEdit();
|
|
166
|
+
},
|
|
167
|
+
...props,
|
|
168
|
+
children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Pencil, { "aria-hidden": "true", className: "size-4" }),
|
|
170
|
+
"Edit"
|
|
171
|
+
] })
|
|
172
|
+
}
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
var MessageEdit = forwardRef(function MessageEdit2({ value, onEditSubmit, editing, defaultEditing, onEditingChange, className, children, ...props }, ref) {
|
|
177
|
+
return /* @__PURE__ */ jsx(
|
|
178
|
+
MessageEditProvider,
|
|
179
|
+
{
|
|
180
|
+
value,
|
|
181
|
+
onEditSubmit,
|
|
182
|
+
editing,
|
|
183
|
+
defaultEditing,
|
|
184
|
+
onEditingChange,
|
|
185
|
+
children: /* @__PURE__ */ jsxs(
|
|
186
|
+
"div",
|
|
187
|
+
{
|
|
188
|
+
ref,
|
|
189
|
+
className: cn("group/message-edit flex w-full flex-col gap-1", className),
|
|
190
|
+
...props,
|
|
191
|
+
children: [
|
|
192
|
+
/* @__PURE__ */ jsx(MessageEditContent, { children }),
|
|
193
|
+
/* @__PURE__ */ jsx("div", { className: "flex justify-end opacity-0 transition-opacity duration-fast focus-within:opacity-100 group-hover/message-edit:opacity-100 motion-reduce:transition-none", children: /* @__PURE__ */ jsx(MessageEditTrigger, {}) })
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
export {
|
|
202
|
+
useMessageEdit,
|
|
203
|
+
MessageEditProvider,
|
|
204
|
+
MessageEditForm,
|
|
205
|
+
MessageEditContent,
|
|
206
|
+
MessageEditTrigger,
|
|
207
|
+
MessageEdit
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=chunk-EV3U6ZZB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/message-edit.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageEdit — edit-in-place for a user message.\n *\n * Swaps a message bubble between its display content and an inline editor\n * (the composer's `Textarea` primitive) seeded with the original text.\n * `onEditSubmit(newText)` fires on save — the consumer then creates a branch\n * (compose with `MessageBranch*`). Presentational only: it never mutates the\n * message; the original is simply restored on cancel because the source text is\n * untouched until `onEditSubmit`.\n *\n * Behavior: Enter submits, Shift+Enter inserts a newline, Esc cancels. Focus\n * moves into the editor on begin, is trapped within it while editing, and is\n * restored to the trigger on cancel/submit.\n *\n * Compound structure (the ChangeReview convention — named parts, lifted state):\n * <MessageEditProvider> — lifted edit state (editing + draft + actions)\n * <MessageEditContent> — display children, or the inline editor\n * <MessageEditTrigger> — begins editing (focus is restored here on exit)\n */\n\nimport {\n createContext,\n forwardRef,\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FormEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { Check, Pencil, X } from \"lucide-react\";\nimport { Button, Textarea } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\n// ─── Context ────────────────────────────────────────────────────────────────\n\ninterface MessageEditContextValue {\n editing: boolean;\n draft: string;\n setDraft: (value: string) => void;\n beginEdit: () => void;\n cancel: () => void;\n submit: () => void;\n /** Ref for the trigger element so focus can be restored to it on exit. */\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n editorId: string;\n}\n\nconst MessageEditContext = createContext<MessageEditContextValue | null>(null);\n\nfunction useMessageEditContext(): MessageEditContextValue {\n const ctx = use(MessageEditContext);\n if (!ctx) {\n throw new Error(\"MessageEdit sub-components must be rendered inside <MessageEditProvider>.\");\n }\n return ctx;\n}\n\n/** Read-only access to the edit state (for a custom trigger/toolbar). */\nexport function useMessageEdit(): Pick<\n MessageEditContextValue,\n \"editing\" | \"draft\" | \"beginEdit\" | \"cancel\" | \"submit\"\n> {\n const { editing, draft, beginEdit, cancel, submit } = useMessageEditContext();\n return { editing, draft, beginEdit, cancel, submit };\n}\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport interface MessageEditProviderProps {\n /** The editable source text (seeds the editor on begin). */\n value: string;\n /** Called with the new text on save. The consumer creates the branch. */\n onEditSubmit?: (newText: string) => void;\n /** Controlled editing state. When set, `onEditingChange` drives transitions. */\n editing?: boolean;\n /** Uncontrolled initial editing state. @default false */\n defaultEditing?: boolean;\n /** Called when editing begins/ends. */\n onEditingChange?: (editing: boolean) => void;\n children: ReactNode;\n}\n\n/** Lifts the edit state (editing + draft). Controlled or uncontrolled. */\nexport function MessageEditProvider({\n value,\n onEditSubmit,\n editing: editingProp,\n defaultEditing = false,\n onEditingChange,\n children,\n}: MessageEditProviderProps) {\n const editorId = useId();\n const isControlled = editingProp !== undefined;\n const [internalEditing, setInternalEditing] = useState(defaultEditing);\n const editing = isControlled ? (editingProp as boolean) : internalEditing;\n\n const [draft, setDraft] = useState(value);\n const triggerRef = useRef<HTMLElement | null>(null);\n const restoreFocus = useRef(false);\n\n const setEditing = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalEditing(next);\n onEditingChange?.(next);\n },\n [isControlled, onEditingChange],\n );\n\n const beginEdit = useCallback(() => {\n setDraft(value); // seed from the current source text\n setEditing(true);\n }, [value, setEditing]);\n\n const cancel = useCallback(() => {\n setDraft(value); // discard edits (original is restored)\n restoreFocus.current = true;\n setEditing(false);\n }, [value, setEditing]);\n\n const submit = useCallback(() => {\n onEditSubmit?.(draft);\n restoreFocus.current = true;\n setEditing(false);\n }, [draft, onEditSubmit, setEditing]);\n\n // Restore focus to the trigger once the editor has unmounted.\n useEffect(() => {\n if (!editing && restoreFocus.current) {\n restoreFocus.current = false;\n triggerRef.current?.focus();\n }\n }, [editing]);\n\n const contextValue = useMemo<MessageEditContextValue>(\n () => ({ editing, draft, setDraft, beginEdit, cancel, submit, triggerRef, editorId }),\n [editing, draft, beginEdit, cancel, submit, editorId],\n );\n\n return <MessageEditContext.Provider value={contextValue}>{children}</MessageEditContext.Provider>;\n}\n\n// ─── Inline editor ─────────────────────────────────────────────────────────────\n\nexport type MessageEditFormProps = Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> & {\n /** Save button label. @default \"Save\" */\n saveLabel?: string;\n /** Cancel button label. @default \"Cancel\" */\n cancelLabel?: string;\n};\n\n/** The inline editor: an autofocused textarea + Save/Cancel, Enter/Esc wired. */\nexport const MessageEditForm = forwardRef<HTMLFormElement, MessageEditFormProps>(\n function MessageEditForm(\n { className, saveLabel = \"Save\", cancelLabel = \"Cancel\", ...props },\n ref,\n ) {\n const { t } = useLocale();\n const { draft, setDraft, cancel, submit, editorId } = useMessageEditContext();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Autofocus the textarea and place the caret at the end.\n useEffect(() => {\n const el = textareaRef.current;\n if (el) {\n el.focus();\n el.setSelectionRange(el.value.length, el.value.length);\n }\n }, []);\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n return;\n }\n // Enter submits from the textarea; Shift+Enter inserts a newline.\n if (e.key === \"Enter\" && !e.shiftKey && e.target === textareaRef.current) {\n e.preventDefault();\n submit();\n }\n // NOTE: Tab is deliberately NOT trapped — this is an inline, non-modal\n // editor, and the repo a11y rule forbids trapping focus outside modals.\n // Tab flows naturally out of the editor; focus is restored to the trigger\n // only on cancel/submit.\n };\n\n return (\n <form\n ref={ref}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n className={cn(\"flex w-full flex-col gap-2\", className)}\n {...props}\n >\n <Textarea\n ref={textareaRef}\n id={editorId}\n value={draft}\n aria-label={t(\"ai.message.editMessage\")}\n onChange={(e) => setDraft(e.target.value)}\n className=\"min-h-16\"\n />\n <div className=\"flex items-center justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={cancel}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n {cancelLabel}\n </Button>\n <Button type=\"submit\" size=\"sm\" disabled={draft.trim().length === 0}>\n <Check aria-hidden=\"true\" className=\"size-4\" />\n {saveLabel}\n </Button>\n </div>\n </form>\n );\n },\n);\n\n// ─── Content ──────────────────────────────────────────────────────────────────\n\nexport type MessageEditContentProps = HTMLAttributes<HTMLDivElement>;\n\n/** Renders `children` in display mode, or the inline editor while editing. */\nexport const MessageEditContent = forwardRef<HTMLDivElement, MessageEditContentProps>(\n function MessageEditContent({ className, children, ...props }, ref) {\n const { editing } = useMessageEditContext();\n return (\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n {editing ? <MessageEditForm /> : children}\n </div>\n );\n },\n);\n\n// ─── Trigger ──────────────────────────────────────────────────────────────────\n\nexport type MessageEditTriggerProps = React.ComponentProps<typeof Button>;\n\n/** Begins editing. Focus is restored here on cancel/submit. Hidden while editing. */\nexport const MessageEditTrigger = forwardRef<HTMLButtonElement, MessageEditTriggerProps>(\n function MessageEditTrigger(\n { className, children, variant = \"ghost\", size = \"sm\", onClick, ...props },\n ref,\n ) {\n const { editing, beginEdit, triggerRef } = useMessageEditContext();\n if (editing) return null;\n return (\n <Button\n ref={(node) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n variant={variant}\n size={size}\n className={className}\n onClick={(e) => {\n onClick?.(e);\n beginEdit();\n }}\n {...props}\n >\n {children ?? (\n <>\n <Pencil aria-hidden=\"true\" className=\"size-4\" />\n Edit\n </>\n )}\n </Button>\n );\n },\n);\n\n// ─── Root convenience ──────────────────────────────────────────────────────────\n\nexport interface MessageEditProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onSubmit\" | \"children\"\n> {\n /** The editable source text. */\n value: string;\n /** Called with the new text on save (consumer creates the branch). */\n onEditSubmit?: (newText: string) => void;\n /** Controlled editing state. */\n editing?: boolean;\n /** Uncontrolled initial editing state. */\n defaultEditing?: boolean;\n /** Called when editing begins/ends. */\n onEditingChange?: (editing: boolean) => void;\n /** The display content (usually the rendered message text). */\n children: ReactNode;\n}\n\n/**\n * Convenience composition: display `children` + an \"Edit\" trigger, swapping to\n * the inline editor while editing. For toolbar-placed triggers, compose the\n * parts (`MessageEditProvider` + `MessageEditTrigger` in your toolbar).\n */\nexport const MessageEdit = forwardRef<HTMLDivElement, MessageEditProps>(function MessageEdit(\n { value, onEditSubmit, editing, defaultEditing, onEditingChange, className, children, ...props },\n ref,\n) {\n return (\n <MessageEditProvider\n value={value}\n onEditSubmit={onEditSubmit}\n editing={editing}\n defaultEditing={defaultEditing}\n onEditingChange={onEditingChange}\n >\n <div\n ref={ref}\n className={cn(\"group/message-edit flex w-full flex-col gap-1\", className)}\n {...props}\n >\n <MessageEditContent>{children}</MessageEditContent>\n <div className=\"flex justify-end opacity-0 transition-opacity duration-fast focus-within:opacity-100 group-hover/message-edit:opacity-100 motion-reduce:transition-none\">\n <MessageEditTrigger />\n </div>\n </div>\n </MessageEditProvider>\n );\n});\n"],"mappings":"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","names":["MessageEditForm","MessageEditContent","MessageEditTrigger","MessageEdit"]}
|
|
@@ -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":[]}
|