@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
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent.tsx","../src/code-block.tsx","../src/shimmer.tsx","../src/_code-block-theme.ts","../src/agent-event.tsx","../src/agent-timeline.tsx","../src/artifact.tsx","../src/asset-preview.tsx","../src/context-panel.tsx","../src/markdown-view.tsx","../src/_streamdown-safety.ts","../src/_streamdown-i18n.ts","../src/_lazy-mermaid.ts","../src/_mermaid-error-panel.tsx","../src/attachments.tsx","../src/audio-player.tsx","../src/_lazy-engine-boundary.tsx","../src/audio-visualizer.tsx","../src/canvas.tsx","../src/_flow-lazy.ts","../src/chain-of-thought.tsx","../src/chat-greeting.tsx","../src/checkpoint.tsx","../src/commit.tsx","../src/composer.tsx","../src/prompt-input.tsx","../src/prompt-input-effort.tsx","../src/prompt-input-mode.tsx","../src/prompt-input-slash.tsx","../src/suggestion.tsx","../src/confirmation.tsx","../src/connection.tsx","../src/controls.tsx","../src/conversation.tsx","../src/diff-view.tsx","../src/edge.tsx","../src/environment-variables.tsx","../src/file-tree.tsx","../src/gallery.tsx","../src/grouped-parts.tsx","../src/reasoning.tsx","../src/tool.tsx","../src/part-groups.ts","../src/image.tsx","../src/inline-citation.tsx","../src/jsx-preview.tsx","../src/message.tsx","../src/message-compare.tsx","../src/message-edit.tsx","../src/message-feedback.tsx","../src/message-form.tsx","../src/message-form-spec.ts","../src/message-table.tsx","../src/message-table-spec.ts","../src/mic-selector.tsx","../src/model-provider-logo.tsx","../src/motion-config.tsx","../src/node.tsx","../src/open-in-chat.tsx","../src/package-info.tsx","../src/panel.tsx","../src/permission-mode-select.tsx","../src/persona.tsx","../src/persona-sources.ts","../src/plan.tsx","../src/queue.tsx","../src/sandbox.tsx","../src/schema-display.tsx","../src/selection-toolbar.tsx","../src/session-header.tsx","../src/session-status-bar.tsx","../src/snippet.tsx","../src/sources.tsx","../src/speech-input.tsx","../src/stack-trace.tsx","../src/task.tsx","../src/test-results.tsx","../src/token-usage.tsx","../src/tool-result-card.tsx","../src/toolbar.tsx","../src/transcription.tsx","../src/turn-status.tsx","../src/use-audio-level.ts","../src/voice-selector.tsx","../src/web-preview.tsx","../src/chat-shell.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@elabs-ai/components-ui\";\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { Tool } from \"ai\";\nimport { BotIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { memo } from \"react\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type AgentProps = ComponentProps<\"div\">;\n\nexport const Agent = memo(({ className, ...props }: AgentProps) => (\n <div className={cn(\"not-prose w-full rounded-md border\", className)} {...props} />\n));\n\nexport type AgentHeaderProps = ComponentProps<\"div\"> & {\n name: string;\n model?: string;\n};\n\nexport const AgentHeader = memo(({ className, name, model, ...props }: AgentHeaderProps) => (\n <div className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <BotIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{name}</span>\n {model && (\n <Badge className=\"font-mono text-xs\" variant=\"secondary\">\n {model}\n </Badge>\n )}\n </div>\n </div>\n));\n\nexport type AgentContentProps = ComponentProps<\"div\">;\n\nexport const AgentContent = memo(({ className, ...props }: AgentContentProps) => (\n <div className={cn(\"space-y-4 p-4 pt-0\", className)} {...props} />\n));\n\nexport type AgentInstructionsProps = ComponentProps<\"div\"> & {\n children: string;\n};\n\nexport const AgentInstructions = memo(\n ({ className, children, ...props }: AgentInstructionsProps) => {\n const { t } = useLocale();\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <span className=\"font-medium text-muted-foreground text-sm\">\n {t(\"ai.agent.instructions\")}\n </span>\n <div className=\"rounded-md bg-muted/50 p-3 text-muted-foreground text-sm\">\n <p>{children}</p>\n </div>\n </div>\n );\n },\n);\n\nexport type AgentToolsProps = ComponentProps<typeof Accordion>;\n\nexport const AgentTools = memo(({ className, ...props }: AgentToolsProps) => {\n const { t } = useLocale();\n return (\n <div className={cn(\"space-y-2\", className)}>\n <span className=\"font-medium text-muted-foreground text-sm\">{t(\"ai.agent.tools\")}</span>\n <Accordion className=\"rounded-md border\" {...props} />\n </div>\n );\n});\n\nexport type AgentToolProps = ComponentProps<typeof AccordionItem> & {\n tool: Tool;\n};\n\nexport const AgentTool = memo(({ className, tool, value, ...props }: AgentToolProps) => {\n const schema = \"jsonSchema\" in tool && tool.jsonSchema ? tool.jsonSchema : tool.inputSchema;\n // `tool.description` may be a fixed string OR (ai@7+) a function of the live\n // call context (`(options) => string`) for a per-call dynamic description.\n // AgentTool renders a static list, so it has no call context to invoke that\n // function with — show it only when it is already a plain string.\n const description = typeof tool.description === \"string\" ? tool.description : undefined;\n\n return (\n <AccordionItem className={cn(\"border-b last:border-b-0\", className)} value={value} {...props}>\n <AccordionTrigger className=\"px-3 py-2 text-sm hover:no-underline\">\n {description ?? \"No description\"}\n </AccordionTrigger>\n <AccordionContent className=\"px-3 pb-3\">\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={JSON.stringify(schema, null, 2)} language=\"json\" />\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n});\n\nexport type AgentOutputProps = ComponentProps<\"div\"> & {\n schema: string;\n};\n\nexport const AgentOutput = memo(({ className, schema, ...props }: AgentOutputProps) => (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <span className=\"font-medium text-muted-foreground text-sm\">Output Schema</span>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={schema} language=\"typescript\" />\n </div>\n </div>\n));\n\nAgent.displayName = \"Agent\";\nAgentHeader.displayName = \"AgentHeader\";\nAgentContent.displayName = \"AgentContent\";\nAgentInstructions.displayName = \"AgentInstructions\";\nAgentTools.displayName = \"AgentTools\";\nAgentTool.displayName = \"AgentTool\";\nAgentOutput.displayName = \"AgentOutput\";\n","\"use client\";\n\nimport { Button, useLocale } from \"@elabs-ai/components-ui\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, HTMLAttributes } from \"react\";\nimport { Shimmer } from \"./shimmer\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { BundledLanguage, BundledTheme, HighlighterGeneric, ThemedToken } from \"shiki\";\nimport { createHighlighter } from \"shiki\";\n\nimport { buildCodeBlockTheme, codeBlockThemeId, getThemeScopeKey } from \"./_code-block-theme\";\n\n/**\n * Nearest ancestor (inclusive) carrying `data-theme`, defaulting to `<html>`.\n * Lets a CodeBlock rendered inside a region-scoped `<div data-theme=\"…\">`\n * (a supported `ThemeProvider`/decorator pattern — see\n * @.claude/rules/theming.md) resolve THAT region's `--code-*` tokens instead\n * of always the document root's (#315 follow-up).\n */\nconst getThemeScope = (el: Element | null): Element | null =>\n el?.closest(\"[data-theme]\") ??\n (typeof document !== \"undefined\" ? document.documentElement : null);\n\n// Shiki uses bitflags for font styles: 1=italic, 2=bold, 4=underline\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isItalic = (fontStyle: number | undefined) => fontStyle && fontStyle & 1;\n// oxlint-disable-next-line eslint(no-bitwise)\nconst isBold = (fontStyle: number | undefined) => fontStyle && fontStyle & 2;\nconst isUnderline = (fontStyle: number | undefined) =>\n // oxlint-disable-next-line eslint(no-bitwise)\n fontStyle && fontStyle & 4;\n\n// Transform tokens to include pre-computed keys to avoid noArrayIndexKey lint\ninterface KeyedToken {\n token: ThemedToken;\n key: string;\n}\ninterface KeyedLine {\n tokens: KeyedToken[];\n key: string;\n}\n\nconst addKeysToTokens = (lines: ThemedToken[][]): KeyedLine[] =>\n lines.map((line, lineIdx) => ({\n key: `line-${lineIdx}`,\n tokens: line.map((token, tokenIdx) => ({\n key: `line-${lineIdx}-${tokenIdx}`,\n token,\n })),\n }));\n\n// Token rendering component. Colors come entirely from the derived brand\n// theme's inline styles (`_code-block-theme.ts`, #315) — no `dark:` escape\n// hatch needed, since the theme is already resolved for whichever brand\n// theme is active (including a monochrome ink palette).\nconst TokenSpan = ({ token }: { token: ThemedToken }) => (\n <span\n style={\n {\n backgroundColor: token.bgColor,\n color: token.color,\n fontStyle: isItalic(token.fontStyle) ? \"italic\" : undefined,\n fontWeight: isBold(token.fontStyle) ? \"bold\" : undefined,\n textDecoration: isUnderline(token.fontStyle) ? \"underline\" : undefined,\n ...token.htmlStyle,\n } as CSSProperties\n }\n >\n {token.content}\n </span>\n);\n\n// Line number styles using CSS counters\nconst LINE_NUMBER_CLASSES = cn(\n \"block\",\n \"before:content-[counter(line)]\",\n \"before:inline-block\",\n \"before:[counter-increment:line]\",\n \"before:w-8\",\n \"before:me-4\",\n \"before:text-end\",\n \"before:text-muted-foreground/50\",\n \"before:font-mono\",\n \"before:select-none\",\n);\n\n// Line rendering component\nconst LineSpan = ({\n keyedLine,\n showLineNumbers,\n}: {\n keyedLine: KeyedLine;\n showLineNumbers: boolean;\n}) => (\n <span className={showLineNumbers ? LINE_NUMBER_CLASSES : \"block\"}>\n {keyedLine.tokens.length === 0\n ? \"\\n\"\n : keyedLine.tokens.map(({ token, key }) => <TokenSpan key={key} token={token} />)}\n </span>\n);\n\n// Types\nexport type CodeBlockProps = HTMLAttributes<HTMLDivElement> & {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n /**\n * Soft-wrap long lines instead of scrolling horizontally. Use in narrow embeds\n * (e.g. a side rail) so content is not silently clipped. Default: false.\n */\n wrap?: boolean;\n /**\n * code is arriving incrementally (loading-states.md isStreaming) — code\n * keeps rendering progressively (build-up), NOT a skeleton, since a\n * streaming code block is not fetch-then-show. Shows a Shimmer generating\n * cue below the content as the in-progress affordance.\n * @default false\n */\n isStreaming?: boolean;\n};\n\ninterface TokenizedCode {\n tokens: ThemedToken[][];\n fg: string;\n bg: string;\n}\n\ninterface CodeBlockContextType {\n code: string;\n}\n\n// Context\nconst CodeBlockContext = createContext<CodeBlockContextType>({\n code: \"\",\n});\n\n// Highlighter cache (singleton per language)\nconst highlighterCache = new Map<\n string,\n Promise<HighlighterGeneric<BundledLanguage, BundledTheme>>\n>();\n\n// Token cache\nconst tokensCache = new Map<string, TokenizedCode>();\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\n// The theme id is part of the cache key (#315) — the SAME code+language must\n// re-tokenize (and re-cache) when the active brand theme changes, or a code\n// block would keep showing stale colors from the theme active when it was\n// first highlighted. The id is derived from `getThemeScopeKey` (the RAW\n// `data-theme` attribute, or a sentinel when unset) rather than the validated\n// `ThemeName` — see `_code-block-theme.ts`'s module doc comment for why: an\n// unset attribute and an explicit `data-theme=\"light\"` both narrow to\n// the SAME `ThemeName`, but `:root`'s `--code-*` fallback values are their own\n// distinct placeholder palette, not an alias of `light`'s — so keying on\n// the validated name would let the pre-mount render's `:root` colors poison\n// the cache under the key `ThemeProvider` later writes explicitly, and they'd\n// never be replaced.\nconst getTokensCacheKey = (code: string, language: BundledLanguage, themeId: string) => {\n const start = code.slice(0, 100);\n const end = code.length > 100 ? code.slice(-100) : \"\";\n return `${themeId}:${language}:${code.length}:${start}:${end}`;\n};\n\nconst getHighlighter = (\n language: BundledLanguage,\n): Promise<HighlighterGeneric<BundledLanguage, BundledTheme>> => {\n const cached = highlighterCache.get(language);\n if (cached) {\n return cached;\n }\n\n // No themes preloaded here (#315) — the theme is derived from brand tokens\n // per call (`buildCodeBlockTheme`) and passed directly to `codeToTokens`,\n // never a bundled `github-*` literal.\n const highlighterPromise = createHighlighter({\n langs: [language],\n themes: [],\n });\n\n highlighterCache.set(language, highlighterPromise);\n return highlighterPromise;\n};\n\n// Create raw tokens for immediate display while highlighting loads\nconst createRawTokens = (code: string): TokenizedCode => ({\n bg: \"transparent\",\n fg: \"inherit\",\n tokens: code.split(\"\\n\").map((line) =>\n line === \"\"\n ? []\n : [\n {\n color: \"inherit\",\n content: line,\n } as ThemedToken,\n ],\n ),\n});\n\n// Synchronous highlight with callback for async results. `callback` stays in\n// its ORIGINAL third position (pre-#315 public API — a positional break here\n// would silently mis-wire any existing 3-arg caller, see #315 follow-up); `el`\n// is a new, purely-additive fourth parameter: the element (default `<html>`)\n// whose active brand theme's `--code-*` tokens the highlighter derives its\n// colors from. Passing a descendant of a region-scoped `<div data-theme=\"…\">`\n// resolves THAT region's theme instead of the document root's.\nexport const highlightCode = (\n code: string,\n language: BundledLanguage,\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-callbacks)\n callback?: (result: TokenizedCode) => void,\n el?: Element | null,\n): TokenizedCode | null => {\n const themeId = codeBlockThemeId(getThemeScopeKey(el));\n const tokensCacheKey = getTokensCacheKey(code, language, themeId);\n\n // Return cached result if available\n const cached = tokensCache.get(tokensCacheKey);\n if (cached) {\n return cached;\n }\n\n // Subscribe callback if provided\n if (callback) {\n if (!subscribers.has(tokensCacheKey)) {\n subscribers.set(tokensCacheKey, new Set());\n }\n subscribers.get(tokensCacheKey)?.add(callback);\n }\n\n // Start highlighting in background - fire-and-forget async pattern\n getHighlighter(language)\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then)\n .then((highlighter) => {\n const availableLangs = highlighter.getLoadedLanguages();\n const langToUse = availableLangs.includes(language) ? language : \"text\";\n\n // Derived from brand `--code-*` tokens (#315), never a `github-*` literal.\n // Same `el` the theme NAME above came from, so id/type/colors agree.\n const result = highlighter.codeToTokens(code, {\n lang: langToUse,\n theme: buildCodeBlockTheme(el),\n });\n\n const tokenized: TokenizedCode = {\n bg: result.bg ?? \"transparent\",\n fg: result.fg ?? \"inherit\",\n tokens: result.tokens,\n };\n\n // Cache the result\n tokensCache.set(tokensCacheKey, tokenized);\n\n // Notify all subscribers\n const subs = subscribers.get(tokensCacheKey);\n if (subs) {\n for (const sub of subs) {\n sub(tokenized);\n }\n subscribers.delete(tokensCacheKey);\n }\n })\n // oxlint-disable-next-line eslint-plugin-promise(prefer-await-to-then), eslint-plugin-promise(prefer-await-to-callbacks)\n .catch((error) => {\n console.error(\"Failed to highlight code:\", error);\n subscribers.delete(tokensCacheKey);\n });\n\n return null;\n};\n\nconst CodeBlockBody = memo(\n ({\n tokenized,\n showLineNumbers,\n wrap,\n className,\n }: {\n tokenized: TokenizedCode;\n showLineNumbers: boolean;\n wrap?: boolean;\n className?: string;\n }) => {\n const preStyle = useMemo(\n () => ({\n backgroundColor: tokenized.bg,\n color: tokenized.fg,\n }),\n [tokenized.bg, tokenized.fg],\n );\n\n const keyedLines = useMemo(() => addKeysToTokens(tokenized.tokens), [tokenized.tokens]);\n\n return (\n <pre\n className={cn(\"m-0 p-4 text-sm\", wrap && \"whitespace-pre-wrap break-words\", className)}\n style={preStyle}\n >\n <code\n className={cn(\n \"font-mono text-sm\",\n showLineNumbers && \"[counter-increment:line_0] [counter-reset:line]\",\n )}\n >\n {keyedLines.map((keyedLine) => (\n <LineSpan key={keyedLine.key} keyedLine={keyedLine} showLineNumbers={showLineNumbers} />\n ))}\n </code>\n </pre>\n );\n },\n (prevProps, nextProps) =>\n prevProps.tokenized === nextProps.tokenized &&\n prevProps.showLineNumbers === nextProps.showLineNumbers &&\n prevProps.wrap === nextProps.wrap &&\n prevProps.className === nextProps.className,\n);\n\nCodeBlockBody.displayName = \"CodeBlockBody\";\n\nexport const CodeBlockContainer = ({\n className,\n language,\n style,\n ...props\n}: HTMLAttributes<HTMLDivElement> & { language: string }) => (\n <div\n className={cn(\n \"group relative w-full overflow-hidden rounded-md border bg-background text-foreground\",\n className,\n )}\n data-language={language}\n style={{\n containIntrinsicSize: \"auto 200px\",\n contentVisibility: \"auto\",\n ...style,\n }}\n {...props}\n />\n);\n\nexport const CodeBlockHeader = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex items-center justify-between border-b bg-muted/80 px-3 py-2 text-muted-foreground text-xs\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport const CodeBlockTitle = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockFilename = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>) => (\n <span className={cn(\"font-mono\", className)} {...props}>\n {children}\n </span>\n);\n\nexport const CodeBlockActions = ({\n children,\n className,\n ...props\n}: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"-my-1 -me-1 flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n wrap = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n wrap?: boolean;\n}) => {\n // Track the active brand theme (#315), SCOPED to this code block's own\n // subtree (`getThemeScope`) rather than always `<html>` — so a CodeBlock\n // nested inside a region-scoped `<div data-theme=\"dark\">` (a supported\n // ThemeProvider/decorator pattern) picks up THAT region's `--code-*` tokens,\n // not the document root's. A MutationObserver on the resolved scope element\n // re-derives the Shiki theme — and any already-highlighted code — whenever\n // that region's `data-theme` changes.\n const scopeRef = useRef<HTMLDivElement>(null);\n const [themeRevision, setThemeRevision] = useState(0);\n\n useLayoutEffect(() => {\n if (typeof document === \"undefined\") return;\n // The ref only attaches after this first commit, so the scope resolved\n // during the initial render (before mount) may have fallen back to\n // `<html>`. Bump the revision now — synchronously, before paint, via\n // `useLayoutEffect` — so a scoped code block never flashes the document\n // root's colors first.\n const scope = getThemeScope(scopeRef.current);\n setThemeRevision((r) => r + 1);\n const observer = new MutationObserver(() => setThemeRevision((r) => r + 1));\n observer.observe(scope ?? document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const scopeEl = getThemeScope(scopeRef.current);\n // Keyed on the RAW `data-theme` scope, not the validated theme name (#315\n // follow-up) — see `_code-block-theme.ts`'s module doc comment. An unset\n // attribute (the pre-mount render) and an explicit `data-theme=\"light\"`\n // both narrow to the SAME `ThemeName`, so using the validated name here would\n // mean this memo's dependency doesn't CHANGE across that mutation and the\n // stale `:root`-tokenized colors would never be recomputed once\n // `ThemeProvider` mounts and writes the attribute explicitly.\n // eslint-disable-next-line react-hooks/exhaustive-deps -- themeRevision is the trigger; the scope key itself is re-read live off scopeEl.\n const themeScopeKey = useMemo(() => getThemeScopeKey(scopeEl), [themeRevision]);\n\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache lookup — avoids setState in effect for cached results.\n // `themeScopeKey` isn't read directly below (highlightCode re-derives it from\n // `scopeEl` itself), but it MUST stay a dependency: a theme switch mutates\n // the SAME scope element's `data-theme` attribute, so `scopeEl`'s object\n // identity never changes — `themeScopeKey` (keyed on `themeRevision`) is the\n // only signal that tells this memo to re-tokenize.\n const syncTokens = useMemo(\n () => highlightCode(code, language, undefined, scopeEl) ?? rawTokens,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- themeScopeKey is required to trigger recompute; see comment above.\n [code, language, themeScopeKey, scopeEl, rawTokens],\n );\n\n // Async highlighting result (populated after shiki loads)\n const [asyncTokens, setAsyncTokens] = useState<TokenizedCode | null>(null);\n const asyncKeyRef = useRef({ code, language, themeScopeKey });\n\n // Invalidate stale async tokens synchronously during render\n if (\n asyncKeyRef.current.code !== code ||\n asyncKeyRef.current.language !== language ||\n asyncKeyRef.current.themeScopeKey !== themeScopeKey\n ) {\n asyncKeyRef.current = { code, language, themeScopeKey };\n setAsyncTokens(null);\n }\n\n useEffect(() => {\n let cancelled = false;\n\n // `highlightCode` returns the tokenized result SYNCHRONOUSLY on a cache\n // hit (and never invokes the callback in that case — see its early\n // `if (cached) return cached` branch). That cache hit is the COMMON case\n // right after a theme switch (#315): the highlighter for this language is\n // already loaded, so re-tokenizing for the new theme resolves within a\n // microtask — often before this effect even runs — and without this\n // direct check `asyncTokens` would stay null forever, stranding the\n // code block on its raw/unhighlighted fallback after every theme change.\n const cached = highlightCode(\n code,\n language,\n (result) => {\n if (!cancelled) {\n setAsyncTokens(result);\n }\n },\n scopeEl,\n );\n if (cached && !cancelled) {\n setAsyncTokens(cached);\n }\n\n return () => {\n cancelled = true;\n };\n }, [code, language, themeScopeKey, scopeEl]);\n\n const tokenized = asyncTokens ?? syncTokens;\n\n return (\n <div\n ref={scopeRef}\n className={cn(\n \"relative overflow-auto\",\n // Discoverable horizontal-scroll affordance in non-wrap mode, so a narrow\n // embed doesn't silently clip long lines. Hidden when wrapping (no overflow).\n !wrap &&\n \"[scrollbar-width:thin] [&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-border\",\n )}\n >\n <CodeBlockBody showLineNumbers={showLineNumbers} tokenized={tokenized} wrap={wrap} />\n </div>\n );\n};\n\nexport const CodeBlock = ({\n code,\n language,\n showLineNumbers = false,\n wrap = false,\n isStreaming = false,\n className,\n children,\n ...props\n}: CodeBlockProps) => {\n const contextValue = useMemo(() => ({ code }), [code]);\n const { t } = useLocale();\n\n return (\n <CodeBlockContext.Provider value={contextValue}>\n <CodeBlockContainer className={className} language={language} {...props}>\n {children}\n <CodeBlockContent\n code={code}\n language={language}\n showLineNumbers={showLineNumbers}\n wrap={wrap}\n />\n {isStreaming ? (\n <div\n className=\"flex items-center gap-2 border-t bg-muted/80 px-3 py-1.5 text-caption text-muted-foreground\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Shimmer>{t(\"ai.codeBlock.generating\")}</Shimmer>\n </div>\n ) : null}\n </CodeBlockContainer>\n </CodeBlockContext.Provider>\n );\n};\n\nexport type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CodeBlockCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(CodeBlockContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\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 size={14} />\n </span>\n )}\n </Button>\n );\n};\n\nexport type CodeBlockLanguageSelectorProps = ComponentProps<typeof Select>;\n\nexport const CodeBlockLanguageSelector = (props: CodeBlockLanguageSelectorProps) => (\n <Select {...props} />\n);\n\nexport type CodeBlockLanguageSelectorTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const CodeBlockLanguageSelectorTrigger = ({\n className,\n ...props\n}: CodeBlockLanguageSelectorTriggerProps) => (\n <SelectTrigger\n className={cn(\"h-7 border-none bg-transparent px-2 text-xs shadow-none\", className)}\n size=\"sm\"\n {...props}\n />\n);\n\nexport type CodeBlockLanguageSelectorValueProps = ComponentProps<typeof SelectValue>;\n\nexport const CodeBlockLanguageSelectorValue = (props: CodeBlockLanguageSelectorValueProps) => (\n <SelectValue {...props} />\n);\n\nexport type CodeBlockLanguageSelectorContentProps = ComponentProps<typeof SelectContent>;\n\nexport const CodeBlockLanguageSelectorContent = ({\n align = \"end\",\n ...props\n}: CodeBlockLanguageSelectorContentProps) => <SelectContent align={align} {...props} />;\n\nexport type CodeBlockLanguageSelectorItemProps = ComponentProps<typeof SelectItem>;\n\nexport const CodeBlockLanguageSelectorItem = (props: CodeBlockLanguageSelectorItemProps) => (\n <SelectItem {...props} />\n);\n","\"use client\";\n\nimport { useReducedMotion } from \"@elabs-ai/components-tokens\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { MotionProps } from \"motion/react\";\nimport { motion } from \"motion/react\";\nimport type { CSSProperties, ElementType, JSX } from \"react\";\nimport { memo, useMemo } from \"react\";\n\ntype MotionHTMLProps = MotionProps & Record<string, unknown>;\n\n// Cache motion components at module level to avoid creating during render\nconst motionComponentCache = new Map<\n keyof JSX.IntrinsicElements,\n React.ComponentType<MotionHTMLProps>\n>();\n\nconst getMotionComponent = (element: keyof JSX.IntrinsicElements) => {\n let component = motionComponentCache.get(element);\n if (!component) {\n component = motion.create(element);\n motionComponentCache.set(element, component);\n }\n return component;\n};\n\nexport interface TextShimmerProps {\n children: string;\n as?: ElementType;\n className?: string;\n duration?: number;\n spread?: number;\n}\n\nconst ShimmerComponent = ({\n children,\n as: Component = \"p\",\n className,\n duration = 2,\n spread = 2,\n}: TextShimmerProps) => {\n const MotionComponent = getMotionComponent(Component as keyof JSX.IntrinsicElements);\n\n // The CSS --motion-factor gate cannot reach this JS timeline; resolve the\n // motion preference (user > OS) here and stop the infinite sweep when reduced.\n const reducedMotion = useReducedMotion();\n\n const dynamicSpread = useMemo(() => (children?.length ?? 0) * spread, [children, spread]);\n\n return (\n <MotionComponent\n animate={{ backgroundPosition: \"0% center\" }}\n className={cn(\n \"relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent\",\n \"[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]\",\n className,\n )}\n initial={{ backgroundPosition: \"100% center\" }}\n style={\n {\n \"--spread\": `${dynamicSpread}px`,\n backgroundImage:\n \"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))\",\n } as CSSProperties\n }\n transition={\n reducedMotion\n ? { duration: 0, repeat: 0 }\n : {\n duration,\n ease: \"linear\",\n repeat: Number.POSITIVE_INFINITY,\n }\n }\n >\n {children}\n </MotionComponent>\n );\n};\n\nexport const Shimmer = memo(ShimmerComponent);\n","/**\n * _code-block-theme — derives a Shiki theme from brand-ui's `--code-*` tokens\n * instead of a hardcoded `github-light`/`github-dark` literal (issue #315).\n *\n * Shiki can't read CSS custom properties at tokenize time, so — the same\n * \"wrap an engine, theme it from tokens\" pattern as `@elabs-ai/components-editor`'s\n * Monaco bridge (`monaco-theme-bridge.ts`), `@elabs-ai/components-maps`' `useTokenColor`,\n * and this package's own `buildInteractiveTerminalTheme` — this module reads the\n * ACTIVE theme's resolved token colors at call time via `resolveTokenColor`\n * (`@elabs-ai/components-tokens`, ADR 0015: oklch → hex, no canvas needed since every\n * `--code-*` token is authored as `oklch()`) and builds a single Shiki\n * `ThemeRegistrationRaw` that matches whatever brand theme is currently active\n * — including a low-chroma monochrome ink palette, never a recolored GitHub\n * theme. Callers re-derive (and re-highlight) whenever `data-theme` changes;\n * see `code-block.tsx`'s `data-theme` MutationObserver.\n *\n * `buildCodeBlockTheme` takes a single `el` (default `<html>`) and derives BOTH\n * the theme id/type AND the resolved colors from that SAME element — never a\n * separately-requested theme name. A CodeBlock nested inside a region-scoped\n * `<div data-theme=\"dark\">` (a supported `ThemeProvider`/decorator pattern,\n * see @.claude/rules/theming.md) resolves ITS region's theme this way: pass a\n * descendant of that region as `el` and the id/type/colors all agree by\n * construction (there is no \"themeName\" parameter that could disagree with what\n * `el` actually renders).\n *\n * The highlight-cache key (`codeBlockThemeId`, consumed by `code-block.tsx`'s\n * `getTokensCacheKey`) is keyed on `getThemeScopeKey` — the RAW `data-theme`\n * attribute — and must NOT be collapsed to a validated/normalized theme name.\n * This matters: \"no `data-theme` attribute yet\" (the first render, before\n * `ThemeProvider` mounts and writes the attribute) and an EXPLICIT\n * `data-theme=\"light\"` are DIFFERENT palettes, because `:root`'s fallback\n * `--code-*` values are intentionally their OWN neutral placeholder theme, not\n * a byte-identical copy of `[data-theme=\"light\"]`'s (see `themes.css`'s\n * \"`:root` holds the DEFAULT (light) theme\" header — a deliberately distinct\n * palette, not an alias). If the cache key normalized \"unset\" to \"light\", a\n * code block that first tokenizes before `ThemeProvider` mounts would cache\n * `:root`'s colors under the SAME key `ThemeProvider` later writes explicitly\n * — so the (correct) `light` colors would never take effect; the cache hit\n * would return the stale `:root` colors forever (#315 follow-up). Keying on the\n * raw attribute gives \"no attribute\" and \"light\" distinct cache entries, so the\n * mutation from one to the other is a genuine cache miss and re-tokenizes.\n *\n * ADR 0029 removed the `getActiveThemeName` helper this file used to export.\n * Theme names are open now, so \"narrow the attribute to a known theme\" is not a\n * meaningful operation — a consumer theme is as real as a shipped one. The two\n * things it was used for are both answered off the element directly:\n * `resolveThemeIsDark(el)` for the light/dark `type`, and `resolveTokenColor`\n * for the colors.\n */\n\nimport { resolveThemeIsDark, resolveTokenColor } from \"@elabs-ai/components-tokens\";\nimport type { ThemeRegistrationRaw } from \"shiki\";\n\nconst FALLBACK_BACKGROUND = \"#ffffff\";\nconst FALLBACK_FOREGROUND = \"#111111\";\n/** Cache-key sentinel for \"no `data-theme` attribute present\" — see `getThemeScopeKey`. */\nconst ROOT_SCOPE_KEY = \"__root__\";\n\n/**\n * Reads the RAW `data-theme` attribute off `el` (default `<html>`) — or the\n * `\"__root__\"` sentinel when the attribute is absent. It deliberately does NOT\n * collapse \"unset\" and \"explicit light\" into one value (see the module comment),\n * and it never validates the name against a registry: a consumer theme gets its\n * own cache bucket, which is exactly right — it has its own `--code-*` values.\n */\nexport function getThemeScopeKey(el?: Element | null): string {\n const root = el ?? (typeof document !== \"undefined\" ? document.documentElement : null);\n return root?.getAttribute(\"data-theme\") || ROOT_SCOPE_KEY;\n}\n\n/** Shiki theme `name` for a given theme-scope key — also the highlight-cache key. */\nexport function codeBlockThemeId(scopeKey: string): string {\n return `brand-code-${scopeKey}`;\n}\n\n/**\n * Builds a Shiki `ThemeRegistrationRaw` from the resolved `--code-*` tokens of\n * whichever brand theme is active on `el` (default `<html>`). The theme id, its\n * light/dark `type` and its colors are ALL derived from THIS SAME element, so\n * they can never disagree. `type` comes from `resolveThemeIsDark` (the theme's\n * own `color-scheme`) rather than a registry lookup, so a consumer-authored\n * theme gets the right Shiki type without registering here (ADR 0029). Scopes\n * follow the common TextMate categories Shiki's bundled grammars emit across\n * languages.\n */\nexport function buildCodeBlockTheme(el?: Element | null): ThemeRegistrationRaw {\n const root = el ?? (typeof document !== \"undefined\" ? document.documentElement : null);\n const read = (name: string, fallback: string) => resolveTokenColor(name, { el: root, fallback });\n\n const background = read(\"--code-background\", FALLBACK_BACKGROUND);\n const foreground = read(\"--code-foreground\", FALLBACK_FOREGROUND);\n const comment = read(\"--code-comment\", foreground);\n const string_ = read(\"--code-string\", foreground);\n const number = read(\"--code-number\", foreground);\n const constant = read(\"--code-constant\", foreground);\n const keyword = read(\"--code-keyword\", foreground);\n const func = read(\"--code-function\", foreground);\n const type = read(\"--code-type\", foreground);\n const tag = read(\"--code-tag\", foreground);\n const property = read(\"--code-property\", foreground);\n\n return {\n // Keyed on the RAW scope, not the validated name — see the module doc\n // comment + `getThemeScopeKey` for why \"unset\" and \"light\" must get\n // different cache buckets.\n name: codeBlockThemeId(getThemeScopeKey(root)),\n type: resolveThemeIsDark(root) ? \"dark\" : \"light\",\n bg: background,\n fg: foreground,\n colors: {\n \"editor.background\": background,\n \"editor.foreground\": foreground,\n },\n settings: [\n { settings: { foreground } },\n {\n scope: [\"comment\", \"punctuation.definition.comment\"],\n settings: { foreground: comment, fontStyle: \"italic\" },\n },\n {\n scope: [\"string\", \"string.quoted\", \"string.template\", \"punctuation.definition.string\"],\n settings: { foreground: string_ },\n },\n {\n scope: [\"constant.numeric\", \"constant.character\", \"constant.character.escape\"],\n settings: { foreground: number },\n },\n {\n scope: [\"constant.language\", \"constant.other\", \"support.constant\"],\n settings: { foreground: constant },\n },\n {\n scope: [\n \"keyword\",\n \"keyword.control\",\n \"keyword.operator\",\n \"storage.type\",\n \"storage.modifier\",\n ],\n settings: { foreground: keyword },\n },\n {\n scope: [\n \"entity.name.function\",\n \"support.function\",\n \"meta.function-call\",\n \"variable.function\",\n ],\n settings: { foreground: func },\n },\n {\n scope: [\n \"entity.name.type\",\n \"entity.name.class\",\n \"support.type\",\n \"support.class\",\n \"entity.other.inherited-class\",\n ],\n settings: { foreground: type },\n },\n {\n scope: [\"entity.name.tag\", \"punctuation.definition.tag\"],\n settings: { foreground: tag },\n },\n {\n scope: [\n \"entity.other.attribute-name\",\n \"variable.other.property\",\n \"meta.object-literal.key\",\n \"support.type.property-name\",\n ],\n settings: { foreground: property },\n },\n // Deliberately NO `invalid`/`invalid.illegal` rule here (#315 follow-up):\n // it used to alias to the SAME color as `tag`, so a perfectly valid\n // <div>/JSX tag — the most common markup element in the languages this\n // component renders — was indistinguishable from genuinely broken syntax.\n // Leaving the scope unmapped falls through to the base `{ settings:\n // { foreground } }` rule above (Shiki/TextMate cascade), same as most\n // grammars' own default. If a dedicated \"this token is invalid\" highlight\n // is ever wanted, it needs its OWN `--code-*` token, not a reuse of `tag`.\n ],\n };\n}\n","\"use client\";\n\n/**\n * AgentEvent — the lifecycle/hook event line (#109).\n *\n * Nothing in the trace vocabulary (`Message` → `Tool` → `Task`/`AgentStep`)\n * has a place for something the *runtime* did to the agent: a lifecycle hook\n * (`user_prompt_submit`, `stop`) or a policy/guard check\n * (`pre_tool_use`/`post_tool_use`) that fired around a tool call. `AgentEvent`\n * fills that gap as an `AgentStep` VARIANT on the existing `AgentTimeline`\n * rail — not a second spine. It sits in the same `<ol>` as ordinary steps,\n * distinguished by glyph and label rather than by a different layout\n * (docs/decisions/2026-09-01-brainless-adoption-architecture.md § 6, and the\n * `Task`/`TaskItem` precedent this file follows in `./agent-timeline`).\n *\n * `outcome` maps onto the existing closed 7-state `Status` (`@elabs-ai/components-ui`) —\n * no eighth status is introduced. `checks` renders a gate's verdicts: an\n * array renders each check as icon + accessible pass/fail TEXT (never colour\n * alone — the greyscale test in `.claude/rules/accessibility.md`); a count\n * summary renders `passed/ran` as plain text.\n */\nimport { Webhook, type LucideIcon } from \"lucide-react\";\nimport { forwardRef, type ReactNode } from \"react\";\nimport {\n StatusIcon,\n agentEventOutcomeStatus,\n formatElapsed,\n useLocale,\n type AgentEventOutcome,\n type AgentEventPhase,\n type CheckResult,\n type CheckSummary,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { AgentStep, type AgentStepProps } from \"./agent-timeline\";\n\n// `AgentEventPhase`, `AgentEventOutcome` and the outcome→`Status` mapping\n// (`agentEventOutcomeStatus`, formerly this file's private `OUTCOME_STATUS`)\n// moved to `@elabs-ai/components-ui` (`lib/agent-event-model.ts`) — the\n// terminal CLI look-alike family's own event line (issue #117) reuses the\n// same model, and `@elabs-ai/components-ai`/`@elabs-ai/components-terminal`\n// are layer-2 DAG siblings that may not import each other (T0; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n// above; NOT re-exported from here — a consumer imports `AgentEventPhase`/\n// `AgentEventOutcome` from `@elabs-ai/components-ui`.\n\nexport interface AgentEventProps extends Omit<\n AgentStepProps,\n \"name\" | \"status\" | \"children\" | \"icon\" | \"timestamp\"\n> {\n /** The runtime event name, verbatim as the runtime emits it — e.g. `\"user_prompt_submit\"`, `\"pre_tool_use\"`, `\"stop\"`. */\n label: string;\n /** When this event fired relative to the action it gates. See `AgentEventPhase`. */\n phase?: AgentEventPhase;\n /** The event's verdict. @default \"ok\" */\n outcome?: AgentEventOutcome;\n /** Wall-clock duration of the event, in milliseconds. Rendered with the shared `formatElapsed`. */\n durationMs?: number;\n /** Gate checks the event ran: individual verdicts, or a count summary. */\n checks?: CheckSummary | CheckResult[];\n /** Optional leading glyph on the title row (Lucide). @default Webhook */\n icon?: LucideIcon;\n}\n\nfunction isCheckResultList(checks: CheckSummary | CheckResult[]): checks is CheckResult[] {\n return Array.isArray(checks);\n}\n\n/**\n * A single gate-check verdict row: icon + label + accessible status word +\n * optional duration + optional detail. Mirrors the anatomy of `ChangeReview`'s\n * check row (`packages/ui/src/components/change-review/change-review.tsx`) so\n * the two `CheckResult` surfaces read as one convention — reimplemented here\n * (rather than imported) because that row is a private, unexported function.\n *\n * The pass/fail signal is carried by TWO non-colour cues — `StatusIcon`'s\n * distinct glyph (decorative, `aria-hidden`) and the visible status word\n * (what reaches assistive tech) — so it survives in greyscale (WCAG 1.4.1).\n */\nfunction AgentEventCheckRow({ check }: { check: CheckResult }) {\n const { t } = useLocale();\n const { label, ok, detail, durationMs } = check;\n const statusWord = t(ok ? \"ai.agentEvent.checkPassed\" : \"ai.agentEvent.checkFailed\");\n\n return (\n <div data-slot=\"agent-event-check\" data-ok={ok} className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-x-1.5 gap-y-0.5 min-w-0\">\n <StatusIcon status={ok ? \"complete\" : \"failed\"} className=\"size-3.5 shrink-0\" />\n <span className=\"text-caption font-medium text-foreground truncate\">{label}</span>\n <span\n data-slot=\"agent-event-check-status\"\n className={cn(\"text-caption\", ok ? \"text-success-text\" : \"text-destructive-text\")}\n >\n {statusWord}\n </span>\n {durationMs !== undefined && (\n <span className=\"text-caption text-muted-foreground tabular-nums shrink-0\">\n {formatElapsed(durationMs)}\n </span>\n )}\n </div>\n {detail !== undefined && detail !== \"\" && (\n <p\n data-slot=\"agent-event-check-detail\"\n className=\"pl-5 text-caption text-muted-foreground break-words\"\n >\n {detail}\n </p>\n )}\n </div>\n );\n}\n\n/** The checks section: a flat list of verdict rows, or a `passed/ran` count line. */\nfunction AgentEventChecks({ checks }: { checks: CheckSummary | CheckResult[] }) {\n const { t } = useLocale();\n\n if (isCheckResultList(checks)) {\n if (checks.length === 0) return null;\n return (\n <div data-slot=\"agent-event-checks\" className=\"flex flex-col gap-1.5\">\n {checks.map((check, index) => (\n <AgentEventCheckRow key={`${check.label}-${index}`} check={check} />\n ))}\n </div>\n );\n }\n\n const { ran, passed } = checks;\n return (\n <p\n data-slot=\"agent-event-checks-summary\"\n className=\"text-meta text-muted-foreground tabular-nums\"\n >\n {t(\"ai.agentEvent.checksSummary\", { passed, ran })}\n </p>\n );\n}\n\nconst PHASE_KEY: Record<AgentEventPhase, string> = {\n before: \"ai.agentEvent.phaseBefore\",\n after: \"ai.agentEvent.phaseAfter\",\n lifecycle: \"ai.agentEvent.phaseLifecycle\",\n};\n\n/**\n * One lifecycle/hook event line on the `AgentTimeline` rail — an `AgentStep`\n * variant, never a second spine. Composes `AgentStep` exactly as `TaskItem`\n * does in `./agent-timeline`, so it rides the same `TimelineRoot`/`TimelineItem`\n * primitives every other trace entry uses.\n */\nexport const AgentEvent = forwardRef<HTMLLIElement, AgentEventProps>(function AgentEvent(\n { label, phase, outcome = \"ok\", durationMs, checks, icon: Icon = Webhook, summary, ...props },\n ref,\n) {\n const { t } = useLocale();\n const status = agentEventOutcomeStatus(outcome);\n const phaseLabel = phase === undefined ? undefined : t(PHASE_KEY[phase]);\n\n const name: ReactNode = phaseLabel ? (\n <>\n {label}{\" \"}\n <span data-slot=\"agent-event-phase\" className=\"text-meta font-normal text-muted-foreground\">\n · {phaseLabel}\n </span>\n </>\n ) : (\n label\n );\n\n return (\n <AgentStep\n ref={ref}\n icon={Icon}\n name={name}\n status={status}\n summary={summary}\n timestamp={durationMs === undefined ? undefined : formatElapsed(durationMs)}\n data-slot=\"agent-event\"\n {...props}\n >\n {checks ? <AgentEventChecks checks={checks} /> : null}\n </AgentStep>\n );\n});\n\nAgentEvent.displayName = \"AgentEvent\";\n","\"use client\";\n\n/**\n * AgentTimeline / AgentStep — the agent execution-trace rail (#192,\n * research 10 §B.3).\n *\n * The convergence compound of the execution-trace grammar: sequenced,\n * status-bearing agent steps render on ONE visual spine — the canonical\n * `@elabs-ai/components-ui` Timeline rail (`TimelineRoot`/`TimelineItem`, #190) — speaking\n * ONE status vocabulary — the closed 7-state `Status` enum (`StatusBadge`,\n * #189). `ChainOfThought`'s steps and `Task`'s body compose this instead of\n * hand-rolling rails; an inspect-only `Tool` call renders as an `AgentStep`\n * with its JSON behind a `ToolDetails` disclosure as children.\n *\n * Deliberately NOT converged (different speech-acts, research 10 §B.3):\n * `Plan` (a proposal, not an executed step), `Checkpoint` (a divider/restore\n * point), `Reasoning` (inline thinking prose).\n *\n * The shared rail is motion-free; the gated entrance animation lives here,\n * in the composing consumer (research 10 §B.2).\n */\nimport { StatusBadge, TimelineItem, TimelineRoot, type Status } from \"@elabs-ai/components-ui\";\nimport type { TimelineItemProps, TimelineRootProps } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { forwardRef, memo, type ReactNode } from \"react\";\n\nexport type AgentTimelineProps = TimelineRootProps;\n\n/** The `<ol>` rail an agent run's steps sit on (canonical @elabs-ai/components-ui spine). */\nexport const AgentTimeline = forwardRef<HTMLOListElement, AgentTimelineProps>(\n function AgentTimeline({ className, ...props }, ref) {\n return <TimelineRoot ref={ref} className={cn(\"not-prose w-full\", className)} {...props} />;\n },\n);\n\nexport interface AgentStepProps extends Omit<TimelineItemProps, \"children\" | \"description\"> {\n /** Optional leading concept glyph on the title row (Lucide). */\n icon?: LucideIcon;\n /** What the agent did — the step's title (`text-body`). */\n name: ReactNode;\n /** The business summary line under the name (`text-meta`), not JSON. */\n summary?: ReactNode;\n /**\n * The canonical execution status (closed 7-state enum). Drives the rail\n * node AND the `StatusBadge`. `skipped` is the agent-step-only state with\n * no SDK source (research 10 §B.1).\n */\n status?: Status;\n /**\n * Drop the inline `StatusBadge` (the rail node still carries the status\n * color). For quiet prose rails — e.g. the `ChainOfThought` alias — where a\n * badge per step would shout.\n */\n hideBadge?: boolean;\n /** Rich detail under the node (e.g. a `ToolDetails` disclosure, results). */\n children?: ReactNode;\n}\n\n/**\n * One executed/executing step: icon + name + `StatusBadge` + business\n * summary, with composed children for detail. Memoized for long transcripts\n * (research 10 §G.6).\n */\nexport const AgentStep = memo(\n forwardRef<HTMLLIElement, AgentStepProps>(function AgentStep(\n {\n icon: Icon,\n name,\n summary,\n status = \"pending\",\n hideBadge = false,\n className,\n children,\n ...props\n },\n ref,\n ) {\n return (\n <TimelineItem\n ref={ref}\n status={status}\n description={\n summary ? <span className=\"text-meta text-muted-foreground\">{summary}</span> : undefined\n }\n detail={children}\n className={cn(\n \"fade-in-0 slide-in-from-top-2 animate-in [--tw-ease:var(--ease-entrance)] motion-reduce:animate-none\",\n className,\n )}\n {...props}\n >\n <span className=\"inline-flex items-center gap-2\">\n {Icon ? (\n <Icon aria-hidden=\"true\" className=\"size-4 shrink-0 text-muted-foreground\" />\n ) : null}\n {name}\n {hideBadge ? null : <StatusBadge size=\"sm\" status={status} />}\n </span>\n </TimelineItem>\n );\n }),\n);\n\nAgentTimeline.displayName = \"AgentTimeline\";\nAgentStep.displayName = \"AgentStep\";\n","\"use client\";\n\nimport { Button, Skeleton, useLocale } from \"@elabs-ai/components-ui\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { XIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { createContext, use, useMemo } from \"react\";\n\n/**\n * Shared `loading` state (composition-patterns — lifted into the provider):\n * `Artifact` is the ONLY place that knows whether the body has arrived;\n * `ArtifactContent` reads the interface and renders its skeleton, while\n * `ArtifactHeader`/`ArtifactTitle` (ordinary children of `Artifact`) keep\n * rendering normally, untouched by the not-ready state.\n */\nconst ArtifactContext = createContext<{ loading: boolean }>({ loading: false });\n\nexport type ArtifactProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * The artifact body has not arrived yet (loading-states.md loading signal).\n * ArtifactContent renders a layout-shaped skeleton instead of its\n * children; ArtifactHeader/ArtifactTitle keep rendering as passed.\n * @default false\n */\n loading?: boolean;\n};\n\nexport const Artifact = ({ className, loading = false, children, ...props }: ArtifactProps) => {\n const contextValue = useMemo(() => ({ loading }), [loading]);\n\n return (\n <ArtifactContext.Provider value={contextValue}>\n <div\n // KEEP this border (#194, research 08 §G.5): it is redundant on light\n // (the #187 page-ground recess + shadow already lift the frame), but under\n // high decoration the shadow is zeroed and the border becomes the\n // SOLE structural cue — the canonical \"redundant-on-light, sole-cue-under-\n // decoration\" KEEP example. Do not drop it in a border-noise pass.\n className={cn(\n \"flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </ArtifactContext.Provider>\n );\n};\n\nexport type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactHeader = ({ className, ...props }: ArtifactHeaderProps) => (\n <div\n className={cn(\"flex items-center justify-between border-b bg-muted/50 px-4 py-3\", className)}\n {...props}\n />\n);\n\nexport type ArtifactCloseProps = ComponentProps<typeof Button>;\n\nexport const ArtifactClose = ({\n className,\n children,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactCloseProps) => {\n const { t } = useLocale();\n return (\n <Button\n className={cn(\"size-8 p-0 text-muted-foreground hover:text-foreground\", className)}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? <XIcon className=\"size-4\" />}\n <span className=\"sr-only\">{t(\"close\")}</span>\n </Button>\n );\n};\n\nexport type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (\n <p className={cn(\"font-medium text-foreground text-sm\", className)} {...props} />\n);\n\nexport type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const ArtifactDescription = ({ className, ...props }: ArtifactDescriptionProps) => (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n\nexport type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactActions = ({ className, ...props }: ArtifactActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props} />\n);\n\nexport type ArtifactActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n icon?: LucideIcon;\n};\n\nexport const ArtifactAction = ({\n tooltip,\n label,\n icon: Icon,\n children,\n className,\n size = \"sm\",\n variant = \"ghost\",\n ...props\n}: ArtifactActionProps) => {\n const button = (\n <Button\n className={cn(\"size-8 p-0 text-muted-foreground hover:text-foreground\", className)}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {Icon ? <Icon className=\"size-4\" /> : children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\nexport type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const ArtifactContent = ({ className, children, ...props }: ArtifactContentProps) => {\n const { loading } = use(ArtifactContext);\n const { t } = useLocale();\n\n return (\n <div className={cn(\"flex-1 overflow-auto p-4\", className)} {...props}>\n {loading ? (\n <div className=\"space-y-2\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n ) : (\n children\n )}\n </div>\n );\n};\n","\"use client\";\n\n/**\n * AssetPreview — type-keyed preview of one produced asset (#193, research 04\n * §5 ASSET-4). Reuses the `Artifact` chrome for the header/actions; the body\n * switches on `ContextAsset.type`:\n *\n * markdown → `MarkdownView` (the branded renderer — a document, never\n * Shiki source; the ASSET-2 fix)\n * code/sql → `CodeBlock` (Shiki)\n * csv → a small token-styled table + row-count summary\n * image → an image preview\n *\n * A Preview / Raw toggle serves users who want the source (Raw = `CodeBlock`,\n * soft-wrapped for narrow embeds). Selection state lives in the\n * `ContextPanelProvider` — the tree and this preview are the two levels of the\n * drill-in.\n *\n * Formats beyond that switch — a PDF, a spreadsheet, a video — arrive through\n * `renderPreview` (prop, or injected once on `ContextPanelProvider`), because\n * `@elabs-ai/components-viewer` is a layer PEER of this package and\n * neither may import the other (ADR 0024 §6). A renderer that returns `null`\n * declines, and everything below runs exactly as before.\n */\nimport {\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BundledLanguage } from \"shiki\";\nimport {\n Artifact,\n ArtifactActions,\n ArtifactContent,\n ArtifactHeader,\n ArtifactTitle,\n} from \"./artifact\";\nimport { CodeBlock } from \"./code-block\";\nimport type { AssetPreviewRenderer, ContextAsset } from \"./context-panel\";\nimport { useAssetPreviewRenderer } from \"./context-panel\";\nimport { MarkdownView } from \"./markdown-view\";\n\nexport type AssetPreviewMode = \"preview\" | \"raw\";\n\nconst DEFAULT_CODE_LANGUAGE: BundledLanguage = \"typescript\";\n\n/** Raw-mode (and code-preview) Shiki language for an asset. */\nfunction assetLanguage(asset: ContextAsset): BundledLanguage {\n switch (asset.type) {\n case \"markdown\":\n return \"markdown\";\n case \"sql\":\n return \"sql\";\n case \"csv\":\n return \"csv\";\n case \"code\":\n return (asset.language as BundledLanguage) ?? DEFAULT_CODE_LANGUAGE;\n default:\n return DEFAULT_CODE_LANGUAGE;\n }\n}\n\ninterface ParsedCsv {\n header: string[];\n rows: string[][];\n}\n\n/** Minimal preview-grade CSV split (no quoted-comma handling — it's a glance, not a grid). */\nfunction parseCsv(content: string): ParsedCsv {\n const lines = content\n .trim()\n .split(/\\r?\\n/)\n .filter((line) => line.length > 0);\n const [head = \"\", ...rest] = lines;\n const split = (line: string) => line.split(\",\").map((cell) => cell.trim());\n return { header: split(head), rows: rest.map(split) };\n}\n\nconst CsvPreview = ({ content }: { content: string }) => {\n const { header, rows } = useMemo(() => parseCsv(content), [content]);\n return (\n <div className=\"flex flex-col gap-2\">\n <Table className=\"text-body tabular-nums\">\n <TableHeader>\n <TableRow>\n {header.map((cell) => (\n <TableHead key={cell}>{cell}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n // Rows have no stable identity in raw CSV — index is the key.\n // oxlint-disable-next-line eslint-plugin-react(no-array-index-key)\n <TableRow key={`row-${rowIndex}`}>\n {row.map((cell, cellIndex) => (\n // oxlint-disable-next-line eslint-plugin-react(no-array-index-key)\n <TableCell key={`cell-${rowIndex}-${cellIndex}`}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n <p className=\"text-meta text-muted-foreground\">\n {rows.length} {rows.length === 1 ? \"row\" : \"rows\"}\n </p>\n </div>\n );\n};\n\nexport interface AssetPreviewProps extends HTMLAttributes<HTMLDivElement> {\n asset: ContextAsset;\n /** Initial mode. Default `\"preview\"`. */\n defaultMode?: AssetPreviewMode;\n /**\n * Draw this asset's preview body yourself; return `null` to decline and get\n * the built-in rendering. Wins over a renderer injected on\n * `ContextPanelProvider`, so one rail-wide default can still be overridden\n * for a single preview.\n */\n renderPreview?: AssetPreviewRenderer;\n}\n\nexport const AssetPreview = ({\n asset,\n defaultMode = \"preview\",\n renderPreview,\n className,\n ...props\n}: AssetPreviewProps) => {\n const [mode, setMode] = useState<AssetPreviewMode>(defaultMode);\n const injectedRenderer = useAssetPreviewRenderer();\n const content = asset.content ?? \"\";\n // Raw source only exists for text assets with content.\n const hasRaw = asset.type !== \"image\" && content.length > 0;\n const showRaw = mode === \"raw\" && hasRaw;\n\n // Raw is \"show me the source\", so an injection never intercepts it.\n const render = renderPreview ?? injectedRenderer;\n const injected = !showRaw && render ? render(asset) : null;\n\n let body: ReactNode;\n if (injected !== null) {\n body = injected;\n } else if (asset.type !== \"image\" && content.length === 0) {\n body = <p className=\"text-body text-muted-foreground\">No preview available…</p>;\n } else if (showRaw) {\n body = <CodeBlock code={content} language={assetLanguage(asset)} wrap />;\n } else {\n switch (asset.type) {\n case \"markdown\": {\n // Constrained heading rung inside the narrow rail (research 09 §G.2).\n body = <MarkdownView baseHeadingLevel={2}>{content}</MarkdownView>;\n break;\n }\n case \"code\":\n case \"sql\": {\n body = <CodeBlock code={content} language={assetLanguage(asset)} showLineNumbers wrap />;\n break;\n }\n case \"csv\": {\n body = <CsvPreview content={content} />;\n break;\n }\n case \"image\": {\n body = (\n <img\n src={content || asset.path}\n alt={asset.name}\n loading=\"lazy\"\n className=\"max-w-full rounded-md\"\n />\n );\n break;\n }\n }\n }\n\n return (\n <Artifact data-slot=\"asset-preview\" className={className} {...props}>\n <ArtifactHeader>\n <ArtifactTitle className=\"min-w-0 truncate\">{asset.name}</ArtifactTitle>\n {hasRaw ? (\n <ArtifactActions>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={!showRaw}\n className={cn(!showRaw && \"bg-accent text-accent-foreground\")}\n onClick={() => setMode(\"preview\")}\n >\n Preview\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={showRaw}\n className={cn(showRaw && \"bg-accent text-accent-foreground\")}\n onClick={() => setMode(\"raw\")}\n >\n Raw\n </Button>\n </ArtifactActions>\n ) : null}\n </ArtifactHeader>\n <ArtifactContent>{body}</ArtifactContent>\n </Artifact>\n );\n};\n","\"use client\";\n\n/**\n * ContextPanel — the chat workspace's right context rail (#193, research 09).\n *\n * A compound, lifted-state component (doc-13): `ContextPanelProvider` lifts ALL\n * state ({ open, view, selectedAsset }) so an external trigger (e.g. an\n * app-header `ContextPanelTrigger`) can drive the panel from anywhere inside\n * the provider. The panel itself is ALWAYS MOUNTED and collapses via the\n * canonical `useCollapsiblePanel` width tween (one collapse implementation —\n * never a conditional mount, which can't animate). Root ↔ detail drill-in is a\n * v1 CSS two-pane translateX track behind the future `useViewTransition` seam\n * (research view-transitions/01-design.md §6.1): `openDetail`/`back` are\n * already shaped as `mutate`-callbacks and the panes carry stable\n * `data-vt-pane` identities, so the v2 swap is internal-only.\n *\n * ChatShell stays generic: compose `<ContextPanel>` as a SIBLING of\n * `<ChatShell>` under a workspace-wrapping `<ContextPanelProvider>` (the\n * Sidebar / SidebarInset relationship). Below the mobile breakpoint the panel\n * degrades to a `@elabs-ai/components-ui` `<Sheet side=\"right\">` driven by the same state.\n */\nimport {\n Button,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n useCollapsiblePanel,\n useIsMobile,\n useLocale,\n type FileSource,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronLeftIcon, PanelRightIcon } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties, HTMLAttributes, ReactNode, RefObject } from \"react\";\nimport {\n createContext,\n forwardRef,\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst CONTEXT_PANEL_COOKIE_NAME = \"context_panel_state\";\nconst CONTEXT_PANEL_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst CONTEXT_PANEL_WIDTH = \"20rem\";\nconst CONTEXT_PANEL_WIDTH_MOBILE = \"20rem\";\n\n/** Closed asset-type enum shared by the tree (`ProducedAssetTree`) and the preview (`AssetPreview`). */\nexport type ContextAssetType = \"markdown\" | \"code\" | \"sql\" | \"csv\" | \"image\";\n\n/** One produced asset — the unit the drill-in focuses (research 09 §B.1). */\nexport interface ContextAsset {\n id: string;\n name: string;\n path?: string;\n type: ContextAssetType;\n /** Inline content: source text — or, for `image`, the image src URL. */\n content?: string;\n /** Optional Shiki language for `code` assets (defaults to \"typescript\"). */\n language?: string;\n /**\n * The file itself, when the asset IS one — a `File`, a `Blob`, a URL, a\n * buffer. Carried so a `renderPreview` injection (below) can hand it to\n * something that opens files, such as `@elabs-ai/components-viewer`'s\n * `FileViewer`, without the asset first being turned into a string.\n *\n * `ContextAssetType` is deliberately NOT widened to cover PDFs, Office files\n * or video: this union describes what THIS package can draw, and every format\n * beyond it arrives through the injection seam rather than by growing a case\n * per format here (ADR 0024 §6).\n */\n source?: FileSource;\n /** MIME type, when known — helps a renderer that detects by media type. */\n mediaType?: string;\n}\n\n/**\n * Draw the body of an asset preview.\n *\n * Return `null` to decline and let `AssetPreview` fall through to its own\n * type-keyed rendering, which is what makes this additive: an injection that\n * handles PDFs only leaves markdown, code and CSV exactly as they were.\n */\nexport type AssetPreviewRenderer = (asset: ContextAsset) => ReactNode | null;\n\nexport type ContextPanelView = \"root\" | \"detail\";\n\nexport interface ContextPanelContextValue {\n /** Lifted state (doc-13 `state` / `actions` / `meta` interface). */\n state: {\n open: boolean;\n view: ContextPanelView;\n selectedAsset: ContextAsset | null;\n };\n actions: {\n /** Toggle the panel (the inline collapse on desktop, the Sheet on mobile). */\n toggle: () => void;\n setOpen: (open: boolean | ((open: boolean) => boolean)) => void;\n /** Drill into one asset (root → detail). Focus moves to the BACK control. */\n openDetail: (asset: ContextAsset) => void;\n /** Return to the root view; focus is restored to the originating row. */\n back: () => void;\n };\n meta: {\n isMobile: boolean;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n /**\n * The injected preview renderer, if the provider was given one.\n * `AssetPreview` reads it from here so a page can teach the whole rail a\n * new format in one place instead of at every call site.\n */\n renderPreview?: AssetPreviewRenderer;\n };\n}\n\nconst ContextPanelContext = createContext<ContextPanelContextValue | null>(null);\n\ninterface ContextPanelInternalValue {\n panelId: string;\n titleId: string;\n /** The element focus moves to on `openDetail` (the BACK control). */\n detailFocusRef: RefObject<HTMLElement | null>;\n}\n\nconst ContextPanelInternalContext = createContext<ContextPanelInternalValue | null>(null);\n\nexport function useContextPanel(): ContextPanelContextValue {\n const context = use(ContextPanelContext);\n if (!context) throw new Error(\"useContextPanel must be used within a ContextPanelProvider.\");\n return context;\n}\n\n/**\n * The renderer injected into the surrounding `ContextPanelProvider`, if any.\n *\n * Unlike `useContextPanel()` this does NOT throw outside a provider:\n * `AssetPreview` is usable on its own (a preview pane in a page, a story), and\n * \"no provider\" simply means nobody injected anything.\n */\nexport function useAssetPreviewRenderer(): AssetPreviewRenderer | undefined {\n return use(ContextPanelContext)?.meta.renderPreview;\n}\n\nfunction useContextPanelInternal(): ContextPanelInternalValue {\n const context = use(ContextPanelInternalContext);\n if (!context) {\n throw new Error(\"ContextPanel components must be used within a ContextPanelProvider.\");\n }\n return context;\n}\n\nexport interface ContextPanelProviderProps {\n children: ReactNode;\n /** Uncontrolled initial open state. Default `true`. */\n defaultOpen?: boolean;\n /** Controlled open state (`isControlled = open !== undefined`, never flips). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Controlled view (root ↔ detail). */\n view?: ContextPanelView;\n onViewChange?: (view: ContextPanelView) => void;\n /** Uncontrolled initial view. Default `\"root\"`. */\n defaultView?: ContextPanelView;\n /** Controlled selected asset. */\n selectedAsset?: ContextAsset | null;\n onSelectedAssetChange?: (asset: ContextAsset | null) => void;\n /** Uncontrolled initial selected asset. Default `null`. */\n defaultSelectedAsset?: ContextAsset | null;\n /**\n * Draw an asset's preview body yourself.\n *\n * The seam that lets this package show formats it cannot parse — a PDF, a\n * spreadsheet, a video — without importing a domain sibling\n * (`@elabs-ai/components-ai` and\n * `@elabs-ai/components-viewer` are peers in the layer graph and\n * may never import each other). The consuming app owns the edge:\n *\n * ```tsx\n * <ContextPanelProvider\n * renderPreview={(asset) =>\n * asset.source ? <FileViewer source={asset.source} /> : null\n * }\n * >\n * ```\n *\n * Return `null` to decline, and the built-in type-keyed rendering runs\n * exactly as before — so an injection is additive, never a replacement.\n */\n renderPreview?: AssetPreviewRenderer;\n}\n\n/**\n * Lifts the panel state above the workspace so siblings outside the panel's\n * frame (the app-header trigger) can read/drive it — no prop-drilling, no\n * page-level `useState`, no conditional mount (research 09 §B.1/§C.2).\n */\nexport function ContextPanelProvider({\n children,\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n view: viewProp,\n onViewChange,\n defaultView = \"root\",\n selectedAsset: selectedAssetProp,\n onSelectedAssetChange,\n defaultSelectedAsset = null,\n renderPreview,\n}: ContextPanelProviderProps) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = useState(false);\n\n // Controlled/uncontrolled per component-api.md: controlled iff the prop is\n // provided; the mode never flips mid-life.\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp : uncontrolledOpen;\n\n const [uncontrolledView, setUncontrolledView] = useState<ContextPanelView>(defaultView);\n const viewControlled = viewProp !== undefined;\n const view = viewControlled ? viewProp : uncontrolledView;\n\n const [uncontrolledAsset, setUncontrolledAsset] = useState<ContextAsset | null>(\n defaultSelectedAsset,\n );\n const assetControlled = selectedAssetProp !== undefined;\n const selectedAsset = assetControlled ? selectedAssetProp : uncontrolledAsset;\n\n const panelId = useId();\n const titleId = useId();\n /** Where focus returns on `back()` — the originating tree row (09 §B.5). */\n const returnFocusRef = useRef<HTMLElement | null>(null);\n /** Where focus lands on `openDetail()` — the BACK control in the header. */\n const detailFocusRef = useRef<HTMLElement | null>(null);\n\n const setOpen = useCallback(\n (value: boolean | ((open: boolean) => boolean)) => {\n const next = typeof value === \"function\" ? value(open) : value;\n if (!openControlled) setUncontrolledOpen(next);\n onOpenChange?.(next);\n // Persistence: the SidebarProvider cookie pattern (research 09 §B.1).\n if (typeof document !== \"undefined\") {\n document.cookie = `${CONTEXT_PANEL_COOKIE_NAME}=${next}; path=/; max-age=${CONTEXT_PANEL_COOKIE_MAX_AGE}`;\n }\n },\n [onOpenChange, open, openControlled],\n );\n\n const toggle = useCallback(() => {\n if (isMobile) setOpenMobile((o) => !o);\n else setOpen((o) => !o);\n }, [isMobile, setOpen]);\n\n const setView = useCallback(\n (next: ContextPanelView) => {\n if (!viewControlled) setUncontrolledView(next);\n onViewChange?.(next);\n },\n [onViewChange, viewControlled],\n );\n\n const setSelectedAsset = useCallback(\n (next: ContextAsset | null) => {\n if (!assetControlled) setUncontrolledAsset(next);\n onSelectedAssetChange?.(next);\n },\n [assetControlled, onSelectedAssetChange],\n );\n\n const openDetail = useCallback(\n (asset: ContextAsset) => {\n // Drilling while collapsed auto-opens first (research 09 §G.1).\n if (isMobile) setOpenMobile(true);\n else if (!open) setOpen(true);\n // Stash the originating row so back() can restore focus (09 §B.5).\n if (typeof document !== \"undefined\" && document.activeElement instanceof HTMLElement) {\n returnFocusRef.current = document.activeElement;\n }\n // The v2 `useViewTransition` seam: this state change is the `mutate`\n // callback a future vt.run({ recipe: \"nav-forward\" }) will wrap (09 §B.3).\n setView(\"detail\");\n setSelectedAsset(asset);\n // Focus management is independent of the animation (VT guardrail §8):\n // land on the BACK control after the swap, never on transition end.\n requestAnimationFrame(() => detailFocusRef.current?.focus());\n },\n [isMobile, open, setOpen, setSelectedAsset, setView],\n );\n\n const back = useCallback(() => {\n // The v2 seam: the `mutate` a future vt.run({ recipe: \"nav-back\" }) wraps.\n setView(\"root\");\n requestAnimationFrame(() => {\n const target = returnFocusRef.current;\n if (target?.isConnected) target.focus();\n });\n }, [setView]);\n\n const contextValue = useMemo<ContextPanelContextValue>(\n () => ({\n state: { open, view, selectedAsset },\n actions: { toggle, setOpen, openDetail, back },\n meta: { isMobile, openMobile, setOpenMobile, renderPreview },\n }),\n [\n back,\n isMobile,\n open,\n openDetail,\n openMobile,\n renderPreview,\n selectedAsset,\n setOpen,\n toggle,\n view,\n ],\n );\n\n const internalValue = useMemo<ContextPanelInternalValue>(\n () => ({ panelId, titleId, detailFocusRef }),\n [panelId, titleId],\n );\n\n return (\n <ContextPanelContext.Provider value={contextValue}>\n <ContextPanelInternalContext.Provider value={internalValue}>\n {children}\n </ContextPanelInternalContext.Provider>\n </ContextPanelContext.Provider>\n );\n}\n\nexport interface ContextPanelProps extends ComponentProps<\"div\"> {\n /** Expanded panel width (any CSS length). Default `\"20rem\"`. */\n width?: string;\n}\n\n/**\n * The always-mounted shell. On desktop it animates its OWN width via the\n * canonical `useCollapsiblePanel` two-element tween — bounded to the SHELL\n * (a relative group + absolute container), not the viewport (09 §B.2). Below\n * the mobile breakpoint it renders a `Sheet side=\"right\"` with the same\n * children, driven by the same provider (09 §B.4).\n */\nexport const ContextPanel = forwardRef<HTMLDivElement, ContextPanelProps>(function ContextPanel(\n { width = CONTEXT_PANEL_WIDTH, className, style, children, ...props },\n ref,\n) {\n const { state, actions, meta } = useContextPanel();\n const { panelId } = useContextPanelInternal();\n const { t } = useLocale();\n\n const panel = useCollapsiblePanel({\n side: \"right\",\n open: state.open,\n onOpenChange: actions.setOpen,\n widthClassName: \"w-(--context-panel-width)\",\n spacerCollapsedClassName: \"group-data-[state=collapsed]:w-0\",\n containerSlideClassNames: {\n left: \"left-0 group-data-[state=collapsed]:left-[calc(var(--context-panel-width)*-1)]\",\n right: \"right-0 group-data-[state=collapsed]:right-[calc(var(--context-panel-width)*-1)]\",\n },\n });\n\n if (meta.isMobile) {\n return (\n <Sheet open={meta.openMobile} onOpenChange={meta.setOpenMobile}>\n <SheetContent\n id={panelId}\n side=\"right\"\n data-slot=\"context-panel\"\n data-mobile=\"true\"\n className=\"w-(--context-panel-width) gap-0 p-0\"\n style={{ \"--context-panel-width\": CONTEXT_PANEL_WIDTH_MOBILE } as CSSProperties}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>{t(\"ai.contextPanel.title\")}</SheetTitle>\n <SheetDescription>Displays the chat context panel.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n ref={ref}\n id={panelId}\n data-slot=\"context-panel\"\n // Collapsed container is inert (09 §B.5 — Sidebar gets this free via\n // `hidden`; the right rail must do it explicitly).\n inert={state.open ? undefined : true}\n className={cn(\"group relative hidden overflow-hidden md:block\", className)}\n style={{ \"--context-panel-width\": width, ...style } as CSSProperties}\n {...panel.attrs}\n {...props}\n >\n <div data-slot=\"context-panel-gap\" className={panel.spacerClassName} />\n <div\n data-slot=\"context-panel-container\"\n // The deliberate Sidebar divergence (09 §B.2): bound to the shell, not\n // the viewport — `absolute` within the relative group, full height.\n className={cn(panel.containerClassName, \"absolute inset-y-0 flex h-full border-s\")}\n >\n {/* Detail-tier surface: raised `card`, robust across themes (#193). */}\n <div data-slot=\"context-panel-inner\" className=\"flex h-full w-full flex-col bg-card\">\n {children}\n </div>\n </div>\n </div>\n );\n});\n\nexport type ContextPanelTriggerProps = ComponentProps<typeof Button>;\n\n/** Toggle button — placeable ANYWHERE inside the provider (e.g. the app header). */\nexport const ContextPanelTrigger = forwardRef<HTMLButtonElement, ContextPanelTriggerProps>(\n function ContextPanelTrigger({ className, onClick, children, ...props }, ref) {\n const { t } = useLocale();\n const { state, actions, meta } = useContextPanel();\n const { panelId } = useContextPanelInternal();\n const expanded = meta.isMobile ? meta.openMobile : state.open;\n return (\n <Button\n ref={ref}\n data-slot=\"context-panel-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n aria-expanded={expanded}\n aria-controls={panelId}\n aria-label={t(\"ai.contextPanel.toggle\")}\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event);\n actions.toggle();\n }}\n {...props}\n >\n {children ?? <PanelRightIcon aria-hidden=\"true\" />}\n </Button>\n );\n },\n);\n\nexport interface ContextPanelHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Root-view title. Default `\"Context\"`. */\n title?: ReactNode;\n}\n\n/**\n * Title row. In the detail view it hosts the BACK control (a real button —\n * \"tab-panel swap\", not a breadcrumb) and shows the focused asset's name.\n */\nexport const ContextPanelHeader = forwardRef<HTMLDivElement, ContextPanelHeaderProps>(\n function ContextPanelHeader({ title = \"Context\", className, children, ...props }, ref) {\n const { t } = useLocale();\n const { state, actions } = useContextPanel();\n const { titleId, detailFocusRef } = useContextPanelInternal();\n const isDetail = state.view === \"detail\";\n return (\n <div\n ref={ref}\n data-slot=\"context-panel-header\"\n className={cn(\"flex h-12 shrink-0 items-center gap-2 border-b px-3\", className)}\n {...props}\n >\n {isDetail ? (\n <Button\n ref={(node) => {\n detailFocusRef.current = node;\n }}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"context-panel-back\"\n aria-label={t(\"ai.contextPanel.back\")}\n className=\"gap-1 px-2 text-muted-foreground\"\n onClick={() => actions.back()}\n >\n <ChevronLeftIcon className=\"size-4\" aria-hidden=\"true\" data-rtl-flip />\n Back\n </Button>\n ) : null}\n <h2 id={titleId} className=\"min-w-0 truncate text-title\">\n {isDetail ? (state.selectedAsset?.name ?? title) : title}\n </h2>\n {children ? <div className=\"ms-auto flex items-center gap-1\">{children}</div> : null}\n </div>\n );\n },\n);\n\nexport interface ContextPanelBodyProps extends HTMLAttributes<HTMLDivElement> {\n /** Root view — the labelled sections (status / grounding / produced assets). */\n root: ReactNode;\n /** Detail view — typically `<ContextPanelDetail><AssetPreview …/></ContextPanelDetail>`. */\n detail: ReactNode;\n /** Accessible name of the region. Default `\"Context\"`. */\n label?: string;\n}\n\n/**\n * The two-view container that owns the drill-in. v1: a CSS-gated two-pane\n * translateX track (both panes mounted, transform-only, `duration-base` +\n * explicit `motion-reduce:` neutralizer). The off-screen pane is `aria-hidden`\n * AND `inert` so Tab can't land in it mid-slide (09 §B.3/§B.5). The panes'\n * `data-vt-pane` identities are the v2 `useViewTransition` seam.\n */\nexport const ContextPanelBody = forwardRef<HTMLDivElement, ContextPanelBodyProps>(\n function ContextPanelBody({ root, detail, label = \"Context\", className, ...props }, ref) {\n const { state } = useContextPanel();\n const isDetail = state.view === \"detail\";\n\n // Announce, don't steal focus mid-animation (09 §B.5). Skip the initial view.\n const [announcement, setAnnouncement] = useState(\"\");\n const previousView = useRef(state.view);\n useEffect(() => {\n if (previousView.current === state.view) return;\n previousView.current = state.view;\n setAnnouncement(\n state.view === \"detail\"\n ? `Showing ${state.selectedAsset?.name ?? \"asset detail\"}`\n : \"Back to context\",\n );\n }, [state.selectedAsset, state.view]);\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n data-slot=\"context-panel-body\"\n className={cn(\"relative min-h-0 flex-1 overflow-hidden\", className)}\n {...props}\n >\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n <div\n data-slot=\"context-panel-track\"\n className=\"flex h-full w-[200%] transition-transform duration-base ease-standard motion-reduce:transition-none\"\n style={{ transform: isDetail ? \"translateX(-50%)\" : \"translateX(0)\" }}\n >\n <div\n data-vt-pane=\"root\"\n aria-hidden={isDetail}\n inert={isDetail ? true : undefined}\n className=\"flex h-full w-1/2 flex-col gap-5 overflow-y-auto p-4\"\n >\n {root}\n </div>\n <div\n data-vt-pane=\"detail\"\n aria-hidden={!isDetail}\n inert={isDetail ? undefined : true}\n className=\"h-full w-1/2 overflow-y-auto\"\n >\n {detail}\n </div>\n </div>\n </div>\n );\n },\n);\n\nexport interface ContextPanelSectionProps extends HTMLAttributes<HTMLElement> {\n /** Section label — a quiet `text-meta` heading, not a box (research 08). */\n label?: ReactNode;\n}\n\n/** A labelled root-view section (status / grounding / produced assets). */\nexport const ContextPanelSection = forwardRef<HTMLElement, ContextPanelSectionProps>(\n function ContextPanelSection({ label, className, children, ...props }, ref) {\n return (\n <section\n ref={ref}\n data-slot=\"context-panel-section\"\n className={cn(\"flex shrink-0 flex-col gap-2\", className)}\n {...props}\n >\n {label ? <h3 className=\"text-meta text-muted-foreground\">{label}</h3> : null}\n {children}\n </section>\n );\n },\n);\n\nexport type ContextPanelDetailProps = HTMLAttributes<HTMLDivElement>;\n\n/** The focused single-asset view — hosts `<AssetPreview>` (research 04 §5). */\nexport const ContextPanelDetail = forwardRef<HTMLDivElement, ContextPanelDetailProps>(\n function ContextPanelDetail({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"context-panel-detail\"\n className={cn(\"flex min-h-full flex-col p-4\", className)}\n {...props}\n />\n );\n },\n);\n","\"use client\";\n\n/**\n * MarkdownView — the branded READ-ONLY markdown renderer (#193, research 04 §5).\n *\n * Renders a markdown *document* as a document — never as Shiki source (that\n * was the ASSET-2 defect: `CodeBlock code={…} language=\"markdown\"`). Built on\n * the EXISTING `streamdown` dependency (no new heavy dep), but unlike the\n * streaming `MessageResponse` it maps the element tree onto the promoted\n * `Prose*` primitives from `@elabs-ai/components-ui` via a `components` map.\n *\n * What is SHARED is the `Prose*` set — plus the Streamdown locale bridge in\n * `_streamdown-i18n` and `ui`'s `streamdown-translations` — NOT the renderer and\n * NOT the element map. The wording this docblock used to carry (\"one source-owned\n * prose set for chat answers, the editor preview and this view\") kept being read\n * as \"one renderer\", and it never meant that. Three branded document renderers\n * ship, and their element MAPS stay per-surface on purpose:\n * - this view — `baseHeadingLevel` for a constrained rung, and a sanitiser\n * chain locked at the type level AND at runtime;\n * - `@elabs-ai/components-editor`'s `MarkdownPreview` — the brand `:::card` /\n * `:::callout` / `::metric` / `:::timeline` dialect, and every standard\n * element wrapped to attach `data-sourcepos`, the ghost-diff wash and the\n * search wash, with slug ids and a heading-action slot on headings;\n * - `@elabs-ai/components-viewer`'s markdown adapter — a file the app did not\n * write, so no plugins and no streaming.\n * `ai`, `editor` and `viewer` are layer-2 leaves that may not import one\n * another, so the half that COULD move down already has; and `streamdown` must\n * never follow it into `ui` — see the rule stated in\n * `packages/ui/src/lib/streamdown-translations.ts` — or every consumer of every\n * foundation component would carry it. Re-litigated and re-ratified 2026-09-03:\n * the three maps are the decision, not an unpaid debt.\n *\n * `baseHeadingLevel` is the constrained-rung seam (research 04 §5 / 09 §G.2):\n * inside a narrow rail pass `baseHeadingLevel={2}` so a document `#` renders\n * at the `title` rung, not the reading-scale h1 — never \"biggest text on\n * screen\" inside a 20rem panel.\n */\nimport {\n ProseBlockquote,\n ProseHeading,\n ProseInlineCode,\n ProseLink,\n ProseList,\n ProseListItem,\n ProseText,\n type ProseHeadingLevel,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { stripSanitizerOverrides, warnOnTrustedPluginSlots } from \"./_streamdown-safety\";\nimport {\n useStreamdownMermaidOptions,\n useStreamdownPlugins,\n useStreamdownTranslations,\n} from \"./_streamdown-i18n\";\nimport type { ComponentProps } from \"react\";\nimport { useMemo } from \"react\";\nimport { Streamdown } from \"streamdown\";\n\ntype StreamdownComponents = NonNullable<ComponentProps<typeof Streamdown>[\"components\"]>;\ntype StreamdownPlugins = ComponentProps<typeof Streamdown>[\"plugins\"];\n\nconst MAX_HEADING_LEVEL = 6;\n\nconst clampHeadingLevel = (level: number): ProseHeadingLevel =>\n Math.min(MAX_HEADING_LEVEL, Math.max(1, level)) as ProseHeadingLevel;\n\n/**\n * Map the markdown element tree onto the Prose* primitives. Fenced code blocks\n * (className `language-*`) stay with the streamdown `code` plugin (Shiki);\n * only INLINE code re-maps to `ProseInlineCode`.\n */\nfunction buildProseComponents(baseHeadingLevel: ProseHeadingLevel): StreamdownComponents {\n const heading =\n (markdownLevel: number): StreamdownComponents[\"h1\"] =>\n ({ node: _node, ...props }) => (\n <ProseHeading level={clampHeadingLevel(markdownLevel + baseHeadingLevel - 1)} {...props} />\n );\n return {\n h1: heading(1),\n h2: heading(2),\n h3: heading(3),\n h4: heading(4),\n h5: heading(5),\n h6: heading(6),\n p: ({ node: _node, ...props }) => <ProseText {...props} />,\n a: ({ node: _node, ...props }) => <ProseLink {...props} />,\n // `ref` is stripped: ProseList's intersection ref type (ul & ol) is\n // narrower than the per-element ref react-markdown passes.\n ul: ({ node: _node, ref: _ref, ...props }) => <ProseList {...props} />,\n ol: ({ node: _node, ref: _ref, ...props }) => <ProseList ordered {...props} />,\n li: ({ node: _node, ...props }) => <ProseListItem {...props} />,\n blockquote: ({ node: _node, ...props }) => <ProseBlockquote {...props} />,\n code: ({ node: _node, className, ...props }) =>\n /\\blanguage-/.test(className ?? \"\") ? (\n <code className={className} {...props} />\n ) : (\n <ProseInlineCode className={className} {...props} />\n ),\n };\n}\n\nexport interface MarkdownViewProps extends Omit<\n ComponentProps<typeof Streamdown>,\n \"components\" | \"plugins\" | \"rehypePlugins\"\n> {\n /**\n * The prose level a markdown `#` maps to; deeper headings shift with it\n * (capped at 6). Default `1` (the full reading scale). Pass `2` in narrow\n * embeds (a context rail) so headings stay on the constrained rung.\n */\n baseHeadingLevel?: ProseHeadingLevel;\n /**\n * Per-element renderer overrides, MERGED over the internal Prose* map\n * (#10) — a consumer entry wins for its key; every key the consumer does\n * NOT set keeps rendering through `buildProseComponents()`. This is the\n * seam for rendering inline citations: override `a` (or a custom node\n * type) to swap a `[1](url)`-style marker for an `InlineCitation` chip\n * while headings/lists/etc. keep the branded prose styling.\n *\n * Deliberately a MERGE, not a replace: sanitisation is unaffected either\n * way (see `plugins` below), but a wholesale replace would silently drop\n * the branded styling from every element the consumer didn't think to\n * re-declare — a citation override should not have to also re-implement\n * headings/lists/code to keep them on-brand.\n *\n * **Known constraint: a `components` change alone does not force a\n * re-render of already-rendered markdown (#10).** Streamdown memoizes on\n * `children`/`plugins`/theme/etc but NOT on `components`\n * (`streamdown@2.5.0`'s top-level `memo` comparator omits it), so if the\n * SAME markdown string is still current when an override's closed-over\n * data changes — e.g. an inline-citation chip that resolves its title\n * asynchronously — the new render function is captured but nothing\n * schedules Streamdown to call it again. Don't rely on a `components`\n * closure to reflect state that arrives after the initial render; instead\n * have the overriding component read that state itself (a shared context,\n * a store keyed by citation id, or an internal `useState`/subscription\n * inside the override) so IT re-renders independently of `MarkdownView`'s\n * own render pass — the pattern `InlineCitation`/`InlineCitationCard`\n * already use.\n */\n components?: StreamdownComponents;\n /**\n * Streamdown plugin-slot overrides (`cjk`/`code`/`math`/`mermaid`/\n * `renderers`), MERGED per key over the internal defaults (the reactive,\n * brand-token-derived `code` plugin and i18n-aware `cjk`/`math`/`mermaid`\n * set — see `_streamdown-i18n.ts`).\n *\n * **This narrow `plugins` prop can only APPEND — it can never displace\n * Streamdown's default `rehypePlugins` chain** (`rehype-raw` →\n * `rehype-sanitize` → `rehype-harden`). `MarkdownView` never sets\n * `rehypePlugins` itself, and nothing in `PluginConfig` removes or replaces\n * a member of that pipeline, so the sanitiser cannot be turned off through\n * this prop. But two of the five slots are **not** upstream of it and must\n * be treated as trusted code:\n * - **`math.rehypePlugin` runs AFTER `rehype-sanitize`/`rehype-harden`**\n * (appended to the end of the rehype pipeline, verified against\n * `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`) — its output is never\n * re-sanitised.\n * - **`mermaid` never enters the rehype/remark pipeline at all.** Its\n * `getMermaid().render()` result is written via\n * `dangerouslySetInnerHTML` (streamdown's only such sink). brand-ui's own\n * `useStreamdownPlugins()` default pins `securityLevel: \"strict\"`\n * (`_lazy-mermaid.ts`); a replacement `mermaid` plugin must sanitise its\n * own SVG output the same way.\n * - `cjk` (remark-stage only — its output is re-sanitised downstream by\n * the rehype pipeline like any other remark result), `code` (feeds only\n * `shikiTheme`, no HTML injection) and `renderers` (ordinary React\n * components rendered with the fenced block's raw `code` string as a\n * `string` prop, the same trusted-component boundary as a `components`\n * override) do not bypass sanitisation.\n *\n * **`rehypePlugins` is NOT exposed on this component (#36, fixed).** Unlike\n * `plugins`, a caller-supplied `rehypePlugins` array would REPLACE\n * Streamdown's default rehype pipeline wholesale rather than extending it,\n * silently dropping `rehype-raw`/`rehype-sanitize`/`rehype-harden` and\n * letting a plain markdown string execute script in the host page — so\n * `MarkdownViewProps` `Omit`s it at the type level AND\n * `stripSanitizerOverrides()` deletes it at runtime before the `{...props}`\n * spread below, even if a JS consumer or a cast reaches this component with\n * it set. If you need to widen sanitisation, use\n * `allowedTags`/`literalTagContent`, which MERGE into the sanitize schema\n * instead of replacing the pipeline. See\n * `packages/ai/src/_streamdown-safety.ts`.\n *\n * **`remarkPlugins` IS supported** (PR #74 review, round 1 — the original\n * #36 fix over-reached and removed it too). The remark stage runs strictly\n * upstream of the rehype chain, and Streamdown builds its rehype list\n * without reading `remarkPlugins`, so everything a remark plugin emits is\n * still sanitised downstream — measured across raw-`html` mdast nodes,\n * `data.hName`/`hChildren` hast elements, `hProperties` event handlers,\n * `javascript:` link URLs and smuggled `raw` hast children. Note the\n * ordinary (non-security) footgun: your array REPLACES Streamdown's own\n * remark defaults (`remark-gfm`, `codeMeta`), so spread\n * `Object.values(defaultRemarkPlugins)` from `streamdown` back in if you\n * want to keep GFM tables/strikethrough.\n */\n plugins?: StreamdownPlugins;\n}\n\nexport const MarkdownView = ({\n baseHeadingLevel = 1,\n className,\n children,\n components: componentOverrides,\n plugins: pluginOverrides,\n ...props\n}: MarkdownViewProps) => {\n // Streamdown installs [rehypeRaw, rehypeSanitize, harden] as the DEFAULT VALUE of\n // `rehypePlugins`; a supplied array REPLACES it. This component renders untrusted\n // model output, so the chain is not overridable. Widen with `allowedTags` /\n // `literalTagContent`, which merge into the sanitize schema. See issue #36.\n // `remarkPlugins` is deliberately left alone — it runs upstream of the rehype\n // chain and cannot bypass it (PR #74 review; see `_streamdown-safety.ts`).\n stripSanitizerOverrides(props);\n const internalComponents = useMemo(\n () => buildProseComponents(baseHeadingLevel),\n [baseHeadingLevel],\n );\n // Consumer entries win per key; every other key falls through to the\n // internal Prose* map — see the `components` prop doc above.\n const components = useMemo(\n () => ({ ...internalComponents, ...componentOverrides }),\n [internalComponents, componentOverrides],\n );\n // Streamdown's own chrome (code copy, table menus) reads the locale seam (#310).\n // Spread AFTER so an explicit `translations` prop still wins (ADR 0017).\n const translations = useStreamdownTranslations();\n // Brand-token-derived `code` plugin, not the package's static github-*\n // default (#315 follow-up) — re-derives when the active theme changes.\n const internalPlugins = useStreamdownPlugins();\n // Same per-key merge as `components` — see the `plugins` prop doc above.\n // `math.rehypePlugin`/`mermaid` are the two slots that land in the DOM after\n // (or outside) the sanitiser chain, so replacing one is a TRUSTED-CODE\n // decision. The runtime half of that documented boundary is a dev warning —\n // the plugin still runs; stripping it would break the legitimate use (#76).\n const plugins = useMemo(() => {\n warnOnTrustedPluginSlots(pluginOverrides, internalPlugins);\n return { ...internalPlugins, ...pluginOverrides };\n }, [internalPlugins, pluginOverrides]);\n // The TOP-LEVEL Streamdown `mermaid` prop (distinct from `plugins.mermaid`\n // above) — catches a failed diagram render, including a missing `mermaid`\n // optional peer (issue #33). See `_streamdown-i18n.ts`.\n const mermaidOptions = useStreamdownMermaidOptions();\n return (\n <Streamdown\n data-slot=\"markdown-view\"\n className={cn(\"space-y-3 [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\", className)}\n components={components}\n plugins={plugins}\n translations={translations}\n mermaid={mermaidOptions}\n {...props}\n >\n {children}\n </Streamdown>\n );\n};\n","/**\n * The runtime half of the #36 fix (the type-level `Omit` is the other half — see\n * `MarkdownViewProps`/`MessageResponseProps`).\n *\n * Streamdown installs its sanitiser chain (`rehype-raw` → `rehype-sanitize` →\n * `rehype-harden`) as the DEFAULT VALUE of its `rehypePlugins` prop — a plain\n * JS default parameter. Supplying the prop REPLACES the whole chain; there is\n * no merge (verified against `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`:\n * `xt = { raw, sanitize, harden }; gn = Object.values(xt)` is the default, and\n * the component signature reads `rehypePlugins: a = gn`).\n *\n * `MarkdownView`/`MessageResponse` render UNTRUSTED, model-authored markdown,\n * so that prop may never reach `<Streamdown>` — not even through a plain\n * JavaScript consumer, an `as any`/`as never` cast, or a wider\n * `{...spreadProps}` object a type-level `Omit` cannot see at runtime. `Omit`\n * closes the TypeScript surface; this function closes the runtime one. Both\n * are required — see issue #36.\n *\n * `remarkPlugins` is deliberately NOT stripped (PR #74 review, round 1). It is\n * the same *shape* of prop — a consumer array replaces Streamdown's own remark\n * defaults (`gfm`, `codeMeta`) rather than merging with them — but it is NOT a\n * sanitiser override: the remark stage runs strictly UPSTREAM of the rehype\n * chain, and Streamdown derives its rehype list without reading `remarkPlugins`\n * at all. Anything a remark plugin injects — a raw `html` mdast node, a\n * `data.hName`/`hChildren` hast element, an `onerror` via `hProperties`, a\n * `javascript:` link URL, a smuggled `raw` hast child — still passes through\n * `rehype-raw` → `rehype-sanitize` → `rehype-harden` before it can reach the\n * DOM. Measured with this strip removed: all five channels executed and none\n * produced a `<script>`, an `[onerror]` attribute or a `javascript:` href,\n * while the identical payload injected AFTER the sanitiser did. Stripping it\n * therefore removed real capability (remark-directive, footnotes, custom\n * syntax) and closed nothing.\n *\n * If a consumer needs to widen what survives SANITISATION, `allowedTags` /\n * `literalTagContent` are the supported seam: they MERGE into the sanitize\n * schema instead of replacing the pipeline outright.\n *\n * THIS LIST HAS A PARITY COUNTERPART, AND EDITING ONE SIDE FAILS CI (#75).\n * `scripts/check-sanitizer-passthrough.mjs` declares the same key set as\n * `SAFE_RENDERERS[streamdown].dangerousProps` and reads THIS array literal back\n * out of this file, asserting set-equality in BOTH directions — so removing a\n * key here (the runtime stops stripping it) and removing a key there (the gate\n * stops looking for it) are each a red build, and so is renaming the constant\n * or rewriting it into a shape the gate cannot parse. Change the key set in\n * both places, in the same commit, or don't change it.\n */\nconst SANITIZER_OVERRIDE_KEYS = [\"rehypePlugins\"] as const;\n\n/**\n * Deletes `rehypePlugins` off `props` in place (if present) and warns in dev.\n * Call this BEFORE spreading `props` onto `<Streamdown>`.\n *\n * Takes a plain object rather than a typed `MarkdownViewProps`/\n * `MessageResponseProps` on purpose: the whole point is to catch a value that\n * reached this call with a wider runtime shape than its type says (a `.tsx`\n * consumer with no type checking at all, a force-cast, a spread of a bigger\n * object) — a parameter typed to the post-`Omit` props would only accept\n * values TypeScript already believes are safe.\n */\nexport function stripSanitizerOverrides(props: object): void {\n const record = props as Record<string, unknown>;\n for (const key of SANITIZER_OVERRIDE_KEYS) {\n if (key in record) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n `[@elabs-ai/components-ai] \\`${key}\\` is not a supported prop on this component: ` +\n \"it would replace Streamdown's default sanitiser chain (rehype-raw → \" +\n \"rehype-sanitize → rehype-harden) and let untrusted markdown execute \" +\n \"script in the host page. The value was ignored. Use `allowedTags` / \" +\n \"`literalTagContent` to widen sanitisation instead — see issue #36.\",\n );\n }\n delete record[key];\n }\n }\n}\n\n/**\n * The CONVERSE of `SANITIZER_OVERRIDE_KEYS`: the plugin slots that deliberately\n * stay reachable even though they land in the DOM *after* — or entirely outside\n * — Streamdown's sanitiser chain (#76).\n *\n * - **`math.rehypePlugin` is APPENDED to the END of the rehype pipeline**, i.e.\n * after `rehype-raw` → `rehype-sanitize` → `rehype-harden` (verified against\n * `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`). Its output is never\n * re-sanitised.\n * - **`mermaid` never enters the rehype/remark pipeline at all.** Its\n * `getMermaid().render()` result is written via `dangerouslySetInnerHTML`\n * (streamdown's only such sink). brand-ui's own default pins mermaid's\n * `securityLevel: \"strict\"` (`_lazy-mermaid.ts`).\n *\n * `cjk` (remark-stage, re-sanitised downstream), `code` (feeds `shikiTheme`\n * only) and `renderers` (ordinary React components) are NOT trust-bearing and\n * are deliberately absent — a warning that fired on them would be noise\n * consumers learn to ignore.\n *\n * **This is not a live vulnerability and must not be described as one.**\n * Supplying an executable `Pluggable` takes code in the consuming app's own\n * bundle, and an app author who can do that can already run code. The real,\n * non-hypothetical hazard is MISCONFIGURATION — most sharply KaTeX's `trust`\n * option (needed for anything beyond `singleDollarTextMath`/`errorColor`),\n * which silently disables KaTeX's own sanitisation for model-authored content\n * the consumer never intended to trust. Hence: WARN, never strip. Stripping\n * would break the legitimate trusted use and is the breaking change #76\n * explicitly rejects — `markdown-view.test.tsx`/`message.test.tsx` pin the slot\n * OPEN so a future \"hardening\" fails loudly.\n */\nconst TRUSTED_PLUGIN_SLOT_ADVICE =\n \"This is a supported, TRUSTED-CODE seam — the plugin still runs and nothing was \" +\n \"dropped — so treat it as code you ship: it can put arbitrary markup in the page. \" +\n \"If you only needed KaTeX options, prefer `createMathPlugin({ singleDollarTextMath, \" +\n \"errorColor })` and leave KaTeX's `trust` option off for model-authored content. \" +\n \"See docs/CSP-AND-NETWORK.md and issue #76.\";\n\nconst isPluginObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\n/**\n * Dev-only `console.warn` when a consumer's `plugins` override replaces one of\n * the two slots that are NOT upstream of the sanitiser. Call it where the\n * consumer's overrides are merged over the internal defaults, passing both.\n *\n * **Reference-equality comparator, deliberately — not truthiness, not a deep\n * compare.** `useStreamdownPlugins()` returns a FRESH `code` object on every\n * theme change but a STABLE `math`/`mermaid`, so a truthiness check would fire\n * on every theme flip and a deep-equality check would stay silent for a consumer\n * who rebuilds an equivalent-looking object each render. For `math` the\n * comparison narrows further to the `rehypePlugin` member itself, so changing\n * only `remarkPlugin`/`getStyles` (upstream of, or outside, the DOM sink) stays\n * silent.\n *\n * Warns; never mutates. `stripSanitizerOverrides` is the other half of the\n * boundary — the props that must never be reachable at all.\n */\nexport function warnOnTrustedPluginSlots(overrides: object | undefined, internal: object): void {\n if (process.env.NODE_ENV === \"production\") return;\n if (!overrides) return;\n const consumer = overrides as Record<string, unknown>;\n const defaults = internal as Record<string, unknown>;\n\n if (isPluginObject(consumer.math)) {\n const theirs = consumer.math.rehypePlugin;\n const ours = isPluginObject(defaults.math) ? defaults.math.rehypePlugin : undefined;\n if (theirs !== ours) {\n console.warn(\n \"[@elabs-ai/components-ai] `plugins.math.rehypePlugin` is appended to the END of \" +\n \"Streamdown's rehype pipeline, so it runs AFTER the sanitiser chain \" +\n \"(rehype-raw → rehype-sanitize → rehype-harden) and whatever it emits is never \" +\n `re-sanitised. ${TRUSTED_PLUGIN_SLOT_ADVICE}`,\n );\n }\n }\n\n if (isPluginObject(consumer.mermaid) && consumer.mermaid !== defaults.mermaid) {\n // The message describes React's `dangerouslySetInnerHTML` in prose rather than\n // naming the identifier: `pnpm csp-sinks:check` preserves string literals on\n // purpose (a sink hidden in a string is still a sink), so spelling the prop out\n // inside this warning makes the gate read THIS file as a new HTML-assigning\n // module. Comments like this one are stripped by that gate, so the name is safe\n // here and in the TSDoc above — just not inside a runtime string.\n console.warn(\n \"[@elabs-ai/components-ai] `plugins.mermaid` never enters the rehype pipeline at \" +\n \"all: its rendered SVG is injected as raw HTML through React's dangerous \" +\n \"inner-HTML prop, i.e. after and outside the sanitiser chain \" +\n \"(rehype-raw → rehype-sanitize → rehype-harden). A \" +\n \"replacement plugin must sanitise its own output — brand-ui's default pins \" +\n `mermaid's strict security level. ${TRUSTED_PLUGIN_SLOT_ADVICE}`,\n );\n }\n}\n","\"use client\";\n\n/**\n * The shared Streamdown wiring for every streamed-markdown surface in\n * `@elabs-ai/components-ai` — the plugin set and the locale bridge.\n *\n * Why the locale bridge exists (#310)\n * -----------------------------------\n * Streamdown renders its own chrome inside the markdown it draws: a code-block\n * header with a copy control, table copy/download menus, a Mermaid toolbar, an\n * external-link interstitial. Those labels live in the dependency, not in our\n * source, so `pnpm microcopy:check` structurally cannot see them and a\n * `<LocaleProvider>` used to stop at the Streamdown boundary — every localized\n * app leaked \"Copy Code\" / \"Download diagram\" / \"You're about to visit an\n * external website.\" in English.\n *\n * Streamdown exposes the whole set through one `translations` prop, so the fix\n * is to map its keys onto our `ai.streamdown.*` namespace and resolve them with\n * `t()`. The English defaults in\n * `packages/ui/src/components/locale-provider/messages.ts` are byte-identical to\n * streamdown's own, so this is a no-op for anyone who overrides nothing.\n *\n * Memoization matters: Streamdown puts `translations` into a React context, so a\n * fresh object per render would re-render every code block and table in the\n * document. The map is memoized on `t`, which is itself stable per locale.\n */\nimport {\n STREAMDOWN_TRANSLATION_KEYS,\n useStreamdownTranslations,\n type StreamdownTranslationKey,\n} from \"@elabs-ai/components-ui\";\nimport { cjk } from \"@streamdown/cjk\";\nimport { createCodePlugin } from \"@streamdown/code\";\nimport { math } from \"@streamdown/math\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { StreamdownTranslations } from \"streamdown\";\nimport { buildCodeBlockTheme } from \"./_code-block-theme\";\nimport { lazyMermaid } from \"./_lazy-mermaid\";\nimport { MermaidErrorPanel } from \"./_mermaid-error-panel\";\n\n/**\n * Reactive replacement for `@streamdown/code`'s pre-configured `code` export\n * (issue #315 follow-up, the \"major\" carve-out: only `<CodeBlock>` had been\n * de-GitHub-ed — every fenced code block rendered through `Message`/\n * `MarkdownView`/`Reasoning`'s Streamdown instance still went through this\n * plugin, whose `getThemes()` is FROZEN at import time to\n * `[\"github-light\", \"github-dark\"]`).\n *\n * Streamdown's dual-theme mechanism (`createCodePlugin({ themes: [light, dark] })`)\n * expects exactly TWO themes and picks between them purely via the `.dark` CSS\n * selector — but brand-ui ships EVERY theme, not just Shiki's light/dark,\n * and any dark-declaring theme matches `.dark` too (see `_code-block-theme.ts`). Passing a real\n * light/dark PAIR would still force such a theme into the dark slot. Instead\n * this pins BOTH slots to `buildCodeBlockTheme()` — the SAME brand-token-derived\n * theme the active `data-theme` resolves to — so whichever slot the `.dark`\n * selector picks, it's the CORRECT theme for whatever is actually active.\n *\n * Re-derives on every `data-theme` mutation (a `MutationObserver` on\n * `<html>`, mirroring `code-block.tsx`'s own) and returns a NEW plugin object\n * each time, because Streamdown only re-reads `plugins.code.getThemes()` when\n * the `plugins.code` object's REFERENCE changes (see streamdown's internal\n * `shikiTheme` memo) — a mutated-in-place plugin would never be picked up.\n */\nfunction useReactiveCodePlugin() {\n const [revision, setRevision] = useState(0);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const observer = new MutationObserver(() => setRevision((r) => r + 1));\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\"],\n });\n return () => observer.disconnect();\n }, []);\n\n return useMemo(() => {\n const theme = buildCodeBlockTheme();\n return createCodePlugin({ themes: [theme, theme] });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- revision is the trigger; the theme itself is re-read live off document.documentElement.\n }, [revision]);\n}\n\n/**\n * The plugin set every `@elabs-ai/components-ai` markdown surface renders with.\n *\n * `mermaid` is the LAZY plugin (`./_lazy-mermaid`): the engine + d3 + DOMPurify\n * load on first diagram render, not in the entry chunk of every consumer. `code`\n * is the reactive, brand-token-derived plugin above (#315) — never the\n * `@streamdown/code` package's static `github-light`/`github-dark` default.\n * Memoized so Streamdown sees a referentially stable `plugins` prop except when\n * the active theme actually changes.\n */\nexport function useStreamdownPlugins() {\n const code = useReactiveCodePlugin();\n return useMemo(() => ({ cjk, code, math, mermaid: lazyMermaid }), [code]);\n}\n\n/**\n * The top-level Streamdown `mermaid` prop (distinct from `plugins.mermaid`,\n * the LAZY `DiagramPlugin` `useStreamdownPlugins()` wires above) — this is\n * where a FAILED render is caught (issue #33). Streamdown hands its\n * `errorComponent` a plain STRING describing what went wrong;\n * `MermaidErrorPanel` decides whether that string names a missing optional\n * peer (`mermaid` not installed — a capability gap, `StatePanel kind=\"empty\"`)\n * or a genuine diagram render failure (`StatePanel kind=\"error\"`, with retry).\n *\n * A stable module-level object, not a fresh one per render: Streamdown only\n * re-reads `mermaid.errorComponent` when this reference changes, and\n * `MermaidErrorPanel` never varies at runtime. Exported as a hook to match\n * `useStreamdownPlugins()`'s call-site shape.\n */\nconst MERMAID_OPTIONS = { errorComponent: MermaidErrorPanel };\nexport function useStreamdownMermaidOptions() {\n return MERMAID_OPTIONS;\n}\n\n/*\n * The translation MAP moved down to `@elabs-ai/components-ui`\n * (`lib/streamdown-translations.ts`) when `@elabs-ai/components-viewer`\n * became a second Streamdown renderer — the two packages may not import each\n * other. What stays here is the half that needs the dependency itself: the\n * proof that the shared key list is still COMPLETE.\n */\n\n// `satisfies` proves every key in the shared list is real…\nconst _keysAreReal =\n STREAMDOWN_TRANSLATION_KEYS satisfies readonly (keyof StreamdownTranslations)[];\nvoid _keysAreReal;\n\n// …and this proves the converse. If a streamdown upgrade ADDS a translation\n// key, the assignment below stops building until the shared list (and the\n// `ai.streamdown.*` English defaults) catch up, instead of silently leaking\n// that key in English. The tripwire lives in the package that pins the version.\ntype MissingTranslationKeys = Exclude<keyof StreamdownTranslations, StreamdownTranslationKey>;\nconst _noMissingTranslationKeys: [MissingTranslationKeys] extends [never] ? true : false = true;\nvoid _noMissingTranslationKeys;\n\nexport { useStreamdownTranslations };\n","/**\n * A drop-in replacement for `@streamdown/mermaid`'s `mermaid` plugin that loads\n * the Mermaid engine **on first diagram render** instead of at import time.\n *\n * Why this exists\n * ---------------\n * `@streamdown/mermaid`'s dist opens with a static `import n from \"mermaid\"`, and\n * neither it nor `mermaid`/`dompurify`/`d3` declares `sideEffects`, so a bundler\n * must keep the whole edge. `@elabs-ai/components-ai` imported that plugin from three modules\n * (`message`, `reasoning`, `markdown-view`), which put Mermaid + d3 + DOMPurify —\n * several MB — in the **entry chunk** of every consumer, including the vast\n * majority that never render a diagram.\n *\n * How it avoids a render flash\n * ----------------------------\n * `DiagramPlugin` is not the engine; it is a lazy accessor. Streamdown calls\n * `getMermaid()` only from inside its async diagram-render path (immediately\n * before `await instance.render(...)`), never at module or component init. So the\n * plugin object can be present from the very first frame — Streamdown always\n * treats a ```mermaid fence as a diagram — while the engine itself arrives with a\n * dynamic import inside `render()`. No content-sniffing, no plugin swap, no\n * suspense seam at the call sites, and no \"raw source flashes then becomes a\n * diagram\" transition.\n *\n * The upstream plugin is ~10 lines; its defaults and initialize-once semantics\n * are mirrored exactly below. The `DiagramPlugin` type is still imported (as a\n * type, so it erases) from `@streamdown/mermaid`, which keeps this honest against\n * the real contract at typecheck time.\n */\nimport type { DiagramPlugin, MermaidConfig, MermaidInstance } from \"@streamdown/mermaid\";\n\n/** Mirrors `@streamdown/mermaid`'s defaults — notably `securityLevel: \"strict\"`. */\nconst DEFAULT_CONFIG: MermaidConfig = {\n fontFamily: \"monospace\",\n securityLevel: \"strict\",\n startOnLoad: false,\n suppressErrorRendering: true,\n theme: \"default\",\n};\n\ntype MermaidModule = {\n initialize: (config: MermaidConfig) => void;\n render: (id: string, source: string) => Promise<{ svg: string }>;\n};\n\n/**\n * Module-level singleton: the engine is fetched at most once per app, however\n * many diagrams or Streamdown instances render.\n */\nlet enginePromise: Promise<MermaidModule> | undefined;\n\nconst loadEngine = (): Promise<MermaidModule> => {\n enginePromise ??= import(\"mermaid\").then((m) => {\n const engine = m.default as unknown as MermaidModule;\n // `mermaid` is an optional peer (issue #33), but its bytes are always\n // installed anyway: TWO of this package's own plain dependencies —\n // `streamdown` and `@streamdown/mermaid` — each declare `mermaid` as\n // their own plain, non-optional dependency (issue #94,\n // `pnpm optional-peers:check` proves and tracks this). So a hoisting\n // package manager (pnpm's default `node-linker=isolated` included, via\n // phantom resolution through the virtual store) may still make the real\n // bytes resolve even when a consumer never installed `mermaid`\n // themselves — this guard does not cover that case, only a bundler\n // whose optional-peer handling substitutes an EMPTY module (Vite's\n // production stub is `export default {}`) once the peer is genuinely\n // absent from the resolved tree. Without this guard that empty object\n // resolves successfully and the crash lands one call later, on\n // `engine.initialize is not a function` — a message\n // `isModuleNotFoundMessage` does not recognize, so it reaches the user\n // as \"Diagram couldn't be drawn\" with a Retry button that can never\n // succeed, instead of the actionable capability-gap panel.\n if (typeof engine?.initialize !== \"function\" || typeof engine?.render !== \"function\") {\n throw new Error(\"Cannot find module 'mermaid'\");\n }\n return engine;\n });\n return enginePromise;\n};\n\n/**\n * Start fetching the Mermaid engine ahead of time.\n *\n * Optional. Call it when you already know the surface will render diagrams (on\n * route entry, or when a conversation is known to contain them) so the first\n * diagram doesn't pay the import latency. Safe to call repeatedly; safe to\n * ignore — rendering a diagram loads the engine either way.\n */\nexport const preloadMermaid = (): void => {\n void loadEngine();\n};\n\n/**\n * Create a lazy Mermaid diagram plugin for Streamdown.\n *\n * @param options.config Mermaid config merged over the brand defaults.\n */\nexport const createLazyMermaidPlugin = (\n options: { config?: MermaidConfig } = {},\n): DiagramPlugin => {\n let initialized = false;\n let config: MermaidConfig = { ...DEFAULT_CONFIG, ...options.config };\n\n const instance: MermaidInstance = {\n // Upstream calls `mermaid.initialize` synchronously here. We can't (the\n // engine may not have loaded yet), so record the config and apply it inside\n // `render`, which is the only place it can matter — Streamdown always calls\n // `getMermaid()` immediately before awaiting `render()`.\n initialize(next: MermaidConfig) {\n config = { ...DEFAULT_CONFIG, ...options.config, ...next };\n initialized = false;\n },\n async render(id: string, source: string) {\n const engine = await loadEngine();\n if (!initialized) {\n engine.initialize(config);\n initialized = true;\n }\n return engine.render(id, source);\n },\n };\n\n return {\n getMermaid(next?: MermaidConfig) {\n if (next) {\n instance.initialize(next);\n }\n return instance;\n },\n language: \"mermaid\",\n name: \"mermaid\",\n type: \"diagram\",\n };\n};\n\n/**\n * The shared lazy Mermaid plugin — the `@elabs-ai/components-ai` replacement for\n * `@streamdown/mermaid`'s eager `mermaid` export. One instance for the whole\n * app, so the engine and its initialize-once state are shared.\n */\nexport const lazyMermaid: DiagramPlugin = createLazyMermaidPlugin();\n","\"use client\";\n\n/**\n * The `errorComponent` Streamdown renders in place of a Mermaid diagram that\n * failed (issue #33). Streamdown hands back the render failure as a plain\n * STRING (`MermaidErrorComponentProps.error`, already reduced from whatever\n * was thrown), so this distinguishes two different failures by matching that\n * string rather than the original error object:\n *\n * - **The optional `mermaid` peer is not installed.** This is a CAPABILITY\n * GAP, not something wrong with the diagram or the app — the same class as\n * `@elabs-ai/components-viewer`'s `parser-missing`\n * (@.claude/rules/viewer-components.md \"A capability gap is not a\n * failure\"). Renders the neutral `StatePanel kind=\"empty\"`, naming the\n * package to install, announced `role=\"status\"`, with no retry action\n * (re-installing a dependency does not happen by clicking a button in the\n * page).\n * - **Anything else is a genuine render/syntax failure** — a real error, so\n * it gets `StatePanel kind=\"error\"` (`role=\"alert\"`, set internally by\n * `StatePanel`) wired to Streamdown's own `retry()`, which increments the\n * render attempt and re-runs the diagram.\n */\nimport { Button, StatePanel, isModuleNotFoundMessage, useLocale } from \"@elabs-ai/components-ui\";\nimport { EyeOffIcon } from \"lucide-react\";\n\nexport interface MermaidErrorPanelProps {\n chart: string;\n error: string;\n retry: () => void;\n}\n\nexport function MermaidErrorPanel({ error, retry }: MermaidErrorPanelProps) {\n const { t } = useLocale();\n\n if (isModuleNotFoundMessage(error)) {\n const feature = t(\"ai.mermaid.feature\");\n return (\n <div className=\"my-4\" role=\"status\" aria-live=\"polite\">\n <StatePanel\n kind=\"empty\"\n // A dashed edge invites a drop; this panel accepts nothing. Solid —\n // mirrors `@elabs-ai/components-viewer`'s `FileViewerError`.\n className=\"border-solid\"\n icon={<EyeOffIcon aria-hidden=\"true\" />}\n title={t(\"ai.error.engineMissing\", { feature })}\n description={t(\"ai.error.engineMissingBody\", { feature, packages: \"mermaid\" })}\n />\n </div>\n );\n }\n\n return (\n <div className=\"my-4\">\n <StatePanel\n kind=\"error\"\n title={t(\"ai.mermaid.renderError\")}\n description={error}\n actions={\n <Button size=\"sm\" variant=\"outline\" onClick={retry}>\n {t(\"ai.error.retry\")}\n </Button>\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { FileUIPart, SourceDocumentUIPart } from \"ai\";\nimport {\n FileTextIcon,\n GlobeIcon,\n ImageIcon,\n Music2Icon,\n PaperclipIcon,\n VideoIcon,\n XIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type AttachmentData =\n | (FileUIPart & { id: string })\n | (SourceDocumentUIPart & { id: string });\n\nexport type AttachmentMediaCategory =\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"document\"\n | \"source\"\n | \"unknown\";\n\nexport type AttachmentVariant = \"grid\" | \"inline\" | \"list\";\n\nconst mediaCategoryIcons: Record<AttachmentMediaCategory, typeof ImageIcon> = {\n audio: Music2Icon,\n document: FileTextIcon,\n image: ImageIcon,\n source: GlobeIcon,\n unknown: PaperclipIcon,\n video: VideoIcon,\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport const getMediaCategory = (data: AttachmentData): AttachmentMediaCategory => {\n if (data.type === \"source-document\") {\n return \"source\";\n }\n\n const mediaType = data.mediaType ?? \"\";\n\n if (mediaType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mediaType.startsWith(\"video/\")) {\n return \"video\";\n }\n if (mediaType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (mediaType.startsWith(\"application/\") || mediaType.startsWith(\"text/\")) {\n return \"document\";\n }\n\n return \"unknown\";\n};\n\nexport const getAttachmentLabel = (data: AttachmentData): string => {\n if (data.type === \"source-document\") {\n return data.title || data.filename || \"Source\";\n }\n\n const category = getMediaCategory(data);\n return data.filename || (category === \"image\" ? \"Image\" : \"Attachment\");\n};\n\nconst renderAttachmentImage = (url: string, filename: string | undefined, isGrid: boolean) =>\n isGrid ? (\n <img\n alt={filename || \"Image\"}\n className=\"size-full object-cover\"\n height={96}\n src={url}\n width={96}\n />\n ) : (\n <img\n alt={filename || \"Image\"}\n className=\"size-full rounded object-cover\"\n height={20}\n src={url}\n width={20}\n />\n );\n\n// ============================================================================\n// Contexts\n// ============================================================================\n\ninterface AttachmentsContextValue {\n variant: AttachmentVariant;\n}\n\nconst AttachmentsContext = createContext<AttachmentsContextValue | null>(null);\n\ninterface AttachmentContextValue {\n data: AttachmentData;\n mediaCategory: AttachmentMediaCategory;\n onRemove?: () => void;\n variant: AttachmentVariant;\n}\n\nconst AttachmentContext = createContext<AttachmentContextValue | null>(null);\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport const useAttachmentsContext = () =>\n useContext(AttachmentsContext) ?? { variant: \"grid\" as const };\n\nexport const useAttachmentContext = () => {\n const ctx = useContext(AttachmentContext);\n if (!ctx) {\n throw new Error(\"Attachment components must be used within <Attachment>\");\n }\n return ctx;\n};\n\n// ============================================================================\n// Attachments - Container\n// ============================================================================\n\nexport type AttachmentsProps = HTMLAttributes<HTMLDivElement> & {\n variant?: AttachmentVariant;\n};\n\nexport const Attachments = ({\n variant = \"grid\",\n className,\n children,\n ...props\n}: AttachmentsProps) => {\n const contextValue = useMemo(() => ({ variant }), [variant]);\n\n return (\n <AttachmentsContext.Provider value={contextValue}>\n <div\n className={cn(\n \"flex items-start\",\n variant === \"list\" ? \"flex-col gap-2\" : \"flex-wrap gap-2\",\n variant === \"grid\" && \"ms-auto w-fit\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </AttachmentsContext.Provider>\n );\n};\n\n// ============================================================================\n// Attachment - Item\n// ============================================================================\n\nexport type AttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: AttachmentData;\n onRemove?: () => void;\n};\n\nexport const Attachment = ({ data, onRemove, className, children, ...props }: AttachmentProps) => {\n const { variant } = useAttachmentsContext();\n const mediaCategory = getMediaCategory(data);\n\n const contextValue = useMemo<AttachmentContextValue>(\n () => ({ data, mediaCategory, onRemove, variant }),\n [data, mediaCategory, onRemove, variant],\n );\n\n return (\n <AttachmentContext.Provider value={contextValue}>\n <div\n className={cn(\n \"group relative\",\n variant === \"grid\" && \"size-24 overflow-hidden rounded-lg\",\n variant === \"inline\" && [\n \"flex h-8 cursor-pointer select-none items-center gap-1.5\",\n \"rounded-md border border-border px-1.5\",\n \"font-medium text-sm transition-colors duration-fast ease-standard motion-reduce:transition-none\",\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n ],\n variant === \"list\" && [\n \"flex w-full items-center gap-3 rounded-lg border p-3\",\n \"hover:bg-accent/50\",\n ],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </AttachmentContext.Provider>\n );\n};\n\n// ============================================================================\n// AttachmentPreview - Media preview\n// ============================================================================\n\nexport type AttachmentPreviewProps = HTMLAttributes<HTMLDivElement> & {\n fallbackIcon?: ReactNode;\n};\n\nexport const AttachmentPreview = ({\n fallbackIcon,\n className,\n ...props\n}: AttachmentPreviewProps) => {\n const { data, mediaCategory, variant } = useAttachmentContext();\n\n const iconSize = variant === \"inline\" ? \"size-3\" : \"size-4\";\n\n const renderIcon = (Icon: typeof ImageIcon) => (\n <Icon className={cn(iconSize, \"text-muted-foreground\")} />\n );\n\n const renderContent = () => {\n if (mediaCategory === \"image\" && data.type === \"file\" && data.url) {\n return renderAttachmentImage(data.url, data.filename, variant === \"grid\");\n }\n\n if (mediaCategory === \"video\" && data.type === \"file\" && data.url) {\n return <video className=\"size-full object-cover\" muted src={data.url} />;\n }\n\n const Icon = mediaCategoryIcons[mediaCategory];\n return fallbackIcon ?? renderIcon(Icon);\n };\n\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center justify-center overflow-hidden\",\n variant === \"grid\" && \"size-full bg-muted\",\n variant === \"inline\" && \"size-5 rounded bg-background\",\n variant === \"list\" && \"size-12 rounded bg-muted\",\n className,\n )}\n {...props}\n >\n {renderContent()}\n </div>\n );\n};\n\n// ============================================================================\n// AttachmentInfo - Name and type display\n// ============================================================================\n\nexport type AttachmentInfoProps = HTMLAttributes<HTMLDivElement> & {\n showMediaType?: boolean;\n};\n\nexport const AttachmentInfo = ({\n showMediaType = false,\n className,\n ...props\n}: AttachmentInfoProps) => {\n const { data, variant } = useAttachmentContext();\n const label = getAttachmentLabel(data);\n\n if (variant === \"grid\") {\n return null;\n }\n\n return (\n <div className={cn(\"min-w-0 flex-1\", className)} {...props}>\n <span className=\"block truncate\">{label}</span>\n {showMediaType && data.mediaType && (\n <span className=\"block truncate text-muted-foreground text-xs\">{data.mediaType}</span>\n )}\n </div>\n );\n};\n\n// ============================================================================\n// AttachmentRemove - Remove button\n// ============================================================================\n\nexport type AttachmentRemoveProps = ComponentProps<typeof Button> & {\n label?: string;\n};\n\nexport const AttachmentRemove = ({\n label = \"Remove\",\n className,\n children,\n ...props\n}: AttachmentRemoveProps) => {\n const { onRemove, variant } = useAttachmentContext();\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onRemove?.();\n },\n [onRemove],\n );\n\n if (!onRemove) {\n return null;\n }\n\n return (\n <Button\n aria-label={label}\n className={cn(\n variant === \"grid\" && [\n \"absolute top-2 end-2 size-6 rounded-full p-0\",\n \"bg-background/80 backdrop-blur-sm\",\n \"opacity-0 transition-opacity group-hover:opacity-100\",\n \"hover:bg-background\",\n \"[&>svg]:size-3\",\n ],\n variant === \"inline\" && [\n \"size-5 rounded p-0\",\n \"opacity-0 transition-opacity group-hover:opacity-100\",\n \"[&>svg]:size-2.5\",\n ],\n variant === \"list\" && [\"size-8 shrink-0 rounded p-0\", \"[&>svg]:size-4\"],\n className,\n )}\n onClick={handleClick}\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <XIcon />}\n <span className=\"sr-only\">{label}</span>\n </Button>\n );\n};\n\n// ============================================================================\n// AttachmentHoverCard - Hover preview\n// ============================================================================\n\nexport type AttachmentHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const AttachmentHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: AttachmentHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type AttachmentHoverCardTriggerProps = ComponentProps<typeof HoverCardTrigger>;\n\nexport const AttachmentHoverCardTrigger = (props: AttachmentHoverCardTriggerProps) => (\n <HoverCardTrigger {...props} />\n);\n\nexport type AttachmentHoverCardContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const AttachmentHoverCardContent = ({\n align = \"start\",\n className,\n ...props\n}: AttachmentHoverCardContentProps) => (\n <HoverCardContent align={align} className={cn(\"w-auto p-2\", className)} {...props} />\n);\n\n// ============================================================================\n// AttachmentEmpty - Empty state\n// ============================================================================\n\nexport type AttachmentEmptyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const AttachmentEmpty = ({ className, children, ...props }: AttachmentEmptyProps) => (\n <div\n className={cn(\"flex items-center justify-center p-4 text-muted-foreground text-sm\", className)}\n {...props}\n >\n {children ?? \"No attachments\"}\n </div>\n);\n","\"use client\";\n\nimport { Skeleton, isOptionalPeerMissing, useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { Experimental_SpeechResult as SpeechResult } from \"ai\";\nimport { VolumeOffIcon } from \"lucide-react\";\nimport type { ComponentProps, ComponentType, HTMLAttributes } from \"react\";\nimport { lazy, Suspense } from \"react\";\n\nimport { LazyEngineBoundary } from \"./_lazy-engine-boundary\";\n\n/**\n * media-chrome lives behind a dynamic import — it declares no `sideEffects`, so\n * a static import would put the whole custom-element library in every consumer's\n * entry chunk, `AudioPlayer` rendered or not. Every value import lives in\n * `_audio-player-media-chrome.tsx`. See ADR 0019 and `pnpm heavy-deps:check`.\n *\n * All ten parts resolve from the SAME module specifier, so they share one chunk:\n * once `AudioPlayer` has loaded it, the controls inside it resolve from cache.\n *\n * Issue #101: `media-chrome` is an OPTIONAL peer, so no PUBLIC export's type\n * may structurally reference `media-chrome/react`'s own types (previously\n * `ComponentProps<typeof MediaController>` and nine siblings, imported as\n * TYPE-only above) — doing so names `media-chrome/react`'s module specifier in\n * this package's generated root `.d.ts` and hands a `skipLibCheck: false`\n * consumer who has correctly omitted the peer a `TS2307` just for importing\n * the barrel — not just for using `AudioPlayer`. `AudioPlayerPartProps` below\n * is an OWNED base type: `media-chrome/react`'s wrapper\n * (`media-chrome/react`'s `createComponent`, from the `ce-la-react` helper it\n * is built on) types every part as `Omit<HTMLAttributes<I>, …> &\n * Partial<the element's own instance members>` — i.e. ordinary HTML attributes\n * plus a handful of optional custom attributes. `AudioPlayerPartProps` itself\n * stays ordinary HTML attributes only; the PRIMITIVE-typed (`string` /\n * `boolean` / `number`) extra instance members of `<media-controller>` and\n * `<media-seek-forward-button>` — the two elements measured by the round-2\n * validator — are mirrored one-by-one on `AudioPlayerProps` and\n * `AudioPlayerSeekForwardButtonProps` below (each a single declaration line\n * referencing nothing peer-owned, the same technique `seekOffset` already\n * used). What stays narrowed to `AudioPlayerPartProps` alone are the\n * PEER/COMPLEX-typed members (`MediaStore`, `AttributeTokenList`,\n * `MediaTooltip`, `TooltipPlacement`, DOM-element and `HTMLMediaElement`\n * callbacks, methods) and every member of the other eight parts — restoring\n * those would re-import the peer type graph this fix exists to avoid. See the\n * CHANGELOG's \"Breaking (types)\" entry for the exact narrowed set.\n * `AudioPlayerPartProps` is therefore NOT a full replica of media-chrome's\n * surface, only the base every part actually uses and re-exports (the same\n * scoping `TerminalColorTheme` uses for xterm's `ITheme` in\n * `packages/terminal/src/interactive-terminal.tsx`, also issue #101). The ten\n * conformance assertions at the bottom of `_audio-player-media-chrome.tsx`\n * (which still imports the real peer types — that module is reached only\n * through `lazy()` and never sits in the barrel's declaration graph) prove\n * every owned type here stays assignable to its real media-chrome counterpart;\n * a peer version bump that narrows a prop incompatibly fails\n * `pnpm --filter @elabs-ai/components-ai typecheck` locally instead of\n * reaching a consumer as silent drift.\n *\n * Deliberately no `ref` field: `ComponentProps<typeof MediaController>` (and\n * its nine siblings) included one via `RefAttributes<I>`, but `RefObject<T>`'s\n * mutable `current` makes ref types INVARIANT in `T` — a `Ref<HTMLElement>`\n * can never be assignable to a real element's own `Ref<MediaController>` (the\n * custom element subclass carries private/extra members `HTMLElement` lacks),\n * so keeping it would make every owned type fail its own conformance\n * assertion below. This IS a real-world break for a React 19 consumer: none\n * of the ten parts this package renders is wrapped in `forwardRef`, but\n * `MediaController` (and its siblings) are genuine `forwardRef` components,\n * and React 19's ref-as-prop carries a `ref` straight through an ordinary\n * function component's `{...props}` spread to the real underlying element —\n * see the CHANGELOG's \"Breaking (types)\" entry for the measured detail. It is\n * inert only under React 18.\n */\nexport type AudioPlayerPartProps = HTMLAttributes<HTMLElement>;\n\ntype MediaChromeModule = typeof import(\"./_audio-player-media-chrome\");\n\nconst lazyPart = <P,>(pick: (module: MediaChromeModule) => ComponentType<P>) =>\n lazy(() => import(\"./_audio-player-media-chrome\").then((m) => ({ default: pick(m) })));\n\n/**\n * The primitive-typed (`string`/`boolean`/`number`) extra instance members of\n * `media-chrome/react`'s `MediaController` — restored per issue #101's round-2\n * validation (R2): each is a single declaration line mirroring the real peer\n * type's name and shape, referencing nothing peer-owned, so it costs nothing\n * against the `.d.ts` leak this fix exists to prevent. Deliberately EXCLUDED:\n * `audio` (already narrowed out — `_audio-player-media-chrome.tsx`'s\n * conformance assertion Omits it from the real `ComponentProps`, since this\n * package renders its own `<AudioPlayerElement>` instead of passing one\n * through), and every PEER/COMPLEX-typed member (`mediaStore`, `hotkeys`\n * (`AttributeTokenList`), `media`/`fullscreenElement` (DOM elements),\n * `mediaStateReceivers`, `associatedElementSubscriptions`, every\n * `HTMLMediaElement` callback and every method) — those stay narrowed to\n * `AudioPlayerPartProps` alone; restoring them would re-import the peer type\n * graph. See `_audio-player-media-chrome.tsx`'s\n * `_AudioPlayerPropsConformance` assertion, which fails typecheck if this\n * interface ever drifts wider than the real element's own props.\n *\n * Doc comments below are inferred from each member's name and media-chrome's\n * public attribute-naming convention (`no*` = boolean opt-out of the\n * corresponding default-on behavior) — media-chrome ships no per-property doc\n * comments in its own `.d.ts` or README to copy from. Treat them as a reading\n * aid, not an authoritative spec; verify against media-chrome's source before\n * relying on exact semantics.\n */\nexport interface AudioPlayerProps extends AudioPlayerPartProps {\n /** Seconds of inactivity before controls hide; a string because it mirrors the HTML attribute value. */\n autohide?: string;\n /** Also autohide while the pointer is over the control elements themselves, not just the media. */\n autohideOverControls?: boolean;\n /** Breakpoint definitions (space-separated `name:width` pairs) driving `breakpointsComputed`. */\n breakpoints?: string;\n /** Whether the controller has computed its current breakpoint(s) at least once. */\n breakpointsComputed?: boolean;\n /** Fallback duration (seconds) to display before the real media duration is known. */\n defaultDuration?: number;\n /** Default stream type (\"on-demand\" or \"live\") before the media has resolved its own. */\n defaultStreamType?: string;\n /** Whether subtitles/captions are enabled by default. */\n defaultSubtitles?: boolean;\n /** Disables the controller's built-in tap/gesture handling (e.g. tap-to-play, double-tap-to-seek). */\n gesturesDisabled?: boolean;\n /** Whether hotkey keyboard control is currently active on the controller. */\n keyboardControl?: boolean;\n /** Space-separated list of hotkey names currently in use, for conflict detection with other listeners. */\n keysUsed?: string;\n /** Seconds behind the live edge still considered \"at\" live, for a live stream's seek range. */\n liveEdgeOffset?: number;\n /** Disables the controller's autohide-controls-on-inactivity behavior entirely. */\n noAutohide?: boolean;\n /** Disables automatically seeking back to the live edge after a manual seek on a live stream. */\n noAutoSeekToLive?: boolean;\n /** Opts out of the controller creating its own default internal media store. */\n noDefaultStore?: boolean;\n /** Disables the controller's built-in keyboard hotkeys entirely. */\n noHotkeys?: boolean;\n /** Opts out of remembering the user's mute preference across sessions. */\n noMutedPref?: boolean;\n /** Opts out of remembering the user's subtitles-language preference across sessions. */\n noSubtitlesLangPref?: boolean;\n /** Opts out of remembering the user's volume preference across sessions. */\n noVolumePref?: boolean;\n /** The language the controller resolved for its UI text, after applying any language preference. */\n resolvedLang?: string;\n /** Whether the user has interacted with the controller yet (affects autoplay-adjacent UI). */\n userInteractive?: boolean;\n}\n\nconst AudioPlayerImpl = lazyPart<AudioPlayerProps>((m) => m.AudioPlayer);\n\n/**\n * The settled-failure stand-in for the `LazyEngineBoundary` above — rendered\n * once the `media-chrome` load has genuinely failed, never while it is still\n * pending (that stays `Skeleton`, via the `Suspense fallback` below). A\n * loading skeleton left in place after a settled failure reads as \"still\n * loading, forever\" (loading-states.md) — this is a terminal state, so it\n * gets a real (if compact) notice instead, sized to the same `h-10` slot so\n * nothing shifts when the boundary trips.\n */\nconst AudioPlayerMissing = ({ className, error }: { className?: string; error: unknown }) => {\n const { t } = useLocale();\n const isPeerMissing = isOptionalPeerMissing(error);\n return (\n <div\n className={cn(\n \"flex h-10 w-full items-center gap-2 rounded-md border border-dashed border-border bg-muted/30 px-3 text-caption text-muted-foreground\",\n className,\n )}\n role={isPeerMissing ? \"status\" : \"alert\"}\n >\n <VolumeOffIcon aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n <span className=\"truncate\">\n {isPeerMissing\n ? t(\"ai.error.engineMissingBody\", {\n feature: t(\"ai.audioPlayer.feature\"),\n packages: \"media-chrome\",\n })\n : t(\"ai.audioPlayer.renderError\")}\n </span>\n </div>\n );\n};\n\nexport const AudioPlayer = ({ className, ...props }: AudioPlayerProps) => (\n <LazyEngineBoundary\n renderMissing={(error) => <AudioPlayerMissing className={className} error={error} />}\n >\n <Suspense fallback={<Skeleton className={cn(\"h-10 w-full rounded-md\", className)} />}>\n <AudioPlayerImpl className={className} data-slot=\"audio-player\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerElementProps = Omit<ComponentProps<\"audio\">, \"src\"> &\n (\n | {\n data: SpeechResult[\"audio\"];\n }\n | {\n src: string;\n }\n );\n\nexport const AudioPlayerElement = ({ ...props }: AudioPlayerElementProps) => (\n // oxlint-disable-next-line eslint-plugin-jsx-a11y(media-has-caption) -- audio player captions are provided by consumer\n <audio\n data-slot=\"audio-player-element\"\n slot=\"media\"\n src={\"src\" in props ? props.src : `data:${props.data.mediaType};base64,${props.data.base64}`}\n {...props}\n />\n);\n\nexport type AudioPlayerControlBarProps = AudioPlayerPartProps;\n\nconst AudioPlayerControlBarImpl = lazyPart<AudioPlayerControlBarProps>(\n (m) => m.AudioPlayerControlBar,\n);\n\nexport const AudioPlayerControlBar = (props: AudioPlayerControlBarProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerControlBarImpl data-slot=\"audio-player-control-bar\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerPlayButtonProps = AudioPlayerPartProps;\n\nconst AudioPlayerPlayButtonImpl = lazyPart<AudioPlayerPlayButtonProps>(\n (m) => m.AudioPlayerPlayButton,\n);\n\nexport const AudioPlayerPlayButton = (props: AudioPlayerPlayButtonProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerPlayButtonImpl data-slot=\"audio-player-play-button\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport interface AudioPlayerSeekBackwardButtonProps extends AudioPlayerPartProps {\n /** Skip distance in seconds. Mirrors the element's own default (10). */\n seekOffset?: number;\n}\n\nconst AudioPlayerSeekBackwardButtonImpl = lazyPart<AudioPlayerSeekBackwardButtonProps>(\n (m) => m.AudioPlayerSeekBackwardButton,\n);\n\nexport const AudioPlayerSeekBackwardButton = (props: AudioPlayerSeekBackwardButtonProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerSeekBackwardButtonImpl data-slot=\"audio-player-seek-backward-button\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\n/**\n * Primitive-typed extra members restored per issue #101's round-2 validation\n * (R2) — same technique and same inferred-from-naming caveat as\n * `AudioPlayerProps` above. Deliberately still narrowed out:\n * `keysUsed` (here typed `string[]`, unlike the controller's own `string`\n * member of the same name — an array is not primitive) and the DOM/method\n * members `disable`/`enable`/`handleClick`/`tooltipEl`/`tooltipPlacement`.\n */\nexport interface AudioPlayerSeekForwardButtonProps extends AudioPlayerPartProps {\n /** Whether the button is disabled. */\n disabled?: boolean;\n /** ID of the `<media-controller>` element this button controls, when it is not an ancestor. */\n mediaController?: string;\n /** The media's current playback time (seconds), as reflected by the controller's media store. */\n mediaCurrentTime?: number;\n /** Skip distance in seconds. Mirrors the element's own default (10). */\n seekOffset?: number;\n /** Suppresses the built-in hover tooltip on this button. */\n noTooltip?: boolean;\n /** Prevents the button's default click handling (for a consumer that wants to fully own the behavior). */\n preventClick?: boolean;\n}\n\nconst AudioPlayerSeekForwardButtonImpl = lazyPart<AudioPlayerSeekForwardButtonProps>(\n (m) => m.AudioPlayerSeekForwardButton,\n);\n\nexport const AudioPlayerSeekForwardButton = (props: AudioPlayerSeekForwardButtonProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerSeekForwardButtonImpl data-slot=\"audio-player-seek-forward-button\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerTimeDisplayProps = AudioPlayerPartProps;\n\nconst AudioPlayerTimeDisplayImpl = lazyPart<AudioPlayerTimeDisplayProps>(\n (m) => m.AudioPlayerTimeDisplay,\n);\n\nexport const AudioPlayerTimeDisplay = (props: AudioPlayerTimeDisplayProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerTimeDisplayImpl data-slot=\"audio-player-time-display\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerTimeRangeProps = AudioPlayerPartProps;\n\nconst AudioPlayerTimeRangeImpl = lazyPart<AudioPlayerTimeRangeProps>((m) => m.AudioPlayerTimeRange);\n\nexport const AudioPlayerTimeRange = (props: AudioPlayerTimeRangeProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerTimeRangeImpl data-slot=\"audio-player-time-range\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerDurationDisplayProps = AudioPlayerPartProps;\n\nconst AudioPlayerDurationDisplayImpl = lazyPart<AudioPlayerDurationDisplayProps>(\n (m) => m.AudioPlayerDurationDisplay,\n);\n\nexport const AudioPlayerDurationDisplay = (props: AudioPlayerDurationDisplayProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerDurationDisplayImpl data-slot=\"audio-player-duration-display\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerMuteButtonProps = AudioPlayerPartProps;\n\nconst AudioPlayerMuteButtonImpl = lazyPart<AudioPlayerMuteButtonProps>(\n (m) => m.AudioPlayerMuteButton,\n);\n\nexport const AudioPlayerMuteButton = (props: AudioPlayerMuteButtonProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerMuteButtonImpl data-slot=\"audio-player-mute-button\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n\nexport type AudioPlayerVolumeRangeProps = AudioPlayerPartProps;\n\nconst AudioPlayerVolumeRangeImpl = lazyPart<AudioPlayerVolumeRangeProps>(\n (m) => m.AudioPlayerVolumeRange,\n);\n\nexport const AudioPlayerVolumeRange = (props: AudioPlayerVolumeRangeProps) => (\n <LazyEngineBoundary renderMissing={() => null}>\n <Suspense fallback={null}>\n <AudioPlayerVolumeRangeImpl data-slot=\"audio-player-volume-range\" {...props} />\n </Suspense>\n </LazyEngineBoundary>\n);\n","\"use client\";\n\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface LazyEngineBoundaryProps {\n children: ReactNode;\n /**\n * Called once a wrapped `lazy()` import rejects (an optional peer that is\n * not installed, or any other load-time failure). Return what to render in\n * its place — the boundary owns no default visual, since the right\n * stand-in differs by surface (an orb placeholder for `Persona`, `null`\n * for an `AudioPlayer` sub-control).\n */\n renderMissing: (error: unknown) => ReactNode;\n}\n\ninterface LazyEngineBoundaryState {\n // Wrapped in an object so `{ value: undefined }` (a boundary that caught\n // an error whose value happens to be `undefined`) is distinguishable from\n // \"nothing caught yet\" (`error: null`).\n error: { value: unknown } | null;\n}\n\n/**\n * Catches a `React.lazy()` load failure — an optional peer dependency that is\n * not installed (issue #33), or any other dynamic-import rejection — and\n * renders a caller-supplied fallback instead of unmounting the tree.\n *\n * `Suspense` alone does not do this: it only covers the PENDING state. A\n * REJECTED lazy import throws during render, and with no boundary above it\n * that throw propagates to the nearest ancestor boundary React DOES find —\n * by default, the whole app. This is the one place in `@elabs-ai/components-ai`\n * that needs a real render-phase error boundary; Mermaid and the interactive\n * terminal fail via an awaited promise instead (Streamdown's `errorComponent`\n * and a `.catch()` on the mount effect, respectively), which don't need one.\n */\nexport class LazyEngineBoundary extends Component<\n LazyEngineBoundaryProps,\n LazyEngineBoundaryState\n> {\n override state: LazyEngineBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: unknown): LazyEngineBoundaryState {\n return { error: { value: error } };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n console.error(\n \"[@elabs-ai/components-ai] a lazy engine failed to load:\",\n error,\n info.componentStack,\n );\n }\n\n override render(): ReactNode {\n if (this.state.error) {\n return this.props.renderMissing(this.state.error.value);\n }\n return this.props.children;\n }\n}\n","\"use client\";\n\nimport { useReducedMotion } from \"@elabs-ai/components-tokens\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n\n/**\n * brand-ui is a presentation layer (D5, docs/DECISIONS.md §D5): this component\n * never calls `getUserMedia`, never owns an `AudioContext`, and starts nothing\n * on mount. It draws whatever `levels` a parent — who already has a\n * `MediaStream`/`AnalyserNode` — passes it, frame by frame. The analyser\n * plumbing, when a consumer genuinely wants it, is the separate, opt-in\n * `useAudioLevel` export in `./use-audio-level` — never something this\n * component reaches for itself. See issue #21.\n */\n\nexport type AudioVisualizerVariant = \"bars\" | \"wave\";\nexport type AudioVisualizerLevelState = \"idle\" | \"silent\" | \"active\";\n\n/**\n * Localized status announced when the discretized level state changes, one\n * key per `AudioVisualizerLevelState`. Typed as a `Record` (not a bare\n * template string) so a state value added later without a matching key here\n * fails to typecheck — same convention as `Persona`'s `PERSONA_STATE_KEYS`.\n */\nconst AUDIO_VISUALIZER_STATE_KEYS: Record<AudioVisualizerLevelState, string> = {\n active: \"ai.audioVisualizer.active\",\n idle: \"ai.audioVisualizer.idle\",\n silent: \"ai.audioVisualizer.silent\",\n};\n\n// Fixed internal render resolution — the canvas is stretched to its CSS box\n// (see the className below), so this is a rendering-quality knob, not a\n// layout one. Picking a fixed size up front means the draw loop never has to\n// measure the DOM (no `getBoundingClientRect`/`offsetHeight` in the hot path).\nconst CANVAS_WIDTH = 320;\nconst CANVAS_HEIGHT = 64;\nconst DEFAULT_BAR_COUNT = 32;\nconst DEFAULT_SENSITIVITY = 1;\nconst DEFAULT_SILENCE_THRESHOLD = 0.04;\n/**\n * Fraction of the remaining distance to the target level closed per animation\n * frame — a fixed-cost lerp, never a growing history buffer, so the per-frame\n * cost stays O(barCount) no matter how long the session has run.\n */\nconst SMOOTHING_FACTOR = 0.35;\n/** Once every displayed level is within this of its target, the smoothing has\n * visually converged — stop scheduling more animation frames rather than\n * looping forever on a static input. */\nconst CONVERGENCE_EPSILON = 0.002;\n/**\n * Hysteresis margin (as a fraction of `silenceThreshold`) around the active/\n * silent boundary. A live signal hovering right at the threshold can cross it\n * on consecutive samples; without a dead zone, every such graze would flip\n * the announced `role=\"status\"` text, flooding assistive tech with\n * alternating \"active\"/\"no input\" announcements. A clear crossing (past the\n * margin on either side) still flips immediately — only a graze inside the\n * dead zone holds the previous state.\n */\nconst HYSTERESIS_RATIO = 0.25;\n\nconst clamp01 = (value: number) => Math.min(1, Math.max(0, value));\n\n/** A finite, rounded, >=2 bar count safe to use as an array length — an\n * unsanitized `barCount` (NaN, Infinity, a fractional value from a\n * misconfigured/computed prop) would otherwise throw `RangeError: Invalid\n * array length` the moment it reaches `new Array(count)`. */\nfunction normalizeBarCount(value: number): number {\n if (!Number.isFinite(value)) return DEFAULT_BAR_COUNT;\n return Math.max(2, Math.round(value));\n}\n\n/** True once every displayed level is within `CONVERGENCE_EPSILON` of its\n * target — i.e. the smoothing animation has nothing left to visibly close. */\nfunction hasConverged(display: number[], target: number[]): boolean {\n for (let i = 0; i < target.length; i += 1) {\n if (Math.abs((display[i] ?? 0) - (target[i] ?? 0)) > CONVERGENCE_EPSILON) return false;\n }\n return true;\n}\n\n/**\n * The discretized level bucket, with hysteresis around `silenceThreshold` —\n * see `HYSTERESIS_RATIO`. `previous` is only consulted inside the dead zone;\n * a clear reading on either side is decisive regardless of history.\n */\nfunction computeLevelBucket(\n average: number,\n loading: boolean,\n silenceThreshold: number,\n previous: AudioVisualizerLevelState,\n): AudioVisualizerLevelState {\n if (loading) return \"idle\";\n const margin = silenceThreshold * HYSTERESIS_RATIO;\n if (average >= silenceThreshold + margin) return \"active\";\n if (average < silenceThreshold - margin) return \"silent\";\n // Inside the dead zone: hold the previous bucket. `previous` starts as\n // \"idle\" (mount, or just-exited `loading`), which isn't itself a valid\n // active/silent reading to hold onto — fall back to the plain threshold\n // check for that one transition only.\n if (previous === \"idle\") return average >= silenceThreshold ? \"active\" : \"silent\";\n return previous;\n}\n\n/** Nearest-neighbor resample of an arbitrary-length sample array to `count`\n * entries, applying `sensitivity` and clamping to [0, 1]. Never allocates\n * more than `count` numbers, independent of `levels.length`. */\nfunction resampleLevels(levels: number[], count: number, sensitivity: number): number[] {\n if (levels.length === 0) {\n return new Array(count).fill(0);\n }\n const out = new Array<number>(count);\n for (let i = 0; i < count; i += 1) {\n const sourceIndex = Math.min(levels.length - 1, Math.floor((i / count) * levels.length));\n out[i] = clamp01((levels[sourceIndex] ?? 0) * sensitivity);\n }\n return out;\n}\n\nfunction drawBars(ctx: CanvasRenderingContext2D, levels: number[], color: string) {\n const { width, height } = ctx.canvas;\n ctx.clearRect(0, 0, width, height);\n const n = levels.length;\n if (n === 0) return;\n const gap = 2;\n const barWidth = Math.max(1, (width - gap * (n - 1)) / n);\n ctx.fillStyle = color;\n for (let i = 0; i < n; i += 1) {\n const level = levels[i] ?? 0;\n const barHeight = Math.max(2, level * height);\n const x = i * (barWidth + gap);\n ctx.fillRect(x, height - barHeight, barWidth, barHeight);\n }\n}\n\n/** Draws the CURRENT sample snapshot as a filled envelope (no history/scroll —\n * see the reduced-motion note on `AudioVisualizer` for why this shape never\n * accumulates state over time). */\nfunction drawWave(ctx: CanvasRenderingContext2D, levels: number[], color: string) {\n const { width, height } = ctx.canvas;\n ctx.clearRect(0, 0, width, height);\n const n = levels.length;\n if (n < 2) return;\n const midY = height / 2;\n ctx.fillStyle = color;\n ctx.beginPath();\n for (let i = 0; i < n; i += 1) {\n const x = (i / (n - 1)) * width;\n const y = midY - clamp01(levels[i] ?? 0) * midY;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n for (let i = n - 1; i >= 0; i -= 1) {\n const x = (i / (n - 1)) * width;\n const y = midY + clamp01(levels[i] ?? 0) * midY;\n ctx.lineTo(x, y);\n }\n ctx.closePath();\n ctx.fill();\n}\n\n/** Resolves the bar/wave fill colour from tokens at draw time. `getComputedStyle`\n * resolves a CSS custom property's VALUE — unlike `getBoundingClientRect`/\n * `offsetHeight`, it never forces layout, so this is not a \"layout read\". */\nfunction resolveFillColor(canvas: HTMLCanvasElement): string {\n const styles = getComputedStyle(canvas);\n const token =\n styles.getPropertyValue(\"--color-primary\").trim() ||\n styles.getPropertyValue(\"--primary\").trim();\n return token || styles.color || \"currentColor\";\n}\n\nexport interface AudioVisualizerProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /**\n * Normalized 0–1 amplitude samples for the CURRENT frame — one per bar (or\n * per sample point for `variant=\"wave\"`). Update this from your own\n * analyser polling loop (or the opt-in `useAudioLevel` hook) on every frame\n * you want reflected; the component never touches the microphone itself.\n * Any length works — samples are resampled to `barCount`.\n */\n levels?: number[];\n /** No stream connected yet — renders the idle baseline instead of `levels`. */\n loading?: boolean;\n /** `\"bars\"` (default) — a bar chart. `\"wave\"` — a filled envelope through the\n * current samples. Both encode level as HEIGHT, never as hue alone. */\n variant?: AudioVisualizerVariant;\n /** Multiplies each level before clamping to [0, 1] — turn up for a quiet input. */\n sensitivity?: number;\n /** Number of bars/points drawn. */\n barCount?: number;\n /** Average level, 0–1, at/above which the status text reads \"active\". */\n silenceThreshold?: number;\n /**\n * Visually-hidden text announced when the discretized level state changes.\n * Defaults to a localized label (\"No input detected\" / \"Microphone\n * active\" / …). Pass `null` when the consuming surface already renders its\n * own live region, so assistive tech is not told twice.\n */\n statusLabel?: ReactNode | null;\n}\n\n/**\n * Live mic-level / waveform meter. Canvas-drawn (one element, no per-bar DOM,\n * so a `levels` prop updating every frame never costs React a 32-element\n * reconciliation) and driven entirely by the `levels` prop — see the module\n * doc comment for the presentation-layer boundary this enforces.\n *\n * The canvas is decorative (`aria-hidden`); the level itself is announced\n * through a throttled `role=\"status\"` text alternative — see `statusLabel`.\n *\n * Reduced motion: under `prefers-reduced-motion` (or while `loading`) the\n * component skips its internal smoothing animation entirely and paints the\n * raw `levels` directly on every prop change — a static bar chart of the\n * current levels, never a freeze mid-interpolation.\n */\nexport const AudioVisualizer = forwardRef<HTMLDivElement, AudioVisualizerProps>(\n function AudioVisualizer(\n {\n className,\n levels = [],\n loading = false,\n variant = \"bars\",\n sensitivity = DEFAULT_SENSITIVITY,\n barCount = DEFAULT_BAR_COUNT,\n silenceThreshold = DEFAULT_SILENCE_THRESHOLD,\n statusLabel,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const prefersReducedMotion = useReducedMotion();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const displayLevelsRef = useRef<number[]>([]);\n const rafRef = useRef<number | null>(null);\n const bucketRef = useRef<AudioVisualizerLevelState>(\"idle\");\n const [levelState, setLevelState] = useState<AudioVisualizerLevelState>(\"idle\");\n // Bumped whenever `data-theme` actually changes on the document — see the\n // MutationObserver effect below. `resolveFillColor` cannot read a token\n // value that isn't there yet: a theme-setting provider (e.g.\n // `ThemeProvider`) applies `data-theme` in its OWN mount effect, and React\n // fires a CHILD's effects before its parent's, so this component's paint\n // effect otherwise runs first and reads whatever the un-themed `:root`\n // fallback resolves to. Re-running the paint once the attribute lands\n // (rather than only on the next animation frame, which the `loading`/\n // reduced-motion path never schedules) is what fixes both the first paint\n // AND a theme change after mount.\n const [themeRevision, setThemeRevision] = useState(0);\n\n const sampleCount = normalizeBarCount(barCount);\n\n const targetLevels = useMemo(\n () => resampleLevels(loading ? [] : levels, sampleCount, sensitivity),\n [levels, loading, sampleCount, sensitivity],\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n const ctx = canvas.getContext(\"2d\");\n\n // The announced status always reflects the CURRENT target level,\n // synchronously and independent of the smoothing animation below — a\n // screen-reader user is never a lerp-frame behind the real signal, even\n // though the visual bars/wave may still be easing toward it.\n const average =\n targetLevels.reduce((sum, value) => sum + value, 0) / (targetLevels.length || 1);\n const bucket = computeLevelBucket(average, loading, silenceThreshold, bucketRef.current);\n if (bucket !== bucketRef.current) {\n bucketRef.current = bucket;\n setLevelState(bucket);\n }\n\n const paint = (paintLevels: number[]) => {\n if (!ctx) return;\n const color = resolveFillColor(canvas);\n if (variant === \"wave\") drawWave(ctx, paintLevels, color);\n else drawBars(ctx, paintLevels, color);\n };\n\n if (prefersReducedMotion || loading) {\n displayLevelsRef.current = targetLevels;\n paint(targetLevels);\n return undefined;\n }\n\n // Seed (or reset, on a `barCount` change) the smoothing buffer and paint\n // this frame SYNCHRONOUSLY — the canvas and status text reflect the\n // current `levels` immediately on mount/update, rather than waiting for\n // the first `requestAnimationFrame` callback. The rAF loop below only\n // has to run to carry the smoothing motion forward from here.\n if (displayLevelsRef.current.length !== targetLevels.length) {\n displayLevelsRef.current = targetLevels.slice();\n }\n paint(displayLevelsRef.current);\n\n const tick = () => {\n const display = displayLevelsRef.current;\n const next = display.map(\n (value, i) => value + ((targetLevels[i] ?? 0) - value) * SMOOTHING_FACTOR,\n );\n displayLevelsRef.current = next;\n paint(next);\n // Stop rescheduling once the smoothing has visually converged — the\n // `targetLevels` dependency above restarts the loop the moment a real\n // prop change gives it somewhere new to go.\n if (hasConverged(next, targetLevels)) return;\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n };\n // `themeRevision` is the trigger; `resolveFillColor` re-reads the token\n // live, so the value itself never needs to be a dependency.\n }, [targetLevels, variant, loading, prefersReducedMotion, silenceThreshold, themeRevision]);\n\n // Track `data-theme` (whatever sets it — `ThemeProvider`'s own mount\n // effect, a later `setTheme` call, or Storybook's theme decorator) and\n // re-run the paint effect above once it actually changes. Same fix as\n // `InteractiveTerminal`'s identical `data-theme` race.\n useEffect(() => {\n if (typeof document === \"undefined\") return undefined;\n const observer = new MutationObserver(() => setThemeRevision((r) => r + 1));\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"data-theme\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const label =\n statusLabel === null ? null : (statusLabel ?? t(AUDIO_VISUALIZER_STATE_KEYS[levelState]));\n\n return (\n <div\n className={cn(\"flex flex-col gap-1\", className)}\n data-slot=\"audio-visualizer\"\n ref={ref}\n {...props}\n >\n <canvas\n aria-hidden=\"true\"\n className=\"h-16 w-full rounded-md bg-muted\"\n data-slot=\"audio-visualizer-canvas\"\n height={CANVAS_HEIGHT}\n ref={canvasRef}\n width={CANVAS_WIDTH}\n />\n {label !== null && (\n <span\n className=\"sr-only\"\n data-slot=\"audio-visualizer-status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {label}\n </span>\n )}\n </div>\n );\n },\n);\n","\"use client\";\n\nimport { Skeleton } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ReactFlowProps } from \"@xyflow/react\";\nimport type { ReactNode } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type CanvasProps = ReactFlowProps & {\n children?: ReactNode;\n};\n\n/**\n * React Flow — and its stylesheet — is reached through a dynamic import: it\n * declares no `sideEffects`, so a static import would put the whole engine in\n * every consumer's entry chunk, a canvas rendered or not. `ReactFlowProps` above\n * is a TYPE import and erases. See ADR 0019 and `pnpm heavy-deps:check`.\n */\nconst CanvasImpl = lazyFlowPart<CanvasProps>((m) => m.Canvas);\n\nexport const Canvas = ({ className, ...props }: CanvasProps) => (\n // The canvas fills the box its parent gives it, so the skeleton reserves the\n // same space and the engine chunk arrives without a layout shift.\n <Suspense fallback={<Skeleton className={cn(\"size-full\", className)} />}>\n <CanvasImpl className={className} {...props} />\n </Suspense>\n);\n","/**\n * The one dynamic-import seam every React-Flow-backed component in\n * `@elabs-ai/components-ai` goes through.\n *\n * `@xyflow/react` declares no `sideEffects`, so a static import from any of the\n * six public modules (`canvas`, `controls`, `edge`, `node`, `panel`, `toolbar`)\n * put the whole engine into the entry chunk of every consumer. They all reach it\n * through **one** boundary module — `_flow-boundary.tsx` — rather than six, so\n * the engine lands in exactly one chunk: six boundaries would mean six chunks\n * each pulling the same engine, and a `<Node>` rendered inside an already-loaded\n * `<Canvas>` would fetch a second copy.\n *\n * Because every part resolves from the same specifier, the parts _inside_ a\n * canvas resolve from the module cache the canvas already populated.\n *\n * This module is deliberately NOT itself a lazy boundary (it carries no such\n * docblock tag, and `pnpm heavy-deps:check` would fail the six static imports\n * below if it did): it holds no engine import of its own, only the `import()`\n * call, so the public modules may import it statically. See ADR 0019.\n */\nimport { lazy } from \"react\";\nimport type { ComponentType, LazyExoticComponent } from \"react\";\n\ntype FlowBoundaryModule = typeof import(\"./_flow-boundary\");\n\n/**\n * Wrap one implementation from the React Flow boundary in a `lazy()` component.\n *\n * @param pick Selects the implementation from the boundary module.\n */\nexport const lazyFlowPart = <P>(\n pick: (module: FlowBoundaryModule) => ComponentType<P>,\n): LazyExoticComponent<ComponentType<P>> =>\n lazy(() => import(\"./_flow-boundary\").then((m) => ({ default: pick(m) })));\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Badge, 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 { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, memo, useContext, useMemo } from \"react\";\n\nimport { AgentStep, AgentTimeline, type AgentStepProps } from \"./agent-timeline\";\n\ninterface ChainOfThoughtContextValue {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n}\n\nconst ChainOfThoughtContext = createContext<ChainOfThoughtContextValue | null>(null);\n\nconst useChainOfThought = () => {\n const context = useContext(ChainOfThoughtContext);\n if (!context) {\n throw new Error(\"ChainOfThought components must be used within ChainOfThought\");\n }\n return context;\n};\n\nexport type ChainOfThoughtProps = ComponentProps<\"div\"> & {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const ChainOfThought = memo(\n ({\n className,\n open,\n defaultOpen = false,\n onOpenChange,\n children,\n ...props\n }: ChainOfThoughtProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n\n const chainOfThoughtContext = useMemo(() => ({ isOpen, setIsOpen }), [isOpen, setIsOpen]);\n\n return (\n <ChainOfThoughtContext.Provider value={chainOfThoughtContext}>\n <div className={cn(\"not-prose w-full space-y-4\", className)} {...props}>\n {children}\n </div>\n </ChainOfThoughtContext.Provider>\n );\n },\n);\n\nexport type ChainOfThoughtHeaderProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const ChainOfThoughtHeader = memo(\n ({ className, children, ...props }: ChainOfThoughtHeaderProps) => {\n const { isOpen, setIsOpen } = useChainOfThought();\n\n return (\n <Collapsible onOpenChange={setIsOpen} open={isOpen}>\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center gap-2 text-body text-muted-foreground transition-colors hover:text-foreground\",\n className,\n )}\n {...props}\n >\n <BrainIcon className=\"size-4\" />\n <span className=\"flex-1 text-start\">{children ?? \"Chain of Thought\"}</span>\n <ChevronDownIcon\n className={cn(\"size-4 transition-transform\", isOpen ? \"rotate-180\" : \"rotate-0\")}\n />\n </CollapsibleTrigger>\n </Collapsible>\n );\n },\n);\n\nexport type ChainOfThoughtStepProps = Omit<\n AgentStepProps,\n \"name\" | \"summary\" | \"status\" | \"hideBadge\"\n> & {\n label: ReactNode;\n description?: ReactNode;\n status?: \"complete\" | \"active\" | \"pending\";\n};\n\n/**\n * Step status → the canonical 7-state vocabulary (#189, research 10 §B.1):\n * `active` is a running step.\n */\nconst stepStatusToCanonical: Record<NonNullable<ChainOfThoughtStepProps[\"status\"]>, Status> = {\n active: \"running\",\n complete: \"complete\",\n pending: \"pending\",\n};\n\n/**\n * @deprecated Compose `AgentStep` (agent-timeline.tsx) directly. Since #192\n * this is a thin alias mapping the legacy `label`/`description`/3-state\n * `status` props onto the canonical rail (`AgentTimeline` + `AgentStep`); the\n * pre-#192 hand-rolled connector + text-opacity status idiom is gone\n * (research 10 §B.3). The badge stays hidden here — the rail node carries the\n * status — keeping the quiet prose-rail look.\n */\nexport const ChainOfThoughtStep = memo(\n ({ label, description, status = \"complete\", ...props }: ChainOfThoughtStepProps) => (\n <AgentStep\n hideBadge\n name={label}\n status={stepStatusToCanonical[status]}\n summary={description}\n {...props}\n />\n ),\n);\n\nexport type ChainOfThoughtSearchResultsProps = ComponentProps<\"div\">;\n\nexport const ChainOfThoughtSearchResults = memo(\n ({ className, ...props }: ChainOfThoughtSearchResultsProps) => (\n <div className={cn(\"flex flex-wrap items-center gap-2\", className)} {...props} />\n ),\n);\n\nexport type ChainOfThoughtSearchResultProps = ComponentProps<typeof Badge>;\n\nexport const ChainOfThoughtSearchResult = memo(\n ({ className, children, ...props }: ChainOfThoughtSearchResultProps) => (\n <Badge\n className={cn(\"gap-1 px-2 py-0.5 text-meta font-normal\", className)}\n variant=\"secondary\"\n {...props}\n >\n {children}\n </Badge>\n ),\n);\n\nexport type ChainOfThoughtContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ChainOfThoughtContent = memo(\n ({ className, children, ...props }: ChainOfThoughtContentProps) => {\n const { isOpen } = useChainOfThought();\n\n return (\n <Collapsible open={isOpen}>\n <CollapsibleContent\n className={cn(\n \"mt-2 space-y-3\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n >\n <AgentTimeline>{children}</AgentTimeline>\n </CollapsibleContent>\n </Collapsible>\n );\n },\n);\n\nexport type ChainOfThoughtImageProps = ComponentProps<\"div\"> & {\n caption?: string;\n};\n\nexport const ChainOfThoughtImage = memo(\n ({ className, children, caption, ...props }: ChainOfThoughtImageProps) => (\n <div className={cn(\"mt-2 space-y-2\", className)} {...props}>\n <div className=\"relative flex max-h-[22rem] items-center justify-center overflow-hidden rounded-lg bg-muted p-3\">\n {children}\n </div>\n {caption && <p className=\"text-meta text-muted-foreground\">{caption}</p>}\n </div>\n ),\n);\n\nChainOfThought.displayName = \"ChainOfThought\";\nChainOfThoughtHeader.displayName = \"ChainOfThoughtHeader\";\nChainOfThoughtStep.displayName = \"ChainOfThoughtStep\";\nChainOfThoughtSearchResults.displayName = \"ChainOfThoughtSearchResults\";\nChainOfThoughtSearchResult.displayName = \"ChainOfThoughtSearchResult\";\nChainOfThoughtContent.displayName = \"ChainOfThoughtContent\";\nChainOfThoughtImage.displayName = \"ChainOfThoughtImage\";\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { forwardRef } from \"react\";\nimport { cn, Heading, type HeadingLevel } from \"@elabs-ai/components-ui\";\n\nexport interface ChatGreetingProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Primary line, e.g. \"Good morning, Avery\". */\n title: ReactNode;\n /**\n * Second line, rendered under `title` inside the same heading. Independent\n * of `accent` — either may be passed alone.\n */\n subtitle?: ReactNode;\n /**\n * Phrase rendered in `text-primary-text` with a bold underline, appended\n * after `subtitle` (or alone). The underline + weight is a NON-hue channel\n * deliberately layered on top of the color — a monochrome theme's `--primary`\n * can be a near-white \"pen\" by design, in which case the accent colour alone\n * is indistinguishable from the surrounding `--foreground` headline text. The\n * underline/weight keep the phrase legible as an accent in EVERY theme,\n * not only the two where hue alone would carry it.\n */\n accent?: ReactNode;\n /** Soft primary glow behind the headline. Default `true`; `false` for dense/embedded use. */\n orb?: boolean;\n /**\n * Semantic heading level for `title`. Default `1` (a chat empty state is\n * typically the only heading on the page). Override to `2`+ when ChatGreeting\n * sits inside a page or route that already renders its own `<h1>` —\n * `Heading` decouples `level` from `size`, so the visual display-scale rung\n * stays put regardless of the level chosen.\n */\n level?: HeadingLevel;\n}\n\n/**\n * ChatGreeting — the centered first-run greeting for an empty chat/composer scene.\n *\n * A display-scale headline (`title`, then `subtitle` with an `accent` phrase\n * in `text-primary-text` + a bold underline, so the accent reads in every theme,\n * including a monochrome one whose `--primary` is otherwise the same\n * near-white as the headline) over an optional soft primary glow. Pair it\n * with `<Composer />` for the standard empty/first-run chat state.\n *\n * Distinct from `ConversationEmptyState` (a generic centered \"No messages yet\"\n * message panel) — this is the display-scale greeting anatomy, not a status\n * message.\n */\nexport const ChatGreeting = forwardRef<HTMLDivElement, ChatGreetingProps>(function ChatGreeting(\n { title, subtitle, accent, orb = true, level = 1, className, ...props },\n ref,\n) {\n const hasSecondLine = subtitle != null || accent != null;\n\n return (\n <div\n ref={ref}\n data-slot=\"chat-greeting\"\n // `isolate` gives the root its own stacking context so the negative-\n // z-index orb paints ABOVE an ancestor's own background instead of\n // beneath it (CSS painting order step 2 vs step 3) — without it, any\n // opaque wrapper (e.g. a `bg-background` scene container) occludes the\n // glow entirely. See issue #254 root-cause.\n className={cn(\"relative isolate mb-10 text-center\", className)}\n {...props}\n >\n {orb ? (\n <div\n aria-hidden=\"true\"\n data-slot=\"chat-greeting-orb\"\n className=\"pointer-events-none absolute start-1/2 top-0 -z-10 size-40 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary/15 blur-3xl\"\n />\n ) : null}\n <Heading data-slot=\"chat-greeting-title\" level={level} size=\"display\">\n {title}\n {hasSecondLine ? (\n <>\n <br />\n {subtitle}\n {subtitle != null && accent != null ? \" \" : null}\n {accent != null ? (\n // #399 — accent phrase inside a headline is TEXT: `-text` rung.\n <span className=\"font-bold text-primary-text underline decoration-2 underline-offset-4\">\n {accent}\n </span>\n ) : null}\n </>\n ) : null}\n </Heading>\n </div>\n );\n});\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Separator } from \"@elabs-ai/components-ui\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { LucideProps } from \"lucide-react\";\nimport { BookmarkIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\n\nexport type CheckpointProps = HTMLAttributes<HTMLDivElement>;\n\nexport const Checkpoint = ({ className, children, ...props }: CheckpointProps) => (\n <div\n className={cn(\"flex items-center gap-0.5 overflow-hidden text-muted-foreground\", className)}\n {...props}\n >\n {children}\n <Separator />\n </div>\n);\n\nexport type CheckpointIconProps = LucideProps;\n\nexport const CheckpointIcon = ({ className, children, ...props }: CheckpointIconProps) =>\n children ?? <BookmarkIcon className={cn(\"size-4 shrink-0\", className)} {...props} />;\n\nexport type CheckpointTriggerProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n};\n\nexport const CheckpointTrigger = ({\n children,\n variant = \"ghost\",\n size = \"sm\",\n tooltip,\n ...props\n}: CheckpointTriggerProps) =>\n tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent align=\"start\" side=\"bottom\">\n {tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n </Button>\n );\n","\"use client\";\n\nimport { Avatar, AvatarFallback } from \"@elabs-ai/components-ui\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { CheckIcon, CopyIcon, FileIcon, GitCommitIcon, MinusIcon, PlusIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type CommitProps = ComponentProps<typeof Collapsible>;\n\nexport const Commit = ({ className, children, ...props }: CommitProps) => (\n <Collapsible className={cn(\"rounded-lg border bg-background\", className)} {...props}>\n {children}\n </Collapsible>\n);\n\nexport type CommitHeaderProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const CommitHeader = ({ className, children, ...props }: CommitHeaderProps) => (\n <CollapsibleTrigger asChild {...props}>\n <div\n className={cn(\n \"group flex cursor-pointer items-center justify-between gap-4 p-3 text-start transition-colors hover:opacity-80\",\n className,\n )}\n >\n {children}\n </div>\n </CollapsibleTrigger>\n);\n\nexport type CommitHashProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const CommitHash = ({ className, children, ...props }: CommitHashProps) => (\n <span className={cn(\"font-mono text-xs\", className)} {...props}>\n <GitCommitIcon className=\"me-1 inline-block size-3\" />\n {children}\n </span>\n);\n\nexport type CommitMessageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const CommitMessage = ({ className, children, ...props }: CommitMessageProps) => (\n <span className={cn(\"font-medium text-sm\", className)} {...props}>\n {children}\n </span>\n);\n\nexport type CommitMetadataProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitMetadata = ({ className, children, ...props }: CommitMetadataProps) => (\n <div\n className={cn(\"flex items-center gap-2 text-muted-foreground text-xs\", className)}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type CommitSeparatorProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const CommitSeparator = ({ className, children, ...props }: CommitSeparatorProps) => (\n <span className={className} {...props}>\n {children ?? \"•\"}\n </span>\n);\n\nexport type CommitInfoProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitInfo = ({ className, children, ...props }: CommitInfoProps) => (\n <div className={cn(\"flex flex-1 flex-col\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type CommitAuthorProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitAuthor = ({ className, children, ...props }: CommitAuthorProps) => (\n <div className={cn(\"flex items-center\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type CommitAuthorAvatarProps = ComponentProps<typeof Avatar> & {\n initials: string;\n};\n\nexport const CommitAuthorAvatar = ({ initials, className, ...props }: CommitAuthorAvatarProps) => (\n <Avatar className={cn(\"size-8\", className)} {...props}>\n <AvatarFallback className=\"text-xs\">{initials}</AvatarFallback>\n </Avatar>\n);\n\nexport type CommitTimestampProps = HTMLAttributes<HTMLTimeElement> & {\n date: Date;\n};\n\nconst formatRelativeDate = (date: Date, locale: string) => {\n const days = Math.round((date.getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n return new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" }).format(days, \"day\");\n};\n\nexport const CommitTimestamp = ({ date, className, children, ...props }: CommitTimestampProps) => {\n const { locale } = useLocale();\n const [formatted, setFormatted] = useState(\"\");\n\n const updateFormatted = useCallback(() => {\n setFormatted(formatRelativeDate(date, locale));\n }, [date, locale]);\n\n useEffect(() => {\n updateFormatted();\n }, [updateFormatted]);\n\n return (\n <time className={cn(\"text-xs\", className)} dateTime={date.toISOString()} {...props}>\n {children ?? formatted}\n </time>\n );\n};\n\nexport type CommitActionsProps = HTMLAttributes<HTMLDivElement>;\n\nconst handleActionsClick = (e: React.MouseEvent) => e.stopPropagation();\nconst handleActionsKeyDown = (e: React.KeyboardEvent) => e.stopPropagation();\n\nexport const CommitActions = ({ className, children, ...props }: CommitActionsProps) => (\n <div\n className={cn(\"flex items-center gap-1\", className)}\n onClick={handleActionsClick}\n onKeyDown={handleActionsKeyDown}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n);\n\nexport type CommitCopyButtonProps = ComponentProps<typeof Button> & {\n hash: string;\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const CommitCopyButton = ({\n hash,\n onCopy,\n onError,\n timeout = 2000,\n children,\n className,\n ...props\n}: CommitCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(hash);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [hash, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"size-7 shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n};\n\nexport type CommitContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const CommitContent = ({ className, children, ...props }: CommitContentProps) => (\n <CollapsibleContent className={cn(\"border-t p-3\", className)} {...props}>\n {children}\n </CollapsibleContent>\n);\n\nexport type CommitFilesProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitFiles = ({ className, children, ...props }: CommitFilesProps) => (\n <div className={cn(\"space-y-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type CommitFileProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitFile = ({ className, children, ...props }: CommitFileProps) => (\n <div\n className={cn(\n \"flex items-center justify-between gap-2 rounded px-2 py-1 text-sm hover:bg-muted/50\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type CommitFileInfoProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitFileInfo = ({ className, children, ...props }: CommitFileInfoProps) => (\n <div className={cn(\"flex min-w-0 items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nconst fileStatusStyles = {\n added: \"text-green-600 dark:text-green-400\",\n deleted: \"text-red-600 dark:text-red-400\",\n modified: \"text-yellow-600 dark:text-yellow-400\",\n renamed: \"text-blue-600 dark:text-blue-400\",\n};\n\nconst fileStatusLabels = {\n added: \"A\",\n deleted: \"D\",\n modified: \"M\",\n renamed: \"R\",\n};\n\nexport type CommitFileStatusProps = HTMLAttributes<HTMLSpanElement> & {\n status: \"added\" | \"modified\" | \"deleted\" | \"renamed\";\n};\n\nexport const CommitFileStatus = ({\n status,\n className,\n children,\n ...props\n}: CommitFileStatusProps) => (\n <span\n className={cn(\"font-medium font-mono text-xs\", fileStatusStyles[status], className)}\n {...props}\n >\n {children ?? fileStatusLabels[status]}\n </span>\n);\n\nexport type CommitFileIconProps = ComponentProps<typeof FileIcon>;\n\nexport const CommitFileIcon = ({ className, ...props }: CommitFileIconProps) => (\n <FileIcon className={cn(\"size-3.5 shrink-0 text-muted-foreground\", className)} {...props} />\n);\n\nexport type CommitFilePathProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const CommitFilePath = ({ className, children, ...props }: CommitFilePathProps) => (\n <span className={cn(\"truncate font-mono text-xs\", className)} {...props}>\n {children}\n </span>\n);\n\nexport type CommitFileChangesProps = HTMLAttributes<HTMLDivElement>;\n\nexport const CommitFileChanges = ({ className, children, ...props }: CommitFileChangesProps) => (\n <div className={cn(\"flex shrink-0 items-center gap-1 font-mono text-xs\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type CommitFileAdditionsProps = HTMLAttributes<HTMLSpanElement> & {\n count: number;\n};\n\nexport const CommitFileAdditions = ({\n count,\n className,\n children,\n ...props\n}: CommitFileAdditionsProps) => {\n if (count <= 0) {\n return null;\n }\n\n return (\n <span className={cn(\"text-green-600 dark:text-green-400\", className)} {...props}>\n {children ?? (\n <>\n <PlusIcon className=\"inline-block size-3\" />\n {count}\n </>\n )}\n </span>\n );\n};\n\nexport type CommitFileDeletionsProps = HTMLAttributes<HTMLSpanElement> & {\n count: number;\n};\n\nexport const CommitFileDeletions = ({\n count,\n className,\n children,\n ...props\n}: CommitFileDeletionsProps) => {\n if (count <= 0) {\n return null;\n }\n\n return (\n <span className={cn(\"text-red-600 dark:text-red-400\", className)} {...props}>\n {children ?? (\n <>\n <MinusIcon className=\"inline-block size-3\" />\n {count}\n </>\n )}\n </span>\n );\n};\n","\"use client\";\n\nimport { useCallback, useRef, useState, type ComponentProps, type ReactNode } from \"react\";\nimport { ArrowUp, Mic, Paperclip, Sparkles } from \"lucide-react\";\nimport { cn, Kbd, useLocale } from \"@elabs-ai/components-ui\";\n\nimport {\n PromptInput,\n PromptInputBody,\n PromptInputButton,\n PromptInputFooter,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n type PromptInputProps,\n} from \"./prompt-input\";\nimport { PromptInputEffort, type PromptInputEffortProps } from \"./prompt-input-effort\";\nimport { PromptInputMode, type PromptInputModeProps } from \"./prompt-input-mode\";\nimport {\n PromptInputSlash,\n PromptInputSlashTextarea,\n type PromptInputSlashProps,\n} from \"./prompt-input-slash\";\nimport { Suggestion, Suggestions } from \"./suggestion\";\n\n/**\n * The slice of `PromptInputModeProps` a `Composer` owns — the vocabulary and\n * the controlled/uncontrolled seam, never the DOM props of the wrapper div.\n *\n * `defaultValue` is deliberately absent: `PromptInputMode` has no uncontrolled\n * initial-value seam (its uncontrolled default is `modes[0]`), and the\n * `defaultValue` it inherits from `HTMLAttributes<HTMLDivElement>` is the DOM\n * attribute, which would type-check and then do nothing. Omit `value` for the\n * uncontrolled default; pass `value` + `onValueChange` to drive it.\n */\nexport type ComposerModeProps = Pick<\n PromptInputModeProps,\n \"modes\" | \"value\" | \"onValueChange\" | \"aria-label\"\n>;\n\n/**\n * The slice of `PromptInputEffortProps` a `Composer` owns. `aria-label` stays\n * REQUIRED, exactly as on the primitive: the name of the scale (\"Reasoning\n * effort\", \"Thinking budget\") is as much the consumer's vocabulary as its\n * levels are, so `Composer` has no default to invent either. `defaultValue` is\n * absent for the same reason it is on `ComposerModeProps`.\n */\nexport type ComposerEffortProps = Pick<\n PromptInputEffortProps,\n \"levels\" | \"value\" | \"onValueChange\" | \"aria-label\"\n>;\n\n/**\n * One shortcut-hint row entry: the physical key(s) plus what they do, shown\n * as a `Kbd` chip beside a plain-text label — never inside a control's own\n * name (see `ComposerProps.shortcuts`).\n */\nexport interface ComposerShortcut {\n /** Rendered inside a `Kbd` chip, e.g. `\"Enter\"`, `\"Shift+Enter\"`. */\n keys: string;\n /** What the key does, in a word or two, e.g. `\"send\"`, `\"newline\"`. */\n label: string;\n}\n\nexport interface ComposerProps {\n /** Submit handler — receives the assembled message (text + attachments). */\n onSubmit?: PromptInputProps[\"onSubmit\"];\n /** Textarea placeholder. Default `\"Ask me anything…\"`. */\n placeholder?: string;\n /**\n * Muted status line shown above the input well. Default `\"Awaiting your\n * input\"`. Drive it from chat state (\"Thinking…\", \"Generating…\") or pass\n * `null` to hide the strip entirely.\n */\n status?: ReactNode;\n /**\n * The model control, rendered first in the tools cluster after `attach`.\n * Pass a `<ModelPicker>` from `@elabs-ai/components-ui` (it is sized to sit\n * in a composer footer) — or anything else. Default: nothing renders.\n *\n * This replaces the old `model` prop, which rendered a static, non-interactive\n * pill defaulted to a hard-coded model name. A composer that shows a model\n * name it cannot change is a lie about what the control does; the slot now\n * takes the real picker instead.\n */\n modelPicker?: ReactNode;\n /**\n * App-defined operating mode control — renders a `PromptInputMode` in the\n * tools cluster. Omitted, nothing renders. `brand-ui` ships no mode\n * vocabulary: `modes` is entirely yours.\n */\n mode?: ComposerModeProps;\n /**\n * Ordered reasoning-effort control — renders a `PromptInputEffort` in the\n * tools cluster. Omitted, nothing renders. `levels` is ordered low → high\n * and is entirely yours; `aria-label` names the scale.\n */\n effort?: ComposerEffortProps;\n /**\n * Slash-command palette. When set (and non-empty) the textarea becomes a\n * `PromptInputSlashTextarea` wrapped in a `PromptInputSlash`, so typing `/`\n * at the start of a line opens a filtered command list — nothing else about\n * the composer changes.\n *\n * Note this makes the textarea REACT-CONTROLLED (the palette needs to read\n * and splice the text), which is why `Composer` clears its own copy of the\n * text on submit: `PromptInput`'s `form.reset()` reaches the DOM node, not\n * React state.\n */\n slashCommands?: PromptInputSlashProps[\"commands\"];\n /** Fires with the chosen slash command (alongside the text splice). */\n onSlashCommand?: PromptInputSlashProps[\"onSelect\"];\n /**\n * Override the DEFAULT tool buttons (today: the attach button) — e.g. to add\n * a web-search or connect-data control. Render `PromptInputButton`s /\n * `PromptInputActionMenu` here; when set, `showAttach` is ignored.\n *\n * The explicit `modelPicker` / `mode` / `effort` slots are NOT part of this\n * override — they render after whatever this puts in the cluster, so passing\n * `tools` can never silently swallow a control you asked for by name.\n */\n tools?: ReactNode;\n /** Send-button state, forwarded to `PromptInputSubmit` (ready/submitted/streaming/error). */\n sendStatus?: ComponentProps<typeof PromptInputSubmit>[\"status\"];\n /** Stop handler used while the send button shows the generating state. */\n onStop?: ComponentProps<typeof PromptInputSubmit>[\"onStop\"];\n /**\n * Keyboard-shortcut hints shown as a row beneath the input well — plain\n * `Kbd` + label pairs, e.g. `[{ keys: \"Enter\", label: \"send\" }]`. Omitted,\n * nothing renders (opt-in, like every other Composer slot); the row is\n * never invented, since the real bindings are the host app's.\n */\n shortcuts?: ComposerShortcut[];\n /**\n * A second, busy-only hint appended to `shortcuts` (#107) — shown ONLY\n * once the composer is actually generating (`sendStatus` is `\"submitted\"`\n * or `\"streaming\"`) AND a real `onStop` handler is set, so the hint never\n * describes an affordance that isn't there. Mirrors\n * `TerminalComposer`'s `canCancel = busy && Boolean(onStop)` shape.\n */\n cancelShortcut?: ComposerShortcut;\n /**\n * Extra props spread onto the send button — `disabled`, `aria-label`,\n * `variant`, `id`, `className`. `status` and `onStop` are excluded because\n * `Composer` owns them via `sendStatus` / `onStop` above. (A `data-*` key is\n * not assignable through this object: TypeScript only permits arbitrary\n * `data-*` on a JSX element directly, not on a typed props object. Reach for\n * `id` or `aria-label` as the test hook.)\n *\n * **`disabled` is the one that matters for correctness.** `PromptInput`'s\n * submit handler calls `form.reset()` as soon as it ACCEPTS a submit, so a\n * consumer that refuses the send inside `onSubmit` — an app doing async setup\n * on the first message, say — has already had the textarea cleared and the\n * user's text destroyed, with nothing to restore from. Disabling the control\n * is what actually prevents it: `PromptInputTextarea`'s Enter handler checks\n * `submitControl?.disabled` and bails before `requestSubmit()`, so the Enter\n * path is closed too, not just the click. It holds with a slash palette open\n * as well — the palette's own Enter handling only ever inserts a command.\n *\n * Leave it UNSET rather than passing `false` when you have no opinion —\n * `PromptInputSubmit` resolves `disabled ?? autoDisabled`, so a literal\n * `false` opts out of the library's own empty-composer guard.\n */\n submitProps?: Omit<ComponentProps<typeof PromptInputSubmit>, \"status\" | \"onStop\">;\n /**\n * The two-tone arrangement, forwarded to the `tone` prop of `PromptInput`.\n * `\"surface\"` (default, unchanged) is the original Composer look — an outer\n * `bg-card` frame around the standard muted `PromptInput` well — so every\n * existing usage is unaffected. `\"card\"` swaps to the tinted-outer/\n * distinct-inner \"double card\" (#254): an outer `bg-surface-muted` frame\n * around a `tone=\"card\"` well. The well fill relative to the frame is\n * theme-driven, not universally \"white\" — raised on light themes, recessed\n * on dark; see the `tone` prop doc on `PromptInput`.\n */\n tone?: PromptInputProps[\"tone\"];\n /** Optional suggestion chips rendered beneath the composer. */\n suggestions?: string[];\n /** Click handler for a suggestion chip. */\n onSuggestionClick?: (suggestion: string) => void;\n /** Show the voice button. Default `true`. */\n showVoice?: boolean;\n /** Show the attach button. Default `true`. */\n showAttach?: boolean;\n /** Extra classes for the outer card frame. */\n className?: string;\n}\n\n/**\n * Composer — the standard brand-ui AI chat input.\n *\n * A rounded two-tone \"double card\": a status strip wrapping a recessed\n * `PromptInput` well (sharp top, theme-rounded bottom), a tools cluster,\n * voice, and a circular send. Built on the real `PromptInput`, so it drops\n * into a `ChatShell` footer or stands alone as an empty-state composer. `tone`\n * (default `\"surface\"`, unchanged) picks the arrangement: `\"surface\"` keeps\n * the original outer `bg-card` frame around the standard muted well;\n * `\"card\"` (#254) swaps to an outer `bg-surface-muted` frame around a\n * `tone=\"card\"` well — the well fill is theme-driven (raised on light\n * themes, recessed on dark), not universally white; see the\n * `tone` prop doc on `PromptInput`. Semantic tokens only; theme-aware radii\n * (`rounded-xl` frame / `rounded-b-lg` well); reads in every theme.\n *\n * **Composer is the chat input. Every control the `PromptInput` family ships\n * is reachable from a `Composer` prop; drop to `PromptInput` only for a\n * bespoke shell.** `modelPicker`, `mode`, `effort` and `slashCommands` are the\n * four slots that make that true — they render `ModelPicker`,\n * `PromptInputMode`, `PromptInputEffort` and `PromptInputSlash` respectively,\n * in the footer order `attach · modelPicker · mode · effort │ voice · send`\n * (the same left-to-right arrangement `TerminalComposer` uses, so the chat and\n * console skins agree).\n */\nexport function Composer({\n onSubmit,\n placeholder,\n status = \"Awaiting your input\",\n modelPicker,\n mode,\n effort,\n slashCommands,\n onSlashCommand,\n tools,\n sendStatus,\n onStop,\n submitProps,\n shortcuts,\n cancelShortcut,\n suggestions,\n onSuggestionClick,\n showVoice = true,\n showAttach = true,\n tone = \"surface\",\n className,\n}: ComposerProps) {\n const { t } = useLocale();\n\n // Only read when `slashCommands` is set — the palette needs the live text and\n // a handle on the field to do its caret math. Without it the textarea stays\n // uncontrolled, exactly as before.\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [text, setText] = useState(\"\");\n const hasSlash = slashCommands !== undefined && slashCommands.length > 0;\n\n // #107: \"Composer shortcut hints change with a busy state\" — derived from\n // the existing canonical `sendStatus`, never a second boolean prop. The\n // cancel hint only ever joins the row once there is a real Stop affordance\n // it can describe (mirrors `TerminalComposer`'s `canCancel` derivation).\n const busy = sendStatus === \"submitted\" || sendStatus === \"streaming\";\n const canCancel = busy && Boolean(onStop);\n const allShortcuts = [\n ...(shortcuts ?? []),\n ...(canCancel && cancelShortcut ? [cancelShortcut] : []),\n ];\n\n const handleSubmit = useCallback<PromptInputProps[\"onSubmit\"]>(\n (message, event) => {\n // `PromptInput.handleSubmit` calls `form.reset()`, which clears the DOM\n // node but cannot touch React state — so the slash-mode textarea would\n // keep rendering the sent text straight back. Clearing here is a no-op in\n // the uncontrolled (non-slash) arrangement.\n setText(\"\");\n return onSubmit?.(message, event);\n },\n [onSubmit],\n );\n\n const resolvedPlaceholder = placeholder ?? t(\"ai.composer.placeholder\");\n\n return (\n <div className=\"w-full\">\n <div\n className={cn(\n \"rounded-xl p-1.5 border\",\n tone === \"card\" ? \"bg-surface-muted\" : \"bg-card shadow-sm\",\n className,\n )}\n >\n {/* Muted status strip — sits in the outer frame above the input well. */}\n {status != null ? (\n <div className=\"flex items-center gap-1.5 px-3 py-1.5 text-meta text-muted-foreground\">\n <Sparkles className=\"size-3.5\" aria-hidden=\"true\" />\n <span>{status}</span>\n </div>\n ) : null}\n\n {/* Inner well — sharp top (nests under the strip), theme-rounded bottom. */}\n <PromptInput\n onSubmit={handleSubmit}\n surfaceClassName=\"rounded-t-none rounded-b-lg\"\n tone={tone}\n >\n <PromptInputBody>\n {hasSlash && slashCommands ? (\n <PromptInputSlash\n commands={slashCommands}\n value={text}\n textareaRef={textareaRef}\n onValueChange={(next) => setText(next.text)}\n onSelect={onSlashCommand}\n >\n {/* No `ref` here on purpose: PromptInputSlashTextarea merges the\n palette's own `textareaRef` in for us. */}\n <PromptInputSlashTextarea\n value={text}\n onChange={(event) => setText(event.target.value)}\n placeholder={resolvedPlaceholder}\n />\n </PromptInputSlash>\n ) : (\n <PromptInputTextarea placeholder={resolvedPlaceholder} />\n )}\n </PromptInputBody>\n <PromptInputFooter>\n {/* `flex-wrap` so a full cluster (attach + picker + mode + effort)\n wraps instead of overflowing a narrow composer. */}\n <PromptInputTools className=\"flex-wrap gap-y-1\">\n {tools ??\n (showAttach ? (\n <PromptInputButton tooltip=\"Attach files\">\n <Paperclip className=\"size-4\" />\n </PromptInputButton>\n ) : null)}\n {modelPicker}\n {mode ? <PromptInputMode {...mode} /> : null}\n {effort ? <PromptInputEffort {...effort} /> : null}\n </PromptInputTools>\n <div className=\"flex shrink-0 items-center gap-1\">\n {showVoice ? (\n <PromptInputButton tooltip=\"Voice\">\n <Mic className=\"size-4\" />\n </PromptInputButton>\n ) : null}\n {/* `sendIcon` (not `children`) survives the send↔stop flip: the\n circular ArrowUp shows at rest AND once a follow-up is typed\n during a running turn (#351), while PromptInputSubmit's own\n status glyphs (spinner / stop square / error) still render\n whenever the control IS the Stop action. */}\n <PromptInputSubmit\n status={sendStatus}\n onStop={onStop}\n sendIcon={<ArrowUp className=\"size-4\" />}\n {...submitProps}\n // After the spread so a caller's `className` EXTENDS the round\n // shape instead of replacing it; every other key still wins.\n className={cn(\"rounded-full\", submitProps?.className)}\n />\n </div>\n </PromptInputFooter>\n </PromptInput>\n\n {/* #107: the hint row itself — plain SIBLING `Kbd` + label pairs, never\n nested inside `PromptInputSubmit` (which already names itself via its\n own `aria-label`), so the row cannot pollute any control's accessible\n name (the #153-style trap). */}\n {allShortcuts.length > 0 ? (\n <div\n className=\"flex flex-wrap items-center gap-3 px-3 pt-1.5 text-meta text-muted-foreground\"\n data-slot=\"composer-shortcuts\"\n >\n {allShortcuts.map((shortcut, index) => (\n <span\n className=\"inline-flex items-center gap-1.5\"\n // Shortcut rows are a fixed, non-reorderable list per render —\n // `keys` alone isn't guaranteed unique (a caller could offer the\n // same key for two purposes), so index is a stable, honest key.\n key={index}\n >\n <Kbd>{shortcut.keys}</Kbd>\n <span>{shortcut.label}</span>\n </span>\n ))}\n </div>\n ) : null}\n </div>\n\n {suggestions && suggestions.length > 0 ? (\n <Suggestions className=\"mt-4 justify-center\">\n {suggestions.map((s) => (\n <Suggestion key={s} suggestion={s} onClick={() => onSuggestionClick?.(s)} />\n ))}\n </Suggestions>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from \"@elabs-ai/components-ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@elabs-ai/components-ui\";\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"@elabs-ai/components-ui\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupTextarea,\n} from \"@elabs-ai/components-ui\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@elabs-ai/components-ui\";\nimport { Spinner } from \"@elabs-ai/components-ui\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport type { ChatStatus, FileUIPart, SourceDocumentUIPart } from \"ai\";\nimport { CornerDownLeftIcon, ImageIcon, Monitor, PlusIcon, SquareIcon, XIcon } from \"lucide-react\";\nimport { nanoid } from \"nanoid\";\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ClipboardEventHandler,\n ComponentProps,\n FormEvent,\n FormEventHandler,\n HTMLAttributes,\n KeyboardEventHandler,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n Children,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n // FileReader uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n return new Promise((resolve) => {\n const reader = new FileReader();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onloadend = () => resolve(reader.result as string);\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(blob);\n });\n } catch {\n return null;\n }\n};\n\nconst captureScreenshot = async (): Promise<File | null> => {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getDisplayMedia) {\n return null;\n }\n\n let stream: MediaStream | null = null;\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n audio: false,\n video: true,\n });\n\n video.srcObject = stream;\n\n // Video element uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n await new Promise<void>((resolve, reject) => {\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onloadedmetadata = () => resolve();\n // oxlint-disable-next-line eslint-plugin-unicorn(prefer-add-event-listener)\n video.onerror = () => reject(new Error(\"Failed to load screen stream\"));\n });\n\n await video.play();\n\n const width = video.videoWidth;\n const height = video.videoHeight;\n if (!width || !height) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n\n context.drawImage(video, 0, 0, width, height);\n // canvas.toBlob uses callback-based API, wrapping in Promise is necessary\n // oxlint-disable-next-line eslint-plugin-promise(avoid-new)\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, \"image/png\");\n });\n if (!blob) {\n return null;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replaceAll(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(\"Z\", \"\");\n\n return new File([blob], `screenshot-${timestamp}.png`, {\n lastModified: Date.now(),\n type: \"image/png\",\n });\n } finally {\n if (stream) {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n }\n video.pause();\n video.srcObject = null;\n }\n};\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport interface AttachmentsContext {\n files: (FileUIPart & { id: string })[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n}\n\nexport interface TextInputContext {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n}\n\nexport interface PromptInputControllerProps {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n __registerFileInput: (ref: RefObject<HTMLInputElement | null>, open: () => void) => void;\n}\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(null);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use usePromptInputController().\",\n );\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () => useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error(\n \"Wrap your component inside <PromptInputProvider> to use useProviderAttachments().\",\n );\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () => useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n}>;\n\n/**\n * Optional global provider that lifts PromptInput state outside of PromptInput.\n * If you don't use it, PromptInput stays fully self-managed.\n */\nexport const PromptInputProvider = ({\n initialInput: initialTextInput = \"\",\n children,\n}: PromptInputProviderProps) => {\n // ----- textInput state\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(\"\"), []);\n\n // ----- attachments state (global when wrapped)\n const [attachmentFiles, setAttachmentFiles] = useState<(FileUIPart & { id: string })[]>([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n // oxlint-disable-next-line eslint(no-empty-function)\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = [...files];\n if (incoming.length === 0) {\n return;\n }\n\n setAttachmentFiles((prev) => [\n ...prev,\n ...incoming.map((file) => ({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\" as const,\n url: URL.createObjectURL(file),\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachmentFiles((prev) => {\n const found = prev.find((f) => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((f) => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachmentFiles((prev) => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n // Keep a ref to attachments for cleanup on unmount (avoids stale closure)\n const attachmentsRef = useRef(attachmentFiles);\n\n useEffect(() => {\n attachmentsRef.current = attachmentFiles;\n }, [attachmentFiles]);\n\n // Cleanup blob URLs on unmount to prevent memory leaks\n useEffect(\n () => () => {\n for (const f of attachmentsRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n },\n [],\n );\n\n const openFileDialog = useCallback(() => {\n openRef.current?.();\n }, []);\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear,\n fileInputRef,\n files: attachmentFiles,\n openFileDialog,\n remove,\n }),\n [attachmentFiles, add, remove, clear, openFileDialog],\n );\n\n const __registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n [],\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n __registerFileInput,\n attachments,\n textInput: {\n clear: clearInput,\n setInput: setTextInput,\n value: textInput,\n },\n }),\n [textInput, clearInput, attachments, __registerFileInput],\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>\n {children}\n </ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n};\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\n/**\n * Submit-readiness, lifted into `PromptInput` so the guard and the affordance\n * agree. `handleSubmit` is the invariant (it is reachable via `requestSubmit()`\n * or a consumer's own button); `PromptInputSubmit`'s disabled state is the\n * affordance. Both read `canSubmit` — a live-looking button that does nothing\n * is an accessibility lie, and a guard nobody can see is a dead end.\n */\ninterface PromptInputSubmitStateContextValue {\n /** Non-whitespace text, or at least one attachment. */\n canSubmit: boolean;\n /**\n * INTERNAL — the uncontrolled textarea reports empty↔non-empty transitions.\n * A boolean, so React bails out on identical state and typing does not make\n * an uncontrolled input re-render per keystroke.\n */\n setHasText: (hasText: boolean) => void;\n /**\n * True while at least one `PromptInputStop` is mounted (#351). When a\n * consumer composes a dedicated Stop control, `PromptInputSubmit` never\n * needs to double as Stop — it stays the Send action in every state.\n */\n hasDedicatedStop: boolean;\n /** Registers a mounted `PromptInputStop`; returns its unregister fn. */\n registerStop: () => () => void;\n}\n\nconst PromptInputSubmitStateContext = createContext<PromptInputSubmitStateContextValue | null>(\n null,\n);\n\n/** Optional — `PromptInputSubmit` may legitimately render outside a `PromptInput`. */\nconst useOptionalSubmitState = () => useContext(PromptInputSubmitStateContext);\n\n/** The `data-slot` the Enter handler uses to find the send control. */\nconst SUBMIT_SLOT = \"prompt-input-submit\";\n\nexport const usePromptInputAttachments = () => {\n // Prefer local context (inside PromptInput) as it has validation, fall back to provider\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = local ?? provider;\n if (!context) {\n throw new Error(\n \"usePromptInputAttachments must be used within a PromptInput or PromptInputProvider\",\n );\n }\n return context;\n};\n\n// ============================================================================\n// Referenced Sources (Local to PromptInput)\n// ============================================================================\n\nexport interface ReferencedSourcesContext {\n sources: (SourceDocumentUIPart & { id: string })[];\n add: (sources: SourceDocumentUIPart[] | SourceDocumentUIPart) => void;\n remove: (id: string) => void;\n clear: () => void;\n}\n\nexport const LocalReferencedSourcesContext = createContext<ReferencedSourcesContext | null>(null);\n\nexport const usePromptInputReferencedSources = () => {\n const ctx = useContext(LocalReferencedSourcesContext);\n if (!ctx) {\n throw new Error(\n \"usePromptInputReferencedSources must be used within a LocalReferencedSourcesContext.Provider\",\n );\n }\n return ctx;\n};\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = \"Add photos or files\",\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n (e: Event) => {\n e.preventDefault();\n attachments.openFileDialog();\n },\n [attachments],\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <ImageIcon className=\"me-2 size-4\" /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputActionAddScreenshotProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddScreenshot = ({\n label = \"Take screenshot\",\n onSelect,\n ...props\n}: PromptInputActionAddScreenshotProps) => {\n const attachments = usePromptInputAttachments();\n\n const handleSelect = useCallback(\n async (event: Event) => {\n onSelect?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n try {\n const screenshot = await captureScreenshot();\n if (screenshot) {\n attachments.add([screenshot]);\n }\n } catch (error) {\n if (\n error instanceof DOMException &&\n (error.name === \"NotAllowedError\" || error.name === \"AbortError\")\n ) {\n return;\n }\n throw error;\n }\n },\n [onSelect, attachments],\n );\n\n return (\n <DropdownMenuItem {...props} onSelect={handleSelect}>\n <Monitor className=\"me-2 size-4\" />\n {label}\n </DropdownMenuItem>\n );\n};\n\nexport interface PromptInputMessage {\n text: string;\n files: FileUIPart[];\n}\n\nexport type PromptInputProps = Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\" | \"onError\"> & {\n // e.g., \"image/*\" or leave undefined for any\n accept?: string;\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n // bytes\n maxFileSize?: number;\n /**\n * The fill of the inner well (the `InputGroup` `variant`). `\"surface\"`\n * (default) is the standard muted composer look; `\"card\"` renders a\n * `bg-card` well for nesting inside an already-tinted outer frame — the\n * \"double card\" look (#254). e.g.\n * `<div className=\"rounded-xl bg-surface-muted p-1.5\"><PromptInput tone=\"card\">…</PromptInput></div>`.\n * The well fill is NOT universally \"white\": `--card` reads lighter\n * (raised) than `--surface-muted` on light themes, but darker (recessed) on\n * dark — the same theme-dependent trade-off documented\n * for `bg-surface-muted`-as-a-well in `styling-and-tokens.md`. The well\n * stays a legible, distinct tone against the outer frame in every theme;\n * only the \"raised\" framing is light-themes-specific.\n */\n tone?: \"surface\" | \"card\";\n onError?: (err: { code: \"max_files\" | \"max_file_size\" | \"accept\"; message: string }) => void;\n onSubmit: (\n message: PromptInputMessage,\n event: FormEvent<HTMLFormElement>,\n ) => void | Promise<void>;\n /**\n * Classes for the inner surface (the visible `InputGroup` well), e.g. to shape\n * its corners. `className` styles the outer `<form>`; this styles the well —\n * the only way to reach it from outside (used by `Composer`).\n */\n surfaceClassName?: string;\n};\n\nexport const PromptInput = ({\n className,\n surfaceClassName,\n tone = \"surface\",\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n onError,\n onSubmit,\n children,\n ...props\n}: PromptInputProps) => {\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = !!controller;\n\n // Microcopy goes through the locale seam. `useLocale` is provider-optional —\n // with no <LocaleProvider> it returns the shipped English defaults, so this is\n // not a breaking change and needs no ancestor. See ADR 0017.\n const { t } = useLocale();\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n const files = usingProvider ? controller.attachments.files : items;\n\n // ----- Submit readiness (drives both the guard and the disabled affordance)\n const [hasLocalText, setHasLocalText] = useState(false);\n const hasText = usingProvider ? controller.textInput.value.trim().length > 0 : hasLocalText;\n\n // ----- Dedicated Stop control registration (#351 — the composed \"separate\"\n // arrangement). A ref counter tolerates >1 mounted PromptInputStop; the\n // boolean state is what's actually read, so React bails out on identical\n // values the same way `setHasText` does.\n const [hasDedicatedStop, setHasDedicatedStop] = useState(false);\n const stopCountRef = useRef(0);\n const registerStop = useCallback(() => {\n stopCountRef.current += 1;\n setHasDedicatedStop(true);\n return () => {\n stopCountRef.current = Math.max(0, stopCountRef.current - 1);\n if (stopCountRef.current === 0) {\n setHasDedicatedStop(false);\n }\n };\n }, []);\n\n // ----- Local referenced sources (always local to PromptInput)\n const [referencedSources, setReferencedSources] = useState<\n (SourceDocumentUIPart & { id: string })[]\n >([]);\n\n // Keep a ref to files for cleanup on unmount (avoids stale closure)\n const filesRef = useRef(files);\n\n useEffect(() => {\n filesRef.current = files;\n }, [files]);\n\n const openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === \"\") {\n return true;\n }\n\n const patterns = accept\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return patterns.some((pattern) => {\n if (pattern.endsWith(\"/*\")) {\n // e.g: image/* -> image/\n const prefix = pattern.slice(0, -1);\n return f.type.startsWith(prefix);\n }\n return f.type === pattern;\n });\n },\n [accept],\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: t(\"ai.promptInput.errorAccept\"),\n });\n return;\n }\n const withinSize = (f: File) => (maxFileSize ? f.size <= maxFileSize : true);\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: t(\"ai.promptInput.errorMaxFileSize\"),\n });\n return;\n }\n\n setItems((prev) => {\n const capacity =\n typeof maxFiles === \"number\" ? Math.max(0, maxFiles - prev.length) : undefined;\n const capped = typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: t(\"ai.promptInput.errorMaxFiles\"),\n });\n }\n const next: (FileUIPart & { id: string })[] = [];\n for (const file of capped) {\n next.push({\n filename: file.name,\n id: nanoid(),\n mediaType: file.type,\n type: \"file\",\n url: URL.createObjectURL(file),\n });\n }\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, maxFileSize, onError],\n );\n\n const removeLocal = useCallback(\n (id: string) =>\n setItems((prev) => {\n const found = prev.find((file) => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter((file) => file.id !== id);\n }),\n [],\n );\n\n // Wrapper that validates files before calling provider's add\n const addWithProviderValidation = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter((f) => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: \"accept\",\n message: t(\"ai.promptInput.errorAccept\"),\n });\n return;\n }\n const withinSize = (f: File) => (maxFileSize ? f.size <= maxFileSize : true);\n const sized = accepted.filter(withinSize);\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: \"max_file_size\",\n message: t(\"ai.promptInput.errorMaxFileSize\"),\n });\n return;\n }\n\n const currentCount = files.length;\n const capacity =\n typeof maxFiles === \"number\" ? Math.max(0, maxFiles - currentCount) : undefined;\n const capped = typeof capacity === \"number\" ? sized.slice(0, capacity) : sized;\n if (typeof capacity === \"number\" && sized.length > capacity) {\n onError?.({\n code: \"max_files\",\n message: t(\"ai.promptInput.errorMaxFiles\"),\n });\n }\n\n if (capped.length > 0) {\n controller?.attachments.add(capped);\n }\n },\n [matchesAccept, maxFileSize, maxFiles, onError, files.length, controller],\n );\n\n const clearAttachments = useCallback(\n () =>\n usingProvider\n ? controller?.attachments.clear()\n : setItems((prev) => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n }),\n [usingProvider, controller],\n );\n\n const clearReferencedSources = useCallback(() => setReferencedSources([]), []);\n\n const add = usingProvider ? addWithProviderValidation : addLocal;\n const remove = usingProvider ? controller.attachments.remove : removeLocal;\n const openFileDialog = usingProvider\n ? controller.attachments.openFileDialog\n : openFileDialogLocal;\n\n const clear = useCallback(() => {\n clearAttachments();\n clearReferencedSources();\n }, [clearAttachments, clearReferencedSources]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider) {\n return;\n }\n controller.__registerFileInput(inputRef, () => inputRef.current?.click());\n }, [usingProvider, controller]);\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = \"\";\n }\n }, [files, syncHiddenInput]);\n\n // Attach drop handlers on nearest form and document (opt-in)\n useEffect(() => {\n const form = formRef.current;\n if (!form) {\n return;\n }\n if (globalDrop) {\n // when global drop is on, let the document-level handler own drops\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n form.addEventListener(\"dragover\", onDragOver);\n form.addEventListener(\"drop\", onDrop);\n return () => {\n form.removeEventListener(\"dragover\", onDragOver);\n form.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(() => {\n if (!globalDrop) {\n return;\n }\n\n const onDragOver = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n };\n const onDrop = (e: DragEvent) => {\n if (e.dataTransfer?.types?.includes(\"Files\")) {\n e.preventDefault();\n }\n if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n add(e.dataTransfer.files);\n }\n };\n document.addEventListener(\"dragover\", onDragOver);\n document.addEventListener(\"drop\", onDrop);\n return () => {\n document.removeEventListener(\"dragover\", onDragOver);\n document.removeEventListener(\"drop\", onDrop);\n };\n }, [add, globalDrop]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of filesRef.current) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n }\n },\n [usingProvider],\n );\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n if (event.currentTarget.files) {\n add(event.currentTarget.files);\n }\n // Reset input value to allow selecting files that were previously removed\n event.currentTarget.value = \"\";\n },\n [add],\n );\n\n const attachmentsCtx = useMemo<AttachmentsContext>(\n () => ({\n add,\n clear: clearAttachments,\n fileInputRef: inputRef,\n files: files.map((item) => ({ ...item, id: item.id })),\n openFileDialog,\n remove,\n }),\n [files, add, remove, clearAttachments, openFileDialog],\n );\n\n const submitState = useMemo<PromptInputSubmitStateContextValue>(\n () => ({\n canSubmit: hasText || files.length > 0,\n hasDedicatedStop,\n registerStop,\n setHasText: setHasLocalText,\n }),\n [hasText, files.length, hasDedicatedStop, registerStop],\n );\n\n const refsCtx = useMemo<ReferencedSourcesContext>(\n () => ({\n add: (incoming: SourceDocumentUIPart[] | SourceDocumentUIPart) => {\n const array = Array.isArray(incoming) ? incoming : [incoming];\n setReferencedSources((prev) => [...prev, ...array.map((s) => ({ ...s, id: nanoid() }))]);\n },\n clear: clearReferencedSources,\n remove: (id: string) => {\n setReferencedSources((prev) => prev.filter((s) => s.id !== id));\n },\n sources: referencedSources,\n }),\n [referencedSources, clearReferencedSources],\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n async (event) => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text = usingProvider\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n return (formData.get(\"message\") as string) || \"\";\n })();\n\n // Nothing to send: no text AND no attachments. This runs BEFORE the reset\n // below — a later guard would still have wiped the composer. Only the\n // guard trims; the untrimmed `text` still reaches `onSubmit`, preserving\n // the existing payload semantics. An attachments-only submit (no text) is\n // legitimate and must still go through.\n if (text.trim().length === 0 && files.length === 0) {\n return;\n }\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n // `form.reset()` fires no change event, so tell the submit affordance.\n setHasLocalText(false);\n }\n\n try {\n // Convert blob URLs to data URLs asynchronously\n const convertedFiles: FileUIPart[] = await Promise.all(\n files.map(async ({ id: _id, ...item }) => {\n if (item.url?.startsWith(\"blob:\")) {\n const dataUrl = await convertBlobUrlToDataUrl(item.url);\n // If conversion failed, keep the original blob URL\n return {\n ...item,\n url: dataUrl ?? item.url,\n };\n }\n return item;\n }),\n );\n\n const result = onSubmit({ files: convertedFiles, text }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear inputs\n clear();\n if (usingProvider) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n },\n [usingProvider, controller, files, onSubmit, clear],\n );\n\n // Render with or without local provider\n const inner = (\n <>\n <input\n accept={accept}\n aria-label={t(\"ai.promptInput.uploadFiles\")}\n className=\"hidden\"\n multiple={multiple}\n onChange={handleChange}\n ref={inputRef}\n title={t(\"ai.promptInput.uploadFiles\")}\n type=\"file\"\n />\n <form className={cn(\"w-full\", className)} onSubmit={handleSubmit} ref={formRef} {...props}>\n {/* The composer is a soft fill + focus ring, not a hard box (#194,\n research 02 §3a BTN-3 / 08 §C.1): the chat footer already draws a\n `border-t` (chat-shell.tsx), so the box border was redundant. */}\n <InputGroup variant={tone} className={cn(\"overflow-hidden\", surfaceClassName)}>\n {children}\n </InputGroup>\n </form>\n </>\n );\n\n const withReferencedSources = (\n <LocalReferencedSourcesContext.Provider value={refsCtx}>\n <PromptInputSubmitStateContext.Provider value={submitState}>\n {inner}\n </PromptInputSubmitStateContext.Provider>\n </LocalReferencedSourcesContext.Provider>\n );\n\n // Always provide LocalAttachmentsContext so children get validated add function\n return (\n <LocalAttachmentsContext.Provider value={attachmentsCtx}>\n {withReferencedSources}\n </LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({ className, ...props }: PromptInputBodyProps) => (\n <div className={cn(\"contents\", className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<typeof InputGroupTextarea>;\n\nexport const PromptInputTextarea = ({\n onChange,\n onKeyDown,\n className,\n placeholder,\n ...props\n}: PromptInputTextareaProps) => {\n const { t } = useLocale();\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const submitState = useOptionalSubmitState();\n const [isComposing, setIsComposing] = useState(false);\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n (e) => {\n // Call the external onKeyDown handler first\n onKeyDown?.(e);\n\n // If the external handler prevented default, don't run internal logic\n if (e.defaultPrevented) {\n return;\n }\n\n if (e.key === \"Enter\") {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n if (e.shiftKey) {\n return;\n }\n e.preventDefault();\n\n // Don't submit when the send control is unavailable. Query by data-slot,\n // NOT `button[type=\"submit\"]`: PromptInputSubmit flips to type=\"button\"\n // while generating, so the old selector matched nothing mid-stream and\n // `null?.disabled` (undefined, falsy) let Enter send a second message.\n const { form } = e.currentTarget;\n const submitControl = form?.querySelector<HTMLButtonElement>(\n `[data-slot=\"${SUBMIT_SLOT}\"]`,\n );\n // `data-action` is the current contract (#351): \"stop\" blocks Enter,\n // \"send\" (including the running+typed flip) lets it through. Fall back\n // to the older `data-generating` flag for a consumer-supplied control\n // that still only sets that attribute.\n const action =\n submitControl?.dataset.action ??\n (submitControl?.dataset.generating === \"true\" ? \"stop\" : undefined);\n // `aria-disabled` is checked alongside the real `disabled` property: the\n // resting empty-composer state marks the control aria-disabled so it stays\n // FOCUSABLE (a real `disabled` button is skipped by the tab order and\n // announces nothing), while a consumer-supplied `disabled` is a genuine\n // DOM disable. Enter must be refused for both.\n if (\n submitControl?.disabled ||\n submitControl?.getAttribute(\"aria-disabled\") === \"true\" ||\n action === \"stop\"\n ) {\n return;\n }\n\n form?.requestSubmit();\n }\n\n // Remove last attachment when Backspace is pressed and textarea is empty\n if (e.key === \"Backspace\" && e.currentTarget.value === \"\" && attachments.files.length > 0) {\n e.preventDefault();\n const lastAttachment = attachments.files.at(-1);\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n },\n [onKeyDown, isComposing, attachments],\n );\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n (event) => {\n const items = event.clipboardData?.items;\n\n if (!items) {\n return;\n }\n\n const files: File[] = [];\n\n for (const item of items) {\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n },\n [attachments],\n );\n\n const handleCompositionEnd = useCallback(() => setIsComposing(false), []);\n const handleCompositionStart = useCallback(() => setIsComposing(true), []);\n\n const controlledProps = controller\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n controller.textInput.setInput(e.currentTarget.value);\n onChange?.(e);\n },\n value: controller.textInput.value,\n }\n : {\n // Uncontrolled: report only the empty↔non-empty transition so the submit\n // affordance can enable/disable. Boolean state ⇒ React bails out on\n // identical values, so this stays cheap per keystroke.\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => {\n submitState?.setHasText(e.currentTarget.value.trim().length > 0);\n onChange?.(e);\n },\n };\n\n return (\n <InputGroupTextarea\n className={cn(\"field-sizing-content max-h-48 min-h-10\", className)}\n name=\"message\"\n onCompositionEnd={handleCompositionEnd}\n onCompositionStart={handleCompositionStart}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder ?? t(\"ai.promptInput.placeholder\")}\n {...props}\n {...controlledProps}\n />\n );\n};\n\nexport type PromptInputHeaderProps = Omit<ComponentProps<typeof InputGroupAddon>, \"align\">;\n\nexport const PromptInputHeader = ({ className, ...props }: PromptInputHeaderProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"order-first flex-wrap gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputFooterProps = Omit<ComponentProps<typeof InputGroupAddon>, \"align\">;\n\nexport const PromptInputFooter = ({ className, ...props }: PromptInputFooterProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\"justify-between gap-1\", className)}\n {...props}\n />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({ className, ...props }: PromptInputToolsProps) => (\n <div className={cn(\"flex min-w-0 items-center gap-1\", className)} {...props} />\n);\n\nexport type PromptInputButtonTooltip =\n | string\n | {\n content: ReactNode;\n shortcut?: string;\n side?: ComponentProps<typeof TooltipContent>[\"side\"];\n };\n\nexport type PromptInputButtonProps = ComponentProps<typeof InputGroupButton> & {\n tooltip?: PromptInputButtonTooltip;\n};\n\n/**\n * True when `node` renders any visible text (a non-blank string/number node,\n * at any nesting depth) rather than icon-only content (bare SVGs/icon\n * components). Adapts the same \"inspect the children's shape\" notion the\n * size heuristic below uses (`Children.count(...) > 1`) to the question that\n * actually matters for the accessible name: is there a visible label already,\n * not merely how many top-level children there are.\n */\nconst hasVisibleText = (node: ReactNode): boolean => {\n if (typeof node === \"string\" || typeof node === \"number\") {\n return String(node).trim().length > 0;\n }\n if (Array.isArray(node)) {\n return node.some(hasVisibleText);\n }\n if (isValidElement<{ children?: ReactNode }>(node)) {\n return hasVisibleText(node.props.children);\n }\n return false;\n};\n\nexport const PromptInputButton = ({\n variant = \"ghost\",\n className,\n size,\n tooltip,\n \"aria-label\": ariaLabelProp,\n ...props\n}: PromptInputButtonProps) => {\n const newSize = size ?? (Children.count(props.children) > 1 ? \"sm\" : \"icon-sm\");\n\n const tooltipContent = tooltip\n ? typeof tooltip === \"string\"\n ? tooltip\n : tooltip.content\n : undefined;\n\n // Icon-only buttons (Attach, Voice, …) commonly carry ONLY a tooltip and no\n // visible text, so the tooltip is the only description of what the button\n // does — default the accessible name to it. A button that already has a\n // VISIBLE TEXT label must NOT have that label replaced by the tooltip (WCAG\n // 2.5.3 Label in Name) — the derived name is opt-in to icon-only buttons\n // only. An explicit, DEFINED `aria-label` still wins over the derived\n // default; an explicitly-passed `aria-label={undefined}` must NOT clobber\n // it, so we pull `aria-label` out of `props` above (it is applied, as the\n // final computed value, AFTER the `{...props}` spread below — the spread\n // can no longer reintroduce the `undefined` key over it).\n const isIconOnly = !hasVisibleText(props.children);\n const ariaLabel =\n ariaLabelProp ??\n (isIconOnly && typeof tooltipContent === \"string\" ? tooltipContent : undefined);\n\n const button = (\n <InputGroupButton\n className={cn(className)}\n size={newSize}\n type=\"button\"\n variant={variant}\n {...props}\n aria-label={ariaLabel}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n const shortcut = typeof tooltip === \"string\" ? undefined : tooltip.shortcut;\n const side = typeof tooltip === \"string\" ? \"top\" : (tooltip.side ?? \"top\");\n\n // Self-provide so the button works anywhere — a consumer rendering a bare\n // composer (a block, a story) shouldn't have to remember to mount a global\n // TooltipProvider. Mirrors the ThemeSwitcher self-provision convention.\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side={side}>\n {tooltipContent}\n {shortcut && <span className=\"ms-2 text-muted-foreground\">{shortcut}</span>}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu>;\nexport const PromptInputActionMenu = (props: PromptInputActionMenuProps) => (\n <DropdownMenu {...props} />\n);\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n ...props\n}: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={className} {...props}>\n {children ?? <PlusIcon className=\"size-4\" />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<typeof DropdownMenuContent>;\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<typeof DropdownMenuItem>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => <DropdownMenuItem className={cn(className)} {...props} />;\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\n/**\n * Which action the merged primary control currently performs (#351). The\n * component owns the AFFORDANCE only — it always invokes `onSubmit` (via the\n * normal form submit) once the action is \"send\", never `onStop`. What a\n * mid-turn submit MEANS (queued, interleaved, dropped) is entirely up to the\n * app's own `onSubmit`/runtime — brand-ui asserts nothing about that (D5).\n */\nexport type PromptInputSubmitAction = \"send\" | \"stop\";\n\nexport type PromptInputSubmitProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop?: () => void;\n /**\n * Glyph for the SEND action only — survives the send↔stop flip, so a\n * consumer's resting glyph (e.g. `Composer`'s circular arrow) is no longer\n * lost while generating with a non-empty composer. Prefer this over\n * `children`.\n */\n sendIcon?: ReactNode;\n /**\n * @deprecated Replaces the glyph for **every** status — ready, submitted,\n * streaming AND error — which is why generating/error affordances can\n * disappear even though the control is still live. Prefer `sendIcon`,\n * which only ever replaces the resting Send glyph.\n */\n children?: ReactNode;\n};\n\n/**\n * Merged primary-action contract (#351):\n * 1. `ready`/`undefined`/`error` → **Send** (unchanged).\n * 2. `submitted`/`streaming` + composer EMPTY → **Stop** (unchanged).\n * 3. `submitted`/`streaming` + composer NON-EMPTY → **Send** (the fix — a\n * follow-up can always be composed and submitted mid-turn).\n * 4. A `PromptInputStop` mounted alongside → this control is ALWAYS Send;\n * the dedicated control owns stopping (the composed \"separate\" shape).\n */\nexport const PromptInputSubmit = ({\n className,\n variant = \"default\",\n size = \"icon-sm\",\n status,\n onStop,\n onClick,\n children,\n sendIcon,\n disabled,\n ...props\n}: PromptInputSubmitProps) => {\n const { t } = useLocale();\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n const submitState = useOptionalSubmitState();\n\n const action: PromptInputSubmitAction =\n isGenerating && !submitState?.canSubmit && !submitState?.hasDedicatedStop ? \"stop\" : \"send\";\n\n // Auto-disable only the Send action at rest, and only inside a PromptInput\n // (a standalone submit has no context and keeps working). `error` must stay\n // clickable to retry, and the Stop action is never auto-disabled. An\n // explicit `disabled` prop always wins.\n //\n // NOTE this drives `aria-disabled`, not the native attribute — see the render.\n const autoDisabled =\n action === \"send\" && status !== \"error\" && submitState ? !submitState.canSubmit : false;\n\n let Icon = sendIcon ?? <CornerDownLeftIcon className=\"size-4\" data-rtl-flip />;\n\n if (action === \"stop\") {\n Icon = status === \"submitted\" ? <Spinner /> : <SquareIcon className=\"size-4\" />;\n } else if (status === \"error\") {\n Icon = <XIcon className=\"size-4\" />;\n }\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n // `aria-disabled` (see the render) does not block activation the way the\n // native attribute does, so the handler has to.\n if (autoDisabled) {\n e.preventDefault();\n return;\n }\n if (action === \"stop\" && onStop) {\n e.preventDefault();\n onStop();\n return;\n }\n onClick?.(e);\n },\n [autoDisabled, action, onStop, onClick],\n );\n\n return (\n <InputGroupButton\n aria-label={action === \"stop\" ? t(\"ai.promptInput.stop\") : t(\"ai.promptInput.submit\")}\n /*\n * `aria-disabled`, NOT the native `disabled` attribute, for the RESTING\n * empty-composer state.\n *\n * Two reasons. (1) A focused control that becomes natively disabled is\n * removed from the focus order by the HTML focus-fixup rule, so focus\n * drops to <body> — after every keyboard-initiated send, since the\n * composer clears and the button goes not-ready in the same commit. That\n * silently strands keyboard and screen-reader users mid-conversation.\n * (2) `interaction-guidelines.md` says a submit stays enabled until the\n * request starts; aria-disabled keeps it a real, focusable tab stop that\n * still announces its state, while `handleClick` + `handleSubmit` do the\n * actual blocking.\n *\n * An explicit `disabled` prop is still honoured natively — that is the\n * consumer deliberately taking the control out of the tab order.\n */\n aria-disabled={autoDisabled || undefined}\n className={cn(autoDisabled && \"cursor-not-allowed opacity-50 hover:bg-primary\", className)}\n data-action={action}\n data-generating={action === \"stop\" ? \"true\" : undefined}\n data-slot={SUBMIT_SLOT}\n disabled={disabled}\n onClick={handleClick}\n size={size}\n type={autoDisabled || (action === \"stop\" && onStop) ? \"button\" : \"submit\"}\n variant={variant}\n {...props}\n >\n {children ?? (\n <span\n key={`${status ?? \"ready\"}-${action}`}\n className=\"flex animate-in fade-in-0 zoom-in-95 duration-fast ease-entrance\"\n >\n {Icon}\n </span>\n )}\n </InputGroupButton>\n );\n};\n\n/** The `data-slot` `PromptInputStop` renders with. */\nconst STOP_SLOT = \"prompt-input-stop\";\n\nexport type PromptInputStopProps = ComponentProps<typeof InputGroupButton> & {\n status?: ChatStatus;\n onStop: () => void;\n /** Glyph override; defaults to a square Stop icon. */\n children?: ReactNode;\n};\n\n/**\n * A dedicated Stop control — the composed answer to \"two buttons\" (#351;\n * never a `mode` prop, per `component-api.md`'s ban on behavioural-mode\n * props). Renders `null` unless the turn is running (`status` is `submitted`\n * or `streaming`). While at least one `PromptInputStop` is mounted inside the\n * same `PromptInput`, `PromptInputSubmit` stays the Send action in every\n * state — the dedicated control owns stopping instead.\n */\nexport const PromptInputStop = ({\n className,\n variant = \"outline\",\n size = \"icon-sm\",\n status,\n onStop,\n onClick,\n children,\n ...props\n}: PromptInputStopProps) => {\n const { t } = useLocale();\n const submitState = useOptionalSubmitState();\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n useEffect(() => {\n const unregister = submitState?.registerStop();\n return unregister;\n }, [submitState]);\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (e.defaultPrevented) {\n return;\n }\n onStop();\n },\n [onClick, onStop],\n );\n\n if (!isGenerating) {\n return null;\n }\n\n return (\n <InputGroupButton\n aria-label={t(\"ai.promptInput.stop\")}\n className={cn(className)}\n data-slot={STOP_SLOT}\n onClick={handleClick}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children ?? <SquareIcon className=\"size-4\" />}\n </InputGroupButton>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => <Select {...props} />;\n\nexport type PromptInputSelectTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const PromptInputSelectTrigger = ({\n className,\n ...props\n}: PromptInputSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n \"border-none bg-transparent font-medium text-muted-foreground shadow-none transition-colors\",\n \"hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground\",\n className,\n )}\n {...props}\n />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<typeof SelectContent>;\n\nexport const PromptInputSelectContent = ({\n className,\n ...props\n}: PromptInputSelectContentProps) => <SelectContent className={cn(className)} {...props} />;\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({ className, ...props }: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({ className, ...props }: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<typeof HoverCardTrigger>;\n\nexport const PromptInputHoverCardTrigger = (props: PromptInputHoverCardTriggerProps) => (\n <HoverCardTrigger {...props} />\n);\n\nexport type PromptInputHoverCardContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const PromptInputHoverCardContent = ({\n align = \"start\",\n ...props\n}: PromptInputHoverCardContentProps) => <HoverCardContent align={align} {...props} />;\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({ className, ...props }: PromptInputTabsListProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({ className, ...props }: PromptInputTabProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({ className, ...props }: PromptInputTabLabelProps) => (\n // Content provided via children in props\n // oxlint-disable-next-line eslint-plugin-jsx-a11y(heading-has-content)\n <h3 className={cn(\"mb-2 px-3 font-medium text-muted-foreground text-xs\", className)} {...props} />\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({ className, ...props }: PromptInputTabBodyProps) => (\n <div className={cn(\"space-y-1\", className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({ className, ...props }: PromptInputTabItemProps) => (\n <div\n className={cn(\"flex items-center gap-2 px-3 py-2 text-xs hover:bg-accent\", className)}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({ className, ...props }: PromptInputCommandProps) => (\n <Command className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({ className, ...props }: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({ className, ...props }: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({ className, ...props }: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({ className, ...props }: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\n/**\n * A selectable row inside `PromptInputCommand` (e.g. an `@`-mention popup).\n *\n * `id`/`role`/`aria-selected` are assigned internally by the `cmdk` dependency\n * itself — one layer below this wrapper and below `@elabs-ai/components-ui`'s\n * own `CommandItem` — and applied AFTER any props you pass, so a\n * consumer-supplied `id`/`role`/`aria-selected` is silently overridden\n * (`CommandItem` warns about this in development; #365).\n *\n * To wire `aria-activedescendant` from an input rendered OUTSIDE this\n * `PromptInputCommand` tree (the composer textarea driving the popup), use\n * `PromptInputCommand`'s `onActiveItemIdChange` callback (inherited from\n * `@elabs-ai/components-ui`'s `Command`, since `PromptInputCommandProps =\n * ComponentProps<typeof Command>`) instead of reading the id back\n * positionally from the DOM:\n *\n * ```tsx\n * const [activeId, setActiveId] = useState<string>();\n * <textarea role=\"combobox\" aria-expanded={open} aria-controls={listId}\n * aria-activedescendant={activeId} />\n * <PromptInputCommand onActiveItemIdChange={setActiveId}>…</PromptInputCommand>\n * ```\n */\nexport const PromptInputCommandItem = ({ className, ...props }: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const PromptInputCommandSeparator = ({\n className,\n ...props\n}: PromptInputCommandSeparatorProps) => <CommandSeparator className={cn(className)} {...props} />;\n","\"use client\";\n\nimport { forwardRef, type HTMLAttributes } from \"react\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport {\n RadioGroup,\n RadioGroupItem,\n cn,\n effortRungForIndex,\n type EffortLevel,\n} from \"@elabs-ai/components-ui\";\n\n// `EffortLevel` and the growing-square size ramp (`effortRungForIndex`,\n// formerly this file's private `SIZE_RUNGS`/`rungForIndex`) moved to\n// `@elabs-ai/components-ui` (`lib/operating-mode.ts`) — the terminal CLI\n// look-alike family's own effort chips (issue #117) reuse the same\n// vocabulary shape, and `@elabs-ai/components-ai`/\n// `@elabs-ai/components-terminal` are layer-2 DAG siblings that may not\n// import each other (T0; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n// above; NOT re-exported from here — a consumer imports `EffortLevel` from\n// `@elabs-ai/components-ui`.\n\nexport type PromptInputEffortProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> & {\n /** Ordered low → high. The order IS the semantics — render in this order. */\n levels: EffortLevel[];\n /** Controlled selected level id. Omit for the uncontrolled default (`levels[0]`). */\n value?: string;\n /** Fires with the chosen level's id. */\n onValueChange?: (id: string) => void;\n /**\n * Accessible name for the whole scale (e.g. \"Reasoning effort\", \"Thinking\n * budget\") — required because the NAME of the scale is as much the\n * consumer's vocabulary as its levels are; this component has no default\n * to fall back to.\n */\n \"aria-label\": string;\n};\n\n/**\n * PromptInputEffort — an ORDERED reasoning-effort/budget control.\n *\n * Renders `levels` as a row of same-shape squares that GROW in size, low to\n * high — the size ramp encodes the order on its own, before any selection is\n * made. Selecting a level fills every square up to and including it (solid\n * fill + coloured border) and leaves the rest hollow (outline only): the\n * indicator's FILL is the second, non-colour channel required by a\n * greyscale-legibility read — the size ramp and the solid/hollow shape both\n * survive a greyscale render, so the level is recoverable without colour.\n * The current level's name is additionally rendered as text.\n *\n * Built on Radix (`RadioGroup`/`RadioGroupItem` from `@elabs-ai/components-ui`,\n * `role=\"radiogroup\"` of `role=\"radio\"`s) for arrow-key navigation, roving\n * focus and an accessible-name announcement on the checked item — no\n * hand-rolled key handling.\n */\nexport const PromptInputEffort = forwardRef<HTMLDivElement, PromptInputEffortProps>(\n function PromptInputEffort(\n { levels, value, onValueChange, className, \"aria-label\": ariaLabel, ...props },\n ref,\n ) {\n const [selected, setSelected] = useControllableState<string>({\n defaultProp: levels[0]?.id ?? \"\",\n onChange: onValueChange,\n prop: value,\n });\n\n const handleChange = (next: string) => {\n if (!next) return;\n setSelected(next);\n };\n\n const currentIndex = levels.findIndex((level) => level.id === selected);\n const current = currentIndex >= 0 ? levels[currentIndex] : levels[0];\n\n return (\n <div\n ref={ref}\n data-slot=\"prompt-input-effort\"\n className={cn(\"inline-flex items-center gap-2\", className)}\n {...props}\n >\n <RadioGroup\n value={selected}\n onValueChange={handleChange}\n orientation=\"horizontal\"\n aria-label={ariaLabel}\n data-slot=\"prompt-input-effort-scale\"\n className=\"flex items-end gap-1\"\n >\n {levels.map((level, index) => {\n const filled = currentIndex >= 0 && index <= currentIndex;\n return (\n // The visible bar (`-visual`) and the click/tap/focus target\n // (the radio itself) are decoupled (WCAG 2.5.8, #161): the\n // radio's authored size IS the ramp's meaning, so it can't\n // simply grow to 24px without flattening the ramp. Instead the\n // radio is stretched to fill this `size-6` (24px) frame —\n // invisible, but a real >=24x24 hit box — while a separate,\n // `aria-hidden` sibling paints the small bar at its authored\n // `effortRungForIndex` size. Both are bottom-flush + centered\n // so the radio's own checked-state indicator still lands on\n // (and stays invisible against) the visible bar, exactly as\n // when the radio painted the bar directly.\n <span\n key={level.id}\n data-slot=\"prompt-input-effort-item-frame\"\n className=\"relative inline-flex size-6 shrink-0 items-end justify-center\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"prompt-input-effort-item-visual\"\n className={cn(\n effortRungForIndex(index, levels.length),\n \"rounded-sm border\",\n filled ? \"border-primary bg-primary\" : \"border-border-strong bg-transparent\",\n )}\n />\n <RadioGroupItem\n value={level.id}\n aria-label={level.label}\n data-slot=\"prompt-input-effort-item\"\n data-filled={filled ? \"true\" : \"false\"}\n className=\"absolute inset-0 flex size-full items-end justify-center rounded-sm border-0 bg-transparent p-0 shadow-none\"\n />\n </span>\n );\n })}\n </RadioGroup>\n <span className=\"text-body\" data-slot=\"prompt-input-effort-label\">\n {current?.label}\n </span>\n </div>\n );\n },\n);\n","\"use client\";\n\nimport { forwardRef, useId, type HTMLAttributes } from \"react\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { ChevronDown } from \"lucide-react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuTrigger,\n Kbd,\n cn,\n type OperatingMode,\n} from \"@elabs-ai/components-ui\";\n\nimport { PromptInputButton } from \"./prompt-input\";\n\n// `OperatingMode` moved to `@elabs-ai/components-ui` (`lib/operating-mode.ts`)\n// — the terminal CLI look-alike family's own composer chips (issue #117) reuse\n// the same vocabulary shape, and `@elabs-ai/components-ai`/\n// `@elabs-ai/components-terminal` are layer-2 DAG siblings that may not import\n// each other (T0; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n// above; NOT re-exported from here — `@elabs-ai/components-ai` never\n// re-exports from `@elabs-ai/components-ui`. A consumer imports\n// `OperatingMode` from `@elabs-ai/components-ui`.\n\nexport type PromptInputModeProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> & {\n /** The app's own operating modes, low to high ceremony or however it orders them. */\n modes: OperatingMode[];\n /** Controlled selected mode id. Omit for the uncontrolled default (`modes[0]`). */\n value?: string;\n /** Fires with the chosen mode's id. */\n onValueChange?: (id: string) => void;\n /**\n * Accessible name for the trigger control, read alongside the current\n * mode's label. Optional — the trigger already carries the current mode's\n * visible text as its name, so this only adds context (e.g. \"Operating\n * mode: Auto\" instead of just \"Auto\").\n */\n \"aria-label\"?: string;\n};\n\n/**\n * PromptInputMode — a composer control for an app-defined operating mode\n * (how autonomously the agent may act on the next turn).\n *\n * A `DropdownMenu` of `modes`, radio-selected so exactly one is active at a\n * time; the trigger shows the current mode's icon + label. Ships no mode\n * vocabulary — `modes` is entirely prop-driven, so `auto`/`plan`/whatever a\n * given agent calls its modes lives in the consuming app, not here.\n *\n * Built on Radix (`DropdownMenu` + `DropdownMenuRadioGroup`/`RadioItem` from\n * `@elabs-ai/components-ui`) for keyboard navigation, roving focus and a\n * `menuitemradio` role whose `aria-checked` announces the current selection —\n * no hand-rolled key handling.\n */\nexport const PromptInputMode = forwardRef<HTMLDivElement, PromptInputModeProps>(\n function PromptInputMode(\n { modes, value, onValueChange, className, \"aria-label\": ariaLabel, ...props },\n ref,\n ) {\n const [selected, setSelected] = useControllableState<string>({\n defaultProp: modes[0]?.id ?? \"\",\n onChange: onValueChange,\n prop: value,\n });\n\n const handleChange = (next: string) => {\n // Radix would otherwise allow an empty-string commit if a caller wires\n // a deselectable radio group elsewhere — a mode picker always has an\n // active mode, so an empty commit is ignored.\n if (!next) return;\n setSelected(next);\n };\n\n const current = modes.find((mode) => mode.id === selected) ?? modes[0];\n\n // `OperatingMode.id` is an unconstrained, consumer-owned string — it may\n // contain whitespace or other characters that are invalid inside a\n // single `aria-describedby` token (a space-separated ID list splits on\n // whitespace). Derive a per-instance, DOM-safe id from `useId()` and the\n // mode's index instead of embedding the raw value.\n const descriptionIdBase = useId();\n\n return (\n <div\n ref={ref}\n data-slot=\"prompt-input-mode\"\n className={cn(\"inline-flex\", className)}\n {...props}\n >\n {/*\n * `modal={false}` is load-bearing, not a preference. Radix's modal\n * dropdown marks the rest of the document `aria-hidden` while the menu\n * is open — including this component's own trigger — which axe flags as\n * `aria-hidden-focus` (\"ARIA hidden element must not be focusable\")\n * and which drops the trigger out of the accessibility tree entirely.\n * A composer toolbar chip has no business hiding the page or locking\n * its scroll, so the non-modal layer is both the accessible answer and\n * the semantically correct one.\n */}\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <PromptInputButton\n variant=\"ghost\"\n className=\"gap-1.5 rounded-full\"\n disabled={modes.length === 0}\n aria-label={\n ariaLabel && current ? `${ariaLabel}: ${current.label}` : (ariaLabel ?? undefined)\n }\n data-slot=\"prompt-input-mode-trigger\"\n >\n {current?.icon}\n <span>{current?.label}</span>\n <ChevronDown className=\"size-3.5 opacity-60\" aria-hidden=\"true\" />\n </PromptInputButton>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent align=\"start\" data-slot=\"prompt-input-mode-content\" className=\"w-72\">\n <DropdownMenuRadioGroup value={selected} onValueChange={handleChange}>\n {modes.map((mode, index) => {\n const descriptionId =\n mode.description === undefined\n ? undefined\n : `${descriptionIdBase}-description-${index}`;\n return (\n <DropdownMenuRadioItem\n key={mode.id}\n value={mode.id}\n data-slot=\"prompt-input-mode-item\"\n className=\"gap-2\"\n aria-describedby={descriptionId}\n >\n {mode.icon}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-body\">{mode.label}</span>\n {mode.description === undefined ? null : (\n // Visible, but excluded from the item's accessible\n // name (aria-hidden) so the name stays exactly the\n // label; still exposed as the accessible DESCRIPTION\n // via aria-describedby above — a hidden node an\n // aria-describedby reference points to is still read\n // for the description computation.\n <span\n id={descriptionId}\n aria-hidden=\"true\"\n className=\"truncate text-meta text-muted-foreground\"\n >\n {mode.description}\n </span>\n )}\n </span>\n {mode.keyHint === undefined ? null : (\n <Kbd className=\"shrink-0\" aria-hidden=\"true\">\n {mode.keyHint}\n </Kbd>\n )}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n },\n);\n","\"use client\";\n\n/**\n * PromptInputSlash — a slash-command palette for the chat composer.\n *\n * Reuses the generic trigger machinery `@elabs-ai/components-ui` ships at\n * `lib/trigger-query.ts` (`findTriggerQuery` / `replaceTriggerRun`) with\n * `trigger: \"/\"` and `boundary: \"line-start\"` — the same algorithm\n * `MentionInput` runs with `trigger: \"@\"` and the `\"word\"` boundary. See\n * docs/decisions/2026-09-01-brainless-adoption-architecture.md § 5: this\n * package NEVER re-implements trigger detection, and never imports the\n * markdown-scoped slash menu in `@elabs-ai/components-editor` (that would be\n * a sideways edge in the one-way dependency graph).\n *\n * Rendering goes through the existing `PromptInputCommand*` parts (thin\n * `cmdk` wrappers), controlled rather than driven by `cmdk`'s own keyboard\n * handling — the caret must stay in the composer's `<textarea>` the whole\n * time, so every keystroke (Arrow/Home/End/Enter/Escape) is intercepted on\n * the textarea itself and only the *highlighted* `value` is pushed into\n * `PromptInputCommand`. `aria-activedescendant` is read back via\n * `PromptInputCommand`'s existing `onActiveItemIdChange` seam (the doc-block\n * on `PromptInputCommandItem` names this exact composition) rather than by\n * guessing a DOM id — `cmdk` assigns each item's `id` internally and\n * overwrites any id a consumer passes.\n *\n * `SlashCommand`, `defaultSlashCommandFilter` and the index-stepping helper\n * (`stepIndex`, formerly this file's private `step`) are promoted to\n * `@elabs-ai/components-ui` (T0 — the terminal CLI look-alike family's own\n * palette, issue #117, reuses the same model; `ui` is the one legal shared\n * home for two layer-2 DAG siblings — see\n * docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4).\n */\nimport {\n createContext,\n forwardRef,\n use,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ForwardedRef,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n cn,\n defaultSlashCommandFilter,\n findTriggerQuery,\n replaceTriggerRun,\n stepIndex,\n useLocale,\n type SlashCommand,\n type TriggerBoundary,\n} from \"@elabs-ai/components-ui\";\n\nimport {\n PromptInputCommand,\n PromptInputCommandEmpty,\n PromptInputCommandItem,\n PromptInputCommandList,\n PromptInputTextarea,\n type PromptInputTextareaProps,\n} from \"./prompt-input\";\n\nconst TRIGGER = \"/\";\n\n// ---------------------------------------------------------------------------\n// Small local helpers (deliberately NOT shared — see the doc-comments below)\n// ---------------------------------------------------------------------------\n\n/**\n * Merge multiple refs into one callback ref. A private, ~10-line copy rather\n * than a cross-package import: `mergeRefs` lives in `@elabs-ai/components-ui`'s\n * `lib/` but is not exported from its barrel or any subpath today, and adding\n * one is a subpath-export decision this change is not scoped to make (see\n * `.claude/rules/component-api.md` § \"Subpath exports\"). Ordinary React\n * ref-composition boilerplate, not the trigger algorithm this file exists to\n * avoid re-implementing.\n */\ntype MaybeRef<T> = ForwardedRef<T> | undefined;\n\n// prettier-ignore\nfunction mergeRefs<T>(\n ...refs: Array<MaybeRef<T>>\n) {\n return (node: T | null) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as { current: T | null }).current = node;\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n//\n// `SlashCommand` and `defaultSlashCommandFilter` moved to\n// `@elabs-ai/components-ui` (`lib/slash-command.ts`) — see the promotion\n// note at the top of this file.\n\nexport interface PromptInputSlashProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onSelect\" | \"children\"\n> {\n /** The registered commands the palette offers. */\n commands: SlashCommand[];\n /** The composer's current text — must match what the wrapped textarea renders. */\n value: string;\n /** Ref to the composer's `<textarea>` (usually the one `PromptInputSlashTextarea` renders). */\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n /**\n * Only trigger at the start of a line (index 0, or right after `\"\\n\"`).\n * `false` falls back to `MentionInput`'s word-boundary rule.\n * @default true\n */\n lineStartOnly?: boolean;\n /** Which commands survive the current query. @default defaultSlashCommandFilter */\n filter?: (command: SlashCommand, query: string) => boolean;\n /**\n * A command was chosen — apply the spliced `{ text, caret }` to your own\n * controlled value (the same shape `replaceTriggerRun` returns). The\n * splice inserts `\"/\" + command.name + \" \"` in place of the typed query.\n */\n onValueChange: (next: { text: string; caret: number }) => void;\n /** A command was chosen (fires alongside, not instead of, `onValueChange`). */\n onSelect?: (command: SlashCommand) => void;\n /** The popup opened or closed. */\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Wiring context — private plumbing between the root and its `Textarea` part\n// (component-api.md: \"compound components share a context, not props\").\n// ---------------------------------------------------------------------------\n\ninterface PromptInputSlashWiring {\n open: boolean;\n /**\n * The REAL DOM id `cmdk` assigned to the listbox, read back off the\n * rendered node — `cmdk`'s `CommandList` forces its own internally\n * generated `id` after spreading consumer props (the same override\n * `CMDK_OVERRIDDEN_ITEM_PROPS` documents for `CommandItem`), so a\n * self-minted id passed as a prop is silently dropped.\n */\n listDomId?: string;\n /** DOM id of the highlighted `PromptInputCommandItem`, from `onActiveItemIdChange`. */\n activeId?: string;\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n syncCaret: (element: HTMLTextAreaElement) => void;\n onKeyDown: (event: ReactKeyboardEvent<HTMLTextAreaElement>) => void;\n}\n\nconst PromptInputSlashWiringContext = createContext<PromptInputSlashWiring | null>(null);\n\n// ---------------------------------------------------------------------------\n// PromptInputSlash (root — provider + Popover, mirrors MentionInput's shape)\n// ---------------------------------------------------------------------------\n\n/**\n * PromptInputSlash — wrap the composer's textarea (rendered via\n * `PromptInputSlashTextarea`) to add a `/`-triggered command palette.\n *\n * ```tsx\n * const textareaRef = useRef<HTMLTextAreaElement>(null);\n * const [text, setText] = useState(\"\");\n *\n * <PromptInputSlash\n * commands={commands}\n * value={text}\n * textareaRef={textareaRef}\n * onValueChange={({ text }) => setText(text)}\n * >\n * <PromptInputSlashTextarea value={text} onChange={(e) => setText(e.target.value)} />\n * </PromptInputSlash>\n * ```\n */\nexport const PromptInputSlash = forwardRef<HTMLDivElement, PromptInputSlashProps>(\n function PromptInputSlash(\n {\n commands,\n value,\n textareaRef,\n lineStartOnly = true,\n filter = defaultSlashCommandFilter,\n onValueChange,\n onSelect,\n onOpenChange,\n className,\n children,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const mergedRootRef = useMemo(() => mergeRefs<HTMLDivElement>(ref, rootRef), [ref]);\n\n // ------------------------------------------------------------------\n // Caret — tracked from the wrapped textarea's own DOM events, exactly\n // like `MentionInput`'s `syncCaret`/`applyCaret` pair.\n // ------------------------------------------------------------------\n const [caret, setCaret] = useState(() => value.length);\n const pendingCaretRef = useRef<number | null>(null);\n\n const syncCaret = useCallback((element: HTMLTextAreaElement) => {\n setCaret(element.selectionStart ?? 0);\n }, []);\n\n // Post-commit pass: only after `value` has actually re-rendered into the\n // DOM can the caret be restored — see MentionInput's identical comment.\n useLayoutEffect(() => {\n const position = pendingCaretRef.current;\n if (position === null) return;\n pendingCaretRef.current = null;\n // `setSelectionRange` fires a native `select` event, which\n // `PromptInputSlashTextarea`'s `onSelect` handler already routes to\n // `syncCaret` — no need to call `setCaret` here too (mirrors\n // `MentionInput`'s identical caret-restore effect).\n textareaRef.current?.setSelectionRange(position, position);\n });\n\n // ------------------------------------------------------------------\n // Query / open state\n // ------------------------------------------------------------------\n const boundary: TriggerBoundary = lineStartOnly ? \"line-start\" : \"word\";\n\n const queryInfo = useMemo(\n () => findTriggerQuery(value, caret, TRIGGER, { boundary }),\n [value, caret, boundary],\n );\n\n // Escape (and an outside dismissal) suppress the popup for the run it was\n // dismissed on, without touching the text — same rationale as MentionInput.\n const [dismissedStart, setDismissedStart] = useState<number | null>(null);\n useEffect(() => {\n if (queryInfo === null && dismissedStart !== null) setDismissedStart(null);\n }, [queryInfo, dismissedStart]);\n\n const open = queryInfo !== null && dismissedStart !== queryInfo.start;\n const query = open && queryInfo ? queryInfo.query : null;\n\n const setOpen = useCallback(\n (next: boolean) => {\n onOpenChange?.(next);\n if (!next) setDismissedStart(queryInfo?.start ?? null);\n },\n [onOpenChange, queryInfo],\n );\n\n // ------------------------------------------------------------------\n // Filtering + highlight\n // ------------------------------------------------------------------\n const filtered = useMemo(\n () => (query !== null ? commands.filter((command) => filter(command, query)) : []),\n [query, commands, filter],\n );\n\n const [activeIndexState, setActiveIndexState] = useState(0);\n\n // Resolved DURING render, never repaired in an effect, so a stale index\n // from before a filter keystroke can never reach the DOM — see the\n // identical rationale in `MentionInput`'s `activeIndex` docblock.\n const activeIndex = useMemo(() => {\n if (filtered.length === 0) return -1;\n if (activeIndexState < 0 || activeIndexState >= filtered.length) return 0;\n return activeIndexState;\n }, [filtered, activeIndexState]);\n\n useEffect(() => {\n setActiveIndexState(0);\n }, [query]);\n\n const activeCommand = activeIndex >= 0 ? filtered[activeIndex] : undefined;\n const [activeDomId, setActiveDomId] = useState<string | undefined>(undefined);\n\n // The listbox lives inside `PopoverContent`, which UNMOUNTS on close — its\n // `onActiveItemIdChange` never fires again to report \"no active item\", so\n // without this the textarea would keep pointing `aria-activedescendant`\n // at a node that no longer exists.\n useEffect(() => {\n if (!open) setActiveDomId(undefined);\n }, [open]);\n\n // The REAL DOM id `cmdk` assigns to the listbox (see `listDomId`'s\n // docblock on `PromptInputSlashWiring`) — read off the rendered node\n // rather than trusted from a prop we pass in, since `cmdk` overwrites it.\n const [listDomId, setListDomId] = useState<string | undefined>(undefined);\n const handleListRef = useCallback((node: HTMLDivElement | null) => {\n setListDomId(node?.id);\n }, []);\n\n // `PromptInputCommand` is controlled (`value=`), so `cmdk`'s own pointer\n // hover / mount-time auto-select report back here instead of self-applying\n // — keep mouse and keyboard highlighting as one source of truth.\n const handleActiveValueChange = useCallback(\n (nextValue: string) => {\n const index = filtered.findIndex((command) => command.name === nextValue);\n if (index >= 0) setActiveIndexState(index);\n },\n [filtered],\n );\n\n // ------------------------------------------------------------------\n // Actions\n // ------------------------------------------------------------------\n const select = useCallback(\n (command: SlashCommand) => {\n if (!queryInfo) return;\n const insertText = `${TRIGGER}${command.name} `;\n const result = replaceTriggerRun(value, queryInfo.start, caret, insertText);\n pendingCaretRef.current = result.caret;\n onValueChange(result);\n onSelect?.(command);\n },\n [queryInfo, value, caret, onValueChange, onSelect],\n );\n\n const close = useCallback(() => setOpen(false), [setOpen]);\n\n const handleKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {\n if (!open) return;\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndexState(stepIndex(filtered.length, activeIndex, 1));\n return;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndexState(stepIndex(filtered.length, activeIndex < 0 ? 0 : activeIndex, -1));\n return;\n case \"Home\":\n event.preventDefault();\n setActiveIndexState(0);\n return;\n case \"End\":\n event.preventDefault();\n setActiveIndexState(filtered.length - 1);\n return;\n case \"Enter\":\n case \"Tab\": {\n if (activeCommand) {\n event.preventDefault();\n select(activeCommand);\n }\n return;\n }\n case \"Escape\":\n event.preventDefault();\n close();\n textareaRef.current?.focus();\n return;\n default:\n return;\n }\n },\n [open, filtered.length, activeIndex, activeCommand, select, close, textareaRef],\n );\n\n const wiring = useMemo<PromptInputSlashWiring>(\n () => ({\n open,\n listDomId,\n activeId: activeDomId,\n textareaRef,\n syncCaret,\n onKeyDown: handleKeyDown,\n }),\n [open, listDomId, activeDomId, textareaRef, syncCaret, handleKeyDown],\n );\n\n return (\n <PromptInputSlashWiringContext value={wiring}>\n <Popover open={open} onOpenChange={(next) => !next && setOpen(false)}>\n <PopoverAnchor asChild>\n <div\n ref={mergedRootRef}\n data-slot=\"prompt-input-slash\"\n className={cn(\"relative\", className)}\n {...props}\n >\n {children}\n </div>\n </PopoverAnchor>\n <PopoverContent\n data-slot=\"prompt-input-slash-content\"\n // A plain container, not a dialog — the listbox inside carries all\n // the semantics (same rationale as `MentionInputContent`).\n role=\"presentation\"\n align=\"start\"\n side=\"top\"\n sideOffset={8}\n className=\"w-72 p-0\"\n onOpenAutoFocus={(event) => event.preventDefault()}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onPointerDownOutside={(event) => {\n // Clicking the field itself only moves the caret; it must not\n // count as a dismissal, or the popup would fight the caret it\n // depends on (same rationale as `MentionInputContent`).\n const target = event.detail.originalEvent.target as Node | null;\n if (target && textareaRef.current?.contains(target)) event.preventDefault();\n }}\n >\n <PromptInputCommand\n shouldFilter={false}\n value={activeCommand?.name ?? \"\"}\n onValueChange={handleActiveValueChange}\n onActiveItemIdChange={setActiveDomId}\n data-slot=\"prompt-input-slash-command\"\n >\n <PromptInputCommandList\n ref={handleListRef}\n // `cmdk`'s `CommandList` reads its accessible name off its own\n // `label` prop (defaulting to \"Suggestions\"), not `aria-label`\n // — an `aria-label` prop would land in the spread `cmdk`\n // overwrites, same as the `id` it also owns.\n label={t(\"ai.promptInputSlash.listLabel\")}\n data-slot=\"prompt-input-slash-list\"\n >\n {filtered.length === 0 ? (\n <PromptInputCommandEmpty data-slot=\"prompt-input-slash-empty\">\n {t(\"ai.promptInputSlash.empty\")}\n </PromptInputCommandEmpty>\n ) : (\n filtered.map((command) => (\n <PromptInputCommandItem\n key={command.name}\n value={command.name}\n data-slot=\"prompt-input-slash-item\"\n onSelect={() => select(command)}\n // The field keeps focus — select on mousedown, before a\n // click on a non-focusable row could ever move it.\n onMouseDown={(event) => event.preventDefault()}\n >\n {command.icon ? (\n <span\n aria-hidden=\"true\"\n className=\"flex size-5 shrink-0 items-center justify-center text-muted-foreground [&_svg]:size-4\"\n >\n {command.icon}\n </span>\n ) : null}\n {/* Fixed-width name column: the selection moving never\n shifts the description text under the user's eyes. */}\n <span className=\"w-28 shrink-0 truncate text-body\">\n {TRIGGER}\n {command.name}\n </span>\n {command.description ? (\n <span className=\"truncate text-meta text-muted-foreground\">\n {command.description}\n </span>\n ) : null}\n </PromptInputCommandItem>\n ))\n )}\n </PromptInputCommandList>\n </PromptInputCommand>\n </PopoverContent>\n </Popover>\n </PromptInputSlashWiringContext>\n );\n },\n);\n\n// ---------------------------------------------------------------------------\n// PromptInputSlashTextarea\n// ---------------------------------------------------------------------------\n\nexport type PromptInputSlashTextareaProps = PromptInputTextareaProps;\n\n/**\n * The composer's `<textarea>`, carrying the combobox semantics the palette\n * needs. A thin wrapper around `PromptInputTextarea` — every prop you'd pass\n * that component still works; this one additionally merges in the palette's\n * `ref`, caret tracking and `aria-activedescendant`.\n *\n * Must be rendered inside a `<PromptInputSlash>`.\n */\nexport const PromptInputSlashTextarea = forwardRef<\n HTMLTextAreaElement,\n PromptInputSlashTextareaProps\n>(function PromptInputSlashTextarea(\n { onChange, onKeyDown, onSelect, onKeyUp, onClick, className, ...props },\n ref,\n) {\n const wiring = use(PromptInputSlashWiringContext);\n if (!wiring) {\n throw new Error(\"PromptInputSlashTextarea must be used inside a <PromptInputSlash>.\");\n }\n const mergedRef = useMemo(\n () => mergeRefs<HTMLTextAreaElement>(ref, wiring.textareaRef),\n [ref, wiring.textareaRef],\n );\n\n return (\n <PromptInputTextarea\n ref={mergedRef}\n data-slot=\"prompt-input-slash-textarea\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n // Only while the popup is mounted: the listbox lives in a Radix portal\n // that unmounts on close, and an `aria-controls` pointing at a removed\n // node is a dangling reference (same rationale as `MentionInputTextarea`).\n aria-controls={wiring.open ? wiring.listDomId : undefined}\n aria-activedescendant={wiring.activeId}\n className={cn(\"relative z-0\", className)}\n {...props}\n onChange={(event) => {\n wiring.syncCaret(event.currentTarget);\n onChange?.(event);\n }}\n onKeyDown={(event) => {\n wiring.onKeyDown(event);\n onKeyDown?.(event);\n }}\n onSelect={(event) => {\n wiring.syncCaret(event.currentTarget);\n onSelect?.(event);\n }}\n onKeyUp={(event) => {\n wiring.syncCaret(event.currentTarget);\n onKeyUp?.(event);\n }}\n onClick={(event) => {\n wiring.syncCaret(event.currentTarget);\n onClick?.(event);\n }}\n />\n );\n});\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { ScrollArea, ScrollBar } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { useCallback } from \"react\";\n\nimport { Shimmer } from \"./shimmer\";\n\nexport type SuggestionsProps = ComponentProps<typeof ScrollArea>;\n\nexport const Suggestions = ({ className, children, ...props }: SuggestionsProps) => (\n <ScrollArea className=\"w-full overflow-x-auto whitespace-nowrap\" {...props}>\n <div className={cn(\"flex w-max flex-nowrap items-center gap-2\", className)}>{children}</div>\n <ScrollBar className=\"hidden\" orientation=\"horizontal\" />\n </ScrollArea>\n);\n\nexport type SuggestionProps = Omit<ComponentProps<typeof Button>, \"onClick\"> & {\n suggestion: string;\n onClick?: (suggestion: string) => void;\n};\n\nexport const Suggestion = ({\n suggestion,\n onClick,\n className,\n // The soft tinted pill (#194, research 02 §3a BTN-2 / 08 §C.1): `secondary`\n // = borderless `bg-secondary` fill; the pill shape comes from `rounded-full`\n // below. The harsh `outline` (strong `--input` boundary) is for form-adjacent\n // controls, not chips.\n variant = \"secondary\",\n size = \"sm\",\n children,\n ...props\n}: SuggestionProps) => {\n const handleClick = useCallback(() => {\n onClick?.(suggestion);\n }, [onClick, suggestion]);\n\n return (\n <Button\n className={cn(\"cursor-pointer rounded-full px-4\", className)}\n onClick={handleClick}\n size={size}\n type=\"button\"\n variant={variant}\n {...props}\n >\n {children || suggestion}\n </Button>\n );\n};\n\nexport type SuggestionLoadingProps = HTMLAttributes<HTMLDivElement> & {\n /** Shimmering label shown while the suggestion set is still generating. */\n label?: string;\n};\n\n/**\n * A non-interactive trailing chip that shimmers while suggestions stream in.\n * Shaped like a `Suggestion` pill; composes `Shimmer` (motion-reduce aware) and\n * announces via `role=\"status\"`. Render it after the chips while loading.\n */\nexport const SuggestionLoading = ({\n label = \"Thinking…\",\n className,\n ...props\n}: SuggestionLoadingProps) => (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"inline-flex h-8 shrink-0 items-center rounded-full bg-secondary px-4 text-body\",\n className,\n )}\n {...props}\n >\n <Shimmer as=\"span\" className=\"text-secondary-foreground\">\n {label}\n </Shimmer>\n </div>\n);\n\nexport type StreamingSuggestionsProps = Omit<SuggestionsProps, \"children\"> & {\n /** The suggestions to render. As this array grows, new chips appear in place. */\n suggestions: string[];\n /** While true, a shimmering trailing chip is shown until the set settles. */\n loading?: boolean;\n /** Click handler for a suggestion chip. */\n onSuggestionClick?: (suggestion: string) => void;\n /** Label for the trailing loading chip. @default \"Thinking…\" */\n loadingLabel?: string;\n};\n\n/**\n * Suggestions that appear progressively while a generator streams. Each chip\n * fades in on mount (existing chips don't re-animate — keys are the suggestion\n * text); a shimmering trailing chip shows until `loading` flips false.\n */\nexport const StreamingSuggestions = ({\n suggestions,\n loading = false,\n onSuggestionClick,\n loadingLabel,\n ...props\n}: StreamingSuggestionsProps) => (\n <Suggestions {...props}>\n {suggestions.map((s) => (\n <Suggestion\n key={s}\n suggestion={s}\n onClick={onSuggestionClick}\n className=\"animate-in fade-in-0 slide-in-from-bottom-1 duration-fast ease-entrance motion-reduce:animate-none\"\n />\n ))}\n {loading && <SuggestionLoading label={loadingLabel} />}\n </Suggestions>\n);\n","\"use client\";\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n APPROVAL_SCOPE_DESCRIPTION_KEYS,\n Kbd,\n Label,\n RadioGroup,\n RadioGroupItem,\n StatusBadge,\n Textarea,\n useLocale,\n type ApprovalOption,\n} from \"@elabs-ai/components-ui\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ToolUIPart } from \"ai\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, forwardRef, useContext, useId, useMemo, useState } from \"react\";\n\ntype ToolUIPartApproval =\n | {\n id: string;\n approved?: never;\n reason?: never;\n }\n | {\n id: string;\n approved: boolean;\n reason?: string;\n }\n | {\n id: string;\n approved: true;\n reason?: string;\n }\n | {\n id: string;\n approved: false;\n reason?: string;\n }\n | undefined;\n\ninterface ConfirmationContextValue {\n approval: ToolUIPartApproval;\n state: ToolUIPart[\"state\"];\n /** Default id wired from the card's `aria-labelledby` to `ConfirmationTitle`. */\n titleId: string;\n /**\n * Shared draft reason text (#103) — written by `ApprovalCardReason`, read by\n * `ApprovalCardOptions` at the moment a decision commits, so a typed\n * explanation reaches `onConfirm`'s second argument without threading a\n * prop between two sibling compound parts. Unused by the pre-existing\n * binary `Confirmation*` parts, so their rendered output is unaffected.\n */\n reason: string;\n setReason: (reason: string) => void;\n}\n\nconst ConfirmationContext = createContext<ConfirmationContextValue | null>(null);\n\nconst useConfirmation = () => {\n const context = useContext(ConfirmationContext);\n\n if (!context) {\n throw new Error(\"Confirmation components must be used within Confirmation\");\n }\n\n return context;\n};\n\nexport type ConfirmationProps = ComponentProps<typeof Alert> & {\n approval?: ToolUIPartApproval;\n state: ToolUIPart[\"state\"];\n};\n\nexport const Confirmation = ({\n className,\n approval,\n state,\n variant,\n role,\n children,\n ...props\n}: ConfirmationProps) => {\n const titleId = useId();\n const [reason, setReason] = useState(\"\");\n const contextValue = useMemo(\n () => ({ approval, state, titleId, reason, setReason }),\n [approval, state, titleId, reason],\n );\n\n if (!approval || state === \"input-streaming\" || state === \"input-available\") {\n return null;\n }\n\n const isResolved =\n state === \"approval-responded\" || state === \"output-denied\" || state === \"output-available\";\n const isPending = state === \"approval-requested\";\n const approved = isResolved ? approval.approved : undefined;\n\n // QUIET-RAIL treatment (supersedes research-11's warning/status WASH — a\n // deliberate design-authority decision to drop the filled \"AI card\" look):\n // a neutral card ground (Alert variant=\"default\") + ONE accent rail encoding\n // the outcome, plus the StatusBadge (icon + label, never color alone). The\n // rails are hue-independent enough to stay legible at high decoration / high-contrast.\n // A caller-supplied `variant` still wins (escape hatch).\n const railClass =\n approved === true\n ? \"border-s-success\"\n : approved === false\n ? \"border-s-destructive\"\n : isPending\n ? \"border-s-border-strong\"\n : \"border-s-border\";\n\n return (\n <ConfirmationContext.Provider value={contextValue}>\n <Alert\n variant={variant ?? \"default\"}\n // A pending decision containing focusable controls is a labelled\n // region, NOT an assertive live region (research 11 §B.3): pending =\n // role=\"group\" + aria-labelledby; resolved keeps role=\"alert\".\n role={role ?? (isPending ? \"group\" : \"alert\")}\n aria-labelledby={isPending ? titleId : undefined}\n className={cn(\n \"flex flex-col gap-2 border-s-4 transition-colors duration-fast\",\n railClass,\n isPending && \"shadow-sm\",\n className,\n )}\n {...props}\n >\n {/* The status line is the canonical StatusBadge (#189, research 10 §B.1). */}\n {approved === true ? (\n <StatusBadge\n className=\"animate-in fade-in-0 self-start duration-base ease-entrance\"\n status=\"complete\"\n >\n Approved\n </StatusBadge>\n ) : null}\n {approved === false ? (\n <StatusBadge\n className=\"animate-in fade-in-0 self-start duration-base ease-entrance\"\n status=\"denied\"\n >\n Denied\n </StatusBadge>\n ) : null}\n {children}\n </Alert>\n </ConfirmationContext.Provider>\n );\n};\n\nexport type ConfirmationTitleProps = ComponentProps<typeof AlertTitle>;\n\n/**\n * The question zone (research 11 §B.3 APPROVE-3) — out-ranks the surrounding\n * `text-body` and names the pending region via the card's `aria-labelledby`.\n */\nexport const ConfirmationTitle = ({ className, id, ...props }: ConfirmationTitleProps) => {\n const { titleId } = useConfirmation();\n return <AlertTitle id={id ?? titleId} className={cn(\"text-subtitle\", className)} {...props} />;\n};\n\nexport type ConfirmationDescriptionProps = ComponentProps<typeof AlertDescription>;\n\n/** The consequence zone — what approving will actually do (research 11 §B.3). */\nexport const ConfirmationDescription = ({ className, ...props }: ConfirmationDescriptionProps) => (\n <AlertDescription className={cn(\"text-body text-muted-foreground\", className)} {...props} />\n);\n\nexport interface ConfirmationRequestProps {\n children?: ReactNode;\n}\n\nexport const ConfirmationRequest = ({ children }: ConfirmationRequestProps) => {\n const { state } = useConfirmation();\n\n // Only show when approval is requested\n if (state !== \"approval-requested\") {\n return null;\n }\n\n return children;\n};\n\nexport interface ConfirmationAcceptedProps {\n children?: ReactNode;\n}\n\nexport const ConfirmationAccepted = ({ children }: ConfirmationAcceptedProps) => {\n const { approval, state } = useConfirmation();\n\n // Only show when approved and in response states\n if (\n !approval?.approved ||\n (state !== \"approval-responded\" && state !== \"output-denied\" && state !== \"output-available\")\n ) {\n return null;\n }\n\n return children;\n};\n\nexport interface ConfirmationRejectedProps {\n children?: ReactNode;\n}\n\nexport const ConfirmationRejected = ({ children }: ConfirmationRejectedProps) => {\n const { approval, state } = useConfirmation();\n\n // Only show when rejected and in response states\n if (\n approval?.approved !== false ||\n (state !== \"approval-responded\" && state !== \"output-denied\" && state !== \"output-available\")\n ) {\n return null;\n }\n\n return children;\n};\n\nexport type ConfirmationActionsProps = ComponentProps<\"div\">;\n\nexport const ConfirmationActions = ({ className, ...props }: ConfirmationActionsProps) => {\n const { state } = useConfirmation();\n\n // Only show when approval is requested\n if (state !== \"approval-requested\") {\n return null;\n }\n\n return (\n <div\n className={cn(\n // The action band (research 11 §B.3 APPROVE-3): the divider is the SOLE\n // cue between consequence and buttons, so `border-strong` is correct.\n \"flex w-full items-center justify-end gap-2 border-t border-border-strong pt-3\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport type ConfirmationActionProps = ComponentProps<typeof Button>;\n\nexport const ConfirmationAction = ({ className, ...props }: ConfirmationActionProps) => (\n <Button className={cn(\"h-8 px-3 text-sm\", className)} type=\"button\" {...props} />\n);\n\nexport type ConfirmationApproveProps = ConfirmationActionProps;\n\n/**\n * The proceed action — presets the filled primary variant (research 11 §B.3\n * APPROVE-2). Role-named so the primary path cannot drift to `outline`.\n */\nexport const ConfirmationApprove = (props: ConfirmationApproveProps) => (\n <ConfirmationAction variant=\"default\" {...props} />\n);\n\nexport type ConfirmationDenyProps = ConfirmationActionProps;\n\n/** The decline action — presets the quiet `ghost` variant, never `outline`. */\nexport const ConfirmationDeny = (props: ConfirmationDenyProps) => (\n <ConfirmationAction variant=\"ghost\" {...props} />\n);\n\n/*\n * ApprovalCard — the promoted, semantically-named front door for the approval\n * interaction (research 11 §B.3). Same components, clearer name; the\n * `Confirmation*` exports stay for the AI-Elements-shaped API (non-breaking).\n * New code reaches for `ApprovalCard`.\n *\n * The `Confirmation*` family below is CLOSED — frozen at exactly the ten\n * names aliased here. New parts (#103 and beyond) are declared as real\n * `ApprovalCard*` implementations, never added to this alias block. See\n * `docs/decisions/2026-09-01-brainless-adoption-architecture.md` § 4 and the\n * `FROZEN_CONFIRMATION_EXPORTS` lock in `confirmation.test.tsx`.\n */\nexport const ApprovalCard = Confirmation;\nexport type ApprovalCardProps = ConfirmationProps;\nexport const ApprovalCardTitle = ConfirmationTitle;\nexport type ApprovalCardTitleProps = ConfirmationTitleProps;\nexport const ApprovalCardDescription = ConfirmationDescription;\nexport type ApprovalCardDescriptionProps = ConfirmationDescriptionProps;\nexport const ApprovalCardRequest = ConfirmationRequest;\nexport type ApprovalCardRequestProps = ConfirmationRequestProps;\nexport const ApprovalCardAccepted = ConfirmationAccepted;\nexport type ApprovalCardAcceptedProps = ConfirmationAcceptedProps;\nexport const ApprovalCardRejected = ConfirmationRejected;\nexport type ApprovalCardRejectedProps = ConfirmationRejectedProps;\nexport const ApprovalCardActions = ConfirmationActions;\nexport type ApprovalCardActionsProps = ConfirmationActionsProps;\nexport const ApprovalCardAction = ConfirmationAction;\nexport type ApprovalCardActionProps = ConfirmationActionProps;\nexport const ApprovalCardApprove = ConfirmationApprove;\nexport type ApprovalCardApproveProps = ConfirmationApproveProps;\nexport const ApprovalCardDeny = ConfirmationDeny;\nexport type ApprovalCardDenyProps = ConfirmationDenyProps;\n\n/*\n * ---------------------------------------------------------------------------\n * N-option, scoped approval (#103)\n * ---------------------------------------------------------------------------\n * Real coding-agent permission prompts are rarely a plain yes/no — they ask\n * an N-option question whose options encode SCOPE: \"Yes\", \"Yes, and don't ask\n * again this session\", \"No, and tell the agent what to do instead\". The\n * binary `Confirmation`/`ApprovalCard` pair above cannot express the middle\n * option; these three parts extend it additively, composed as CHILDREN of the\n * existing card (`ApprovalCard` / `ApprovalCardRequest`), never as a\n * replacement for it. Every new export here is a real `ApprovalCard*`\n * implementation — see the closed-family note above the alias block.\n *\n * Vocabulary note: this is the PER-CALL decision surface (\"may I run this\n * command?\"). `PermissionModeSelect` (#104) is the separate, standing POLICY\n * surface (\"how much may you do without asking?\") — the two compose rather\n * than merge into one boolean-flagged component, per\n * `.claude/rules/component-api.md` (\"Avoid boolean-prop proliferation\").\n */\n\n/**\n * `ApprovalScope`, `ApprovalOption` and `APPROVAL_SCOPE_DESCRIPTION_KEYS`\n * moved to `@elabs-ai/components-ui` (`lib/approval-option.ts`) — the\n * terminal CLI look-alike family's own permission row (issue #117) reuses\n * the same model, and `@elabs-ai/components-ai`/`@elabs-ai/components-terminal`\n * are layer-2 DAG siblings that may not import each other (T0; see\n * docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n * above.\n */\n\nexport interface ApprovalCardOptionsProps extends ComponentProps<\"div\"> {\n options: ApprovalOption[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (id: string) => void;\n /**\n * Fires when an option is selected — by click, or by ANY keyboard move\n * within the radio group (Home/End/arrow keys select immediately, per the\n * native/ARIA radiogroup pattern Radix implements; there is no separate\n * \"highlight vs commit\" step). Reports the full resolved `ApprovalOption`\n * plus whatever reason text is currently held by a sibling\n * `ApprovalCardReason` — type a reason BEFORE choosing an option to have it\n * included in this call.\n */\n onConfirm?: (option: ApprovalOption, reason?: string) => void;\n}\n\n/**\n * ApprovalCardOptions — the N-option, scoped decision (#103). Renders through\n * `@elabs-ai/components-ui`'s `RadioGroup` (Radix) for roving focus, arrow-key\n * wrap, Home/End and announcement — never a hand-rolled\n * `parentElement.children[i]` focus walk. Composed inside `ApprovalCardRequest`,\n * alongside the existing `ApprovalCardTitle`/`ApprovalCardDescription`.\n */\nexport const ApprovalCardOptions = forwardRef<HTMLDivElement, ApprovalCardOptionsProps>(\n function ApprovalCardOptions(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n onConfirm,\n className,\n dir,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const { titleId, reason } = useConfirmation();\n const baseId = useId();\n\n // Controlled/uncontrolled mirrors the platform (and `PermissionModeSelect`,\n // #104): `value`/`onValueChange` for a controlled caller, `defaultValue`\n // for an uncontrolled starting point — Radix's own `RadioGroup` already\n // implements both correctly. Hand-rolling a parallel `internalValue`\n // state here and always passing a (possibly `undefined`) `value` down\n // makes Radix's controllable-state hook see a spurious\n // uncontrolled-to-controlled transition the first time a selection is\n // made, which is exactly the warning this avoids.\n const handleValueChange = (id: string) => {\n onValueChange?.(id);\n const option = options.find((candidate) => candidate.id === id);\n if (option) onConfirm?.(option, reason.trim() ? reason : undefined);\n };\n\n return (\n <RadioGroup\n ref={ref}\n // `dir` on a plain <div> is a free-form HTML string; Radix's\n // RadioGroup narrows it to \"ltr\" | \"rtl\". Cast at this single call\n // site, matching `PermissionModeSelect` (#104), rather than widening\n // (and so weakening) the public prop type.\n dir={dir as \"ltr\" | \"rtl\" | undefined}\n defaultValue={defaultValue}\n value={value}\n onValueChange={handleValueChange}\n aria-labelledby={ariaLabelledBy ?? titleId}\n data-slot=\"approval-card-options\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n >\n {options.map((option) => {\n const itemId = `${baseId}-${option.id}`;\n const descriptionId = `${itemId}-description`;\n const description =\n option.description ?? t(APPROVAL_SCOPE_DESCRIPTION_KEYS[option.scope]);\n\n return (\n <div\n key={option.id}\n data-slot=\"approval-card-option\"\n data-scope={option.scope}\n className={cn(\n \"flex items-start gap-3 rounded-lg border border-border bg-card p-3\",\n \"has-[[data-state=checked]]:border-primary\",\n )}\n >\n <RadioGroupItem\n aria-describedby={descriptionId}\n className=\"mt-1\"\n data-slot=\"approval-card-option-input\"\n id={itemId}\n value={option.id}\n />\n <div className=\"grid flex-1 gap-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label\n className=\"text-body flex items-center gap-2 font-medium\"\n data-slot=\"approval-card-option-label\"\n htmlFor={itemId}\n >\n {option.label}\n </Label>\n {option.keyHint ? (\n <Kbd data-slot=\"approval-card-option-key-hint\">{option.keyHint}</Kbd>\n ) : null}\n </div>\n <p\n className=\"text-meta text-muted-foreground\"\n data-slot=\"approval-card-option-description\"\n id={descriptionId}\n >\n {description}\n </p>\n </div>\n </div>\n );\n })}\n </RadioGroup>\n );\n },\n);\n\nApprovalCardOptions.displayName = \"ApprovalCardOptions\";\n\nexport type ApprovalCardTargetProps = ComponentProps<\"div\">;\n\n/**\n * ApprovalCardTarget — the preview slot for WHAT is being approved: a\n * command, a path, or a richer node such as a `DiffView` (#102). Accepts\n * arbitrary children — this file never imports `DiffView`, the composition\n * happens entirely in the consumer's tree. Ungated by state (unlike\n * `ApprovalCardRequest`/`Accepted`/`Rejected`): the subject of a decision\n * stays visible after it resolves, not only while pending.\n */\nexport const ApprovalCardTarget = forwardRef<HTMLDivElement, ApprovalCardTargetProps>(\n function ApprovalCardTarget({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"approval-card-target\"\n className={cn(\"text-body rounded-md bg-muted/50 p-3\", className)}\n {...props}\n />\n );\n },\n);\n\nApprovalCardTarget.displayName = \"ApprovalCardTarget\";\n\nexport type ApprovalCardReasonProps = Omit<\n ComponentProps<typeof Textarea>,\n \"value\" | \"defaultValue\" | \"onChange\"\n>;\n\n/**\n * ApprovalCardReason — the deny-with-reason input, wired to the `reason`\n * field that already exists on `ToolUIPartApproval` and was previously\n * unreachable from the UI. Shares its value with `ApprovalCardOptions`\n * through `Confirmation`'s own context (not a prop threaded between the two\n * sibling parts) — type here BEFORE choosing an option to have the text\n * included in that option's `onConfirm` call.\n */\nexport const ApprovalCardReason = forwardRef<HTMLTextAreaElement, ApprovalCardReasonProps>(\n function ApprovalCardReason({ className, id, placeholder, ...props }, ref) {\n const { t } = useLocale();\n const { reason, setReason } = useConfirmation();\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className=\"grid gap-1.5\" data-slot=\"approval-card-reason\">\n <Label\n className=\"text-meta text-muted-foreground\"\n data-slot=\"approval-card-reason-label\"\n htmlFor={textareaId}\n >\n {t(\"ai.approvalCard.reasonLabel\")}\n </Label>\n <Textarea\n ref={ref}\n id={textareaId}\n placeholder={placeholder ?? t(\"ai.approvalCard.reasonPlaceholder\")}\n value={reason}\n onChange={(event) => setReason(event.target.value)}\n data-slot=\"approval-card-reason-input\"\n className={cn(\"min-h-16 text-body\", className)}\n {...props}\n />\n </div>\n );\n },\n);\n\nApprovalCardReason.displayName = \"ApprovalCardReason\";\n","import type { ConnectionLineComponent } from \"@xyflow/react\";\n\nconst HALF = 0.5;\n\nexport const Connection: ConnectionLineComponent = ({ fromX, fromY, toX, toY }) => (\n <g>\n <path\n className=\"animated\"\n d={`M${fromX},${fromY} C ${fromX + (toX - fromX) * HALF},${fromY} ${fromX + (toX - fromX) * HALF},${toY} ${toX},${toY}`}\n fill=\"none\"\n stroke=\"var(--color-ring)\"\n strokeWidth={1}\n />\n <circle\n cx={toX}\n cy={toY}\n fill=\"var(--color-background)\"\n r={3}\n stroke=\"var(--color-ring)\"\n strokeWidth={1}\n />\n </g>\n);\n","\"use client\";\n\nimport type { Controls as ControlsPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type ControlsProps = ComponentProps<typeof ControlsPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst ControlsImpl = lazyFlowPart<ControlsProps>((m) => m.Controls);\n\nexport const Controls = (props: ControlsProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <ControlsImpl {...props} />\n </Suspense>\n);\n","\"use client\";\n\nimport { Button, downloadBlob } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { UIMessage } from \"ai\";\nimport { ArrowDownIcon, DownloadIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn(\"relative flex-1 overflow-y-hidden\", className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<typeof StickToBottom.Content>;\n\nexport const ConversationContent = ({\n className,\n scrollClassName,\n ...props\n}: ConversationContentProps) => (\n <StickToBottom.Content\n // `use-stick-to-bottom` renders a scroll viewport (`scrollClassName`)\n // wrapping a content div (`className`, via `...props`). The viewport must\n // be a flex column so its height is a DEFINITE main size the content div\n // can consume via `flex-1` — a bare `height:100%` on the content div\n // can't resolve against a block-level parent whose own height is\n // `min-height`-only (the #72 empty-state-pinned-to-the-top bug).\n scrollClassName={cn(\"flex flex-col\", scrollClassName)}\n className={cn(\"flex flex-1 min-h-0 flex-col gap-8 p-4\", className)}\n {...props}\n />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n /** Primary / secondary action(s) below the description (e.g. suggested prompts). */\n actions?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = \"No messages yet\",\n description = \"Start a conversation to see messages here\",\n icon,\n actions,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n \"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-sm\">{title}</h3>\n {description && <p className=\"text-muted-foreground text-sm\">{description}</p>}\n </div>\n {actions ? <div className=\"mt-1 flex items-center gap-2\">{actions}</div> : null}\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n className,\n ...props\n}: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full dark:bg-background dark:hover:bg-muted\",\n className,\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n\nconst getMessageText = (message: UIMessage): string =>\n message.parts\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n\nexport type ConversationDownloadProps = Omit<ComponentProps<typeof Button>, \"onClick\"> & {\n messages: UIMessage[];\n filename?: string;\n formatMessage?: (message: UIMessage, index: number) => string;\n};\n\nconst defaultFormatMessage = (message: UIMessage): string => {\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n return `**${roleLabel}:** ${getMessageText(message)}`;\n};\n\nexport const messagesToMarkdown = (\n messages: UIMessage[],\n formatMessage: (message: UIMessage, index: number) => string = defaultFormatMessage,\n): string => messages.map((msg, i) => formatMessage(msg, i)).join(\"\\n\\n\");\n\nexport const ConversationDownload = ({\n messages,\n filename = \"conversation.md\",\n formatMessage = defaultFormatMessage,\n className,\n children,\n ...props\n}: ConversationDownloadProps) => {\n const handleDownload = useCallback(() => {\n const markdown = messagesToMarkdown(messages, formatMessage);\n downloadBlob(new Blob([markdown], { type: \"text/markdown\" }), filename);\n }, [messages, filename, formatMessage]);\n\n return (\n <Button\n className={cn(\n \"absolute top-4 end-4 rounded-full dark:bg-background dark:hover:bg-muted\",\n className,\n )}\n onClick={handleDownload}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {children ?? <DownloadIcon className=\"size-4\" />}\n </Button>\n );\n};\n","\"use client\";\n\n/**\n * DiffView — line-level unified diff renderer for an agent transcript (#102).\n *\n * An agent's primary output is a code change; the package had no way to show\n * one line-by-line. DiffView is the presentational surface for a `DiffLine[]`\n * someone else computed (parsed a unified diff, a git patch, an LLM tool\n * result) — it never diffs, fetches or parses a patch itself (D5).\n *\n * Package placement + the `ChangeReview` seam are BINDING decisions, not\n * choices this file makes on its own — see\n * `docs/decisions/2026-09-01-brainless-adoption-architecture.md` § 3:\n * - DiffView ships here (`@elabs-ai/components-ai`), never in\n * `@elabs-ai/components-ui`, because it reuses `highlightCode` (Shiki) and\n * `ui` does not depend on Shiki.\n * - `ChangeHunk` (`ui`) gains NO `lines` field and `DiffLine` never moves to\n * `ui`. A consumer composes the two via `ChangeReview`'s existing\n * injection seams — `renderHunk` or `ChangeHunk.after` (both `ReactNode`)\n * — never a cross-package import in either direction. See the\n * `ChangeReviewComposition` story.\n *\n * Reuses `highlightCode` from `./code-block` (Shiki) for intra-line syntax\n * colour, so a diff and a code block agree on tokenisation and theme — real\n * `add`/`del`/`context` lines are re-joined into one document before\n * highlighting so Shiki sees genuine surrounding context, then the result is\n * mapped back onto the original line indices. `hunk`/`meta` lines (diff\n * headers, not source) are excluded from that document.\n *\n * Colour is never the only channel (accessibility.md, WCAG 1.4.1): every\n * `add`/`del` row carries a screen-reader polarity word AND a `+`/`−` marker\n * glyph in its own column — the row tint (`bg-success/10` / `bg-destructive/10`,\n * the fill rung) is the third, redundant cue, never the only one.\n *\n * The `DiffLine` model and the polarity-prefix technique are adapted from\n * `theswerd/brainless` (MIT) — see `ATTRIBUTION.md`.\n */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentProps,\n type KeyboardEvent,\n} from \"react\";\nimport {\n Skeleton,\n diffLineAccessibleLabel,\n diffLineMarker,\n useDiffRows,\n useLocale,\n type DiffLine,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { cva } from \"class-variance-authority\";\nimport type { BundledLanguage, ThemedToken } from \"shiki\";\nimport { highlightCode } from \"./code-block\";\nimport { Shimmer } from \"./shimmer\";\n\n// ─── Public types ───────────────────────────────────────────────────────────\n//\n// `DiffLineType` and `DiffLine` moved to `@elabs-ai/components-ui`\n// (`lib/diff-line.ts`) — the terminal CLI look-alike family's own diff hunk\n// (issue #117) reuses the same model, and `@elabs-ai/components-ai`/\n// `@elabs-ai/components-terminal` are layer-2 DAG siblings that may not\n// import each other (T0; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n// above; NOT re-exported from here — `@elabs-ai/components-ai` never\n// re-exports from `@elabs-ai/components-ui` (its barrel stays own-module\n// only). A consumer imports `DiffLine`/`DiffLineType` from\n// `@elabs-ai/components-ui`.\n\nexport interface DiffViewProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /** The diff, as a flat, ordered line list. */\n lines: DiffLine[];\n /** File path shown in the header. */\n file?: string;\n /** One-line summary shown beside the file name. */\n summary?: string;\n /** Added / removed line counts shown in the header. */\n stats?: { additions: number; deletions: number };\n /** `inline` = unified single column; `split` = side-by-side. @default \"inline\" */\n variant?: \"inline\" | \"split\";\n /**\n * Full-screen reading surface: a scrollable region with a scroll-position\n * indicator, a key legend (↑/↓, Page Up/Down, Home/End), and a named\n * `role=\"region\"`. Absorbs the upstream `CodexDiff` pager shape — this\n * prop, not a second component.\n */\n pager?: boolean;\n /** Shiki language id for intra-line syntax colour. Omit to render plain text. */\n language?: BundledLanguage;\n /** Collapse a run of consecutive `context` lines longer than this behind a \"show more\" control. */\n contextLines?: number;\n /** Hard cap on rendered lines. Extra lines are simply not rendered. */\n maxLines?: number;\n /** No renderable diff yet (loading-states.md) — layout-shaped skeleton rows at the real row height. */\n loading?: boolean;\n /** Lines are still arriving (loading-states.md) — render what exists; never an error surface. */\n isStreaming?: boolean;\n}\n\n// ─── Row styling (one visual axis: line type → tint) ───────────────────────\n\n/**\n * The row's fill-rung tint — the THIRD, redundant cue (accessibility.md /\n * styling-and-tokens.md). Never the only signal: every `add`/`del` row also\n * carries a marker glyph (shape) and an `sr-only` polarity word (name).\n */\nexport const diffRowVariants = cva(\n \"grid grid-cols-[2.75rem_2.75rem_1.25rem_1fr] items-start gap-x-2 px-2 py-0.5\",\n {\n variants: {\n type: {\n add: \"bg-success/10\",\n del: \"bg-destructive/10\",\n context: \"\",\n hunk: \"bg-muted/40\",\n meta: \"\",\n },\n },\n defaultVariants: { type: \"context\" },\n },\n);\n\nconst GUTTER_CLASS = \"select-none text-end text-meta text-muted-foreground tabular-nums\";\n\n// Marker GLYPHS (`diffLineMarker`) and screen-reader polarity LABELS\n// (`diffLineAccessibleLabel`) are promoted to `@elabs-ai/components-ui`\n// (`lib/diff-line.ts`) — imported above. The tint below stays here: it is\n// presentational (Tailwind token classes), not part of the shared model.\n\nconst MARKER_TONE: Record<\"add\" | \"del\" | \"context\", string> = {\n add: \"text-success-text\",\n del: \"text-destructive-text\",\n context: \"text-muted-foreground\",\n};\n\n// ─── Theme scope (mirrors code-block.tsx's private helper — not a fork of it) ──\n\nconst getThemeScope = (el: Element | null): Element | null =>\n el?.closest(\"[data-theme]\") ??\n (typeof document !== \"undefined\" ? document.documentElement : null);\n\n// ─── Intra-line syntax highlighting ────────────────────────────────────────\n\ntype TokenizedResult = NonNullable<ReturnType<typeof highlightCode>>;\n\n/**\n * Highlights only the lines that are real source (`add` / `del` / `context`)\n * as one combined document, so Shiki sees genuine surrounding context instead\n * of tokenizing each line in isolation, then maps the result back onto the\n * original line indices. `hunk` / `meta` lines are diff headers, not code, and\n * are excluded from the document entirely.\n */\nfunction useDiffTokens(\n lines: DiffLine[],\n language: BundledLanguage | undefined,\n scopeEl: Element | null,\n): Map<number, ThemedToken[]> | null {\n const codeIndices = useMemo(\n () =>\n lines\n .map((line, index) => ({ line, index }))\n .filter(({ line }) => line.type !== \"hunk\" && line.type !== \"meta\")\n .map(({ index }) => index),\n [lines],\n );\n const combinedCode = useMemo(\n () => codeIndices.map((index) => lines[index]?.text ?? \"\").join(\"\\n\"),\n [codeIndices, lines],\n );\n\n const [result, setResult] = useState<TokenizedResult | null>(null);\n\n useEffect(() => {\n if (!language || combinedCode.length === 0) {\n setResult(null);\n return;\n }\n let cancelled = false;\n const cached = highlightCode(\n combinedCode,\n language,\n (r) => {\n if (!cancelled) setResult(r);\n },\n scopeEl,\n );\n if (cached) setResult(cached);\n return () => {\n cancelled = true;\n };\n }, [combinedCode, language, scopeEl]);\n\n return useMemo(() => {\n if (!language || !result) return null;\n const map = new Map<number, ThemedToken[]>();\n codeIndices.forEach((originalIndex, i) => {\n const tokenLine = result.tokens[i];\n if (tokenLine) map.set(originalIndex, tokenLine);\n });\n return map;\n }, [codeIndices, result, language]);\n}\n\n/** Renders pre-highlighted tokens; colour only (a diff row doesn't need bold/italic/underline). */\nfunction TokenText({ tokens, fallback }: { tokens?: ThemedToken[]; fallback: string }) {\n if (!tokens) return <>{fallback}</>;\n return (\n <>\n {tokens.map((token, i) => (\n // oxlint-disable-next-line eslint(react/no-array-index-key) -- tokens for one line never reorder\n <span key={i} style={{ color: token.color }}>\n {token.content}\n </span>\n ))}\n </>\n );\n}\n\n// ─── Context-run collapsing ─────────────────────────────────────────────────\n//\n// The row-collapsing model (`DiffRow`, `collapseDiffRows`, `useDiffRows`,\n// formerly this file's private `Row`/`useVisibleRows`) is promoted to\n// `@elabs-ai/components-ui` (`lib/diff-rows.ts`) — imported above. It is pure\n// (no Shiki, no DOM) and the terminal CLI look-alike family's own diff hunk\n// (issue #117) reuses it unchanged; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4.\n\nfunction CollapsedRow({ hiddenCount, onExpand }: { hiddenCount: number; onExpand: () => void }) {\n const { t } = useLocale();\n return (\n <div\n data-slot=\"diff-view-collapsed\"\n className=\"col-span-full grid grid-cols-[2.75rem_2.75rem_1.25rem_1fr]\"\n >\n <button\n type=\"button\"\n onClick={onExpand}\n className=\"col-start-4 w-fit rounded-sm px-1 text-info-text text-meta hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {t(\"ai.diffView.showMore\", { count: hiddenCount })}\n </button>\n </div>\n );\n}\n\n// ─── Full-width rows (hunk / meta) ──────────────────────────────────────────\n\nfunction FullWidthRow({ line }: { line: DiffLine }) {\n return (\n <div\n data-slot=\"diff-view-row\"\n data-diff-type={line.type}\n className={cn(\n diffRowVariants({ type: line.type as \"hunk\" | \"meta\" }),\n \"col-span-full block font-mono text-meta text-muted-foreground\",\n line.type === \"hunk\" && \"italic\",\n )}\n >\n {line.text || \" \"}\n </div>\n );\n}\n\n// ─── Inline rows ────────────────────────────────────────────────────────────\n\nfunction InlineRow({\n line,\n index,\n tokens,\n}: {\n line: DiffLine;\n index: number;\n tokens?: ThemedToken[];\n}) {\n const { t } = useLocale();\n if (line.type === \"hunk\" || line.type === \"meta\") {\n return <FullWidthRow line={line} />;\n }\n const type = line.type;\n const polarityKey = diffLineAccessibleLabel(type);\n return (\n <div\n data-slot=\"diff-view-row\"\n data-diff-type={type}\n data-diff-index={index}\n className={diffRowVariants({ type })}\n >\n <span data-slot=\"diff-view-gutter-old\" className={GUTTER_CLASS} aria-hidden=\"true\">\n {type !== \"add\" ? (line.oldNumber ?? \"\") : \"\"}\n </span>\n <span data-slot=\"diff-view-gutter-new\" className={GUTTER_CLASS} aria-hidden=\"true\">\n {type !== \"del\" ? (line.newNumber ?? \"\") : \"\"}\n </span>\n <span\n data-slot=\"diff-view-marker\"\n aria-hidden=\"true\"\n className={cn(\"select-none font-bold font-mono text-code\", MARKER_TONE[type])}\n >\n {diffLineMarker(type)}\n </span>\n <span\n data-slot=\"diff-view-line-text\"\n className=\"whitespace-pre-wrap break-all font-mono text-code\"\n >\n {polarityKey && <span className=\"sr-only\">{t(polarityKey)}</span>}\n <TokenText tokens={tokens} fallback={line.text || \" \"} />\n </span>\n </div>\n );\n}\n\n// ─── Split rows (two aligned columns: old-file view | new-file view) ───────\n\nfunction SplitSide({\n show,\n number,\n markerType,\n polarityKey,\n text,\n tokens,\n}: {\n show: boolean;\n number?: number;\n markerType: \"add\" | \"del\" | \"context\";\n polarityKey?: ReturnType<typeof diffLineAccessibleLabel>;\n text: string;\n tokens?: ThemedToken[];\n}) {\n const { t } = useLocale();\n if (!show) {\n return (\n <span aria-hidden=\"true\" className=\"block\">\n {\" \"}\n </span>\n );\n }\n return (\n <div className=\"grid grid-cols-[2.75rem_1.25rem_1fr] items-start gap-x-2\">\n <span className={GUTTER_CLASS} aria-hidden=\"true\">\n {number ?? \"\"}\n </span>\n <span\n aria-hidden=\"true\"\n className={cn(\"select-none font-bold font-mono text-code\", MARKER_TONE[markerType])}\n >\n {diffLineMarker(markerType)}\n </span>\n <span className=\"whitespace-pre-wrap break-all font-mono text-code\">\n {polarityKey && <span className=\"sr-only\">{t(polarityKey)}</span>}\n <TokenText tokens={tokens} fallback={text || \" \"} />\n </span>\n </div>\n );\n}\n\nfunction SplitRow({\n line,\n index,\n tokens,\n}: {\n line: DiffLine;\n index: number;\n tokens?: ThemedToken[];\n}) {\n if (line.type === \"hunk\" || line.type === \"meta\") {\n return <FullWidthRow line={line} />;\n }\n const type = line.type;\n const showOld = type !== \"add\";\n const showNew = type !== \"del\";\n return (\n <div data-slot=\"diff-view-row\" data-diff-type={type} data-diff-index={index} className=\"flex\">\n <div className={cn(\"flex-1 px-2 py-0.5\", showOld && diffRowVariants({ type }))}>\n <SplitSide\n show={showOld}\n number={line.oldNumber}\n markerType={type === \"del\" ? \"del\" : \"context\"}\n polarityKey={diffLineAccessibleLabel(type)}\n text={line.text}\n tokens={tokens}\n />\n </div>\n <div\n className={cn(\n \"flex-1 border-s border-s-border-strong px-2 py-0.5\",\n showNew && diffRowVariants({ type }),\n )}\n >\n <SplitSide\n show={showNew}\n number={line.newNumber}\n markerType={type === \"add\" ? \"add\" : \"context\"}\n polarityKey={diffLineAccessibleLabel(type)}\n text={line.text}\n tokens={tokens}\n />\n </div>\n </div>\n );\n}\n\n// ─── Skeleton (loading-states.md) ───────────────────────────────────────────\n\nfunction SkeletonRow() {\n return (\n <div data-slot=\"diff-view-row\" className={diffRowVariants({ type: \"context\" })}>\n <Skeleton className=\"ms-auto h-3 w-6\" />\n <Skeleton className=\"ms-auto h-3 w-6\" />\n <span />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n );\n}\n\n// ─── Header ─────────────────────────────────────────────────────────────────\n\nfunction DiffViewHeader({\n file,\n summary,\n stats,\n}: {\n file?: string;\n summary?: string;\n stats?: { additions: number; deletions: number };\n}) {\n const { t } = useLocale();\n return (\n <div\n data-slot=\"diff-view-header\"\n className=\"flex items-center justify-between gap-3 border-b bg-muted/80 px-3 py-2 text-meta text-muted-foreground\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n {file && (\n <span className=\"truncate font-mono text-code\" data-slot=\"diff-view-file\">\n {file}\n </span>\n )}\n {summary && <span className=\"truncate\">{summary}</span>}\n </div>\n {stats && (\n <div data-slot=\"diff-view-stats\" className=\"flex shrink-0 items-center gap-2 tabular-nums\">\n <span className=\"sr-only\">\n {t(\"ai.diffView.statsSummary\", {\n additions: stats.additions,\n deletions: stats.deletions,\n })}\n </span>\n <span aria-hidden=\"true\" className=\"font-mono text-success-text\">\n +{stats.additions}\n </span>\n <span aria-hidden=\"true\" className=\"font-mono text-destructive-text\">\n {\"−\"}\n {stats.deletions}\n </span>\n </div>\n )}\n </div>\n );\n}\n\n// ─── Pager (absorbs the upstream CodexDiff shape) ──────────────────────────\n\nfunction DiffViewPager({\n children,\n regionLabel,\n}: {\n children: React.ReactNode;\n regionLabel: string;\n}) {\n const { t } = useLocale();\n const scrollRef = useRef<HTMLDivElement>(null);\n const [percent, setPercent] = useState(0);\n\n const updatePercent = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const max = el.scrollHeight - el.clientHeight;\n setPercent(max <= 0 ? 100 : Math.round((el.scrollTop / max) * 100));\n }, []);\n\n const onKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n const el = scrollRef.current;\n if (!el) return;\n switch (event.key) {\n case \"ArrowDown\":\n el.scrollBy({ top: 24 });\n break;\n case \"ArrowUp\":\n el.scrollBy({ top: -24 });\n break;\n case \"PageDown\":\n el.scrollBy({ top: el.clientHeight });\n break;\n case \"PageUp\":\n el.scrollBy({ top: -el.clientHeight });\n break;\n case \"Home\":\n el.scrollTo({ top: 0 });\n break;\n case \"End\":\n el.scrollTo({ top: el.scrollHeight });\n break;\n default:\n return;\n }\n event.preventDefault();\n }, []);\n\n return (\n <div\n data-slot=\"diff-view-pager\"\n role=\"region\"\n aria-label={regionLabel}\n className=\"flex flex-col\"\n >\n <div\n ref={scrollRef}\n tabIndex={0}\n onScroll={updatePercent}\n onKeyDown={onKeyDown}\n className=\"max-h-[32rem] overflow-y-auto focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n >\n {children}\n </div>\n <div\n data-slot=\"diff-view-pager-footer\"\n className=\"flex items-center justify-between border-t bg-muted/50 px-3 py-1.5 text-meta text-muted-foreground\"\n >\n <span>{t(\"ai.diffView.pagerLegend\")}</span>\n <span aria-hidden=\"true\" className=\"tabular-nums\">\n {percent}%\n </span>\n </div>\n </div>\n );\n}\n\n// ─── Root ───────────────────────────────────────────────────────────────────\n\nexport const DiffView = forwardRef<HTMLDivElement, DiffViewProps>(function DiffView(\n {\n lines,\n file,\n summary,\n stats,\n variant = \"inline\",\n pager = false,\n language,\n contextLines,\n maxLines,\n loading = false,\n isStreaming = false,\n className,\n ...props\n },\n ref,\n) {\n const { t } = useLocale();\n const containerRef = useRef<HTMLDivElement>(null);\n const [scopeEl, setScopeEl] = useState<Element | null>(null);\n\n useEffect(() => {\n setScopeEl(getThemeScope(containerRef.current));\n }, []);\n\n const clippedLines = useMemo(\n () => (maxLines ? lines.slice(0, maxLines) : lines),\n [lines, maxLines],\n );\n const tokens = useDiffTokens(clippedLines, language, scopeEl);\n const { rows, expand } = useDiffRows(clippedLines, contextLines);\n\n const RowComponent = variant === \"split\" ? SplitRow : InlineRow;\n\n const regionLabel = file\n ? `${t(\"ai.diffView.regionLabel\")}: ${file}`\n : t(\"ai.diffView.regionLabel\");\n\n const body = loading ? (\n <div data-slot=\"diff-view-body\">\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {t(\"ai.diffView.loading\")}\n </span>\n {Array.from({\n length: clippedLines.length > 0 ? Math.min(clippedLines.length, 12) : 6,\n }).map((_, i) => (\n // oxlint-disable-next-line eslint(react/no-array-index-key) -- fixed-count placeholder rows\n <SkeletonRow key={i} />\n ))}\n </div>\n ) : (\n <div data-slot=\"diff-view-body\">\n {rows.map((row) =>\n row.kind === \"collapsed\" ? (\n <CollapsedRow\n key={`collapsed-${row.runStart}`}\n hiddenCount={row.hiddenCount}\n onExpand={() => expand(row.runStart)}\n />\n ) : (\n <RowComponent\n key={row.index}\n line={row.line}\n index={row.index}\n tokens={tokens?.get(row.index)}\n />\n ),\n )}\n </div>\n );\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n data-slot=\"diff-view\"\n className={cn(\"overflow-hidden rounded-md border bg-background text-foreground\", className)}\n {...props}\n >\n {(file || summary || stats) && <DiffViewHeader file={file} summary={summary} stats={stats} />}\n {pager ? <DiffViewPager regionLabel={regionLabel}>{body}</DiffViewPager> : body}\n {isStreaming && (\n <div\n className=\"flex items-center gap-2 border-t bg-muted/80 px-3 py-1.5 text-caption text-muted-foreground\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Shimmer>{t(\"ai.codeBlock.generating\")}</Shimmer>\n </div>\n )}\n </div>\n );\n});\n","\"use client\";\n\nimport type { EdgeProps } from \"@xyflow/react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\n/**\n * React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019.\n * `EdgeProps` above is a TYPE import and erases.\n */\nconst AnimatedImpl = lazyFlowPart<EdgeProps>((m) => m.EdgeAnimated);\nconst TemporaryImpl = lazyFlowPart<EdgeProps>((m) => m.EdgeTemporary);\n\n// Edges render inside React Flow's `<svg>`, so the fallback must be `null` —\n// there is no box to reserve, and the engine chunk is the one the surrounding\n// `<Canvas>` already fetched.\nconst Animated = (props: EdgeProps) => (\n <Suspense fallback={null}>\n <AnimatedImpl {...props} />\n </Suspense>\n);\n\nconst Temporary = (props: EdgeProps) => (\n <Suspense fallback={null}>\n <TemporaryImpl {...props} />\n </Suspense>\n);\n\nexport const Edge = {\n Animated,\n Temporary,\n};\n","\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Switch } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { CheckIcon, CopyIcon, EyeIcon, EyeOffIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface EnvironmentVariablesContextType {\n showValues: boolean;\n setShowValues: (show: boolean) => void;\n}\n\n// Default noop for context default value\n// oxlint-disable-next-line eslint(no-empty-function)\nconst noop = () => {};\n\nconst EnvironmentVariablesContext = createContext<EnvironmentVariablesContextType>({\n setShowValues: noop,\n showValues: false,\n});\n\nexport type EnvironmentVariablesProps = HTMLAttributes<HTMLDivElement> & {\n showValues?: boolean;\n defaultShowValues?: boolean;\n onShowValuesChange?: (show: boolean) => void;\n};\n\nexport const EnvironmentVariables = ({\n showValues: controlledShowValues,\n defaultShowValues = false,\n onShowValuesChange,\n className,\n children,\n ...props\n}: EnvironmentVariablesProps) => {\n const [internalShowValues, setInternalShowValues] = useState(defaultShowValues);\n const showValues = controlledShowValues ?? internalShowValues;\n\n const setShowValues = useCallback(\n (show: boolean) => {\n setInternalShowValues(show);\n onShowValuesChange?.(show);\n },\n [onShowValuesChange],\n );\n\n const contextValue = useMemo(() => ({ setShowValues, showValues }), [setShowValues, showValues]);\n\n return (\n <EnvironmentVariablesContext.Provider value={contextValue}>\n <div className={cn(\"rounded-lg border bg-background\", className)} {...props}>\n {children}\n </div>\n </EnvironmentVariablesContext.Provider>\n );\n};\n\nexport type EnvironmentVariablesHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const EnvironmentVariablesHeader = ({\n className,\n children,\n ...props\n}: EnvironmentVariablesHeaderProps) => (\n <div className={cn(\"flex items-center justify-between border-b px-4 py-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type EnvironmentVariablesTitleProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const EnvironmentVariablesTitle = ({\n className,\n children,\n ...props\n}: EnvironmentVariablesTitleProps) => (\n <h3 className={cn(\"font-medium text-sm\", className)} {...props}>\n {children ?? \"Environment Variables\"}\n </h3>\n);\n\nexport type EnvironmentVariablesToggleProps = ComponentProps<typeof Switch>;\n\nexport const EnvironmentVariablesToggle = ({\n className,\n ...props\n}: EnvironmentVariablesToggleProps) => {\n const { t } = useLocale();\n const { showValues, setShowValues } = useContext(EnvironmentVariablesContext);\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n <span className=\"text-muted-foreground text-xs\">\n {showValues ? <EyeIcon size={14} /> : <EyeOffIcon size={14} />}\n </span>\n <Switch\n aria-label={t(\"ai.environmentVariables.toggleVisibility\")}\n checked={showValues}\n onCheckedChange={setShowValues}\n {...props}\n />\n </div>\n );\n};\n\nexport type EnvironmentVariablesContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const EnvironmentVariablesContent = ({\n className,\n children,\n ...props\n}: EnvironmentVariablesContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\ninterface EnvironmentVariableContextType {\n name: string;\n value: string;\n}\n\nconst EnvironmentVariableContext = createContext<EnvironmentVariableContextType>({\n name: \"\",\n value: \"\",\n});\n\nexport type EnvironmentVariableGroupProps = HTMLAttributes<HTMLDivElement>;\n\nexport const EnvironmentVariableGroup = ({\n className,\n children,\n ...props\n}: EnvironmentVariableGroupProps) => (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type EnvironmentVariableNameProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const EnvironmentVariableName = ({\n className,\n children,\n ...props\n}: EnvironmentVariableNameProps) => {\n const { name } = useContext(EnvironmentVariableContext);\n\n return (\n <span className={cn(\"font-mono text-sm\", className)} {...props}>\n {children ?? name}\n </span>\n );\n};\n\nexport type EnvironmentVariableValueProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const EnvironmentVariableValue = ({\n className,\n children,\n ...props\n}: EnvironmentVariableValueProps) => {\n const { value } = useContext(EnvironmentVariableContext);\n const { showValues } = useContext(EnvironmentVariablesContext);\n\n const displayValue = showValues ? value : \"•\".repeat(Math.min(value.length, 20));\n\n return (\n <span\n className={cn(\n \"font-mono text-muted-foreground text-sm\",\n !showValues && \"select-none\",\n className,\n )}\n {...props}\n >\n {children ?? displayValue}\n </span>\n );\n};\n\nexport type EnvironmentVariableProps = HTMLAttributes<HTMLDivElement> & {\n name: string;\n value: string;\n};\n\nexport const EnvironmentVariable = ({\n name,\n value,\n className,\n children,\n ...props\n}: EnvironmentVariableProps) => {\n const envVarContextValue = useMemo(() => ({ name, value }), [name, value]);\n\n return (\n <EnvironmentVariableContext.Provider value={envVarContextValue}>\n <div\n className={cn(\"flex items-center justify-between gap-4 px-4 py-3\", className)}\n {...props}\n >\n {children ?? (\n <>\n <div className=\"flex items-center gap-2\">\n <EnvironmentVariableName />\n </div>\n <EnvironmentVariableValue />\n </>\n )}\n </div>\n </EnvironmentVariableContext.Provider>\n );\n};\n\nexport type EnvironmentVariableCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n copyFormat?: \"name\" | \"value\" | \"export\";\n};\n\nexport const EnvironmentVariableCopyButton = ({\n onCopy,\n onError,\n timeout = 2000,\n copyFormat = \"value\",\n children,\n className,\n ...props\n}: EnvironmentVariableCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { name, value } = useContext(EnvironmentVariableContext);\n\n const getTextToCopy = useCallback((): string => {\n const formatMap = {\n export: () => `export ${name}=\"${value}\"`,\n name: () => name,\n value: () => value,\n };\n return formatMap[copyFormat]();\n }, [name, value, copyFormat]);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(getTextToCopy());\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n }, [getTextToCopy, onCopy, onError, timeout]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"size-6 shrink-0\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={12} />}\n </Button>\n );\n};\n\nexport type EnvironmentVariableRequiredProps = ComponentProps<typeof Badge>;\n\nexport const EnvironmentVariableRequired = ({\n className,\n children,\n ...props\n}: EnvironmentVariableRequiredProps) => (\n <Badge className={cn(\"text-xs\", className)} variant=\"secondary\" {...props}>\n {children ?? \"Required\"}\n </Badge>\n);\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n fileIconFor,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type { LucideIcon } from \"lucide-react\";\nimport {\n ChevronRightIcon,\n DatabaseIcon,\n FileCode2Icon,\n FileIcon,\n FileTextIcon,\n FolderIcon,\n FolderOpenIcon,\n ImageIcon,\n TableIcon,\n} from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, forwardRef, useCallback, useContext, useMemo, useState } from \"react\";\nimport type { ContextAsset, ContextAssetType } from \"./context-panel\";\n\ninterface FileTreeContextType {\n expandedPaths: Set<string>;\n togglePath: (path: string) => void;\n selectedPath?: string;\n onSelect?: (path: string) => void;\n}\n\n// Default noop for context default value\n// oxlint-disable-next-line eslint(no-empty-function)\nconst noop = () => {};\n\nconst FileTreeContext = createContext<FileTreeContextType>({\n // oxlint-disable-next-line eslint-plugin-unicorn(no-new-builtin)\n expandedPaths: new Set(),\n togglePath: noop,\n});\n\n/**\n * Visual axis (#193, research 04 §4 ASSET-1): `code` (default, unchanged) is\n * the IDE source tree — mono + hard box; `document` is the produced-asset\n * look — sans body role, no box (section label + spacing separate it,\n * research 08), for trees of documents rather than source files.\n */\nconst fileTreeVariants = cva(\"\", {\n variants: {\n variant: {\n code: \"rounded-lg border bg-background font-mono text-sm\",\n document: \"text-body\",\n },\n },\n defaultVariants: { variant: \"code\" },\n});\n\nexport type FileTreeVariant = NonNullable<VariantProps<typeof fileTreeVariants>[\"variant\"]>;\n\nexport type FileTreeProps = Omit<HTMLAttributes<HTMLDivElement>, \"onSelect\"> &\n VariantProps<typeof fileTreeVariants> & {\n expanded?: Set<string>;\n defaultExpanded?: Set<string>;\n selectedPath?: string;\n onSelect?: (path: string) => void;\n onExpandedChange?: (expanded: Set<string>) => void;\n };\n\nexport const FileTree = forwardRef<HTMLDivElement, FileTreeProps>(function FileTree(\n {\n expanded: controlledExpanded,\n defaultExpanded = new Set(),\n selectedPath,\n onSelect,\n onExpandedChange,\n variant,\n className,\n children,\n ...props\n },\n ref,\n) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const expandedPaths = controlledExpanded ?? internalExpanded;\n\n const togglePath = useCallback(\n (path: string) => {\n const newExpanded = new Set(expandedPaths);\n if (newExpanded.has(path)) {\n newExpanded.delete(path);\n } else {\n newExpanded.add(path);\n }\n setInternalExpanded(newExpanded);\n onExpandedChange?.(newExpanded);\n },\n [expandedPaths, onExpandedChange],\n );\n\n const contextValue = useMemo(\n () => ({ expandedPaths, onSelect, selectedPath, togglePath }),\n [expandedPaths, onSelect, selectedPath, togglePath],\n );\n\n return (\n <FileTreeContext.Provider value={contextValue}>\n <div\n ref={ref}\n className={cn(fileTreeVariants({ variant }), className)}\n role=\"tree\"\n {...props}\n >\n <div className={cn(variant === \"document\" ? undefined : \"p-2\")}>{children}</div>\n </div>\n </FileTreeContext.Provider>\n );\n});\n\nexport type FileTreeIconProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const FileTreeIcon = ({ className, children, ...props }: FileTreeIconProps) => (\n <span className={cn(\"shrink-0\", className)} {...props}>\n {children}\n </span>\n);\n\nexport type FileTreeNameProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const FileTreeName = ({ className, children, ...props }: FileTreeNameProps) => (\n <span className={cn(\"truncate\", className)} {...props}>\n {children}\n </span>\n);\n\ninterface FileTreeFolderContextType {\n path: string;\n name: string;\n isExpanded: boolean;\n}\n\nconst FileTreeFolderContext = createContext<FileTreeFolderContextType>({\n isExpanded: false,\n name: \"\",\n path: \"\",\n});\n\nexport type FileTreeFolderProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n};\n\nexport const FileTreeFolder = ({\n path,\n name,\n className,\n children,\n ...props\n}: FileTreeFolderProps) => {\n const { expandedPaths, togglePath, selectedPath, onSelect } = useContext(FileTreeContext);\n const isExpanded = expandedPaths.has(path);\n const isSelected = selectedPath === path;\n\n const handleOpenChange = useCallback(() => {\n togglePath(path);\n }, [togglePath, path]);\n\n const handleSelect = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n const folderContextValue = useMemo(() => ({ isExpanded, name, path }), [isExpanded, name, path]);\n\n return (\n <FileTreeFolderContext.Provider value={folderContextValue}>\n <Collapsible onOpenChange={handleOpenChange} open={isExpanded}>\n <div className={cn(\"\", className)} role=\"treeitem\" tabIndex={0} {...props}>\n <div\n className={cn(\n \"flex w-full items-center gap-1 rounded px-2 py-1 text-start transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n )}\n >\n <CollapsibleTrigger asChild>\n <button\n className=\"flex shrink-0 cursor-pointer items-center border-none bg-transparent p-0\"\n type=\"button\"\n >\n <ChevronRightIcon\n className={cn(\n \"size-4 shrink-0 text-muted-foreground transition-transform\",\n isExpanded && \"rotate-90\",\n )}\n data-rtl-flip\n />\n </button>\n </CollapsibleTrigger>\n <button\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-1 border-none bg-transparent p-0 text-start\"\n onClick={handleSelect}\n type=\"button\"\n >\n <FileTreeIcon>\n {isExpanded ? (\n <FolderOpenIcon className=\"size-4 text-primary\" />\n ) : (\n <FolderIcon className=\"size-4 text-primary\" />\n )}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </button>\n </div>\n <CollapsibleContent>\n <div className=\"ms-4 border-s ps-2\">{children}</div>\n </CollapsibleContent>\n </div>\n </Collapsible>\n </FileTreeFolderContext.Provider>\n );\n};\n\ninterface FileTreeFileContextType {\n path: string;\n name: string;\n}\n\nconst FileTreeFileContext = createContext<FileTreeFileContextType>({\n name: \"\",\n path: \"\",\n});\n\nexport type FileTreeFileProps = HTMLAttributes<HTMLDivElement> & {\n path: string;\n name: string;\n icon?: ReactNode;\n};\n\nexport const FileTreeFile = ({\n path,\n name,\n icon,\n className,\n children,\n ...props\n}: FileTreeFileProps) => {\n const { selectedPath, onSelect } = useContext(FileTreeContext);\n const isSelected = selectedPath === path;\n\n const handleClick = useCallback(() => {\n onSelect?.(path);\n }, [onSelect, path]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n onSelect?.(path);\n }\n },\n [onSelect, path],\n );\n\n const fileContextValue = useMemo(() => ({ name, path }), [name, path]);\n\n return (\n <FileTreeFileContext.Provider value={fileContextValue}>\n <div\n className={cn(\n \"flex cursor-pointer items-center gap-1 rounded px-2 py-1 transition-colors hover:bg-muted/50\",\n isSelected && \"bg-muted\",\n className,\n )}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"treeitem\"\n tabIndex={0}\n {...props}\n >\n {children ?? (\n <>\n {/* Spacer for alignment */}\n <span className=\"size-4 shrink-0\" />\n <FileTreeIcon>\n {icon ?? <FileIcon className=\"size-4 text-muted-foreground\" />}\n </FileTreeIcon>\n <FileTreeName>{name}</FileTreeName>\n </>\n )}\n </div>\n </FileTreeFileContext.Provider>\n );\n};\n\nexport type FileTreeActionsProps = HTMLAttributes<HTMLDivElement>;\n\nconst stopPropagation = (e: React.SyntheticEvent) => e.stopPropagation();\n\nexport const FileTreeActions = ({ className, children, ...props }: FileTreeActionsProps) => (\n <div\n className={cn(\"ms-auto flex items-center gap-1\", className)}\n onClick={stopPropagation}\n onKeyDown={stopPropagation}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n);\n\n/** Asset-type glyphs (lucide, research 04 §4) — doc / code / sql / csv / image. */\nexport const PRODUCED_ASSET_ICONS: Record<ContextAssetType, LucideIcon> = {\n markdown: FileTextIcon,\n code: FileCode2Icon,\n sql: DatabaseIcon,\n csv: TableIcon,\n image: ImageIcon,\n};\n\n/**\n * The glyph for one asset.\n *\n * A FILE-BACKED asset (`source` set — a PDF, a deck, a video reaching the rail\n * through `AssetPreview`'s `renderPreview` seam) carries a `type` from a closed\n * five-member union that cannot describe it, so the type-keyed glyph above\n * would lie: a PDF typed `code` would draw a code glyph. Its name and MIME do\n * know, so those go through the shared resolver instead (ADR 0024 §6).\n *\n * An asset with inline `content` keeps the type-keyed glyph exactly as before —\n * for those the author's `type` is the better answer, not a guess from a\n * filename.\n */\nfunction assetIcon(asset: ContextAsset): LucideIcon {\n return asset.source ? fileIconFor(asset.name, asset.mediaType) : PRODUCED_ASSET_ICONS[asset.type];\n}\n\nexport type ProducedAssetTreeProps = Omit<\n FileTreeProps,\n \"variant\" | \"onSelect\" | \"selectedPath\"\n> & {\n /** The produced assets, in display order. */\n assets: ContextAsset[];\n /** Selected asset id (mirror `useContextPanel().state.selectedAsset?.id`). */\n selectedId?: string;\n /** Called with the chosen asset — wire to `useContextPanel().actions.openDetail`. */\n onSelect?: (asset: ContextAsset) => void;\n};\n\n/**\n * ProducedAssetTree — the document-variant preset (#193, research 04 §4):\n * produced assets are documents, not source code, so the tree reads sans,\n * box-free, with first-class asset-type icons. Pair with `ContextPanelSection`\n * for the label; selection drives the ContextPanel drill-in.\n */\nexport const ProducedAssetTree = forwardRef<HTMLDivElement, ProducedAssetTreeProps>(\n function ProducedAssetTree({ assets, selectedId, onSelect, ...props }, ref) {\n const assetsById = useMemo(() => new Map(assets.map((asset) => [asset.id, asset])), [assets]);\n const handleSelect = useCallback(\n (path: string) => {\n const asset = assetsById.get(path);\n if (asset) onSelect?.(asset);\n },\n [assetsById, onSelect],\n );\n return (\n <FileTree\n ref={ref}\n variant=\"document\"\n selectedPath={selectedId}\n onSelect={handleSelect}\n {...props}\n >\n {assets.length === 0 ? (\n <p className=\"px-2 py-1 text-body text-muted-foreground\">No assets produced yet.</p>\n ) : (\n assets.map((asset) => {\n const Icon = assetIcon(asset);\n return (\n <FileTreeFile key={asset.id} path={asset.id} name={asset.name}>\n <FileTreeIcon>\n <Icon aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n </FileTreeIcon>\n <FileTreeName>{asset.name}</FileTreeName>\n </FileTreeFile>\n );\n })\n )}\n </FileTree>\n );\n },\n);\n","\"use client\";\n\n/**\n * Gallery — an OUTPUT-oriented image gallery for AI results / chat surfaces.\n *\n * A `Card` that renders a single image, or a thumbnail grid that collapses the\n * overflow into a \"+N more\" tile, and opens a unified lightbox `Dialog` with a\n * `Carousel` and a right-side metadata panel that tracks the active slide.\n *\n * Distinct from the other image surfaces in this package — don't merge them:\n * - `attachments.tsx` — composer INPUT (removable, file-typed thumbnails).\n * - `asset-preview.tsx` — a SINGLE asset in the context rail (type-switched).\n * - `image.tsx` — a base64 `<img>` wrapper for AI-SDK generated images.\n * Gallery is the multi-image lightbox: expand / download / carousel / metadata.\n *\n * The data model is framework-agnostic (plain `{ src, alt, … }`) — it does NOT\n * couple to the AI-SDK message model. Map a `UIMessage` part onto `GalleryImage`\n * in the app or a thin adapter.\n */\n\nimport {\n AspectRatio,\n Button,\n Card,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Skeleton,\n downloadUrl,\n type CarouselApi,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { useReducedMotion } from \"@elabs-ai/components-tokens\";\nimport { Download, ImageOff, Maximize2 } from \"lucide-react\";\nimport {\n createContext,\n forwardRef,\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\n\n/** One labelled metadata row rendered in the detail panel `<dl>`. */\nexport interface GalleryMetaItem {\n /** Field label (rendered muted, in the `<dt>`). */\n label: string;\n /** Field value — a string in the common case; `ReactNode` allows a link/badge. */\n value: ReactNode;\n}\n\n/** A single gallery image plus its optional metadata. */\nexport interface GalleryImage {\n /** Full-resolution source shown in the lightbox and standalone tile. */\n src: string;\n /** Required alt text (a11y). Pass `\"\"` to mark the image decorative. */\n alt: string;\n /** Cheaper thumbnail for the grid; falls back to `src`. */\n thumbnailSrc?: string;\n /** Headline shown in the panel; also feeds the dialog's accessible name. */\n title?: string;\n /** Long-form copy shown under the title in the detail panel. */\n description?: string;\n /** Structured key/value rows rendered as a `<dl>` in the detail panel. */\n meta?: GalleryMetaItem[];\n /** Overrides `src` for the download (e.g. a signed full-res URL). */\n downloadUrl?: string;\n /** Suggested download filename. */\n downloadName?: string;\n}\n\nexport interface GalleryProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Images to display. `0` → empty state, `1` → standalone, `≥2` → grid. */\n images: GalleryImage[];\n /** Thumbnails to show before collapsing the rest into a \"+N more\" tile. @default 5 */\n maxVisible?: number;\n /** Aspect ratio for grid tiles and the standalone image. @default 1 (square) */\n aspectRatio?: number;\n /** Hide every download affordance (e.g. rights-restricted assets). @default false */\n hideDownload?: boolean;\n /**\n * The set is still arriving (loading-states.md `loading` signal). Renders\n * skeleton tiles in the grid footprint instead of the empty state, and fills\n * the gap up to `expectedCount` (or `maxVisible`) while images stream in.\n * @default false\n */\n loading?: boolean;\n /**\n * Total images expected once the set finishes arriving. When\n * `images.length < expectedCount`, the arrived tiles render alongside\n * skeleton tiles for the missing ones, so the grid fills in place (no reflow).\n */\n expectedCount?: number;\n /**\n * Replace the default metadata body in the detail panel. Receives the\n * currently-active image, so it stays in sync with the carousel. The panel\n * chrome + title heading remain.\n */\n renderMeta?: (image: GalleryImage, index: number) => ReactNode;\n}\n\ninterface GalleryContextValue {\n images: GalleryImage[];\n maxVisible: number;\n aspectRatio: number;\n hideDownload: boolean;\n /** The set is still arriving — render skeleton tiles to fill the gap. */\n incoming: boolean;\n /** How many skeleton tiles to append after the arrived images. */\n skeletonCount: number;\n renderMeta?: GalleryProps[\"renderMeta\"];\n state: { open: boolean; activeIndex: number };\n actions: {\n open: (index: number) => void;\n close: () => void;\n setActiveIndex: (index: number) => void;\n setOpen: (open: boolean) => void;\n };\n}\n\nconst GalleryContext = createContext<GalleryContextValue | null>(null);\n\nfunction useGallery(): GalleryContextValue {\n const ctx = use(GalleryContext);\n if (!ctx) throw new Error(\"useGallery must be used within <Gallery />\");\n return ctx;\n}\n\nfunction triggerDownload(image: GalleryImage): void {\n void downloadUrl(image.downloadUrl ?? image.src, image.downloadName);\n}\n\n/**\n * `<img>` with a `Skeleton` placeholder until it loads (loading-states.md — the\n * box is already reserved by `AspectRatio`, so no CLS) and a token-styled\n * fallback box when the source fails to load.\n */\nfunction GalleryImg({\n src,\n alt,\n className,\n loading,\n showSkeleton = true,\n}: {\n src: string;\n alt: string;\n className?: string;\n loading?: \"lazy\" | \"eager\";\n /**\n * Show the `Skeleton` placeholder until load. Only meaningful inside a\n * space-reserved box (`AspectRatio`); the lightbox sets `false` because the\n * slide isn't sized to the image, so an `absolute inset-0` skeleton would fill\n * the whole padded slide rather than the image footprint.\n */\n showSkeleton?: boolean;\n}) {\n const [failed, setFailed] = useState(false);\n const [loaded, setLoaded] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n\n // Cached images can finish before React attaches `onLoad` — read `complete`.\n useEffect(() => {\n if (imgRef.current?.complete) setLoaded(true);\n }, []);\n\n if (failed) {\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center gap-1 bg-muted text-muted-foreground\",\n className,\n )}\n {...(alt ? { role: \"img\", \"aria-label\": alt } : { \"aria-hidden\": true })}\n >\n <ImageOff className=\"size-6\" aria-hidden=\"true\" />\n </div>\n );\n }\n\n return (\n <>\n {showSkeleton && !loaded ? (\n <Skeleton className=\"absolute inset-0 size-full rounded-none\" />\n ) : null}\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n loading={loading}\n onError={() => setFailed(true)}\n onLoad={() => setLoaded(true)}\n className={className}\n />\n </>\n );\n}\n\n/** Round, frosted icon button that downloads `image`. */\nfunction GalleryDownloadButton({\n image,\n className,\n tabIndex,\n}: {\n image: GalleryImage;\n className?: string;\n /** Off-screen carousel slides pass -1 so they're not phantom tab stops. */\n tabIndex?: number;\n}) {\n const { t } = useLocale();\n\n return (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"outline\"\n tabIndex={tabIndex}\n aria-label={t(\"ai.gallery.downloadImage\")}\n className={cn(\"rounded-full bg-background/80 backdrop-blur-sm\", className)}\n onClick={(event) => {\n event.stopPropagation();\n triggerDownload(image);\n }}\n >\n <Download aria-hidden=\"true\" />\n </Button>\n );\n}\n\nconst HOVER_TOOLBAR =\n \"opacity-0 transition-opacity duration-fast ease-standard group-hover:opacity-100 group-focus-within:opacity-100 motion-reduce:transition-none\";\n\n// \"Comes closer\" hover for a tile: a gentle scale-up + drop shadow, plus a 3D\n// tilt that tracks the cursor. Movement (tilt + scale) is gated by\n// useReducedMotion — the shadow still responds (\"reduced != none\", like Card).\n// The wrapper carries `group relative` (toolbar reveal + absolute children) and\n// NO overflow, so the shadow and the inner control's focus ring aren't clipped.\nconst TILT_PERSPECTIVE = 800; // px — larger = subtler tilt\nconst TILT_MAX_DEG = 6;\nconst TILT_SCALE = 1.04;\nconst tiltTransform = (rotateX: number, rotateY: number, scale: number) =>\n `perspective(${TILT_PERSPECTIVE}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`;\nconst TILT_REST = tiltTransform(0, 0, 1);\n\nfunction GalleryTilt({ className, children }: { className?: string; children: ReactNode }) {\n const reduced = useReducedMotion();\n const ref = useRef<HTMLDivElement>(null);\n const rect = useRef<DOMRect | null>(null);\n const raf = useRef<number | null>(null);\n\n useEffect(\n () => () => {\n if (raf.current != null) cancelAnimationFrame(raf.current);\n },\n [],\n );\n\n // Reduced motion: no tilt/scale; the shadow alone signals the lift.\n if (reduced) {\n return (\n <div\n className={cn(\n \"group relative rounded-lg transition-shadow duration-base ease-standard hover:z-10 hover:shadow-xl\",\n className,\n )}\n >\n {children}\n </div>\n );\n }\n\n const write = (transform: string) => {\n if (ref.current) ref.current.style.transform = transform;\n };\n\n return (\n <div\n ref={ref}\n style={{ transform: TILT_REST }}\n onPointerEnter={() => {\n // Cache geometry once per hover (no per-move layout read); grow on enter.\n rect.current = ref.current?.getBoundingClientRect() ?? null;\n write(tiltTransform(0, 0, TILT_SCALE));\n }}\n onPointerMove={(event) => {\n const r = rect.current;\n if (!r) return;\n const px = (event.clientX - r.left) / r.width - 0.5;\n const py = (event.clientY - r.top) / r.height - 0.5;\n if (raf.current != null) cancelAnimationFrame(raf.current);\n raf.current = requestAnimationFrame(() =>\n write(tiltTransform(-py * TILT_MAX_DEG, px * TILT_MAX_DEG, TILT_SCALE)),\n );\n }}\n onPointerLeave={() => {\n if (raf.current != null) cancelAnimationFrame(raf.current);\n write(TILT_REST);\n }}\n className={cn(\n \"group relative rounded-lg transition-[transform,box-shadow] duration-base ease-standard hover:z-10 hover:shadow-2xl\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n\nfunction GalleryEmpty() {\n const { t } = useLocale();\n return (\n <div className=\"flex min-h-32 flex-col items-center justify-center gap-2 p-6 text-center text-muted-foreground\">\n <ImageOff className=\"size-6\" aria-hidden=\"true\" />\n <p className=\"text-body\">{t(\"ai.gallery.noImages\")}</p>\n </div>\n );\n}\n\n/** The single-image branch — a framed image with an always-on expand button. */\nfunction GallerySingle() {\n const { t } = useLocale();\n const { images, aspectRatio, hideDownload, actions } = useGallery();\n const image = images[0];\n if (!image) return null;\n\n return (\n <GalleryTilt>\n <AspectRatio ratio={aspectRatio} className=\"overflow-hidden rounded-lg\">\n <GalleryImg\n src={image.src}\n alt={image.alt}\n loading=\"lazy\"\n className=\"size-full object-cover\"\n />\n </AspectRatio>\n <div className=\"absolute end-2 top-2 z-10 flex items-center gap-1\">\n {hideDownload ? null : <GalleryDownloadButton image={image} className={HOVER_TOOLBAR} />}\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"outline\"\n aria-label={t(\"ai.gallery.expandImage\")}\n className=\"rounded-full bg-background/80 backdrop-blur-sm\"\n onClick={() => actions.open(0)}\n >\n <Maximize2 aria-hidden=\"true\" />\n </Button>\n </div>\n </GalleryTilt>\n );\n}\n\n/** One thumbnail in the grid — a button that opens the lightbox at `index`. */\nfunction GalleryTile({ image, index }: { image: GalleryImage; index: number }) {\n const { images, aspectRatio, hideDownload, actions } = useGallery();\n const total = images.length;\n const label = image.title ?? (image.alt || `Image ${index + 1} of ${total}`);\n\n return (\n <GalleryTilt>\n <button\n type=\"button\"\n onClick={() => actions.open(index)}\n aria-label={label}\n className=\"block w-full rounded-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <AspectRatio ratio={aspectRatio} className=\"overflow-hidden rounded-lg\">\n {/* Decorative: the button carries the accessible name. */}\n <GalleryImg\n src={image.thumbnailSrc ?? image.src}\n alt=\"\"\n loading=\"lazy\"\n className=\"size-full object-cover\"\n />\n </AspectRatio>\n </button>\n {hideDownload ? null : (\n <GalleryDownloadButton\n image={image}\n className={cn(\"absolute end-2 top-2 z-10\", HOVER_TOOLBAR)}\n />\n )}\n </GalleryTilt>\n );\n}\n\n/** The \"+N more\" tile — same footprint as a thumbnail; opens the carousel. */\nfunction GalleryOverflowTile() {\n const { images, maxVisible, aspectRatio, actions } = useGallery();\n const total = images.length;\n const count = total - maxVisible;\n\n return (\n <GalleryTilt>\n <button\n type=\"button\"\n onClick={() => actions.open(maxVisible)}\n aria-label={`Show all ${total} images`}\n className=\"block w-full rounded-lg border border-border bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <AspectRatio ratio={aspectRatio} className=\"overflow-hidden rounded-lg\">\n <span className=\"flex size-full items-center justify-center text-subtitle text-muted-foreground transition-colors duration-fast ease-standard group-hover:text-foreground motion-reduce:transition-none\">\n +{count} more\n </span>\n </AspectRatio>\n </button>\n </GalleryTilt>\n );\n}\n\n/** A grid tile placeholder — same footprint as a thumbnail, shown while loading. */\nfunction GallerySkeletonTile() {\n const { aspectRatio } = useGallery();\n return (\n <AspectRatio ratio={aspectRatio} className=\"overflow-hidden rounded-lg\">\n <Skeleton className=\"size-full rounded-none\" />\n </AspectRatio>\n );\n}\n\n/**\n * The all-skeleton grid for the loading-from-empty case (no images yet).\n * Decorative — the loading announcement comes from the persistent live region on\n * the always-mounted `Card` (so it fires reliably; ARIA22).\n */\nfunction GallerySkeletonGrid() {\n const { skeletonCount } = useGallery();\n return (\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\" aria-hidden=\"true\">\n {Array.from({ length: Math.max(1, skeletonCount) }).map((_, i) => (\n <GallerySkeletonTile key={`skeleton-${i}`} />\n ))}\n </div>\n );\n}\n\nfunction GalleryGrid() {\n const { images, maxVisible, incoming, skeletonCount } = useGallery();\n const total = images.length;\n\n // While the set is still arriving, render the arrived tiles plus skeleton\n // tiles for the missing ones — no \"+N more\" collapse until the set settles.\n if (incoming) {\n return (\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {images.map((image, index) => (\n <GalleryTile key={`${image.src}-${index}`} image={image} index={index} />\n ))}\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <GallerySkeletonTile key={`skeleton-${i}`} />\n ))}\n </div>\n );\n }\n\n const hasOverflow = total > maxVisible;\n const visible = hasOverflow ? images.slice(0, maxVisible) : images;\n\n return (\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {visible.map((image, index) => (\n <GalleryTile key={`${image.src}-${index}`} image={image} index={index} />\n ))}\n {hasOverflow ? <GalleryOverflowTile /> : null}\n </div>\n );\n}\n\n/** Default detail-panel body: description + a `<dl>` of `meta` rows. */\nfunction GalleryDetailPanel({\n image,\n index,\n renderMeta,\n}: {\n image: GalleryImage;\n index: number;\n renderMeta?: GalleryProps[\"renderMeta\"];\n}) {\n const { t } = useLocale();\n const custom = renderMeta?.(image, index);\n if (custom != null) {\n return <div className=\"flex flex-col gap-4\">{custom}</div>;\n }\n\n const hasMeta = image.meta != null && image.meta.length > 0;\n const hasBody = Boolean(image.description) || hasMeta;\n\n if (!hasBody) {\n return <p className=\"text-body text-muted-foreground\">{t(\"ai.gallery.noDetails\")}</p>;\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n {image.description ? (\n <p className=\"text-body text-muted-foreground\">{image.description}</p>\n ) : null}\n {hasMeta ? (\n <dl className=\"flex flex-col gap-3\">\n {image.meta?.map((item, i) => (\n <div key={`${item.label}-${i}`} className=\"flex flex-col gap-0.5\">\n <dt className=\"text-meta text-muted-foreground\">{item.label}</dt>\n <dd className=\"text-body text-foreground\">{item.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n </div>\n );\n}\n\n/** The lightbox carousel — one slide per image; syncs `activeIndex` on select. */\nfunction GalleryCarousel() {\n const { t } = useLocale();\n const { images, state, actions, hideDownload } = useGallery();\n const [api, setApi] = useState<CarouselApi>();\n const showArrows = images.length > 1;\n const { setActiveIndex } = actions;\n // Capture the open-at index ONCE (the modal remounts the carousel each open).\n // Tying opts.startIndex to the live activeIndex hands Embla a changed options\n // object on every slide (it deep-compares) → constant reInit → the native\n // slide animation never plays. A stable opts keeps Embla's scroll intact;\n // activeIndex flows one-way (carousel select → panel), never back into opts.\n const [startIndex] = useState(() => state.activeIndex);\n const opts = useMemo(() => ({ startIndex, loop: false }), [startIndex]);\n\n useEffect(() => {\n if (!api) return;\n const onSelect = () => setActiveIndex(api.selectedScrollSnap());\n onSelect();\n api.on(\"select\", onSelect);\n api.on(\"reInit\", onSelect);\n return () => {\n api.off(\"select\", onSelect);\n api.off(\"reInit\", onSelect);\n };\n }, [api, setActiveIndex]);\n\n // The dialog animates in (zoom-in-95); re-measure once laid out so Embla\n // aligns and lands on the opened slide.\n useEffect(() => {\n if (!api) return;\n const raf = requestAnimationFrame(() => api.reInit());\n return () => cancelAnimationFrame(raf);\n }, [api]);\n\n return (\n <Carousel\n setApi={setApi}\n opts={opts}\n className=\"relative w-full\"\n aria-label={t(\"ai.gallery.label\")}\n >\n <CarouselContent>\n {images.map((image, index) => (\n <CarouselItem\n key={`${image.src}-${index}`}\n aria-label={`${index + 1} of ${images.length}`}\n >\n <div className=\"group/slide relative flex items-center justify-center px-4\">\n <GalleryImg\n src={image.src}\n alt={image.alt}\n showSkeleton={false}\n className=\"max-h-[80vh] w-auto max-w-full object-contain\"\n />\n {hideDownload ? null : (\n <GalleryDownloadButton\n image={image}\n // Off-screen slides stay in the DOM (Embla); keep only the\n // active slide's download button in the tab order.\n tabIndex={index === state.activeIndex ? 0 : -1}\n className=\"absolute end-14 top-3 opacity-0 transition-opacity duration-fast ease-standard group-hover/slide:opacity-100 group-focus-within/slide:opacity-100 motion-reduce:transition-none\"\n />\n )}\n </div>\n </CarouselItem>\n ))}\n </CarouselContent>\n {showArrows ? (\n <>\n <CarouselPrevious className=\"start-4\" />\n <CarouselNext className=\"end-4\" />\n </>\n ) : null}\n </Carousel>\n );\n}\n\nfunction GalleryModal() {\n const { images, state, actions, renderMeta } = useGallery();\n const total = images.length;\n const active = images[state.activeIndex];\n\n const fallbackTitle = active\n ? active.alt || `Image ${state.activeIndex + 1} of ${total}`\n : \"Image preview\";\n\n return (\n <Dialog open={state.open} onOpenChange={actions.setOpen}>\n <DialogContent\n size=\"full\"\n className=\"grid grid-rows-[minmax(0,3fr)_minmax(0,2fr)] gap-0 overflow-hidden p-0 md:grid-cols-[minmax(0,1fr)_22rem] md:grid-rows-1\"\n >\n <div className=\"relative flex min-h-0 items-center justify-center overflow-hidden bg-muted\">\n {active ? <GalleryCarousel /> : null}\n </div>\n <aside className=\"flex min-h-0 flex-col overflow-y-auto border-border bg-card p-6 max-md:border-t md:border-s\">\n {active?.title ? (\n <DialogTitle className=\"pe-8 text-title\">{active.title}</DialogTitle>\n ) : (\n <DialogTitle className=\"sr-only\">{fallbackTitle}</DialogTitle>\n )}\n <DialogDescription className=\"sr-only\">\n {total > 1\n ? `Image ${state.activeIndex + 1} of ${total}. Use the arrow keys to browse.`\n : \"Image preview\"}\n </DialogDescription>\n {active ? (\n <div className=\"mt-4 flex-1\">\n <GalleryDetailPanel\n image={active}\n index={state.activeIndex}\n renderMeta={renderMeta}\n />\n </div>\n ) : null}\n </aside>\n {/* Carousel navigation only changes the title's text, which doesn't\n re-announce. A polite live region orients screen-reader users on each\n slide change. (sr-only is position:absolute, so it adds no grid cell.) */}\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {active && total > 1\n ? `${active.title ?? active.alt} — image ${state.activeIndex + 1} of ${total}`\n : \"\"}\n </span>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport const Gallery = forwardRef<HTMLDivElement, GalleryProps>(function Gallery(\n {\n images,\n maxVisible = 5,\n aspectRatio = 1,\n hideDownload = false,\n loading = false,\n expectedCount,\n renderMeta,\n className,\n ...props\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(0);\n\n const openAt = useCallback((index: number) => {\n setActiveIndex(index);\n setOpen(true);\n }, []);\n const close = useCallback(() => setOpen(false), []);\n\n // The set is \"incoming\" while it's still arriving — either an explicit\n // `loading` flag, or fewer images than the `expectedCount`. Fill the grid up\n // to the target (capped at the visible footprint) with skeleton tiles.\n const target = expectedCount ?? (loading ? maxVisible : undefined);\n const incoming = target !== undefined && images.length < target;\n const skeletonCount = incoming ? Math.max(0, Math.min(target, maxVisible) - images.length) : 0;\n\n // Loading announcement: the live region must exist BEFORE its text appears\n // (ARIA22), so the `sr-only` status span below is always mounted and its label\n // is set one tick later via this effect — reliable on NVDA + Chrome.\n const loadingFromEmpty = incoming && images.length === 0;\n const [liveMsg, setLiveMsg] = useState(\"\");\n useEffect(() => {\n setLiveMsg(loadingFromEmpty ? \"Loading images\" : \"\");\n }, [loadingFromEmpty]);\n\n const value = useMemo<GalleryContextValue>(\n () => ({\n images,\n maxVisible,\n aspectRatio,\n hideDownload,\n incoming,\n skeletonCount,\n renderMeta,\n state: { open, activeIndex },\n actions: { open: openAt, close, setActiveIndex, setOpen },\n }),\n [\n images,\n maxVisible,\n aspectRatio,\n hideDownload,\n incoming,\n skeletonCount,\n renderMeta,\n open,\n activeIndex,\n openAt,\n close,\n ],\n );\n\n let body: ReactNode;\n if (images.length === 0) {\n body = incoming ? <GallerySkeletonGrid /> : <GalleryEmpty />;\n } else if (incoming) {\n body = <GalleryGrid />;\n } else if (images.length === 1) {\n body = <GallerySingle />;\n } else {\n body = <GalleryGrid />;\n }\n\n return (\n <GalleryContext.Provider value={value}>\n <Card ref={ref} className={cn(\"p-2\", className)} {...props}>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {liveMsg}\n </span>\n {body}\n </Card>\n {images.length > 0 ? <GalleryModal /> : null}\n </GalleryContext.Provider>\n );\n});\n","\"use client\";\n\n/**\n * GroupedParts — renders an ordered part list, folding adjacent reasoning/tool\n * parts into collapsible traces (see `part-groups.ts` for the pure engine).\n *\n * A render-prop switches on `part.type`. Group nodes arrive as synthetic\n * `{ type: \"group-…\", status, indices }` with their rendered `children`; real\n * parts arrive as leaves. When no render-prop is given, sensible defaults\n * integrate the existing `Reasoning` / `Tool` components (and a collapsible\n * trace for groups). It is presentational only — the grouping is a client-side\n * view transform, never a model output format.\n *\n * NOTE: this is a generic function component (not `forwardRef`) because the\n * render-prop is generic over the part type `T`; `forwardRef` erases generics.\n */\n\nimport { Fragment, useMemo, type ComponentProps, type HTMLAttributes, type ReactNode } from \"react\";\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport {\n Badge,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\n\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"./reasoning\";\nimport {\n Tool,\n ToolContent,\n ToolHeader,\n ToolInput,\n ToolOutput,\n statusFromToolState,\n type ToolPart,\n} from \"./tool\";\nimport {\n buildPartGroups,\n defaultPartStatus,\n groupPartByType,\n partsFingerprint,\n type GetPartStatus,\n type GroupablePart,\n type GroupBy,\n type GroupedNode,\n type GroupStatus,\n type PartGroupNode,\n} from \"./part-groups\";\n\n// ─── Render-prop args ─────────────────────────────────────────────────────────\n\nexport interface GroupedPartRenderArgs<T extends GroupablePart> {\n /** The real part (leaf) or the synthetic group node. */\n part: T | PartGroupNode;\n /** True when `part` is a synthetic group node. */\n isGroup: boolean;\n /** The rendered subtree — group nodes only. */\n children?: ReactNode;\n /** Rolled-up status (groups) or the part's status (leaves). */\n status: GroupStatus;\n /** Original part indices under this group (groups only). */\n indices?: number[];\n /** Original part index (leaves only). */\n index?: number;\n}\n\nexport type GroupedPartRenderer<T extends GroupablePart> = (\n args: GroupedPartRenderArgs<T>,\n) => ReactNode;\n\n// ─── Default renderers ────────────────────────────────────────────────────────\n\nfunction DefaultGroup({\n status,\n count,\n children,\n}: {\n status: GroupStatus;\n count: number;\n children: ReactNode;\n}) {\n const running = status === \"running\";\n return (\n <Collapsible defaultOpen={running} className=\"not-prose w-full rounded-md border border-border\">\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 p-3 text-body text-muted-foreground\",\n \"transition-colors duration-fast ease-standard hover:text-foreground motion-reduce:transition-none\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n )}\n >\n <BrainIcon aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n <span className=\"flex-1 text-start\">{running ? \"Working…\" : \"Thought process\"}</span>\n {count > 0 && (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n {count}\n </Badge>\n )}\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 transition-transform group-data-[state=open]:rotate-180 motion-reduce:transition-none\"\n />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"space-y-3 p-3 pt-0\">{children}</CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction defaultRenderPart<T extends GroupablePart>(args: GroupedPartRenderArgs<T>): ReactNode {\n if (args.isGroup) {\n return (\n <DefaultGroup status={args.status} count={args.indices?.length ?? 0}>\n {args.children}\n </DefaultGroup>\n );\n }\n\n const part = args.part as GroupablePart;\n const streaming = args.status === \"running\";\n\n // Reasoning → the branded Reasoning disclosure.\n if (part.type === \"reasoning\" || part.type.startsWith(\"reasoning\")) {\n const text = typeof part.text === \"string\" ? part.text : \"\";\n return (\n <Reasoning isStreaming={streaming} defaultOpen={streaming}>\n <ReasoningTrigger />\n <ReasoningContent>{text}</ReasoningContent>\n </Reasoning>\n );\n }\n\n // Tool call → the branded Tool disclosure (defensive: parts are plain objects).\n if (part.type.startsWith(\"tool-\") || part.type === \"dynamic-tool\") {\n const p = part as Record<string, unknown>;\n const headerProps = {\n type: p.type,\n state: p.state ?? \"input-available\",\n toolName: p.type === \"dynamic-tool\" ? p.toolName : undefined,\n } as ComponentProps<typeof ToolHeader>;\n // The output area must reflect an in-flight call, not just a settled one\n // (loading-states.md / #269): a `tool-*` part in `input-streaming` (or\n // `input-available`, before output/error land) is \"pending\", so\n // `ToolOutput` renders its skeleton instead of nothing.\n const toolStreaming =\n statusFromToolState((p.state as ToolPart[\"state\"]) ?? \"input-available\") === \"pending\";\n return (\n <Tool>\n <ToolHeader {...headerProps} />\n <ToolContent>\n {p.input !== undefined && <ToolInput input={p.input} />}\n {(toolStreaming || p.output !== undefined || Boolean(p.errorText)) && (\n <ToolOutput\n output={p.output}\n errorText={(p.errorText as string) ?? undefined}\n isStreaming={toolStreaming}\n />\n )}\n </ToolContent>\n </Tool>\n );\n }\n\n // Text → plain prose (consumers usually override with a markdown renderer).\n if (part.type === \"text\") {\n const text = typeof part.text === \"string\" ? part.text : \"\";\n return <div className=\"whitespace-pre-wrap text-body text-foreground\">{text}</div>;\n }\n\n // Unknown leaf types: nothing by default (supply a render-prop for coverage).\n return null;\n}\n\n// ─── GroupedParts ─────────────────────────────────────────────────────────────\n\nexport interface GroupedPartsProps<T extends GroupablePart> extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\"\n> {\n /** The ordered message parts to render. */\n parts: readonly T[];\n /** How to group parts. @default `groupPartByType()` */\n groupBy?: GroupBy<T>;\n /** Extract a part's status (drives group rollup + streaming affordances). */\n getStatus?: GetPartStatus<T>;\n /** Render-prop switching on `part.type`. Omit to use the default renderers. */\n children?: GroupedPartRenderer<T>;\n}\n\n/**\n * Renders `parts`, coalescing adjacent grouped parts into collapsible traces.\n * The tree only rebuilds when the parts' identity/type/status fingerprint\n * changes, so streaming token updates don't remount rows.\n */\nexport function GroupedParts<T extends GroupablePart>({\n parts,\n groupBy = groupPartByType<T>(),\n getStatus,\n children,\n className,\n ...props\n}: GroupedPartsProps<T>) {\n const fingerprint = partsFingerprint(parts, getStatus);\n const tree = useMemo<GroupedNode<T>[]>(\n () => buildPartGroups(parts, groupBy, getStatus),\n // Rebuild only on a structural change; `parts`/`groupBy`/`getStatus` identity\n // may churn per render, but the fingerprint is the real dependency.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [fingerprint, groupBy, getStatus],\n );\n\n const renderPart = children ?? defaultRenderPart<T>;\n const statusOf = (part: T): GroupStatus => getStatus?.(part) ?? defaultPartStatus(part);\n\n const renderNode = (node: GroupedNode<T>): ReactNode => {\n if (node.kind === \"leaf\") {\n return (\n <Fragment key={node.key}>\n {renderPart({\n part: node.part,\n isGroup: false,\n status: statusOf(node.part),\n index: node.index,\n })}\n </Fragment>\n );\n }\n const kids = node.children.map(renderNode);\n return (\n <Fragment key={node.key}>\n {renderPart({\n part: node.group,\n isGroup: true,\n status: node.group.status,\n indices: node.group.indices,\n children: <>{kids}</>,\n })}\n </Fragment>\n );\n };\n\n return (\n <div className={cn(\"flex w-full flex-col gap-3\", className)} {...props}>\n {tree.map(renderNode)}\n </div>\n );\n}\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n useLocale,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport {\n useStreamdownMermaidOptions,\n useStreamdownPlugins,\n useStreamdownTranslations,\n} from \"./_streamdown-i18n\";\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nimport { Shimmer } from \"./shimmer\";\n\ninterface ReasoningContextValue {\n isStreaming: boolean;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n duration: number | undefined;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nexport const useReasoning = () => {\n const context = useContext(ReasoningContext);\n if (!context) {\n throw new Error(\"Reasoning components must be used within Reasoning\");\n }\n return context;\n};\n\nexport type ReasoningProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n duration?: number;\n};\n\nconst AUTO_CLOSE_DELAY = 1000;\nconst MS_IN_S = 1000;\n\nexport const Reasoning = memo(\n ({\n className,\n isStreaming = false,\n open,\n defaultOpen,\n onOpenChange,\n duration: durationProp,\n children,\n ...props\n }: ReasoningProps) => {\n const resolvedDefaultOpen = defaultOpen ?? isStreaming;\n // Track if defaultOpen was explicitly set to false (to prevent auto-open)\n const isExplicitlyClosed = defaultOpen === false;\n\n const [isOpen, setIsOpen] = useControllableState<boolean>({\n defaultProp: resolvedDefaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n const [duration, setDuration] = useControllableState<number | undefined>({\n defaultProp: undefined,\n prop: durationProp,\n });\n\n const hasEverStreamedRef = useRef(isStreaming);\n const [hasAutoClosed, setHasAutoClosed] = useState(false);\n const startTimeRef = useRef<number | null>(null);\n\n // Track when streaming starts and compute duration\n useEffect(() => {\n if (isStreaming) {\n hasEverStreamedRef.current = true;\n if (startTimeRef.current === null) {\n startTimeRef.current = Date.now();\n }\n } else if (startTimeRef.current !== null) {\n setDuration(Math.ceil((Date.now() - startTimeRef.current) / MS_IN_S));\n startTimeRef.current = null;\n }\n }, [isStreaming, setDuration]);\n\n // Auto-open when streaming starts (unless explicitly closed)\n useEffect(() => {\n if (isStreaming && !isOpen && !isExplicitlyClosed) {\n setIsOpen(true);\n }\n }, [isStreaming, isOpen, setIsOpen, isExplicitlyClosed]);\n\n // Auto-close when streaming ends (once only, and only if it ever streamed)\n useEffect(() => {\n if (hasEverStreamedRef.current && !isStreaming && isOpen && !hasAutoClosed) {\n const timer = setTimeout(() => {\n setIsOpen(false);\n setHasAutoClosed(true);\n }, AUTO_CLOSE_DELAY);\n\n return () => clearTimeout(timer);\n }\n }, [isStreaming, isOpen, setIsOpen, hasAutoClosed]);\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setIsOpen(newOpen);\n },\n [setIsOpen],\n );\n\n const contextValue = useMemo(\n () => ({ duration, isOpen, isStreaming, setIsOpen }),\n [duration, isOpen, isStreaming, setIsOpen],\n );\n\n return (\n <ReasoningContext.Provider value={contextValue}>\n <Collapsible\n className={cn(\"not-prose mb-4\", className)}\n onOpenChange={handleOpenChange}\n open={isOpen}\n {...props}\n >\n {children}\n </Collapsible>\n </ReasoningContext.Provider>\n );\n },\n);\n\nexport type ReasoningTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n getThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n};\n\nconst defaultGetThinkingMessage = (\n isStreaming: boolean,\n duration: number | undefined,\n t: (key: string, vars?: Record<string, string | number>) => string,\n) => {\n if (isStreaming || duration === 0) {\n return <Shimmer duration={1}>Thinking…</Shimmer>;\n }\n if (duration === undefined) {\n return <p>{t(\"ai.reasoning.thoughtDefault\")}</p>;\n }\n return <p>Thought for {duration} seconds</p>;\n};\n\nexport const ReasoningTrigger = memo(\n ({ className, children, getThinkingMessage, ...props }: ReasoningTriggerProps) => {\n const { isStreaming, isOpen, duration } = useReasoning();\n const { t } = useLocale();\n\n return (\n <CollapsibleTrigger\n className={cn(\n \"flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n <BrainIcon className=\"size-4\" />\n {getThinkingMessage\n ? getThinkingMessage(isStreaming, duration)\n : defaultGetThinkingMessage(isStreaming, duration, t)}\n <ChevronDownIcon\n className={cn(\"size-4 transition-transform\", isOpen ? \"rotate-180\" : \"rotate-0\")}\n />\n </>\n )}\n </CollapsibleTrigger>\n );\n },\n);\n\nexport type ReasoningContentProps = Omit<ComponentProps<typeof CollapsibleContent>, \"children\"> & {\n /**\n * The reasoning body.\n *\n * A **string** is rendered as streamed markdown (Streamdown) — the default for\n * model reasoning text. Any other node renders **as-is**, so a structured live\n * ledger (a timeline, per-step status) can live inside the disclosure without\n * being handed to a markdown parser. Mirrors the `getThinkingMessage` /\n * `children` override seam on `ReasoningTrigger`.\n *\n * Note an **array** of strings is not a `string` — `{[\"a\", \"b\"]}` renders raw.\n * Pass one string if you want it parsed as markdown.\n */\n children: ReactNode;\n};\n\nexport const ReasoningContent = memo(({ className, children, ...props }: ReasoningContentProps) => {\n // Streamdown's own chrome (code copy, table menus) reads the locale seam (#310).\n const translations = useStreamdownTranslations();\n // Brand-token-derived `code` plugin, not the package's static github-*\n // default (#315 follow-up) — re-derives when the active theme changes.\n const plugins = useStreamdownPlugins();\n // The TOP-LEVEL Streamdown `mermaid` prop — catches a failed diagram\n // render, including a missing `mermaid` optional peer (issue #33).\n const mermaidOptions = useStreamdownMermaidOptions();\n\n return (\n <CollapsibleContent\n className={cn(\n \"mt-4 text-sm\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n >\n {typeof children === \"string\" ? (\n <Streamdown plugins={plugins} translations={translations} mermaid={mermaidOptions}>\n {children}\n </Streamdown>\n ) : (\n children\n )}\n </CollapsibleContent>\n );\n});\n\nReasoning.displayName = \"Reasoning\";\nReasoningTrigger.displayName = \"ReasoningTrigger\";\nReasoningContent.displayName = \"ReasoningContent\";\n","\"use client\";\n\nimport { Skeleton, StatusBadge, 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 type { DynamicToolUIPart, ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, WrenchIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { isValidElement } from \"react\";\n\nimport { CodeBlock } from \"./code-block\";\n\nexport type ToolProps = ComponentProps<typeof Collapsible>;\n\nexport const Tool = ({ className, ...props }: ToolProps) => (\n <Collapsible\n className={cn(\"group not-prose mb-4 w-full rounded-md border\", className)}\n {...props}\n />\n);\n\nexport type ToolPart = ToolUIPart | DynamicToolUIPart;\n\nexport type ToolHeaderProps = {\n title?: string;\n /**\n * The business summary line (\"3 documents found\", \"8 rows reconciled\"),\n * shown beside the name + StatusBadge (#192, research 10 §B.5). Falls back\n * to nothing — the derived tool name still labels the row.\n */\n summary?: ReactNode;\n className?: string;\n} & (\n | { type: ToolUIPart[\"type\"]; state: ToolUIPart[\"state\"]; toolName?: never }\n | {\n type: DynamicToolUIPart[\"type\"];\n state: DynamicToolUIPart[\"state\"];\n toolName: string;\n }\n);\n\n/**\n * Map the AI-SDK `ToolUIPart` 7-state machine onto the canonical `Status`\n * enum (#189, research 10 §B.1 mapping a). Lives here — not in `@elabs-ai/components-ui` —\n * because it is typed against the SDK union; the `ai` import stays TYPES-ONLY\n * (D6, gate-enforced by `pnpm ai:types-only`).\n */\nexport const statusFromToolState = (state: ToolPart[\"state\"]): Status => {\n switch (state) {\n case \"input-streaming\":\n return \"pending\";\n case \"input-available\":\n return \"running\";\n case \"approval-requested\":\n return \"awaiting-approval\";\n case \"approval-responded\":\n return \"running\";\n case \"output-available\":\n return \"complete\";\n case \"output-denied\":\n return \"denied\";\n case \"output-error\":\n return \"failed\";\n }\n};\n\n/** Same signature as before #189; renders the canonical StatusBadge. */\nexport const getStatusBadge = (status: ToolPart[\"state\"]) => (\n <StatusBadge status={statusFromToolState(status)} />\n);\n\nexport const ToolHeader = ({\n className,\n title,\n summary,\n type,\n state,\n toolName,\n ...props\n}: ToolHeaderProps) => {\n const derivedName = type === \"dynamic-tool\" ? toolName : type.split(\"-\").slice(1).join(\"-\");\n\n return (\n <CollapsibleTrigger\n className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)}\n {...props}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <WrenchIcon className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"shrink-0 text-body font-medium\">{title ?? derivedName}</span>\n {getStatusBadge(state)}\n {summary ? (\n <span className=\"truncate text-meta text-muted-foreground\">{summary}</span>\n ) : null}\n </div>\n <ChevronDownIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n );\n};\n\nexport type ToolContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const ToolContent = ({ className, ...props }: ToolContentProps) => (\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 space-y-4 p-4 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n />\n);\n\nexport type ToolDetailsProps = ComponentProps<typeof Collapsible> & {\n /** The disclosure label. */\n label?: ReactNode;\n};\n\n/**\n * The technical view, behind disclosure — the PACKAGE DEFAULT for tool JSON\n * (#192, research 10 §B.5): a nested collapsible, COLLAPSED by default,\n * holding `ToolInput`/`ToolOutput`. The header carries the business `summary`;\n * the raw payload is one expand away, never the headline.\n */\nexport const ToolDetails = ({\n className,\n label = \"Show technical details\",\n defaultOpen = false,\n children,\n ...props\n}: ToolDetailsProps) => (\n <Collapsible\n className={cn(\"group/tool-details not-prose\", className)}\n defaultOpen={defaultOpen}\n {...props}\n >\n <CollapsibleTrigger className=\"flex items-center gap-1 rounded-sm text-meta text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n <ChevronDownIcon className=\"size-3.5 transition-transform group-data-[state=open]/tool-details:rotate-180\" />\n {label}\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-3 space-y-4\">{children}</CollapsibleContent>\n </Collapsible>\n);\n\nexport type ToolInputProps = ComponentProps<\"div\"> & {\n input: ToolPart[\"input\"];\n};\n\nexport const ToolInput = ({ className, input, ...props }: ToolInputProps) => {\n const { t } = useLocale();\n return (\n <div className={cn(\"space-y-2 overflow-hidden\", className)} {...props}>\n <h4 className=\"text-meta uppercase text-muted-foreground\">\n {t(\"ai.schemaDisplay.parameters\")}\n </h4>\n <div className=\"rounded-md bg-muted/50\">\n <CodeBlock code={JSON.stringify(input, null, 2)} language=\"json\" />\n </div>\n </div>\n );\n};\n\nexport type ToolOutputProps = ComponentProps<\"div\"> & {\n /**\n * The tool result. Objects/strings render as JSON inside the technical view.\n *\n * @deprecated Passing a pre-rendered **React element** here (the \"rich\n * output under a muted Result heading\" path) is deprecated since #192\n * (research 10 §B.5): a produced artifact is the HEADLINE, not a technical\n * detail — host it in a `<ToolResultCard>` and keep `ToolOutput` for the\n * JSON payload behind `<ToolDetails>`. The element path still renders for\n * existing consumers (e.g. the copy-owned `ai-chart` registry block) but\n * will be removed in a future release.\n */\n output: ToolPart[\"output\"];\n errorText: ToolPart[\"errorText\"];\n /**\n * The call has not produced output yet (loading-states.md `isStreaming`) —\n * derive it from the existing `statusFromToolState(state)` mapping\n * (`\"input-streaming\"`/`\"input-available\"` → not yet `\"complete\"`/`\"failed\"`)\n * rather than a second source of truth. While true and no `output`/\n * `errorText` has arrived, renders a layout-shaped skeleton in the Result\n * slot instead of `null`, so the technical view reserves its space. A\n * still-running call is never a terminal failure — the error branch is\n * suppressed while `isStreaming` per the loading-states.md error rule, even\n * if a stale `errorText` is still set from a previous render.\n * @default false\n */\n isStreaming?: boolean;\n};\n\nexport const ToolOutput = ({\n className,\n output,\n errorText,\n isStreaming = false,\n ...props\n}: ToolOutputProps) => {\n const { t } = useLocale();\n\n if (!(output || errorText || isStreaming)) {\n return null;\n }\n\n const showError = !isStreaming && Boolean(errorText);\n const pending = isStreaming && !output && !errorText;\n\n let Output = <div>{output as ReactNode}</div>;\n\n if (typeof output === \"object\" && !isValidElement(output)) {\n Output = <CodeBlock code={JSON.stringify(output, null, 2)} language=\"json\" />;\n } else if (typeof output === \"string\") {\n Output = <CodeBlock code={output} language=\"json\" />;\n }\n\n return (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <h4 className=\"text-meta uppercase text-muted-foreground\">\n {showError ? \"Error\" : \"Result\"}\n </h4>\n {pending ? (\n <div className=\"space-y-2 rounded-md bg-muted/50 p-3\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n ) : (\n <div\n className={cn(\n \"overflow-x-auto rounded-md text-caption [&_table]:w-full\",\n // #124: this colours the ambient text of the error/result body —\n // running text, so the error branch takes the ink rung.\n showError ? \"bg-destructive/10 text-destructive-text\" : \"bg-muted/50 text-foreground\",\n )}\n >\n {showError && <div>{errorText}</div>}\n {Output}\n </div>\n )}\n </div>\n );\n};\n","/**\n * part-groups.ts — Pure, framework-free part-grouping engine.\n *\n * Derives collapsible reasoning/tool traces from an ordered list of message\n * parts. This is a CLIENT-SIDE VIEW TRANSFORM — never a model output format.\n * Adapted from assistant-ui's grouping design onto this library's idiom.\n *\n * `groupBy(part, context)` maps each part to a group-key path (`group-…`);\n * ADJACENT parts sharing a key path coalesce into synthetic group nodes\n * (`{ type: \"group-…\", status, indices }`); multi-element paths nest. The\n * `group-` namespace is reserved so a group key can never collide with a real\n * part `type`.\n */\n\n/** A reserved group-key. The `group-` prefix can't collide with real part types. */\nexport type GroupKey = `group-${string}`;\n\n/** Rolled-up status of a group (any member running → the group is running). */\nexport type GroupStatus = \"pending\" | \"running\" | \"complete\" | \"error\";\n\n/** The minimum a groupable part must expose. */\nexport interface GroupablePart {\n type: string;\n [key: string]: unknown;\n}\n\n/** Context passed to `groupBy` for each part. */\nexport interface GroupByContext<T extends GroupablePart> {\n index: number;\n parts: readonly T[];\n}\n\n/** Maps a part to its group-key path (`[]` = not grouped, a top-level leaf). */\nexport type GroupBy<T extends GroupablePart> = (\n part: T,\n context: GroupByContext<T>,\n) => readonly GroupKey[];\n\n/** Extract a part's status; return `undefined` to fall back to the default. */\nexport type GetPartStatus<T extends GroupablePart> = (part: T) => GroupStatus | undefined;\n\n/** The synthetic node produced for a coalesced group. */\nexport interface PartGroupNode {\n type: GroupKey;\n status: GroupStatus;\n /** Original indices of every leaf part under this group (recursive). */\n indices: number[];\n}\n\n/** One node in the grouped tree — a leaf part or a synthetic group. */\nexport type GroupedNode<T extends GroupablePart> =\n | { kind: \"leaf\"; key: string; index: number; part: T }\n | { kind: \"group\"; key: string; group: PartGroupNode; children: GroupedNode<T>[] };\n\n// ---------------------------------------------------------------------------\n// Default status extraction\n// ---------------------------------------------------------------------------\n\nconst RUNNING_STATES = new Set([\n \"input-streaming\",\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"calling\",\n \"streaming\",\n \"in-progress\",\n]);\nconst ERROR_STATES = new Set([\"output-error\", \"error\", \"failed\"]);\nconst COMPLETE_STATES = new Set([\"output-available\", \"output-denied\", \"done\", \"complete\"]);\n\n/**\n * Best-effort status from common AI-SDK part shapes (tool `state`, reasoning\n * `state`, `isStreaming`). Overridable via `getStatus`.\n */\nexport function defaultPartStatus(part: GroupablePart): GroupStatus {\n if (part.isStreaming === true) return \"running\";\n const state = typeof part.state === \"string\" ? part.state : undefined;\n if (state) {\n if (ERROR_STATES.has(state)) return \"error\";\n if (RUNNING_STATES.has(state)) return \"running\";\n if (COMPLETE_STATES.has(state)) return \"complete\";\n }\n if (part.errorText || part.error) return \"error\";\n return \"complete\";\n}\n\n/** Roll several member statuses up into one group status. */\nexport function rollupStatus(statuses: readonly GroupStatus[]): GroupStatus {\n if (statuses.some((s) => s === \"running\")) return \"running\";\n if (statuses.some((s) => s === \"error\")) return \"error\";\n if (statuses.some((s) => s === \"pending\")) return \"pending\";\n return \"complete\";\n}\n\n// ---------------------------------------------------------------------------\n// Stable identity keys\n// ---------------------------------------------------------------------------\n\n/** Stable leaf key so streaming rows don't remount (prefers a part id). */\nfunction leafKey(part: GroupablePart, index: number): string {\n const id =\n (typeof part.id === \"string\" && part.id) ||\n (typeof part.toolCallId === \"string\" && part.toolCallId) ||\n null;\n return id ?? `${part.type}#${index}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\ninterface Entry<T extends GroupablePart> {\n part: T;\n index: number;\n path: readonly GroupKey[];\n}\n\nfunction buildLevel<T extends GroupablePart>(\n entries: Entry<T>[],\n statusOf: (part: T) => GroupStatus,\n): GroupedNode<T>[] {\n const out: GroupedNode<T>[] = [];\n let i = 0;\n while (i < entries.length) {\n const entry = entries[i]!;\n if (entry.path.length === 0) {\n out.push({\n kind: \"leaf\",\n key: leafKey(entry.part, entry.index),\n index: entry.index,\n part: entry.part,\n });\n i += 1;\n continue;\n }\n\n // Coalesce the adjacent run of entries sharing this level's key.\n const key0 = entry.path[0]!;\n const run: Entry<T>[] = [];\n let j = i;\n while (j < entries.length && entries[j]!.path.length > 0 && entries[j]!.path[0] === key0) {\n run.push(entries[j]!);\n j += 1;\n }\n\n // Recurse with each member's path shifted one level down (nesting).\n const childEntries: Entry<T>[] = run.map((r) => ({\n part: r.part,\n index: r.index,\n path: r.path.slice(1),\n }));\n const children = buildLevel(childEntries, statusOf);\n const indices = run.map((r) => r.index);\n const status = rollupStatus(run.map((r) => statusOf(r.part)));\n\n out.push({\n kind: \"group\",\n // First member index keeps the group key stable across append-only streams.\n key: `${key0}@${run[0]!.index}`,\n group: { type: key0, status, indices },\n children,\n });\n i = j;\n }\n return out;\n}\n\n/**\n * Build the grouped tree from an ordered part list. Pure + deterministic —\n * never throws. Adjacent parts with a shared group-key path coalesce; multi-key\n * paths nest; ungrouped parts (path `[]`) stay as top-level leaves.\n */\nexport function buildPartGroups<T extends GroupablePart>(\n parts: readonly T[],\n groupBy: GroupBy<T>,\n getStatus?: GetPartStatus<T>,\n): GroupedNode<T>[] {\n const statusOf = (part: T): GroupStatus => getStatus?.(part) ?? defaultPartStatus(part);\n const entries: Entry<T>[] = parts.map((part, index) => {\n let path: readonly GroupKey[] = [];\n try {\n path = groupBy(part, { index, parts }) ?? [];\n } catch {\n path = []; // a throwing groupBy must not break the transcript\n }\n return { part, index, path };\n });\n return buildLevel(entries, statusOf);\n}\n\n/**\n * A cheap fingerprint of the parts' identity + type + status. Feed it to a\n * `useMemo` so the grouped tree only rebuilds when something structural\n * changed — streaming token updates that don't change status won't churn it.\n */\nexport function partsFingerprint<T extends GroupablePart>(\n parts: readonly T[],\n getStatus?: GetPartStatus<T>,\n): string {\n return parts\n .map((part, index) => {\n const status = getStatus?.(part) ?? defaultPartStatus(part);\n return `${leafKey(part, index)}:${part.type}:${status}`;\n })\n .join(\"|\");\n}\n\n// ---------------------------------------------------------------------------\n// groupPartByType — the default grouping strategy + classification hint\n// ---------------------------------------------------------------------------\n\n/** Whether a part folds into a trace (`inline`) or always stands alone. */\nexport type PartDisplay = \"inline\" | \"standalone\";\n\nexport interface GroupPartByTypeOptions<T extends GroupablePart> {\n /** Group key for the collapsible trace. @default \"group-work\" */\n groupKey?: GroupKey;\n /** Part types folded into the trace. @default reasoning + tool-* + dynamic-tool + step-start */\n inline?: (string | RegExp)[];\n /** Part types forced standalone (never folded). @default approval / human / confirmation */\n standalone?: (string | RegExp)[];\n /** Explicit per-part classification; overrides the type lists. */\n classify?: (part: T) => PartDisplay | undefined;\n}\n\nconst DEFAULT_INLINE: (string | RegExp)[] = [/^reasoning$/, /^tool-/, \"dynamic-tool\", \"step-start\"];\nconst DEFAULT_STANDALONE: (string | RegExp)[] = [/approval/i, /human/i, \"confirmation\"];\n\nfunction matchesAny(type: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) => (typeof p === \"string\" ? p === type : p.test(type)));\n}\n\n/**\n * Build a `groupBy` that folds reasoning/tool parts into ONE collapsible trace\n * while forcing human/approval-style parts to stand alone — an interaction card\n * must never fold into a thinking accordion. The classification maps to the\n * `display: \"inline\" | \"standalone\"` hint.\n */\nexport function groupPartByType<T extends GroupablePart>(\n options: GroupPartByTypeOptions<T> = {},\n): GroupBy<T> {\n const groupKey = options.groupKey ?? \"group-work\";\n const inline = options.inline ?? DEFAULT_INLINE;\n const standalone = options.standalone ?? DEFAULT_STANDALONE;\n return (part) => {\n const explicit = options.classify?.(part);\n if (explicit === \"standalone\") return [];\n if (explicit === \"inline\") return [groupKey];\n if (matchesAny(part.type, standalone)) return []; // forced standalone\n if (matchesAny(part.type, inline)) return [groupKey];\n return []; // ungrouped (text, sources, files, …) stays top-level\n };\n}\n\n/** Type guard: is this render subject a synthetic group node? */\nexport function isGroupNode(part: { type: string }): part is PartGroupNode {\n return part.type.startsWith(\"group-\");\n}\n","\"use client\";\n\nimport { Skeleton, useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { Experimental_GeneratedImage } from \"ai\";\nimport { ImageOff } from \"lucide-react\";\nimport type { ImgHTMLAttributes } from \"react\";\nimport { forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\";\n\nexport type ImageProps = Experimental_GeneratedImage &\n Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> & {\n /**\n * Show a Skeleton placeholder (loading-states.md) until the img element\n * finishes decoding, so the base64 payload does not pop in. Requires\n * explicit `width`+`height` so the reserved box matches the final size\n * (interaction-guidelines.md Images section — prevents CLS); without\n * both there is no box to reserve, so the default is `false` in that\n * case rather than mounting a skeleton that collapses to nothing.\n * @default Boolean(width && height)\n */\n showSkeleton?: boolean;\n };\n\n/** `<img>` wrapper for an AI-SDK generated image, with a decode-aware skeleton. */\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(function Image(\n {\n base64,\n uint8Array: _uint8Array,\n mediaType,\n className,\n showSkeleton,\n onLoad,\n onError,\n width,\n height,\n alt,\n ...props\n },\n forwardedRef,\n) {\n const { t } = useLocale();\n const shouldSkeleton = showSkeleton ?? Boolean(width && height);\n const [loaded, setLoaded] = useState(false);\n const [failed, setFailed] = useState(false);\n const imgRef = useRef<HTMLImageElement>(null);\n useImperativeHandle(forwardedRef, () => imgRef.current as HTMLImageElement);\n\n const pending = shouldSkeleton && !loaded && !failed;\n\n // The live region must exist BEFORE its text appears (ARIA22), so it is\n // always mounted (while a skeleton can render at all) and its label is set\n // one tick later via this effect.\n const [announce, setAnnounce] = useState(false);\n useEffect(() => setAnnounce(pending), [pending]);\n\n // A cached / instant data-URI decode can finish before React attaches\n // `onLoad` — read `complete` once mounted (gallery.tsx's GalleryImg has the\n // same guard).\n useEffect(() => {\n if (imgRef.current?.complete) setLoaded(true);\n }, []);\n\n if (failed) {\n return (\n <span\n className={cn(\n \"flex flex-col items-center justify-center gap-1 rounded-md bg-muted text-muted-foreground\",\n className,\n )}\n style={{ height, width }}\n {...(alt ? { role: \"img\", \"aria-label\": alt } : { \"aria-hidden\": true })}\n >\n <ImageOff className=\"size-6\" aria-hidden=\"true\" />\n </span>\n );\n }\n\n const img = (\n <img\n {...props}\n ref={imgRef}\n alt={alt ?? \"\"}\n height={height}\n width={width}\n className={cn(\"h-auto max-w-full overflow-hidden rounded-md\", className)}\n src={`data:${mediaType};base64,${base64}`}\n onLoad={(event) => {\n setLoaded(true);\n onLoad?.(event);\n }}\n onError={(event) => {\n setFailed(true);\n onError?.(event);\n }}\n />\n );\n\n // No skeleton to reserve a box for — render the bare <img> exactly as\n // before this feature landed (a `className` like \"w-full\" keeps resolving\n // against the real parent, not a shrink-to-fit wrapper), and mount no\n // (permanently empty) live region.\n if (!shouldSkeleton) return img;\n\n return (\n <span className=\"relative inline-block max-w-full\" style={{ height, width }}>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {announce ? t(\"loading\") : \"\"}\n </span>\n {pending ? <Skeleton className=\"absolute inset-0 size-full rounded-md\" /> : null}\n {img}\n </span>\n );\n});\n\nImage.displayName = \"Image\";\n","\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport type { CarouselApi } from \"@elabs-ai/components-ui\";\nimport { Carousel, CarouselContent, CarouselItem } from \"@elabs-ai/components-ui\";\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { ArrowLeftIcon, ArrowRightIcon, BadgeCheckIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useCallback, useContext, useEffect, useState } from \"react\";\n\nexport type InlineCitationProps = ComponentProps<\"span\">;\n\nexport const InlineCitation = ({ className, ...props }: InlineCitationProps) => (\n <span className={cn(\"group inline items-center gap-1\", className)} {...props} />\n);\n\nexport type InlineCitationTextProps = ComponentProps<\"span\">;\n\nexport const InlineCitationText = ({ className, ...props }: InlineCitationTextProps) => (\n <span className={cn(\"transition-colors group-hover:bg-accent\", className)} {...props} />\n);\n\nexport type InlineCitationCardProps = ComponentProps<typeof HoverCard>;\n\nexport const InlineCitationCard = (props: InlineCitationCardProps) => (\n <HoverCard closeDelay={0} openDelay={0} {...props} />\n);\n\n/**\n * A cited source: a bare string — a URL, or any opaque id / human label — or a\n * labelled object.\n *\n * Non-URL sources are first-class. An agent citing a warehouse table, a document\n * id, an uploaded file or a wiki page has no hostname to show, and must not have\n * to synthesize a fake URL to satisfy the chip.\n */\nexport type InlineCitationSourceRef =\n | string\n | {\n /** Opaque identifier, shown when there is no `label` and no `url`. */\n id?: string;\n /** Human-readable label — wins over any hostname derived from `url`. */\n label?: string;\n /** Optional link; its hostname is the fallback label. */\n url?: string;\n };\n\n/** The URL's hostname when `value` parses as one, else `value` itself. Never throws. */\nconst hostnameOrRaw = (value: string): string => {\n try {\n return new URL(value).hostname || value;\n } catch {\n return value;\n }\n};\n\n/**\n * The chip label for a source ref. Exported so consumers can render the same\n * label elsewhere (a footnote list, a tooltip) without re-deriving the rules.\n */\nexport const inlineCitationSourceLabel = (source: InlineCitationSourceRef): string => {\n if (typeof source === \"string\") {\n return hostnameOrRaw(source);\n }\n // `||` not `??` — an upstream field that is present but EMPTY (`label: \"\"`)\n // must still fall through, or the chip renders with no label at all.\n return source.label || (source.url ? hostnameOrRaw(source.url) : source.id || \"unknown\");\n};\n\nexport type InlineCitationCardTriggerProps = ComponentProps<typeof Badge> & {\n sources: InlineCitationSourceRef[];\n};\n\nexport const InlineCitationCardTrigger = ({\n sources,\n className,\n ...props\n}: InlineCitationCardTriggerProps) => (\n <HoverCardTrigger asChild>\n <Badge\n // The 08 §C.1 evidence channel: the green wash marks \"grounded\" — green\n // is reserved for evidence/answer/favourable (research 11 §B.4).\n className={cn(\n \"ms-1 rounded-full border-success/40 bg-success/10 text-success-text\",\n className,\n )}\n variant=\"outline\"\n {...props}\n >\n <BadgeCheckIcon aria-hidden=\"true\" className=\"size-3\" />\n {sources[0] ? (\n <>\n {inlineCitationSourceLabel(sources[0])} {sources.length > 1 && `+${sources.length - 1}`}\n </>\n ) : (\n \"unknown\"\n )}\n </Badge>\n </HoverCardTrigger>\n);\n\nexport type EvidenceChipProps = InlineCitationCardTriggerProps;\n\n/**\n * EvidenceChip — the named front door for the inline evidence interaction\n * (research 11 §B.4): the re-skinned `InlineCitationCardTrigger` (green\n * \"grounded\" wash). Use inside an `InlineCitationCard` (HoverCard) — it reuses\n * the citation carousel wholesale; it is not a new primitive.\n */\nexport const EvidenceChip = InlineCitationCardTrigger;\n\nexport type InlineCitationCardBodyProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCardBody = ({ className, ...props }: InlineCitationCardBodyProps) => (\n <HoverCardContent className={cn(\"relative w-80 p-0\", className)} {...props} />\n);\n\nconst CarouselApiContext = createContext<CarouselApi | undefined>(undefined);\n\nconst useCarouselApi = () => {\n const context = useContext(CarouselApiContext);\n return context;\n};\n\nexport type InlineCitationCarouselProps = ComponentProps<typeof Carousel>;\n\nexport const InlineCitationCarousel = ({\n className,\n children,\n ...props\n}: InlineCitationCarouselProps) => {\n const [api, setApi] = useState<CarouselApi>();\n\n return (\n <CarouselApiContext.Provider value={api}>\n <Carousel className={cn(\"w-full\", className)} setApi={setApi} {...props}>\n {children}\n </Carousel>\n </CarouselApiContext.Provider>\n );\n};\n\nexport type InlineCitationCarouselContentProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselContent = (props: InlineCitationCarouselContentProps) => (\n <CarouselContent {...props} />\n);\n\nexport type InlineCitationCarouselItemProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselItem = ({\n className,\n ...props\n}: InlineCitationCarouselItemProps) => (\n <CarouselItem className={cn(\"w-full space-y-2 p-4 ps-8\", className)} {...props} />\n);\n\nexport type InlineCitationCarouselHeaderProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselHeader = ({\n className,\n ...props\n}: InlineCitationCarouselHeaderProps) => (\n <div\n className={cn(\n \"flex items-center justify-between gap-2 rounded-t-md bg-secondary p-2\",\n className,\n )}\n {...props}\n />\n);\n\nexport type InlineCitationCarouselIndexProps = ComponentProps<\"div\">;\n\nexport const InlineCitationCarouselIndex = ({\n children,\n className,\n ...props\n}: InlineCitationCarouselIndexProps) => {\n const api = useCarouselApi();\n const [current, setCurrent] = useState(0);\n const [count, setCount] = useState(0);\n\n const syncState = useCallback(() => {\n if (!api) {\n return;\n }\n setCount(api.scrollSnapList().length);\n setCurrent(api.selectedScrollSnap() + 1);\n }, [api]);\n\n useEffect(() => {\n if (!api) {\n return;\n }\n\n syncState();\n\n api.on(\"select\", syncState);\n\n return () => {\n api.off(\"select\", syncState);\n };\n }, [api, syncState]);\n\n return (\n <div\n className={cn(\n \"flex flex-1 items-center justify-end px-3 py-1 text-muted-foreground text-xs\",\n className,\n )}\n {...props}\n >\n {children ?? `${current}/${count}`}\n </div>\n );\n};\n\nexport type InlineCitationCarouselPrevProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselPrev = ({\n className,\n ...props\n}: InlineCitationCarouselPrevProps) => {\n const { t } = useLocale();\n const api = useCarouselApi();\n\n const handleClick = useCallback(() => {\n if (api) {\n api.scrollPrev();\n }\n }, [api]);\n\n return (\n <button\n aria-label={t(\"previous\")}\n className={cn(\"shrink-0\", className)}\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n <ArrowLeftIcon className=\"size-4 text-muted-foreground\" data-rtl-flip />\n </button>\n );\n};\n\nexport type InlineCitationCarouselNextProps = ComponentProps<\"button\">;\n\nexport const InlineCitationCarouselNext = ({\n className,\n ...props\n}: InlineCitationCarouselNextProps) => {\n const { t } = useLocale();\n const api = useCarouselApi();\n\n const handleClick = useCallback(() => {\n if (api) {\n api.scrollNext();\n }\n }, [api]);\n\n return (\n <button\n aria-label={t(\"next\")}\n className={cn(\"shrink-0\", className)}\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n <ArrowRightIcon className=\"size-4 text-muted-foreground\" data-rtl-flip />\n </button>\n );\n};\n\nexport type InlineCitationSourceProps = ComponentProps<\"div\"> & {\n title?: string;\n url?: string;\n description?: string;\n};\n\nexport const InlineCitationSource = ({\n title,\n url,\n description,\n className,\n children,\n ...props\n}: InlineCitationSourceProps) => (\n <div className={cn(\"space-y-1\", className)} {...props}>\n {title && <h4 className=\"truncate font-medium text-sm leading-tight\">{title}</h4>}\n {url && <p className=\"truncate break-all text-muted-foreground text-xs\">{url}</p>}\n {description && (\n <p className=\"line-clamp-3 text-muted-foreground text-sm leading-relaxed\">{description}</p>\n )}\n {children}\n </div>\n);\n\nexport type InlineCitationQuoteProps = ComponentProps<\"blockquote\">;\n\nexport const InlineCitationQuote = ({\n children,\n className,\n ...props\n}: InlineCitationQuoteProps) => (\n <blockquote\n className={cn(\"border-muted border-s-2 ps-3 text-muted-foreground text-sm italic\", className)}\n {...props}\n >\n {children}\n </blockquote>\n);\n","\"use client\";\n\nimport { Skeleton } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { AlertCircle } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { TProps as JsxParserProps } from \"react-jsx-parser\";\nimport JsxParser from \"react-jsx-parser\";\n\n/**\n * The readiness of the preview, derived from the input (see loading-states.md):\n * - `idle` — nothing requested yet (empty input, never rendered). Renders nothing.\n * - `pending` — not-ready: `loading`, `isStreaming`, OR syntactically incomplete\n * input (a half-arrived tag). Builds up best-effort; the error slot\n * is suppressed; the skeleton shows until the first successful paint.\n * - `ready` — settled, parseable input is rendering.\n * - `error` — settled AND genuinely invalid input (the only state that surfaces\n * `JSXPreviewError`).\n */\nexport type JSXPreviewStatus = \"idle\" | \"pending\" | \"ready\" | \"error\";\n\ninterface JSXPreviewContextValue {\n jsx: string;\n processedJsx: string;\n isStreaming: boolean;\n loading: boolean;\n status: JSXPreviewStatus;\n hasRendered: boolean;\n error: Error | null;\n setError: (error: Error | null) => void;\n setHasRendered: (value: boolean) => void;\n components: JsxParserProps[\"components\"];\n bindings: JsxParserProps[\"bindings\"];\n onErrorProp?: (error: Error) => void;\n}\n\nconst JSXPreviewContext = createContext<JSXPreviewContextValue | null>(null);\n\nconst TAG_REGEX = /<\\/?([a-zA-Z][a-zA-Z0-9]*)\\s*([^>]*?)(\\/)?>/;\n\nexport const useJSXPreview = () => {\n const context = useContext(JSXPreviewContext);\n if (!context) {\n throw new Error(\"JSXPreview components must be used within JSXPreview\");\n }\n return context;\n};\n\nconst matchJsxTag = (code: string) => {\n if (code.trim() === \"\") {\n return null;\n }\n\n const match = code.match(TAG_REGEX);\n\n if (!match || match.index === undefined) {\n return null;\n }\n\n const [fullMatch = \"\", tagName = \"\", attributes = \"\", selfClosing] = match;\n\n let type: \"self-closing\" | \"closing\" | \"opening\";\n if (selfClosing) {\n type = \"self-closing\";\n } else if (fullMatch.startsWith(\"</\")) {\n type = \"closing\";\n } else {\n type = \"opening\";\n }\n\n return {\n attributes: attributes.trim(),\n endIndex: match.index + fullMatch.length,\n startIndex: match.index,\n tag: fullMatch,\n tagName,\n type,\n };\n};\n\nconst stripIncompleteTag = (text: string) => {\n // Find the last '<' that isn't part of a complete tag\n const lastOpen = text.lastIndexOf(\"<\");\n if (lastOpen === -1) {\n return text;\n }\n\n const afterOpen = text.slice(lastOpen);\n // If there's no closing '>' after the last '<', it's an incomplete tag\n if (!afterOpen.includes(\">\")) {\n return text.slice(0, lastOpen);\n }\n\n return text;\n};\n\nconst completeJsxTag = (code: string) => {\n const stack: string[] = [];\n let result = \"\";\n let currentPosition = 0;\n\n while (currentPosition < code.length) {\n const match = matchJsxTag(code.slice(currentPosition));\n if (!match) {\n // No more tags found, strip any trailing incomplete tag\n result += stripIncompleteTag(code.slice(currentPosition));\n break;\n }\n const { tagName, type, endIndex } = match;\n\n // Include any text content before this tag\n result += code.slice(currentPosition, currentPosition + endIndex);\n\n if (type === \"opening\") {\n stack.push(tagName);\n } else if (type === \"closing\") {\n stack.pop();\n }\n\n currentPosition += endIndex;\n }\n\n return (\n result +\n [...stack]\n .reverse()\n .map((tag) => `</${tag}>`)\n .join(\"\")\n );\n};\n\nexport type JSXPreviewProps = ComponentProps<\"div\"> & {\n jsx: string;\n /** Content is arriving incrementally — build up, suppress transient errors. */\n isStreaming?: boolean;\n /**\n * No renderable content yet (fetch-then-show). Forces the `pending` state so\n * `JSXPreviewSkeleton` shows until `jsx` arrives. Orthogonal to `isStreaming`.\n */\n loading?: boolean;\n components?: JsxParserProps[\"components\"];\n bindings?: JsxParserProps[\"bindings\"];\n onError?: (error: Error) => void;\n};\n\nexport const JSXPreview = memo(\n ({\n jsx,\n isStreaming = false,\n loading = false,\n components,\n bindings,\n onError,\n className,\n children,\n ...props\n }: JSXPreviewProps) => {\n const [prevJsx, setPrevJsx] = useState(jsx);\n const [error, setError] = useState<Error | null>(null);\n const [hasRendered, setHasRendered] = useState(false);\n\n // Clear the terminal error when jsx changes (derived state pattern)\n if (jsx !== prevJsx) {\n setPrevJsx(jsx);\n setError(null);\n }\n\n // The tag-balanced best-effort of the current input. When it differs from the\n // raw jsx, the input ends mid-tag → it is INCOMPLETE (still streaming / being\n // typed), not invalid. This is the timer-free \"not-ready\" signal.\n const completed = useMemo(() => completeJsxTag(jsx), [jsx]);\n const isIncomplete = jsx.trim() !== \"\" && completed !== jsx;\n\n const processedJsx = useMemo(() => {\n if (loading) return \"\";\n return isStreaming || isIncomplete ? completed : jsx;\n }, [jsx, isStreaming, loading, isIncomplete, completed]);\n\n const status = useMemo<JSXPreviewStatus>(() => {\n if (loading) return \"pending\";\n if (jsx.trim() === \"\") return hasRendered ? \"ready\" : \"idle\";\n if (isStreaming || isIncomplete) return \"pending\";\n return error != null ? \"error\" : \"ready\";\n }, [jsx, isStreaming, loading, isIncomplete, error, hasRendered]);\n\n const contextValue = useMemo(\n () => ({\n bindings,\n components,\n error,\n hasRendered,\n isStreaming,\n jsx,\n loading,\n onErrorProp: onError,\n processedJsx,\n setError,\n setHasRendered,\n status,\n }),\n [\n bindings,\n components,\n error,\n hasRendered,\n isStreaming,\n jsx,\n loading,\n onError,\n processedJsx,\n status,\n ],\n );\n\n return (\n <JSXPreviewContext.Provider value={contextValue}>\n <div className={cn(\"relative\", className)} {...props}>\n {children}\n </div>\n </JSXPreviewContext.Provider>\n );\n },\n);\n\nJSXPreview.displayName = \"JSXPreview\";\n\nexport type JSXPreviewContentProps = Omit<ComponentProps<\"div\">, \"children\">;\n\nexport const JSXPreviewContent = memo(({ className, ...props }: JSXPreviewContentProps) => {\n const { processedJsx, status, components, bindings, setError, setHasRendered, onErrorProp } =\n useJSXPreview();\n const lastGoodJsxRef = useRef(\"\");\n // `erroredJsx` is committed in an effect (never during render). The parser\n // reports errors synchronously DURING its own render, so `handleError` only\n // stashes a ref — committing state there would be a setState-in-render.\n const [erroredJsx, setErroredJsx] = useState<string | null>(null);\n const pendingErrorRef = useRef<{ jsx: string; error: Error } | null>(null);\n\n // Reset the per-input error flag synchronously when the content changes.\n const prevProcessedRef = useRef(processedJsx);\n if (prevProcessedRef.current !== processedJsx) {\n prevProcessedRef.current = processedJsx;\n if (erroredJsx !== null) setErroredJsx(null);\n }\n const hadError = erroredJsx === processedJsx;\n\n const handleError = useCallback(\n (error: Error) => {\n pendingErrorRef.current = { error, jsx: processedJsx };\n },\n [processedJsx],\n );\n\n // After commit, reconcile the parse outcome. A fresh error becomes terminal\n // (surfaces `JSXPreviewError`) ONLY when settled — for a `pending` input it is\n // held silently (build-up keeps going behind the last good render). A clean\n // render records the last-good JSX and marks the first paint.\n useEffect(() => {\n const failed = pendingErrorRef.current?.jsx === processedJsx;\n if (failed) {\n const { error } = pendingErrorRef.current!;\n pendingErrorRef.current = null;\n if (erroredJsx !== processedJsx) setErroredJsx(processedJsx);\n if (status !== \"pending\") {\n setError(error);\n onErrorProp?.(error);\n }\n } else if (erroredJsx !== processedJsx && processedJsx.trim() !== \"\") {\n lastGoodJsxRef.current = processedJsx;\n setHasRendered(true);\n }\n }, [processedJsx, status, erroredJsx, setError, setHasRendered, onErrorProp]);\n\n // The error slot and the skeleton own the \"error\" / nothing-yet states.\n if (status !== \"ready\" && status !== \"pending\") {\n return null;\n }\n\n // While pending, a failed parse falls back to the last good render (which may\n // be empty on first paint — the skeleton covers that).\n const displayJsx = hadError ? lastGoodJsxRef.current : processedJsx;\n\n return (\n <div className={cn(\"jsx-preview-content\", className)} {...props}>\n <JsxParser\n bindings={bindings}\n components={components}\n jsx={displayJsx}\n onError={handleError}\n renderInWrapper={false}\n />\n </div>\n );\n});\n\nJSXPreviewContent.displayName = \"JSXPreviewContent\";\n\nexport type JSXPreviewSkeletonProps = ComponentProps<\"div\">;\n\n/**\n * The not-ready placeholder (loading-states.md §slot anatomy). Renders a\n * layout-shaped `Skeleton` while the preview is `pending` and nothing has\n * painted yet — so a streaming/incomplete surface BUILDS UP behind a skeleton\n * instead of flashing the error box. Pass `children` to override the shape.\n */\nexport const JSXPreviewSkeleton = memo(\n ({ className, children, ...props }: JSXPreviewSkeletonProps) => {\n const { status, hasRendered } = useJSXPreview();\n\n // Show only before the first successful paint; once content builds up, the\n // partial render is its own affordance (no skeleton-over-content).\n const show = !hasRendered && status === \"pending\";\n\n // The live region must exist in the DOM BEFORE its text appears, or NVDA\n // skips the announcement (ARIA22). So the wrapper is ALWAYS rendered (it\n // collapses to `sr-only` when idle) and the label is set one tick later via\n // an effect — guaranteeing an empty region precedes the \"Loading…\" text.\n const [announce, setAnnounce] = useState(false);\n useEffect(() => setAnnounce(show), [show]);\n\n return (\n <div\n className={cn(show ? \"space-y-2\" : \"sr-only\", className)}\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n <span className=\"sr-only\">{announce ? \"Loading preview…\" : \"\"}</span>\n {show\n ? (children ?? (\n <>\n <Skeleton className=\"h-20 w-full\" />\n <div className=\"grid grid-cols-3 gap-2\">\n <Skeleton className=\"h-16\" />\n <Skeleton className=\"h-16\" />\n <Skeleton className=\"h-16\" />\n </div>\n </>\n ))\n : null}\n </div>\n );\n },\n);\n\nJSXPreviewSkeleton.displayName = \"JSXPreviewSkeleton\";\n\nexport type JSXPreviewErrorProps = ComponentProps<\"div\"> & {\n children?: ReactNode | ((error: Error) => ReactNode);\n};\n\nconst renderChildren = (\n children: ReactNode | ((error: Error) => ReactNode),\n error: Error,\n): ReactNode => {\n if (typeof children === \"function\") {\n return children(error);\n }\n return children;\n};\n\nexport const JSXPreviewError = memo(({ className, children, ...props }: JSXPreviewErrorProps) => {\n const { status, error } = useJSXPreview();\n\n // Terminal failures only — never while loading / streaming / incomplete.\n if (status !== \"error\" || !error) {\n return null;\n }\n\n return (\n <div\n // The status wash is the separation gesture (#194, research 08 §B.1):\n // `bg-destructive/10` + the destructive ink/icon already mark the region,\n // and the alpha-wash survives high decoration (token-inequality escape from the\n // drawn-not-filled rule), so the old `border border-destructive/50` was\n // redundant on every theme — dropped. Text + icon use `text-destructive-text`\n // (the on-surface destructive ink ramp) — raw `text-destructive` fails AA on\n // the wash (3.86:1) and goes near-white in dark; the *-text token is\n // AA-guaranteed and keeps the destructive cue in every theme.\n className={cn(\n \"flex items-center gap-2 rounded-md bg-destructive/10 p-3 text-body text-destructive-text\",\n className,\n )}\n role=\"alert\"\n {...props}\n >\n {children ? (\n renderChildren(children, error)\n ) : (\n <>\n <AlertCircle className=\"size-4 shrink-0\" />\n <span>{error.message}</span>\n </>\n )}\n </div>\n );\n});\n\nJSXPreviewError.displayName = \"JSXPreviewError\";\n","\"use client\";\n\nimport { Avatar, AvatarFallback, AvatarImage, Button } from \"@elabs-ai/components-ui\";\nimport { ButtonGroup, ButtonGroupText, Skeleton } from \"@elabs-ai/components-ui\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { stripSanitizerOverrides, warnOnTrustedPluginSlots } from \"./_streamdown-safety\";\nimport {\n useStreamdownMermaidOptions,\n useStreamdownPlugins,\n useStreamdownTranslations,\n} from \"./_streamdown-i18n\";\nimport type { UIMessage } from \"ai\";\nimport { BotIcon, ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport { createContext, memo, useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { Streamdown } from \"streamdown\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage[\"role\"];\n};\n\nexport const Message = ({ className, from, ...props }: MessageProps) => (\n <div\n className={cn(\n \"group flex w-full max-w-[95%] flex-col gap-2\",\n // NOTE `is-user` / `is-assistant` are LOAD-BEARING, not decorative: they\n // are what `MessageContent`'s `group-[.is-user]:…` selectors compile\n // against (`.group.is-user &`). `data-role` below is their semantic twin\n // for querying/testing — don't dedupe the two, removing the class would\n // silently kill the `--chat-user` fill in every theme.\n from === \"user\" ? \"is-user ms-auto justify-end\" : \"is-assistant\",\n className,\n )}\n data-role={from}\n data-slot=\"message\"\n {...props}\n />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({ children, className, ...props }: MessageContentProps) => (\n <div\n className={cn(\n \"flex w-fit min-w-0 max-w-full flex-col gap-2 overflow-hidden text-body\",\n // The user turn is the 08 fill channel: the revalued `--chat-user` tint +\n // its AA-validated foreground (research 11 §B.1 MSG-1). The assistant\n // branch stays bare — its separation is the AgentMessage rail.\n \"group-[.is-user]:ms-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-chat-user group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-chat-user-foreground\",\n \"group-[.is-assistant]:text-foreground\",\n className,\n )}\n data-slot=\"message-content\"\n {...props}\n >\n {children}\n </div>\n);\n\nexport type MessageHeaderProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * Optional identity row above the bubble — avatar + name + timestamp\n * (research 11 §B.1 MSG-2). A slot, not baked structure.\n */\nexport const MessageHeader = ({ className, ...props }: MessageHeaderProps) => (\n <div\n className={cn(\"flex items-center gap-2 text-meta text-muted-foreground\", className)}\n data-slot=\"message-header\"\n {...props}\n />\n);\n\nexport type MessageAvatarProps = ComponentProps<typeof Avatar> & {\n /** Image source for the participant. */\n src?: string;\n /** Participant name — drives the image alt + the fallback initial, and the accessible label. */\n name?: string;\n /**\n * Visual identity role.\n * - `\"user\"` (default): shows the initial letter as a fallback.\n * - `\"agent\"`: shows a branded Bot icon on a primary (green) ground instead\n * of a text initial, matching the agent identity convention.\n */\n role?: \"user\" | \"agent\";\n};\n\n/**\n * Thin preset over the `@elabs-ai/components-ui` Avatar sized for inline chat (NOT a new\n * avatar primitive — research 11 §B.1 MSG-2).\n *\n * When `role=\"agent\"`, renders a filled primary-green circle with a centered\n * Bot icon (lucide-react `BotIcon`) and an accessible label derived from\n * `name`. The primary/primary-foreground token pair is the agent identity\n * colour across both themes (green on light/dark; theme-adapted\n * on others).\n */\nexport const MessageAvatar = ({\n src,\n name,\n role = \"user\",\n className,\n children,\n ...props\n}: MessageAvatarProps) => {\n if (role === \"agent\") {\n return (\n <Avatar\n aria-label={name ? `${name} (agent)` : \"Agent\"}\n // `role=\"img\"` is LOAD-BEARING, not decoration (#386). Radix's\n // `Avatar.Root` renders a plain `<span>`, whose implicit role is\n // `generic` — and ARIA PROHIBITS `aria-label` on `generic`, so axe's\n // `aria-prohibited-attr` reds the story AND assistive tech never\n // announces the name. `img` is the role permitted to carry a name for a\n // graphic whose contents (the Bot glyph) are not text — the same\n // precedent a titled `@elabs-ai/components-icons` `Icon`\n // uses (.claude/rules/icons.md). Only the agent branch takes it: the\n // user branch's fallback initial is real text content, so naming it too\n // would add an `img` per message for no gain.\n role=\"img\"\n className={cn(\"size-6 bg-primary text-primary-foreground\", className)}\n data-role=\"agent\"\n data-slot=\"message-avatar\"\n {...props}\n >\n {src ? <AvatarImage alt={name ?? \"\"} src={src} /> : null}\n <AvatarFallback className=\"bg-primary text-primary-foreground\">\n <BotIcon aria-hidden=\"true\" size={14} />\n </AvatarFallback>\n </Avatar>\n );\n }\n\n return (\n <Avatar\n className={cn(\"size-6\", className)}\n data-role={role}\n data-slot=\"message-avatar\"\n {...props}\n >\n {src ? <AvatarImage alt={name ?? \"\"} src={src} /> : null}\n <AvatarFallback className=\"text-meta\">\n {children ?? name?.slice(0, 1).toUpperCase() ?? \"?\"}\n </AvatarFallback>\n </Avatar>\n );\n};\n\nexport type UserMessageProps = Omit<MessageProps, \"from\">;\n\n/**\n * Named front door for a user turn (research 11 §B.2) — a thin preset over\n * `Message from=\"user\"`; the chat-user fill comes from `MessageContent`.\n */\nexport const UserMessage = (props: UserMessageProps) => <Message from=\"user\" {...props} />;\n\nexport const agentMessageVariants = cva(\"\", {\n variants: {\n /**\n * \"Final answer\" is a VISUAL axis, not a behavioural mode (research 11\n * §B.2): `answer` applies the 08 green left rail. It sits on the message\n * wrapper — never on `MessageContent`, whose `overflow-hidden` would clip\n * it (research 11 §G.1).\n */\n emphasis: {\n default: \"\",\n answer: \"border-s-4 border-s-primary ps-4\",\n },\n },\n defaultVariants: { emphasis: \"default\" },\n});\n\nexport type AgentMessageEmphasis = NonNullable<\n VariantProps<typeof agentMessageVariants>[\"emphasis\"]\n>;\n\nexport type AgentMessageProps = Omit<MessageProps, \"from\"> &\n VariantProps<typeof agentMessageVariants>;\n\n/**\n * Named front door for an assistant turn (research 11 §B.2). KPI band / prose /\n * footer are COMPOSED children (`MetricGrid` + `MessageResponse` +\n * `SourceList`), not baked-in layout.\n */\nexport const AgentMessage = ({ className, emphasis, ...props }: AgentMessageProps) => (\n <Message\n from=\"assistant\"\n className={cn(agentMessageVariants({ emphasis }), className)}\n {...props}\n />\n);\n\nexport const messageActionsVariants = cva(\n [\n \"flex items-center gap-1\",\n // Follow the bubble to the right on a user turn — the SAME selector\n // `MessageContent` uses for the `--chat-user` fill above. Without it the row\n // sits at the flex-column's cross-start (left) edge while the bubble it acts\n // on is `ms-auto`'d to the right, so a `bar` pill renders under the PREVIOUS\n // (assistant) message: \"Edit\" appears to edit the agent's answer. It was\n // invisible before only because a `plain` row stretched full-width and had\n // no drawn box; `w-fit` is what made the misplacement visible.\n \"group-[.is-user]:ms-auto\",\n ],\n {\n variants: {\n /**\n * How the row presents itself. Two VISUAL values, per `cva`'s remit — no\n * behaviour forks on this axis.\n * - `plain` (default): a bare inline row, the pre-#existing shape. Unchanged\n * for every consumer that never sets the prop.\n * - `bar`: a floating pill that reads as chrome sitting ABOVE the transcript\n * rather than as more message content. Per ADR 0020 a floating surface\n * takes `shadow-ring-*` and NO border — the ring bakes the 1px edge in as\n * the shadow's last layer, so there is no second crisp stroke beside it,\n * and because the hairline sits OUTSIDE `--shadow-strength` the pill keeps\n * a drawn edge at high decoration / `data-decoration=\"8|9|10\"` where the lift\n * is zeroed.\n */\n appearance: {\n plain: \"\",\n bar: \"w-fit rounded-full bg-popover p-0.5 shadow-ring-sm\",\n },\n /**\n * When the row is visible.\n * - `always` (default): in flow, always shown.\n * - `hover`: faded out at rest, revealed when the pointer is anywhere over\n * the parent `Message`, when focus lands inside the row, or while a menu\n * inside it is open.\n */\n reveal: {\n always: \"\",\n hover: [\n \"transition-opacity duration-fast ease-standard motion-reduce:transition-none\",\n // Hover-reveal is gated on the POINTER, not on a breakpoint: a touch\n // device has no hover state at all, so hiding the row there would make\n // it unreachable (you cannot tap what you cannot see, and there is no\n // gesture that reveals it first). `pointer-coarse` therefore never\n // takes the `opacity-0` at all and the row stays visible. Note this is\n // a stronger guarantee than the `md:` breakpoint proxy used by the\n // `@elabs-ai/components-ui` Sidebar — a ≥md tablet is\n // exactly the case that proxy gets wrong.\n \"pointer-fine:opacity-0\",\n // Reveal on: the parent Message (`Message` sets the bare `group` class\n // — see the load-bearing note there), the row itself, keyboard focus\n // landing inside it, and an open menu launched from it (a `⋯ more`\n // trigger carries `data-state=\"open\"`; without this the row fades out\n // from under the menu the moment the pointer travels to it).\n \"pointer-fine:group-hover:opacity-100\",\n \"pointer-fine:hover:opacity-100\",\n \"pointer-fine:focus-within:opacity-100\",\n \"pointer-fine:has-[[data-state=open]]:opacity-100\",\n ],\n },\n },\n defaultVariants: { appearance: \"plain\", reveal: \"always\" },\n },\n);\n\nexport type MessageActionsProps = ComponentProps<\"div\"> &\n VariantProps<typeof messageActionsVariants> & {\n /**\n * Accessible name for the group. Defaults to the `ai.message.actions`\n * microcopy key. Naming matters more here than on an always-visible row:\n * assistive tech reaches these controls whether or not a pointer ever\n * revealed them, so the group has to say what they act on.\n */\n label?: string;\n };\n\n/**\n * A row of per-message controls (copy, pin, retry, a `⋯` menu, …).\n *\n * **Presentational only** — it lays the controls out and decides when they are\n * visible; it ships no clipboard call, no pin state and no persistence. Every\n * `MessageAction` inside it is a bare `Button`: give it an `onClick`, and for a\n * toggle (pin, bookmark) an `aria-pressed` the host owns. That is the D5\n * boundary (`docs/DECISIONS.md` §D5) — brand-ui renders, the app acts.\n *\n * `reveal=\"hover\"` reads the parent `Message`'s `group` class, so the row must\n * be rendered INSIDE a `Message` for pointer-reveal to fire. Standing alone it\n * still reveals on its own hover and on focus-within, but not from the bubble.\n */\nexport const MessageActions = ({\n appearance,\n className,\n children,\n label,\n reveal,\n ...props\n}: MessageActionsProps) => {\n const { t } = useLocale();\n\n return (\n <div\n aria-label={label ?? t(\"ai.message.actions\")}\n className={cn(messageActionsVariants({ appearance, reveal }), className)}\n data-slot=\"message-actions\"\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n );\n};\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n};\n\nexport const MessageAction = ({\n tooltip,\n children,\n label,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n}: MessageActionProps) => {\n const button = (\n <Button data-slot=\"message-action\" size={size} type=\"button\" variant={variant} {...props}>\n {children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\ninterface MessageBranchContextType {\n currentBranch: number;\n totalBranches: number;\n goToPrevious: () => void;\n goToNext: () => void;\n branches: ReactElement[];\n setBranches: (branches: ReactElement[]) => void;\n}\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(null);\n\nconst useMessageBranch = () => {\n const context = useContext(MessageBranchContext);\n\n if (!context) {\n throw new Error(\"MessageBranch components must be used within MessageBranch\");\n }\n\n return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * Controlled current branch index. When set, `MessageBranch` no longer\n * tracks its own state — the host owns it and must update `branch` from\n * `onBranchChange` (or elsewhere) to move the selection. Omit for the\n * uncontrolled default (see `defaultBranch`).\n */\n branch?: number;\n defaultBranch?: number;\n onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({\n branch: branchProp,\n defaultBranch = 0,\n onBranchChange,\n className,\n ...props\n}: MessageBranchProps) => {\n // Derived once and never flipped, per the repo's controlled/uncontrolled\n // convention (component-api.md) — mirrors MessageFeedback/MessageEdit.\n const isControlled = branchProp !== undefined;\n const [internalBranch, setInternalBranch] = useState(defaultBranch);\n const currentBranch = isControlled ? branchProp : internalBranch;\n const [branches, setBranches] = useState<ReactElement[]>([]);\n\n const handleBranchChange = useCallback(\n (newBranch: number) => {\n if (!isControlled) setInternalBranch(newBranch);\n onBranchChange?.(newBranch);\n },\n [isControlled, onBranchChange],\n );\n\n const goToPrevious = useCallback(() => {\n const newBranch = currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const goToNext = useCallback(() => {\n const newBranch = currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n }, [currentBranch, branches.length, handleBranchChange]);\n\n const contextValue = useMemo<MessageBranchContextType>(\n () => ({\n branches,\n currentBranch,\n goToNext,\n goToPrevious,\n setBranches,\n totalBranches: branches.length,\n }),\n [branches, currentBranch, goToNext, goToPrevious],\n );\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div\n className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n data-slot=\"message-branch\"\n {...props}\n />\n </MessageBranchContext.Provider>\n );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({ children, ...props }: MessageBranchContentProps) => {\n const { currentBranch, setBranches, branches } = useMessageBranch();\n const childrenArray = useMemo(\n () => (Array.isArray(children) ? children : [children]),\n [children],\n );\n\n // Use useEffect to update branches when they change\n useEffect(() => {\n if (branches.length !== childrenArray.length) {\n setBranches(childrenArray);\n }\n }, [childrenArray, branches, setBranches]);\n\n return childrenArray.map((branch, index) => (\n <div\n className={cn(\n \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n index === currentBranch ? \"block\" : \"hidden\",\n )}\n data-slot=\"message-branch-content\"\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = ComponentProps<typeof ButtonGroup>;\n\nexport const MessageBranchSelector = ({ className, ...props }: MessageBranchSelectorProps) => {\n const { totalBranches } = useMessageBranch();\n\n // Don't render if there's only one branch\n if (totalBranches <= 1) {\n return null;\n }\n\n return (\n <ButtonGroup\n className={cn(\n \"[&>*:not(:first-child)]:rounded-s-md [&>*:not(:last-child)]:rounded-e-md\",\n className,\n )}\n data-slot=\"message-branch-selector\"\n orientation=\"horizontal\"\n {...props}\n />\n );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({ children, ...props }: MessageBranchPreviousProps) => {\n const { t } = useLocale();\n const { goToPrevious, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label={t(\"ai.message.previousBranch\")}\n data-slot=\"message-branch-previous\"\n disabled={totalBranches <= 1}\n onClick={goToPrevious}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronLeftIcon size={14} data-rtl-flip />}\n </Button>\n );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({ children, ...props }: MessageBranchNextProps) => {\n const { t } = useLocale();\n const { goToNext, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label={t(\"ai.message.nextBranch\")}\n data-slot=\"message-branch-next\"\n disabled={totalBranches <= 1}\n onClick={goToNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronRightIcon size={14} data-rtl-flip />}\n </Button>\n );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({ className, ...props }: MessageBranchPageProps) => {\n const { currentBranch, totalBranches } = useMessageBranch();\n\n return (\n <ButtonGroupText\n className={cn(\"border-none bg-transparent text-muted-foreground shadow-none\", className)}\n data-slot=\"message-branch-page\"\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\n/**\n * `rehypePlugins` is NOT exposed on `MessageResponse` (#36, fixed). This\n * renders untrusted, streamed model output — the type-level `Omit` below plus\n * a runtime `stripSanitizerOverrides()` call before the `{...props}` spread\n * onto `<Streamdown>` keep Streamdown's default sanitiser chain (rehype-raw →\n * rehype-sanitize → rehype-harden) non-overridable, even through a JS consumer\n * or a force-cast.\n *\n * `remarkPlugins` IS supported: the remark stage runs upstream of that chain\n * and cannot bypass it (PR #74 review, round 1). See `MarkdownView`'s TSDoc and\n * `packages/ai/src/_streamdown-safety.ts` for the full security model.\n */\nexport type MessageResponseProps = Omit<ComponentProps<typeof Streamdown>, \"rehypePlugins\"> & {\n /**\n * No content has arrived yet (loading-states.md `loading`) — renders\n * skeleton lines at the body line-height instead of `<Streamdown>`, so the\n * bubble reserves its space before the first token.\n * @default false\n */\n loading?: boolean;\n /**\n * Custom renderers for markdown elements. **Semantics differ from\n * `MarkdownView`:** `components` here REPLACES (not merges) per key against\n * Streamdown's own defaults, since `MessageResponse` has no internal\n * component map to merge with. See `MarkdownView` for merge-over-defaults\n * semantics and `#10` for details.\n */\n components?: ComponentProps<typeof Streamdown>[\"components\"];\n /**\n * Streamdown plugin-slot overrides (`cjk`/`code`/`math`/`mermaid`/\n * `renderers`), **merged** per key over the internal defaults, so a\n * consumer's entry wins for its key; every key the consumer does not set\n * keeps the reactive, i18n-aware internal default. Same semantics as\n * `MarkdownView` (#10 fix round).\n *\n * **This narrow `plugins` prop can only APPEND — it can never displace\n * Streamdown's default `rehypePlugins` chain** (`rehype-raw` →\n * `rehype-sanitize` → `rehype-harden`). `MessageResponse` never sets\n * `rehypePlugins` itself, and nothing in `PluginConfig` removes a member of\n * that pipeline. But two of the five slots are **not** upstream of it and\n * must be treated as TRUSTED CODE (#76):\n * - **`math.rehypePlugin` runs AFTER `rehype-sanitize`/`rehype-harden`** —\n * it is appended to the end of the rehype pipeline (verified against\n * `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`), so its output is never\n * re-sanitised. Replacing it emits a dev-only `console.warn`; the plugin\n * still runs (the seam is deliberate, not a hole to close). The sharp\n * edge in practice is KaTeX's `trust` option — it disables KaTeX's own\n * sanitisation, so leave it off for model-authored content.\n * - **`mermaid` never enters the rehype/remark pipeline at all.** Its\n * render output is written via `dangerouslySetInnerHTML` (streamdown's\n * only such sink); brand-ui's default pins mermaid's strict security\n * level, and a replacement must sanitise its own SVG. Also dev-warned.\n * - `cjk` (remark-stage, re-sanitised downstream), `code` (feeds\n * `shikiTheme` only) and `renderers` (ordinary React components) do not\n * bypass sanitisation and are never warned about.\n *\n * See `docs/CSP-AND-NETWORK.md` §1 and\n * `packages/ai/src/_streamdown-safety.ts`; `MarkdownView`'s TSDoc carries\n * the same model for the sibling surface.\n */\n plugins?: ComponentProps<typeof Streamdown>[\"plugins\"];\n};\n\nexport const MessageResponse = memo(\n ({ className, loading = false, plugins: pluginOverrides, ...props }: MessageResponseProps) => {\n // Streamdown installs [rehypeRaw, rehypeSanitize, harden] as the DEFAULT VALUE of\n // `rehypePlugins`; a supplied array REPLACES it. This component renders untrusted,\n // streamed model output, so the chain is not overridable. Widen with `allowedTags` /\n // `literalTagContent`, which merge into the sanitize schema. See issue #36.\n // `remarkPlugins` is deliberately left alone — it runs upstream of the rehype\n // chain and cannot bypass it (PR #74 review; see `_streamdown-safety.ts`).\n stripSanitizerOverrides(props);\n // Streamdown renders its own chrome (code copy, table menus, Mermaid\n // toolbar); route its labels through the locale seam (#310). Spread AFTER\n // so an explicit `translations` prop still wins (ADR 0017 override chain).\n const translations = useStreamdownTranslations();\n const { t } = useLocale();\n // Brand-token-derived `code` plugin, not the package's static github-*\n // default (#315 follow-up) — re-derives when the active theme changes.\n const internalPlugins = useStreamdownPlugins();\n // MERGED per key over the internal defaults — the same semantics as\n // `MarkdownView`'s `plugins` prop (#10 fix round, M4): a consumer entry\n // wins for its key; every key the consumer does not set keeps the\n // reactive, i18n-aware internal default. Previously this component\n // REPLACED `plugins` wholesale (`{...props}` spread after `plugins=`),\n // the opposite of `MarkdownView` for the same prop on a sibling\n // Streamdown surface — aligned so both components mean the same thing by\n // \"override a plugin slot\".\n // `math.rehypePlugin`/`mermaid` are the two slots that land in the DOM\n // after (or outside) the sanitiser chain, so replacing one is a\n // TRUSTED-CODE decision. The runtime half of that documented boundary is a\n // dev warning — the plugin still runs; stripping it would break the\n // legitimate use (#76).\n const plugins = useMemo(() => {\n warnOnTrustedPluginSlots(pluginOverrides, internalPlugins);\n return { ...internalPlugins, ...pluginOverrides };\n }, [internalPlugins, pluginOverrides]);\n // The TOP-LEVEL Streamdown `mermaid` prop — catches a failed diagram\n // render, including a missing `mermaid` optional peer (issue #33).\n const mermaidOptions = useStreamdownMermaidOptions();\n\n if (loading) {\n return (\n <div\n className={cn(\"space-y-2\", className)}\n data-slot=\"message-response\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className=\"sr-only\">{t(\"loading\")}</span>\n {/* Fixed (not percentage) widths: MessageContent is `w-fit`, so a\n skeleton row sized in `%` has nothing definite to shrink-wrap\n around and collapses to zero width. */}\n <Skeleton className=\"h-5 w-64\" />\n <Skeleton className=\"h-5 w-52\" />\n <Skeleton className=\"h-5 w-40\" />\n </div>\n );\n }\n\n return (\n <Streamdown\n className={cn(\n \"size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n // Brand prose scale (research 11 §B.1 MSG-3): map the streamed markdown\n // element tree onto the 07 type roles. Descendant-selector className —\n // NOT a `components` map — so streaming stays cheap.\n \"[&_h1]:text-title [&_h2]:text-subtitle [&_h3]:text-subtitle\",\n \"[&_p]:text-body [&_li]:text-body [&_code]:text-code\",\n className,\n )}\n data-slot=\"message-response\"\n plugins={plugins}\n translations={translations}\n mermaid={mermaidOptions}\n {...props}\n />\n );\n },\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n nextProps.isAnimating === prevProps.isAnimating &&\n nextProps.loading === prevProps.loading,\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n\nexport type MessageToolbarProps = ComponentProps<\"div\">;\n\nexport const MessageToolbar = ({ className, children, ...props }: MessageToolbarProps) => (\n <div\n className={cn(\"mt-4 flex w-full items-center justify-between gap-4\", className)}\n data-slot=\"message-toolbar\"\n {...props}\n >\n {children}\n </div>\n);\n","\"use client\";\n\n/**\n * MessageCompare — side-by-side comparison of 2-4 model responses to the same\n * prompt (issue #23). The one-at-a-time sibling of `MessageBranch`\n * (`message.tsx`): `MessageBranch` switches between responses; `MessageCompare`\n * shows several at once, each with its own status, its own scroll position, and\n * its own `MessageFeedback`.\n *\n * Architecture (lifted state, INTERNAL-ONLY — not the ChartFrame/PromptInputProvider\n * PUBLIC-provider shape): `MessageCompareProvider` + `useMessageCompare()` hold the\n * `state`/`actions`/`meta` that back the grid, but both are unexported implementation\n * details, like `ChartFrameProvider` (`.claude/rules/chart-components.md` — \"not\n * exported publicly\"). `MessageCompare` always mounts its own private instance and\n * treats every child as a column (`Children.toArray`), so there is no seam where an\n * ambient provider or a sibling control could attach to that SAME instance without\n * corrupting the grid (an extra `ResizablePanel`, or a spurious tab with no model\n * name). The supported way to add a \"Sync scroll\" toggle beside the grid is the\n * ordinary controlled-prop pattern — external `useState` plus `syncScroll`/\n * `onSyncScrollChange` on `MessageCompare` (see `SyncedScrollDemo` in\n * `message-compare.stories.tsx`) — which needs neither export. Column registration\n * and the scroll-sync broadcast live on a second, also-unexported context — the same\n * internal-context-splitting shape `context-panel.tsx` uses for its own refs.\n *\n * Independent streaming/scroll (the issue's core requirement): a column never\n * auto-scrolls itself or a sibling — there is no shared \"stick to bottom\"\n * driver here (that's `Conversation`'s job for a single transcript). Content\n * growing in one column therefore cannot move a sibling's scroll position by\n * construction; the only way scroll moves across columns is the opt-in\n * `syncScroll` broadcast below.\n *\n * Responsive collapse: under the `md` breakpoint (768px, the same threshold\n * `useIsMobile` already drives for `ContextPanel`'s Sheet fallback) the\n * side-by-side grid becomes a `Tabs` strip, per the issue. Every column stays\n * mounted (`forceMount` + Radix's own `hidden` attribute on the inactive\n * panel) rather than unmounting on tab switch, so a column's scroll position\n * survives flipping between tabs.\n */\n\nimport {\n createContext,\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n use,\n Children,\n Fragment,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport type { ChatStatus } from \"ai\";\nimport { AlertTriangleIcon } from \"lucide-react\";\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n useIsMobile,\n useLocale,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { Shimmer } from \"./shimmer\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/** The minimum a column needs to identify itself — mainly its accessible name. */\nexport interface MessageCompareModel {\n /** Rendered in the column header AND used as the region's `aria-label`. */\n name: string;\n /** Optional stable id, e.g. for analytics — not used for layout or a11y. */\n id?: string;\n}\n\n/** `MessageCompare` supports 2-4 side-by-side responses (issue #23). */\nexport type MessageCompareColumnsCount = 2 | 3 | 4;\n\ninterface MessageCompareState {\n syncScroll: boolean;\n}\n\ninterface MessageCompareActions {\n setSyncScroll: (value: boolean) => void;\n}\n\ninterface MessageCompareMeta {\n columns: MessageCompareColumnsCount;\n isMobile: boolean;\n}\n\ninterface MessageCompareContextValue {\n state: MessageCompareState;\n actions: MessageCompareActions;\n meta: MessageCompareMeta;\n}\n\n// ── Internal state context (NOT exported — see the file's architecture comment) ─\n\nconst MessageCompareContext = createContext<MessageCompareContextValue | null>(null);\n\n/**\n * INTERNAL — reads the `state`/`actions`/`meta` `MessageCompareProvider` computes.\n * Not exported: `MessageCompare` always owns a private `MessageCompareProvider`\n * instance, so there is no ambient instance for an outside caller to read.\n */\nfunction useMessageCompare(): MessageCompareContextValue {\n const ctx = use(MessageCompareContext);\n if (!ctx) {\n throw new Error(\"useMessageCompare must be used within a MessageCompareProvider.\");\n }\n return ctx;\n}\n\n// ── Internal context (column registry + scroll broadcast — not public API) ───\n\ninterface MessageCompareColumnEntry {\n node: HTMLDivElement;\n /** Set right before a programmatic scroll so the column's own handler knows\n * to swallow the resulting `scroll` event instead of re-broadcasting it. */\n suppressNextScroll: boolean;\n}\n\ninterface MessageCompareInternalValue {\n registerColumn: (id: string, node: HTMLDivElement | null) => void;\n reportScroll: (id: string) => void;\n}\n\nconst MessageCompareInternalContext = createContext<MessageCompareInternalValue | null>(null);\n\nfunction useMessageCompareInternal(): MessageCompareInternalValue {\n const ctx = use(MessageCompareInternalContext);\n if (!ctx) {\n throw new Error(\"MessageCompareColumn must be used within a MessageCompare.\");\n }\n return ctx;\n}\n\n// ── Provider (INTERNAL — not exported; see the file's architecture comment) ────\n\ninterface MessageCompareProviderProps {\n children: ReactNode;\n columns: MessageCompareColumnsCount;\n /** Controlled sync-scroll flag. Omit for the uncontrolled default. */\n syncScroll?: boolean;\n /** Uncontrolled initial value. @default false */\n defaultSyncScroll?: boolean;\n onSyncScrollChange?: (value: boolean) => void;\n}\n\nfunction MessageCompareProvider({\n children,\n columns,\n syncScroll: syncScrollProp,\n defaultSyncScroll = false,\n onSyncScrollChange,\n}: MessageCompareProviderProps) {\n const isControlled = syncScrollProp !== undefined;\n const [internalSyncScroll, setInternalSyncScroll] = useState(defaultSyncScroll);\n const syncScroll = isControlled ? syncScrollProp : internalSyncScroll;\n const isMobile = useIsMobile();\n\n const setSyncScroll = useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalSyncScroll(value);\n onSyncScrollChange?.(value);\n },\n [isControlled, onSyncScrollChange],\n );\n\n // A ref, not state: scroll happens far too often to route through a render.\n const columnsRef = useRef<Map<string, MessageCompareColumnEntry>>(new Map());\n const syncScrollRef = useRef(syncScroll);\n useEffect(() => {\n syncScrollRef.current = syncScroll;\n }, [syncScroll]);\n\n const registerColumn = useCallback((id: string, node: HTMLDivElement | null) => {\n if (node) columnsRef.current.set(id, { node, suppressNextScroll: false });\n else columnsRef.current.delete(id);\n }, []);\n\n const reportScroll = useCallback((id: string) => {\n const entry = columnsRef.current.get(id);\n if (!entry) return;\n\n // This scroll was OUR OWN programmatic write (a broadcast landing on this\n // column) — swallow it once rather than re-broadcasting, which is what\n // would otherwise ping-pong two synced columns back and forth.\n if (entry.suppressNextScroll) {\n entry.suppressNextScroll = false;\n return;\n }\n\n if (!syncScrollRef.current) return;\n\n const { node } = entry;\n const range = node.scrollHeight - node.clientHeight;\n const ratio = range > 0 ? node.scrollTop / range : 0;\n\n columnsRef.current.forEach((other, otherId) => {\n if (otherId === id) return;\n const otherRange = other.node.scrollHeight - other.node.clientHeight;\n if (otherRange <= 0) return;\n // Assign first, THEN compare the browser's actual (possibly rounded)\n // scrollTop to what it was before — never predict equality from the\n // unrounded `ratio * otherRange` math, since scrollTop is an integer\n // pixel value and the destination can already sit at that pixel. Only\n // arm suppression when the write really changed something: if it\n // didn't, no scroll event will fire to clear the flag, and the\n // destination's NEXT real user scroll (a single keyboard PageDown/Home\n // in particular) would otherwise be silently swallowed instead of\n // propagating to its siblings (#12/#53 review, P2).\n const previousScrollTop = other.node.scrollTop;\n other.node.scrollTop = ratio * otherRange;\n if (other.node.scrollTop !== previousScrollTop) {\n other.suppressNextScroll = true;\n }\n });\n }, []);\n\n const state = useMemo<MessageCompareState>(() => ({ syncScroll }), [syncScroll]);\n const actions = useMemo<MessageCompareActions>(() => ({ setSyncScroll }), [setSyncScroll]);\n const meta = useMemo<MessageCompareMeta>(() => ({ columns, isMobile }), [columns, isMobile]);\n const contextValue = useMemo<MessageCompareContextValue>(\n () => ({ state, actions, meta }),\n [state, actions, meta],\n );\n const internalValue = useMemo<MessageCompareInternalValue>(\n () => ({ registerColumn, reportScroll }),\n [registerColumn, reportScroll],\n );\n\n return (\n <MessageCompareContext value={contextValue}>\n <MessageCompareInternalContext value={internalValue}>\n {children}\n </MessageCompareInternalContext>\n </MessageCompareContext>\n );\n}\n\n// ── MessageCompare (layout) ───────────────────────────────────────────────────\n\nfunction columnKey(child: ReactElement, index: number): string {\n return child.key ?? String(index);\n}\n\nexport type MessageCompareProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** `MessageCompareColumn` elements — 2 to 4. */\n children: ReactNode;\n columns: MessageCompareColumnsCount;\n /** Controlled sync-scroll flag. Omit for the uncontrolled default (off). */\n syncScroll?: boolean;\n /** Uncontrolled initial value. @default false */\n defaultSyncScroll?: boolean;\n onSyncScrollChange?: (value: boolean) => void;\n /** aria-label for the narrow-viewport tab strip. Defaults to microcopy. */\n tabsLabel?: string;\n};\n\n/**\n * Responsive side-by-side comparison of 2-4 `MessageCompareColumn`s. Desktop:\n * resizable columns (`ResizablePanelGroup`). Under `md`: a `Tabs` strip, per\n * the issue's named narrow-viewport treatment.\n */\nexport const MessageCompare = forwardRef<HTMLDivElement, MessageCompareProps>(\n function MessageCompare(\n {\n children,\n columns,\n syncScroll,\n defaultSyncScroll,\n onSyncScrollChange,\n tabsLabel,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <MessageCompareProvider\n columns={columns}\n defaultSyncScroll={defaultSyncScroll}\n onSyncScrollChange={onSyncScrollChange}\n syncScroll={syncScroll}\n >\n <MessageCompareLayout ref={ref} className={className} tabsLabel={tabsLabel} {...props}>\n {children}\n </MessageCompareLayout>\n </MessageCompareProvider>\n );\n },\n);\n\ntype MessageCompareLayoutProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children: ReactNode;\n tabsLabel?: string;\n};\n\nconst MessageCompareLayout = forwardRef<HTMLDivElement, MessageCompareLayoutProps>(\n function MessageCompareLayout({ children, tabsLabel, className, ...props }, ref) {\n const { meta } = useMessageCompare();\n const { t } = useLocale();\n const items = Children.toArray(children) as ReactElement[];\n\n if (meta.isMobile) {\n const firstKey = items[0] ? columnKey(items[0], 0) : undefined;\n return (\n <div\n ref={ref}\n className={cn(\"flex h-full min-h-0 flex-col\", className)}\n data-slot=\"message-compare\"\n {...props}\n >\n <Tabs className=\"flex h-full min-h-0 flex-col\" defaultValue={firstKey}>\n <TabsList\n aria-label={tabsLabel ?? t(\"ai.messageCompare.tabs\")}\n className=\"w-full shrink-0\"\n >\n {items.map((child, index) => {\n const key = columnKey(child, index);\n const props = child.props as { model?: MessageCompareModel };\n return (\n <TabsTrigger className=\"flex-1\" key={key} value={key}>\n {props.model?.name ?? key}\n </TabsTrigger>\n );\n })}\n </TabsList>\n {items.map((child, index) => {\n const key = columnKey(child, index);\n return (\n <TabsContent\n className=\"mt-2 min-h-0 flex-1 data-[state=active]:flex\"\n forceMount\n key={key}\n value={key}\n >\n {child}\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={cn(\"h-full min-h-0\", className)}\n data-slot=\"message-compare\"\n {...props}\n >\n <ResizablePanelGroup direction=\"horizontal\">\n {items.map((child, index) => (\n <Fragment key={columnKey(child, index)}>\n {index > 0 && <ResizableHandle withHandle />}\n <ResizablePanel defaultSize={100 / items.length} minSize={15}>\n {child}\n </ResizablePanel>\n </Fragment>\n ))}\n </ResizablePanelGroup>\n </div>\n );\n },\n);\n\n// ── MessageCompareColumn ──────────────────────────────────────────────────────\n\nexport type MessageCompareColumnProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n /** Identifies the column — its `name` becomes the region's accessible name. */\n model: MessageCompareModel;\n /** In-flight state for this column's OWN response, independent of siblings. */\n status?: ChatStatus;\n /** The consumer's own `Message`/`MessageResponse` composition for this column. */\n children?: ReactNode;\n};\n\n/**\n * One labelled, independently-scrolling response column. `role=\"region\"` +\n * `aria-label={model.name}` so a screen-reader user can tell which answer\n * they're in (issue #23 a11y requirement).\n */\nexport const MessageCompareColumn = forwardRef<HTMLDivElement, MessageCompareColumnProps>(\n function MessageCompareColumn({ model, status, children, className, id: idProp, ...props }, ref) {\n const { registerColumn, reportScroll } = useMessageCompareInternal();\n const { t } = useLocale();\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const setScrollRef = useCallback(\n (node: HTMLDivElement | null) => registerColumn(id, node),\n [id, registerColumn],\n );\n const handleScroll = useCallback(() => reportScroll(id), [id, reportScroll]);\n\n const isBusy = status === \"streaming\" || status === \"submitted\";\n const isError = status === \"error\";\n\n return (\n <div\n ref={ref}\n aria-label={model.name}\n className={cn(\"flex h-full min-h-0 min-w-0 flex-col\", className)}\n data-slot=\"message-compare-column\"\n id={id}\n role=\"region\"\n {...props}\n >\n <div\n className=\"flex shrink-0 items-center justify-between gap-2 border-b px-3 py-2\"\n data-slot=\"message-compare-column-header\"\n >\n <span className=\"truncate text-body font-medium\">{model.name}</span>\n {isBusy && (\n <span className=\"shrink-0\" role=\"status\" aria-live=\"polite\">\n <Shimmer as=\"span\" className=\"text-meta\" duration={1.5}>\n {t(\"loading\")}\n </Shimmer>\n </span>\n )}\n {isError && (\n <span\n className=\"flex shrink-0 items-center gap-1 text-meta text-destructive-text\"\n role=\"alert\"\n >\n <AlertTriangleIcon aria-hidden=\"true\" className=\"size-3.5\" />\n {t(\"ai.messageCompare.error\")}\n </span>\n )}\n </div>\n <div\n className=\"min-h-0 flex-1 overflow-y-auto p-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n data-slot=\"message-compare-column-body\"\n onScroll={handleScroll}\n ref={setScrollRef}\n tabIndex={0}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n","\"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","\"use client\";\n\n/**\n * MessageFeedback — thumbs up / down for a single assistant message.\n *\n * Presentational only: it emits `onSubmit({ type })` and reflects the chosen\n * state; it does NOT persist anything (the host owns storage). After a choice\n * the buttons auto-disable (feedback is submit-once) and the root carries\n * `data-submitted` + `data-feedback`. Controlled (`value`) or uncontrolled.\n */\n\nimport { forwardRef, useState, type HTMLAttributes } from \"react\";\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nexport type FeedbackType = \"positive\" | \"negative\";\n\nexport const messageFeedbackVariants = cva(\"inline-flex items-center\", {\n variants: {\n compact: { true: \"gap-0.5\", false: \"gap-1\" },\n },\n defaultVariants: { compact: false },\n});\n\nexport interface MessageFeedbackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\" | \"defaultValue\">,\n VariantProps<typeof messageFeedbackVariants> {\n /** Controlled selected feedback. When set, `onSubmit` is the only updater. */\n value?: FeedbackType | null;\n /** Uncontrolled initial selection. @default null */\n defaultValue?: FeedbackType | null;\n /** Called once with the chosen feedback. No persistence — host-owned. */\n onSubmit?: (feedback: { type: FeedbackType }) => void;\n /** Force-disable both controls (e.g. while the message is still streaming). */\n disabled?: boolean;\n /** aria-label for the positive control. @default \"Good response\" */\n positiveLabel?: string;\n /** aria-label for the negative control. @default \"Bad response\" */\n negativeLabel?: string;\n}\n\n/**\n * Two icon buttons. The chosen one stays prominent after submit; the other\n * recedes. `compact` tightens spacing/size for message toolbars.\n */\nexport const MessageFeedback = forwardRef<HTMLDivElement, MessageFeedbackProps>(\n function MessageFeedback(\n {\n value: valueProp,\n defaultValue = null,\n onSubmit,\n disabled = false,\n compact = false,\n positiveLabel = \"Good response\",\n negativeLabel = \"Bad response\",\n className,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const isControlled = valueProp !== undefined;\n const [internal, setInternal] = useState<FeedbackType | null>(defaultValue);\n const selected = isControlled ? (valueProp as FeedbackType | null) : internal;\n const submitted = selected != null;\n\n const choose = (type: FeedbackType) => {\n if (submitted || disabled) return;\n if (!isControlled) setInternal(type);\n onSubmit?.({ type });\n };\n\n const compactBtn = compact ? \"size-7 [&_svg]:size-3.5\" : undefined;\n\n const renderButton = (type: FeedbackType, label: string, Icon: typeof ThumbsUp) => {\n const active = selected === type;\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n aria-pressed={active}\n // After submit both are inert; keep the chosen one at full opacity.\n disabled={disabled || submitted}\n onClick={() => choose(type)}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n active && \"text-primary disabled:opacity-100 [&_svg]:fill-current\",\n compactBtn,\n )}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={t(\"ai.message.feedback\")}\n data-submitted={submitted || undefined}\n data-feedback={selected ?? undefined}\n className={cn(messageFeedbackVariants({ compact }), className)}\n {...props}\n >\n {renderButton(\"positive\", positiveLabel, ThumbsUp)}\n {renderButton(\"negative\", negativeLabel, ThumbsDown)}\n </div>\n );\n },\n);\n","\"use client\";\n\n/**\n * MessageForm — a model-emittable form rendered inside a chat message.\n *\n * The model emits a serializable `FormSpec` (see `message-form-spec.ts`); the\n * user fills it; the app receives structured `{ formName, values }` on submit.\n *\n * Design bar (mirrors AutoChart + ChangeReview):\n * - Spec-driven, zod-validated. The model is the author; it never chooses look.\n * - Never throws on model output. A malformed spec → `MessageFormFallback`.\n * - Streaming-tolerant. Half-arrived fields are dropped (not fatal); an empty\n * spec while streaming shows a skeleton, never a crash.\n * - Compound + lifted state, controlled AND uncontrolled (the ChangeReview\n * pattern): `MessageFormProvider` owns the values; the parts read a context.\n * - Tokens only; keyboard-operable; inline errors; focus the first error on\n * submit; a submitted form renders inert with its values visible (a chat\n * message is a historical record).\n *\n * Composes `@elabs-ai/components-ui` inputs — it does NOT re-invent field primitives.\n *\n * Compound structure (named exports, the Card/CardHeader convention):\n * <MessageFormProvider> — lifted state (values + errors + actions)\n * <MessageFormRoot> — the <form> element (never nest inside another form)\n * <MessageFormFields> — every field, or place <MessageFormField> yourself\n * <MessageFormSubmit> — submit button / submitting spinner / submitted note\n */\n\nimport {\n createContext,\n forwardRef,\n use,\n useCallback,\n useId,\n useMemo,\n useState,\n type FormEvent,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Check } from \"lucide-react\";\nimport {\n Badge,\n Button,\n Checkbox,\n Input,\n Label,\n NumberInput,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Spinner,\n Textarea,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nimport {\n fieldLabel,\n initialFormValues,\n normalizeFormSpec,\n optionLabel,\n optionValue,\n validateForm,\n type FieldSpec,\n type FormSpec,\n type FormSubmitState,\n type FormValue,\n type FormValues,\n type NormalizedFormSpec,\n} from \"./message-form-spec\";\n\n// ─── Context ────────────────────────────────────────────────────────────────\n\ninterface MessageFormContextValue {\n spec: NormalizedFormSpec;\n values: FormValues;\n /** Per-field error text, only populated after a submit attempt. */\n errors: Record<string, string | null>;\n setValue: (name: string, value: FormValue) => void;\n submit: () => void;\n reset: () => void;\n /** True once submit has been attempted (drives error visibility). */\n attempted: boolean;\n submitted: boolean;\n submitting: boolean;\n disabled: boolean;\n streaming: boolean;\n formId: string;\n headingId: string;\n}\n\nconst MessageFormContext = createContext<MessageFormContextValue | null>(null);\n\nfunction useMessageFormContext(): MessageFormContextValue {\n const ctx = use(MessageFormContext);\n if (!ctx) {\n throw new Error(\"MessageForm sub-components must be rendered inside <MessageFormProvider>.\");\n }\n return ctx;\n}\n\n/** Stable DOM id for a field's primary control (used for label + focus). */\nfunction controlId(formId: string, name: string): string {\n return `${formId}-field-${name}`;\n}\nfunction descId(formId: string, name: string): string {\n return `${formId}-desc-${name}`;\n}\nfunction errorId(formId: string, name: string): string {\n return `${formId}-error-${name}`;\n}\n\n/** The effective value for a field (state value, else its default). */\nfunction effectiveValue(field: FieldSpec, values: FormValues): FormValue {\n const v = values[field.name];\n if (v !== undefined) return v;\n if (field.default !== undefined) return field.default;\n if (field.type === \"boolean\") return false;\n if (field.type === \"multi-enum\") return [];\n return undefined;\n}\n\n// ─── Provider ───────────────────────────────────────────────────────────────\n\nexport interface MessageFormProviderProps {\n /** A validated/normalized spec (a plain `FormSpec` also satisfies this). */\n spec: NormalizedFormSpec;\n /**\n * Controlled values. When provided the component is controlled and `onChange`\n * is the only way to update state.\n */\n values?: FormValues;\n /** Called with the next full values object on any field change. */\n onChange?: (values: FormValues) => void;\n /** Called with `{ formName, values }` when a valid form is submitted. */\n onSubmit?: (state: FormSubmitState) => void;\n /** Disable every control (form is not interactable). */\n disabled?: boolean;\n /** Terminal submitted state: controls are inert, values visible, no submit. */\n submitted?: boolean;\n /** In-flight submit: controls disabled, the submit button shows a spinner. */\n submitting?: boolean;\n /** The spec is still streaming in (renders a skeleton when no fields yet). */\n streaming?: boolean;\n children: ReactNode;\n}\n\n/**\n * Lifts the form values. Controlled (pass `values`) or uncontrolled.\n * Derives `isControlled = values !== undefined` and never flips modes.\n */\nexport function MessageFormProvider({\n spec,\n values: valuesProp,\n onChange,\n onSubmit,\n disabled = false,\n submitted = false,\n submitting = false,\n streaming = false,\n children,\n}: MessageFormProviderProps) {\n const formId = useId();\n const headingId = `${formId}-title`;\n\n const isControlled = valuesProp !== undefined;\n const [internalValues, setInternalValues] = useState<FormValues>(() =>\n initialFormValues(spec.fields),\n );\n const [attempted, setAttempted] = useState(false);\n\n const resolvedValues = isControlled ? (valuesProp as FormValues) : internalValues;\n\n const setValue = useCallback(\n (name: string, value: FormValue) => {\n const base = isControlled ? (valuesProp as FormValues) : internalValues;\n const next: FormValues = { ...base, [name]: value };\n if (!isControlled) setInternalValues(next);\n onChange?.(next);\n },\n [isControlled, valuesProp, internalValues, onChange],\n );\n\n const submit = useCallback(() => {\n setAttempted(true);\n // Build the effective values (defaults folded in) for validation + payload.\n const merged: FormValues = { ...resolvedValues };\n for (const field of spec.fields) merged[field.name] = effectiveValue(field, resolvedValues);\n\n const errs = validateForm(spec.fields, merged);\n const firstInvalid = spec.fields.find((f) => errs[f.name]);\n if (firstInvalid) {\n // Focus the first field with an error (a11y: don't leave the user hunting).\n if (typeof document !== \"undefined\") {\n const el = document.getElementById(controlId(formId, firstInvalid.name));\n el?.focus();\n }\n return;\n }\n onSubmit?.({ formName: spec.formName, values: merged });\n }, [resolvedValues, spec.fields, spec.formName, formId, onSubmit]);\n\n const reset = useCallback(() => {\n setAttempted(false);\n const seeded = initialFormValues(spec.fields);\n if (!isControlled) setInternalValues(seeded);\n onChange?.(seeded);\n }, [isControlled, spec.fields, onChange]);\n\n // Errors only surface after a submit attempt; then they live-update on change.\n const errors = useMemo<Record<string, string | null>>(() => {\n if (!attempted) return {};\n const merged: FormValues = { ...resolvedValues };\n for (const field of spec.fields) merged[field.name] = effectiveValue(field, resolvedValues);\n return validateForm(spec.fields, merged);\n }, [attempted, resolvedValues, spec.fields]);\n\n const value = useMemo<MessageFormContextValue>(\n () => ({\n spec,\n values: resolvedValues,\n errors,\n setValue,\n submit,\n reset,\n attempted,\n submitted,\n submitting,\n disabled,\n streaming,\n formId,\n headingId,\n }),\n [\n spec,\n resolvedValues,\n errors,\n setValue,\n submit,\n reset,\n attempted,\n submitted,\n submitting,\n disabled,\n streaming,\n formId,\n headingId,\n ],\n );\n\n return <MessageFormContext.Provider value={value}>{children}</MessageFormContext.Provider>;\n}\n\n// ─── Field control renderers ──────────────────────────────────────────────────\n\ninterface FieldControlProps {\n field: FieldSpec;\n value: FormValue;\n invalid: boolean;\n disabled: boolean;\n readOnly: boolean;\n id: string;\n /** Id of the field's visible label (used by grouped controls' aria-labelledby). */\n labelId: string;\n describedBy: string | undefined;\n setValue: (name: string, value: FormValue) => void;\n}\n\nfunction StringControl({\n field,\n value,\n invalid,\n disabled,\n readOnly,\n id,\n describedBy,\n setValue,\n}: FieldControlProps & { field: Extract<FieldSpec, { type: \"string\" }> }) {\n const text = value === undefined ? \"\" : String(value);\n const commonAria = {\n id,\n \"aria-invalid\": invalid || undefined,\n \"aria-describedby\": describedBy,\n \"aria-required\": field.required || undefined,\n required: field.required,\n } as const;\n\n if (field.multiline) {\n return (\n <Textarea\n {...commonAria}\n name={field.name}\n value={text}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={field.maxLength}\n onChange={(e) => setValue(field.name, e.target.value)}\n />\n );\n }\n\n // Map the format hint → input type + autofill/keyboard hints.\n const inputType =\n field.format === \"email\"\n ? \"email\"\n : field.format === \"uri\"\n ? \"url\"\n : field.format === \"date\"\n ? \"date\"\n : field.format === \"date-time\"\n ? \"datetime-local\"\n : \"text\";\n const spellCheck = field.format === \"email\" || field.format === \"uri\" ? false : undefined;\n const inputMode = field.format === \"email\" ? \"email\" : field.format === \"uri\" ? \"url\" : undefined;\n\n return (\n <Input\n {...commonAria}\n type={inputType}\n name={field.name}\n value={text}\n disabled={disabled}\n readOnly={readOnly}\n minLength={field.minLength}\n maxLength={field.maxLength}\n spellCheck={spellCheck}\n inputMode={inputMode}\n onChange={(e) => setValue(field.name, e.target.value)}\n />\n );\n}\n\nfunction NumberControl({\n field,\n value,\n invalid,\n disabled,\n readOnly,\n id,\n describedBy,\n setValue,\n}: FieldControlProps & { field: Extract<FieldSpec, { type: \"number\" | \"integer\" }> }) {\n const num = typeof value === \"number\" ? value : null;\n return (\n <NumberInput\n id={id}\n name={field.name}\n value={num}\n min={field.min}\n max={field.max}\n step={field.type === \"integer\" ? 1 : undefined}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n aria-required={field.required || undefined}\n onValueChange={(next) => setValue(field.name, next ?? undefined)}\n />\n );\n}\n\nfunction BooleanControl({\n field,\n value,\n disabled,\n id,\n describedBy,\n setValue,\n}: FieldControlProps & { field: Extract<FieldSpec, { type: \"boolean\" }> }) {\n // Checkbox + clickable label share ONE hit target (no dead zone).\n return (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id={id}\n name={field.name}\n checked={value === true}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-required={field.required || undefined}\n onCheckedChange={(checked) => setValue(field.name, checked === true)}\n />\n <Label htmlFor={id} className=\"flex items-center gap-1 font-normal\">\n {fieldLabel(field)}\n {field.required && (\n <span aria-hidden=\"true\" className=\"text-destructive-text\">\n *\n </span>\n )}\n </Label>\n </div>\n );\n}\n\nfunction EnumControl({\n field,\n value,\n invalid,\n disabled,\n id,\n describedBy,\n setValue,\n}: FieldControlProps & { field: Extract<FieldSpec, { type: \"enum\" }> }) {\n const { t } = useLocale();\n const current = typeof value === \"string\" && value.length > 0 ? value : undefined;\n return (\n <Select value={current} disabled={disabled} onValueChange={(v) => setValue(field.name, v)}>\n <SelectTrigger\n id={id}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n aria-required={field.required || undefined}\n >\n <SelectValue placeholder={t(\"ai.messageForm.selectPlaceholder\")} />\n </SelectTrigger>\n <SelectContent>\n {field.options.map((option) => (\n <SelectItem key={optionValue(option)} value={optionValue(option)}>\n {optionLabel(option)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction MultiEnumControl({\n field,\n value,\n disabled,\n id,\n labelId,\n describedBy,\n setValue,\n}: FieldControlProps & { field: Extract<FieldSpec, { type: \"multi-enum\" }> }) {\n const selected = Array.isArray(value) ? value : [];\n const toggle = (optValue: string, checked: boolean) => {\n const next = checked ? [...selected, optValue] : selected.filter((v) => v !== optValue);\n setValue(field.name, next);\n };\n return (\n // The group is the focus-first-error target (id + tabIndex=-1). It is named\n // by the field's visible label via aria-labelledby — NOT aria-label — so no\n // single checkbox ends up with two <label for> associations.\n <div\n role=\"group\"\n id={id}\n tabIndex={-1}\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n className=\"flex flex-col gap-2 focus:outline-none\"\n >\n {field.options.map((option) => {\n const optValue = optionValue(option);\n const optionId = `${id}-${optValue}`;\n return (\n <div key={optValue} className=\"flex items-center gap-2\">\n <Checkbox\n id={optionId}\n checked={selected.includes(optValue)}\n disabled={disabled}\n onCheckedChange={(checked) => toggle(optValue, checked === true)}\n />\n <Label htmlFor={optionId} className=\"font-normal\">\n {optionLabel(option)}\n </Label>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Field ────────────────────────────────────────────────────────────────────\n\nexport interface MessageFormFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The field's `name` (its key in the spec + values). */\n name: string;\n}\n\n/**\n * Renders one field by name: label, control, description, inline error.\n * Boolean fields render their own inline label (checkbox + label), so the\n * standalone `<Label>` above is suppressed for them.\n */\nexport const MessageFormField = forwardRef<HTMLDivElement, MessageFormFieldProps>(\n function MessageFormField({ name, className, ...props }, ref) {\n const ctx = useMessageFormContext();\n const field = ctx.spec.fields.find((f) => f.name === name);\n if (!field) return null;\n\n const id = controlId(ctx.formId, name);\n const labelId = `${ctx.formId}-label-${name}`;\n const value = effectiveValue(field, ctx.values);\n const error = ctx.errors[name] ?? null;\n const invalid = Boolean(error);\n const controlDisabled = ctx.disabled || ctx.submitted || ctx.submitting;\n const readOnly = ctx.submitted;\n const description = field.description;\n const hasDesc = Boolean(description);\n const describedBy =\n [hasDesc ? descId(ctx.formId, name) : null, invalid ? errorId(ctx.formId, name) : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const controlProps: FieldControlProps = {\n field,\n value,\n invalid,\n disabled: controlDisabled,\n readOnly,\n id,\n labelId,\n describedBy,\n setValue: ctx.setValue,\n };\n\n const isBoolean = field.type === \"boolean\";\n // A multi-enum renders a checkbox group named via aria-labelledby, so its\n // label must NOT use htmlFor (which would associate with a single control).\n const isGroupField = field.type === \"multi-enum\";\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5\", className)} {...props}>\n {!isBoolean && (\n <Label\n id={labelId}\n htmlFor={isGroupField ? undefined : id}\n className=\"flex items-center gap-1\"\n >\n {fieldLabel(field)}\n {field.required && (\n <span aria-hidden=\"true\" className=\"text-destructive-text\">\n *\n </span>\n )}\n </Label>\n )}\n\n {field.type === \"string\" && <StringControl {...controlProps} field={field} />}\n {(field.type === \"number\" || field.type === \"integer\") && (\n <NumberControl {...controlProps} field={field} />\n )}\n {field.type === \"boolean\" && <BooleanControl {...controlProps} field={field} />}\n {field.type === \"enum\" && <EnumControl {...controlProps} field={field} />}\n {field.type === \"multi-enum\" && <MultiEnumControl {...controlProps} field={field} />}\n\n {hasDesc && (\n <p id={descId(ctx.formId, name)} className=\"text-caption text-muted-foreground\">\n {description}\n </p>\n )}\n {invalid && (\n <p id={errorId(ctx.formId, name)} className=\"text-caption text-destructive-text\">\n {error}\n </p>\n )}\n </div>\n );\n },\n);\n\n// ─── Fields (all) ─────────────────────────────────────────────────────────────\n\nexport type MessageFormFieldsProps = HTMLAttributes<HTMLDivElement>;\n\n/** Renders every field in the spec, in order. A skeleton while streaming empty. */\nexport const MessageFormFields = forwardRef<HTMLDivElement, MessageFormFieldsProps>(\n function MessageFormFields({ className, ...props }, ref) {\n const { spec, streaming } = useMessageFormContext();\n\n if (spec.fields.length === 0 && streaming) {\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-4\", className)} {...props}>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Loading form…\n </span>\n <div aria-hidden=\"true\" className=\"flex flex-col gap-4\">\n {[0, 1, 2].map((i) => (\n <div key={i} className=\"flex flex-col gap-1.5\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-9 w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-4\", className)} {...props}>\n {spec.fields.map((field) => (\n <MessageFormField key={field.name} name={field.name} />\n ))}\n </div>\n );\n },\n);\n\n// ─── Submit ───────────────────────────────────────────────────────────────────\n\nexport interface MessageFormSubmitProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Submit button label (overrides `spec.submitLabel`). @default \"Submit\" */\n label?: string;\n}\n\n/**\n * The submit affordance. Enabled until the request starts (validation runs on\n * click), then a spinner. A submitted form shows an inert \"Submitted\" note.\n */\nexport const MessageFormSubmit = forwardRef<HTMLDivElement, MessageFormSubmitProps>(\n function MessageFormSubmit({ label, className, ...props }, ref) {\n const { spec, submitting, submitted, disabled } = useMessageFormContext();\n\n if (submitted) {\n return (\n <div ref={ref} className={cn(\"flex items-center\", className)} {...props}>\n <Badge variant=\"success\" aria-live=\"polite\">\n <Check aria-hidden=\"true\" className=\"size-3\" />\n Submitted\n </Badge>\n </div>\n );\n }\n\n const text = label ?? spec.submitLabel ?? \"Submit\";\n return (\n <div ref={ref} className={cn(\"flex items-center\", className)} {...props}>\n <Button type=\"submit\" disabled={disabled || submitting} aria-busy={submitting || undefined}>\n {submitting && <Spinner aria-hidden=\"true\" className=\"text-current\" />}\n {submitting ? \"Submitting…\" : text}\n </Button>\n </div>\n );\n },\n);\n\n// ─── Root (the <form> element) ────────────────────────────────────────────────\n\nexport type MessageFormRootProps = Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\">;\n\n/**\n * The `<form>` element wired to the context's `submit`. Never nest inside\n * another `<form>` — compose it as its own message-body block.\n */\nexport const MessageFormRoot = forwardRef<HTMLFormElement, MessageFormRootProps>(\n function MessageFormRoot({ className, children, ...props }, ref) {\n const { t } = useLocale();\n const { submit, headingId, spec, disabled, submitting } = useMessageFormContext();\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (disabled || submitting) return;\n submit();\n };\n return (\n <form\n ref={ref}\n noValidate\n onSubmit={handleSubmit}\n aria-labelledby={spec.title ? headingId : undefined}\n aria-label={spec.title ? undefined : spec.formName || t(\"ai.messageForm.label\")}\n className={cn(\"flex w-full flex-col gap-4\", className)}\n {...props}\n >\n {children}\n </form>\n );\n },\n);\n\n// ─── Title + Description ──────────────────────────────────────────────────────\n\nexport type MessageFormTitleProps = HTMLAttributes<HTMLParagraphElement>;\n\n/** The form heading. Its id is the `<form>`'s `aria-labelledby` target. */\nexport const MessageFormTitle = forwardRef<HTMLParagraphElement, MessageFormTitleProps>(\n function MessageFormTitle({ className, children, ...props }, ref) {\n const { headingId, spec } = useMessageFormContext();\n const content = children ?? spec.title;\n if (!content) return null;\n return (\n <p\n ref={ref}\n id={headingId}\n className={cn(\"text-subtitle font-semibold text-foreground text-balance\", className)}\n {...props}\n >\n {content}\n </p>\n );\n },\n);\n\nexport type MessageFormDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\n/** Supplemental description under the title. */\nexport const MessageFormDescription = forwardRef<HTMLParagraphElement, MessageFormDescriptionProps>(\n function MessageFormDescription({ className, children, ...props }, ref) {\n const { spec } = useMessageFormContext();\n const content = children ?? spec.description;\n if (!content) return null;\n return (\n <p\n ref={ref}\n className={cn(\"text-body text-muted-foreground text-pretty\", className)}\n {...props}\n >\n {content}\n </p>\n );\n },\n);\n\n// ─── Fallback ─────────────────────────────────────────────────────────────────\n\nexport interface MessageFormFallbackProps extends HTMLAttributes<HTMLDivElement> {\n /** Short human reason the form could not render. */\n message?: string;\n}\n\n/**\n * Shown when the spec is unusable. Mirrors `ChartFallback`: a calm, bordered\n * status box with a short reason — never a thrown error.\n */\nexport const MessageFormFallback = forwardRef<HTMLDivElement, MessageFormFallbackProps>(\n function MessageFormFallback(\n { message = \"This form could not be displayed.\", className, ...props },\n ref,\n ) {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n // Sole structural cue is the border (no fill) — reads in every theme.\n \"flex items-center justify-center rounded-md border border-border-strong px-4 py-6 text-center text-body text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {message}\n </div>\n );\n },\n);\n\n// ─── Root convenience component ────────────────────────────────────────────────\n\nexport interface MessageFormProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onSubmit\" | \"onChange\" | \"title\"\n> {\n /** The serializable form specification produced by an LLM tool-call. */\n spec: FormSpec | unknown;\n /** Controlled values (`{ [fieldName]: value }`). Omit for uncontrolled. */\n values?: FormValues;\n /** Called with the next full values object on any change. */\n onChange?: (values: FormValues) => void;\n /** Called with `{ formName, values }` on a valid submit. */\n onSubmit?: (state: FormSubmitState) => void;\n /** Submit button label (overrides `spec.submitLabel`). */\n submitLabel?: string;\n /** Disable every control. */\n disabled?: boolean;\n /** Terminal submitted state: inert, values visible, submit replaced. */\n submitted?: boolean;\n /** In-flight submit: controls disabled, spinner on submit. */\n submitting?: boolean;\n /** The spec is still streaming (renders a skeleton when no fields yet). */\n streaming?: boolean;\n}\n\n/**\n * Convenience composition: `Provider → Root(form) → title/description → Fields →\n * Submit`. For a custom layout, compose `MessageFormProvider` + the parts.\n * A malformed spec renders `MessageFormFallback` (never throws).\n */\nexport const MessageForm = forwardRef<HTMLDivElement, MessageFormProps>(function MessageForm(\n {\n spec,\n values,\n onChange,\n onSubmit,\n submitLabel,\n disabled,\n submitted,\n submitting,\n streaming,\n className,\n ...props\n },\n ref,\n) {\n const result = normalizeFormSpec(spec);\n if (!result.ok) {\n return (\n <MessageFormFallback ref={ref} message={result.reason} className={className} {...props} />\n );\n }\n\n const normalized = result.spec;\n const empty = normalized.fields.length === 0;\n\n // Not streaming + no fields → the spec is structurally valid but useless.\n if (empty && !streaming) {\n return (\n <MessageFormFallback\n ref={ref}\n message=\"This form has no fields to fill in.\"\n className={className}\n {...props}\n />\n );\n }\n\n return (\n <MessageFormProvider\n spec={normalized}\n values={values}\n onChange={onChange}\n onSubmit={onSubmit}\n disabled={disabled}\n submitted={submitted}\n submitting={submitting}\n streaming={streaming}\n >\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n <MessageFormRoot>\n {(normalized.title || normalized.description) && (\n <div className=\"flex flex-col gap-1\">\n <MessageFormTitle />\n <MessageFormDescription />\n </div>\n )}\n <MessageFormFields />\n <MessageFormSubmit label={submitLabel} />\n </MessageFormRoot>\n </div>\n </MessageFormProvider>\n );\n});\n","/**\n * message-form-spec.ts — Serializable FormSpec for MessageForm.\n *\n * These are pure data types + zod schemas with no React dependency. The shape is\n * what an LLM tool-call emits when it wants the user to fill in a form inside a\n * chat message. It is deliberately compatible with MCP elicitation's\n * `requestedSchema` (spec 2025-11-25): flat primitive fields (string / number /\n * integer / boolean / single- and multi-select enum), each with a label,\n * optional description, `required`, and a `default`.\n *\n * The exported zod schemas are the source of truth downstream catalogs compile\n * prompts + validators from. Field types are intentionally limited to the safe\n * set — there is NO file input and NO password/credential type/format, so a spec\n * that asks for one fails validation (rejected, never rendered).\n */\n\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Enum options\n// ---------------------------------------------------------------------------\n\n/** A single enum choice: a plain value, or a `{ const, title }` pair. */\nexport const enumOptionSchema = z.union([\n z.string(),\n z.object({ const: z.string(), title: z.string().optional() }),\n]);\nexport type EnumOption = z.infer<typeof enumOptionSchema>;\n\n/** The submitted value of an enum option. */\nexport function optionValue(option: EnumOption): string {\n return typeof option === \"string\" ? option : option.const;\n}\n\n/** The display label of an enum option (falls back to its value). */\nexport function optionLabel(option: EnumOption): string {\n return typeof option === \"string\" ? option : (option.title ?? option.const);\n}\n\n// ---------------------------------------------------------------------------\n// Fields (a discriminated union on `type`)\n// ---------------------------------------------------------------------------\n\n/** Fields shared by every field type. `name` is the key in the emitted values. */\nconst baseField = {\n /** Value key in the emitted form state (the `values` object key). */\n name: z.string(),\n /** Human label. Falls back to a humanized `name` when omitted. */\n label: z.string().optional(),\n /** Helper text shown under the control. */\n description: z.string().optional(),\n /** Whether a value is required before the form can submit. */\n required: z.boolean().optional(),\n};\n\n/**\n * A single-line or multi-line text field.\n * `format` narrows the input type + validation. Note there is NO `\"password\"`\n * format — credential capture is deliberately unsupported.\n */\nexport const stringFieldSchema = z.object({\n type: z.literal(\"string\"),\n ...baseField,\n default: z.string().optional(),\n format: z.enum([\"email\", \"uri\", \"date\", \"date-time\"]).optional(),\n minLength: z.number().int().nonnegative().optional(),\n maxLength: z.number().int().nonnegative().optional(),\n /** A serialized RegExp source string (client-enforced when present). */\n pattern: z.string().optional(),\n /** Render a textarea instead of a single-line input. */\n multiline: z.boolean().optional(),\n});\nexport type StringFieldSpec = z.infer<typeof stringFieldSchema>;\n\n/** A floating-point number field. */\nexport const numberFieldSchema = z.object({\n type: z.literal(\"number\"),\n ...baseField,\n default: z.number().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n});\nexport type NumberFieldSpec = z.infer<typeof numberFieldSchema>;\n\n/** A whole-number field. */\nexport const integerFieldSchema = z.object({\n type: z.literal(\"integer\"),\n ...baseField,\n default: z.number().int().optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n});\nexport type IntegerFieldSpec = z.infer<typeof integerFieldSchema>;\n\n/** A boolean checkbox field. */\nexport const booleanFieldSchema = z.object({\n type: z.literal(\"boolean\"),\n ...baseField,\n default: z.boolean().optional(),\n});\nexport type BooleanFieldSpec = z.infer<typeof booleanFieldSchema>;\n\n/** A single-select enum (one value from `options`). */\nexport const enumFieldSchema = z.object({\n type: z.literal(\"enum\"),\n ...baseField,\n options: z.array(enumOptionSchema),\n default: z.string().optional(),\n});\nexport type EnumFieldSpec = z.infer<typeof enumFieldSchema>;\n\n/** A multi-select enum (zero or more values from `options`). */\nexport const multiEnumFieldSchema = z.object({\n type: z.literal(\"multi-enum\"),\n ...baseField,\n options: z.array(enumOptionSchema),\n default: z.array(z.string()).optional(),\n});\nexport type MultiEnumFieldSpec = z.infer<typeof multiEnumFieldSchema>;\n\n/** Any one field in a FormSpec. */\nexport const fieldSpecSchema = z.discriminatedUnion(\"type\", [\n stringFieldSchema,\n numberFieldSchema,\n integerFieldSchema,\n booleanFieldSchema,\n enumFieldSchema,\n multiEnumFieldSchema,\n]);\nexport type FieldSpec = z.infer<typeof fieldSpecSchema>;\n\n// ---------------------------------------------------------------------------\n// FormSpec\n// ---------------------------------------------------------------------------\n\n/**\n * The serializable form specification produced by an LLM tool-call.\n * MessageForm reads this, renders the fields, and emits `{ formName, values }`.\n *\n * Export target for downstream catalogs: compile the prompt + a validator from\n * `formSpecSchema`.\n */\nexport const formSpecSchema = z.object({\n /** Stable identifier echoed back in the submit payload. */\n formName: z.string(),\n /** Heading rendered above the fields (also the accessible form name). */\n title: z.string().optional(),\n /** Supplemental description under the title. */\n description: z.string().optional(),\n /** The ordered fields to render. */\n fields: z.array(fieldSpecSchema),\n /** Submit button label. @default \"Submit\" */\n submitLabel: z.string().optional(),\n});\nexport type FormSpec = z.infer<typeof formSpecSchema>;\n\n// ---------------------------------------------------------------------------\n// Values\n// ---------------------------------------------------------------------------\n\n/** A single field's value in the form state. */\nexport type FormValue = string | number | boolean | string[] | undefined;\n\n/** The `values` object keyed by field `name`. */\nexport type FormValues = Record<string, FormValue>;\n\n/** The payload passed to `onSubmit`. */\nexport interface FormSubmitState {\n /** Echoes `spec.formName`. */\n formName: string;\n /** The current field values keyed by field name. */\n values: FormValues;\n}\n\n// ---------------------------------------------------------------------------\n// Normalization (lenient — streaming-tolerant, never throws)\n// ---------------------------------------------------------------------------\n\n/** A validated, render-ready FormSpec. */\nexport interface NormalizedFormSpec {\n formName: string;\n title?: string;\n description?: string;\n submitLabel?: string;\n fields: FieldSpec[];\n}\n\n/**\n * Lenient parse for the render path. Mirrors AutoChart's guard philosophy:\n * NEVER throws. Individually invalid or half-streamed fields are dropped (not\n * fatal), so a partial spec still renders progressively. Returns `{ ok: false }`\n * only when the whole spec is unusable (not an object) — the caller then shows\n * `MessageFormFallback`.\n */\nexport function normalizeFormSpec(\n spec: unknown,\n): { ok: true; spec: NormalizedFormSpec } | { ok: false; reason: string } {\n if (spec === null || typeof spec !== \"object\" || Array.isArray(spec)) {\n return { ok: false, reason: \"Form specification is missing or malformed.\" };\n }\n const raw = spec as Record<string, unknown>;\n const rawFields = Array.isArray(raw.fields) ? raw.fields : [];\n\n const fields: FieldSpec[] = [];\n const seen = new Set<string>();\n for (const candidate of rawFields) {\n const parsed = fieldSpecSchema.safeParse(candidate);\n if (!parsed.success) continue; // drop invalid / still-streaming field\n if (seen.has(parsed.data.name)) continue; // de-dupe by name (last-writer avoided)\n seen.add(parsed.data.name);\n fields.push(parsed.data);\n }\n\n return {\n ok: true,\n spec: {\n formName: typeof raw.formName === \"string\" ? raw.formName : \"\",\n title: typeof raw.title === \"string\" ? raw.title : undefined,\n description: typeof raw.description === \"string\" ? raw.description : undefined,\n submitLabel: typeof raw.submitLabel === \"string\" ? raw.submitLabel : undefined,\n fields,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Labels + initial values\n// ---------------------------------------------------------------------------\n\n/** Turn a field name into a human label (\"first_name\" / \"firstName\" → \"First name\"). */\nfunction humanize(name: string): string {\n const spaced = name\n .replace(/[_-]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .trim();\n if (!spaced) return name;\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\n/** The label to show for a field (explicit `label`, else a humanized `name`). */\nexport function fieldLabel(field: FieldSpec): string {\n return field.label && field.label.length > 0 ? field.label : humanize(field.name);\n}\n\n/** Seed the initial values from each field's `default` (+ sensible empties). */\nexport function initialFormValues(fields: FieldSpec[]): FormValues {\n const values: FormValues = {};\n for (const field of fields) {\n if (field.default !== undefined) {\n values[field.name] = field.default;\n } else if (field.type === \"boolean\") {\n values[field.name] = false;\n } else if (field.type === \"multi-enum\") {\n values[field.name] = [];\n }\n }\n return values;\n}\n\n// ---------------------------------------------------------------------------\n// Client-side validation (the declarative vocabulary)\n// ---------------------------------------------------------------------------\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction isEmptyValue(value: FormValue): boolean {\n return value === undefined || value === \"\" || (Array.isArray(value) && value.length === 0);\n}\n\nfunction isValidUrl(value: string): boolean {\n try {\n void new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate one field's value against its declarative constraints.\n * Returns a short human error message, or `null` when the value is valid.\n * The vocabulary: required · email · url · min · max · minLength · maxLength ·\n * pattern · numeric (integer whole-number).\n */\nexport function validateField(field: FieldSpec, value: FormValue): string | null {\n const empty = isEmptyValue(value);\n\n if (field.required) {\n // A required boolean must be affirmatively true (e.g. \"accept terms\");\n // `false` is otherwise a valid, non-empty value.\n if (field.type === \"boolean\") {\n if (value !== true) return \"This field is required.\";\n } else if (empty) {\n return \"This field is required.\";\n }\n }\n if (empty) return null; // optional + empty → valid, skip further checks\n\n switch (field.type) {\n case \"string\": {\n const text = String(value);\n if (field.minLength !== undefined && text.length < field.minLength) {\n return `Must be at least ${field.minLength} character${field.minLength === 1 ? \"\" : \"s\"}.`;\n }\n if (field.maxLength !== undefined && text.length > field.maxLength) {\n return `Must be at most ${field.maxLength} character${field.maxLength === 1 ? \"\" : \"s\"}.`;\n }\n if (field.format === \"email\" && !EMAIL_RE.test(text)) {\n return \"Enter a valid email address.\";\n }\n if (field.format === \"uri\" && !isValidUrl(text)) {\n return \"Enter a valid URL.\";\n }\n if (field.pattern) {\n let re: RegExp | null = null;\n try {\n re = new RegExp(field.pattern);\n } catch {\n re = null; // an invalid pattern from the model must not break validation\n }\n if (re && !re.test(text)) return \"Value doesn't match the required format.\";\n }\n return null;\n }\n case \"number\":\n case \"integer\": {\n const num = typeof value === \"number\" ? value : Number(value);\n if (Number.isNaN(num)) return \"Enter a number.\";\n if (field.type === \"integer\" && !Number.isInteger(num)) return \"Enter a whole number.\";\n if (field.min !== undefined && num < field.min) return `Must be at least ${field.min}.`;\n if (field.max !== undefined && num > field.max) return `Must be at most ${field.max}.`;\n return null;\n }\n default:\n return null;\n }\n}\n\n/** Validate every field; returns a `{ [name]: error | null }` map. */\nexport function validateForm(\n fields: FieldSpec[],\n values: FormValues,\n): Record<string, string | null> {\n const errors: Record<string, string | null> = {};\n for (const field of fields) {\n errors[field.name] = validateField(field, values[field.name]);\n }\n return errors;\n}\n","\"use client\";\n\n/**\n * MessageTable — a model-emittable data table rendered inside a chat message.\n *\n * The model emits a serializable, column-oriented `TableSpec` (see\n * `message-table-spec.ts`); MessageTable renders a lightweight table (NOT the\n * app-chrome `@elabs-ai/components-data` DataTable — this is message content).\n *\n * Design bar (mirrors AutoChart):\n * - Spec-driven, zod-validated; the model never chooses the look.\n * - Never throws. A malformed spec → `MessageTableFallback`; an unknown format\n * falls back to text; a missing cell renders an em-dash.\n * - Streaming-tolerant. Half-arrived columns/rows are dropped or render\n * progressively; a spec with columns but no rows yet shows skeleton rows.\n * - Tokens only; numeric columns are end-aligned + `tabular-nums`.\n * - Optional client-side sort (controlled OR uncontrolled) and an optional\n * per-cell `renderCell` override for consumer composition.\n *\n * Composes the `@elabs-ai/components-ui` `Table` primitive.\n */\n\nimport { forwardRef, useId, useMemo, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport { ChevronDown, ChevronUp, ChevronsUpDown } from \"lucide-react\";\nimport {\n Badge,\n Skeleton,\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nimport {\n badgeToneForValue,\n compareCellValues,\n EMPTY_CELL,\n formatCellValue,\n isEmptyCell,\n isNumericFormat,\n normalizeTableSpec,\n type ColumnSpec,\n type TableRowData,\n type TableSpec,\n} from \"./message-table-spec\";\n\n// ─── Sort ─────────────────────────────────────────────────────────────────────\n\nexport interface TableSort {\n /** The sorted column's key. */\n key: string;\n direction: \"asc\" | \"desc\";\n}\n\n/** Per-cell render override — return `undefined` to fall back to default rendering. */\nexport type RenderCell = (args: {\n value: unknown;\n column: ColumnSpec;\n row: TableRowData;\n rowIndex: number;\n}) => ReactNode;\n\n// ─── Fallback ─────────────────────────────────────────────────────────────────\n\nexport interface MessageTableFallbackProps extends HTMLAttributes<HTMLDivElement> {\n /** Short human reason the table could not render. */\n message?: string;\n}\n\n/** Shown when the spec is unusable. Mirrors `ChartFallback` semantics. */\nexport const MessageTableFallback = forwardRef<HTMLDivElement, MessageTableFallbackProps>(\n function MessageTableFallback(\n { message = \"This table could not be displayed.\", className, ...props },\n ref,\n ) {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n // Sole structural cue is the border (no fill) — reads in every theme,\n // incl. themes where surface-muted ≈ background. border-strong is\n // contrast-guaranteed vs the background.\n \"flex items-center justify-center rounded-md border border-border-strong px-4 py-6 text-center text-body text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {message}\n </div>\n );\n },\n);\n\n// ─── MessageTable ─────────────────────────────────────────────────────────────\n\nexport interface MessageTableProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** The serializable table specification produced by an LLM tool-call. */\n spec: TableSpec | unknown;\n /** Enable click-to-sort column headers. @default false */\n sortable?: boolean;\n /** Controlled sort. When provided, `onSortChange` is the only way to update it. */\n sort?: TableSort | null;\n /** Uncontrolled initial sort. */\n defaultSort?: TableSort | null;\n /** Called with the next sort (or `null`) when a header is clicked. */\n onSortChange?: (sort: TableSort | null) => void;\n /** Cap the number of rendered rows; shows a \"Showing N of M rows\" notice. */\n maxRows?: number;\n /** Per-cell render override for custom composition. */\n renderCell?: RenderCell;\n /** The spec is still streaming (columns-but-no-rows shows skeleton rows). */\n streaming?: boolean;\n}\n\n/**\n * MessageTable — renders a `TableSpec` as a lightweight message-body table.\n *\n * Intentionally bare: no toolbar, no expand chrome. Growing one here would be\n * `ChartFrame` re-implemented inside this package.\n *\n * **To make it expandable, wrap it in `ExpandDialog`**\n * (`@elabs-ai/components-ui`) — the shared two-pane expand surface,\n * the same one a chart opens. Do NOT hand-roll a lightbox or a full-screen\n * breakout; four of those already existed before the component was shared, and\n * each one taught users a different meaning for the same button.\n *\n * The context pane for a table is its SHAPE, not statistics: row count,\n * \"showing N of M\", column count, each column's declared `format`. A\n * model-emitted table's numerics may already be formatted strings, so min/max/avg\n * over them is wrong more often than right.\n */\nexport const MessageTable = forwardRef<HTMLDivElement, MessageTableProps>(function MessageTable(\n {\n spec,\n sortable = false,\n sort: sortProp,\n defaultSort = null,\n onSortChange,\n maxRows,\n renderCell,\n streaming = false,\n className,\n ...props\n },\n ref,\n) {\n const { t } = useLocale();\n const reactId = useId();\n const isControlled = sortProp !== undefined;\n const [internalSort, setInternalSort] = useState<TableSort | null>(defaultSort);\n const resolvedSort = isControlled ? (sortProp as TableSort | null) : internalSort;\n\n const result = normalizeTableSpec(spec);\n\n const normalized = result.ok ? result.spec : null;\n\n const sortedRows = useMemo<TableRowData[]>(() => {\n if (!normalized || !resolvedSort) return normalized?.rows ?? [];\n const column = normalized.columns.find((c) => c.key === resolvedSort.key);\n if (!column) return normalized.rows;\n const direction = resolvedSort.direction === \"asc\" ? 1 : -1;\n return [...normalized.rows].sort(\n (a, b) => direction * compareCellValues(a[column.key], b[column.key], column.format),\n );\n }, [normalized, resolvedSort]);\n\n if (!result.ok) {\n return (\n <MessageTableFallback ref={ref} message={result.reason} className={className} {...props} />\n );\n }\n\n const { columns, title, emptyText } = result.spec;\n\n // No columns: skeleton while streaming, otherwise a fallback.\n if (columns.length === 0) {\n if (streaming) {\n return (\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Loading table…\n </span>\n <div\n aria-hidden=\"true\"\n className=\"flex flex-col gap-2 rounded-md border border-border p-3\"\n >\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n </div>\n </div>\n );\n }\n return (\n <MessageTableFallback\n ref={ref}\n message=\"This table has no columns to display.\"\n className={className}\n {...props}\n />\n );\n }\n\n const total = sortedRows.length;\n const cappedRows =\n maxRows !== undefined && maxRows >= 0 ? sortedRows.slice(0, maxRows) : sortedRows;\n const truncatedCount = total - cappedRows.length;\n\n const titleId = title ? `${reactId}-title` : undefined;\n\n const setSort = (next: TableSort | null) => {\n if (!isControlled) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const toggleSort = (column: ColumnSpec) => {\n if (resolvedSort?.key === column.key) {\n setSort({ key: column.key, direction: resolvedSort.direction === \"asc\" ? \"desc\" : \"asc\" });\n } else {\n setSort({ key: column.key, direction: \"asc\" });\n }\n };\n\n const renderCellContent = (\n column: ColumnSpec,\n row: TableRowData,\n rowIndex: number,\n ): ReactNode => {\n const value = row[column.key];\n if (renderCell) {\n const overridden = renderCell({ value, column, row, rowIndex });\n if (overridden !== undefined) return overridden;\n }\n if (isEmptyCell(value)) {\n return <span className=\"text-muted-foreground\">{EMPTY_CELL}</span>;\n }\n if (column.format === \"badge\") {\n return <Badge variant={badgeToneForValue(value)}>{String(value)}</Badge>;\n }\n return formatCellValue(value, column.format);\n };\n\n return (\n <div ref={ref} className={cn(\"w-full\", className)} {...props}>\n {title && (\n <p id={titleId} className=\"mb-1 text-body font-semibold text-foreground text-balance\">\n {title}\n </p>\n )}\n <div className=\"overflow-hidden rounded-md border border-border\">\n {streaming && cappedRows.length === 0 && (\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Loading table…\n </span>\n )}\n <Table\n aria-labelledby={titleId}\n aria-label={title ? undefined : t(\"ai.messageTable.label\")}\n aria-busy={(streaming && cappedRows.length === 0) || undefined}\n >\n {truncatedCount > 0 && (\n <TableCaption className=\"mb-2 mt-3 px-3 text-caption\">\n Showing {cappedRows.length} of {total} rows\n </TableCaption>\n )}\n <TableHeader>\n <TableRow>\n {columns.map((column) => {\n const numeric = isNumericFormat(column.format);\n const active = resolvedSort?.key === column.key;\n const ariaSort = active\n ? resolvedSort?.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : sortable\n ? \"none\"\n : undefined;\n const label = column.label ?? column.key;\n return (\n <TableHead\n key={column.key}\n scope=\"col\"\n aria-sort={ariaSort}\n className={cn(numeric && \"text-end\")}\n >\n {sortable ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(column)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-sm font-medium\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\",\n \"hover:text-foreground transition-colors duration-fast ease-standard motion-reduce:transition-none\",\n numeric && \"flex-row-reverse\",\n )}\n >\n <span>{label}</span>\n {active ? (\n resolvedSort?.direction === \"asc\" ? (\n <ChevronUp aria-hidden=\"true\" className=\"size-3.5\" />\n ) : (\n <ChevronDown aria-hidden=\"true\" className=\"size-3.5\" />\n )\n ) : (\n <ChevronsUpDown aria-hidden=\"true\" className=\"size-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n label\n )}\n </TableHead>\n );\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {cappedRows.length === 0 && streaming ? (\n [0, 1, 2].map((i) => (\n <TableRow key={`skeleton-${i}`} aria-hidden=\"true\">\n {columns.map((column) => (\n <TableCell key={column.key}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : cappedRows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"py-6 text-center text-muted-foreground\"\n >\n {emptyText ?? \"No rows to display\"}\n </TableCell>\n </TableRow>\n ) : (\n cappedRows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => {\n const numeric = isNumericFormat(column.format);\n return (\n <TableCell\n key={column.key}\n className={cn(numeric && \"text-end tabular-nums\")}\n >\n {renderCellContent(column, row, rowIndex)}\n </TableCell>\n );\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n});\n","/**\n * message-table-spec.ts — Serializable TableSpec for MessageTable.\n *\n * Pure data types + zod schemas (no React). The shape is what an LLM tool-call\n * emits when it wants to show tabular data inside a chat message. It is\n * column-oriented: `columns` declare the shape + per-column `format`, and each\n * `rows` entry is an object keyed by column `key`.\n *\n * The exported zod schemas are the source of truth downstream catalogs compile\n * prompts + validators from. Specs carry NO style-bearing props — the model\n * chooses the data and its semantic format, never the look.\n */\n\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Columns\n// ---------------------------------------------------------------------------\n\n/**\n * How a cell's value is rendered + aligned.\n * - `text` (default) — as-is, start-aligned.\n * - `number` / `currency` / `percent` — `Intl`-formatted, end-aligned, tabular.\n * - `date` — localized date.\n * - `badge` — a tonal badge whose tone is inferred from the value's semantics.\n */\nexport const cellFormatSchema = z.enum([\"text\", \"number\", \"currency\", \"percent\", \"date\", \"badge\"]);\nexport type CellFormat = z.infer<typeof cellFormatSchema>;\n\n/** One column definition. */\nexport const columnSpecSchema = z.object({\n /** The row-object key this column reads. */\n key: z.string(),\n /** Header label. Falls back to the `key` when omitted. */\n label: z.string().optional(),\n /** How cells in this column are formatted + aligned. @default \"text\" */\n format: cellFormatSchema.optional(),\n});\nexport type ColumnSpec = z.infer<typeof columnSpecSchema>;\n\n// ---------------------------------------------------------------------------\n// TableSpec\n// ---------------------------------------------------------------------------\n\n/** A single row: an object keyed by column `key`. */\nexport type TableRowData = Record<string, unknown>;\n\n/**\n * The serializable table specification produced by an LLM tool-call.\n * MessageTable reads this and renders a lightweight, message-body table.\n */\nexport const tableSpecSchema = z.object({\n /** Optional heading + accessible label for the table. */\n title: z.string().optional(),\n /** Ordered column definitions. */\n columns: z.array(columnSpecSchema),\n /** Row objects keyed by column `key`. */\n rows: z.array(z.record(z.string(), z.unknown())),\n /** Message shown when there are zero rows. @default \"No rows to display\" */\n emptyText: z.string().optional(),\n});\nexport type TableSpec = z.infer<typeof tableSpecSchema>;\n\n// ---------------------------------------------------------------------------\n// Normalization (lenient — streaming-tolerant, never throws)\n// ---------------------------------------------------------------------------\n\n/** A validated, render-ready TableSpec. */\nexport interface NormalizedTableSpec {\n title?: string;\n columns: ColumnSpec[];\n rows: TableRowData[];\n emptyText?: string;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction strOrUndefined(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * Lenient parse for the render path. NEVER throws. Individually invalid columns\n * are dropped and non-object rows are filtered out, so a partial (streaming)\n * spec still renders progressively. Returns `{ ok: false }` only when the whole\n * spec is unusable (not an object).\n */\nexport function normalizeTableSpec(\n spec: unknown,\n): { ok: true; spec: NormalizedTableSpec } | { ok: false; reason: string } {\n if (!isPlainObject(spec)) {\n return { ok: false, reason: \"Table specification is missing or malformed.\" };\n }\n\n const columns: ColumnSpec[] = [];\n const seen = new Set<string>();\n if (Array.isArray(spec.columns)) {\n for (const candidate of spec.columns) {\n const parsed = columnSpecSchema.safeParse(candidate);\n if (!parsed.success) continue; // drop invalid / still-streaming column\n if (seen.has(parsed.data.key)) continue; // de-dupe by key\n seen.add(parsed.data.key);\n columns.push(parsed.data);\n }\n }\n\n const rows: TableRowData[] = Array.isArray(spec.rows) ? spec.rows.filter(isPlainObject) : [];\n\n return {\n ok: true,\n spec: {\n title: strOrUndefined(spec.title),\n columns,\n rows,\n emptyText: strOrUndefined(spec.emptyText),\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\n/** The em-dash shown for a missing / empty cell. */\nexport const EMPTY_CELL = \"—\";\n\n/** Whether a format is numeric (drives end-alignment + `tabular-nums`). */\nexport function isNumericFormat(format: CellFormat | undefined): boolean {\n return format === \"number\" || format === \"currency\" || format === \"percent\";\n}\n\n/** Whether a value is considered empty (renders the em-dash). */\nexport function isEmptyCell(value: unknown): boolean {\n return value === null || value === undefined || value === \"\";\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim() !== \"\") return Number(value);\n return Number.NaN;\n}\n\nconst numberFormatter = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });\nconst currencyFormatter = new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: 0,\n});\nconst percentFormatter = new Intl.NumberFormat(undefined, {\n style: \"percent\",\n maximumFractionDigits: 1,\n});\n\n/**\n * Format a present value to a display string per its column format.\n * Unknown formats fall through to `String(value)` (never throws). Empty values\n * are the caller's concern (render `EMPTY_CELL`). `percent` follows `Intl`\n * semantics — pass fractions (0.42 → \"42%\").\n */\nexport function formatCellValue(value: unknown, format: CellFormat | undefined): string {\n switch (format) {\n case \"number\": {\n const n = toNumber(value);\n return Number.isNaN(n) ? String(value) : numberFormatter.format(n);\n }\n case \"currency\": {\n const n = toNumber(value);\n return Number.isNaN(n) ? String(value) : currencyFormatter.format(n);\n }\n case \"percent\": {\n const n = toNumber(value);\n return Number.isNaN(n) ? String(value) : percentFormatter.format(n);\n }\n case \"date\": {\n const d = value instanceof Date ? value : new Date(String(value));\n return Number.isNaN(d.getTime())\n ? String(value)\n : d.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n }\n default:\n return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Badge tone inference (semantic, not style — the spec never picks a tone)\n// ---------------------------------------------------------------------------\n\nexport type BadgeTone = \"secondary\" | \"success\" | \"warning\" | \"destructive\" | \"info\";\n\nconst SUCCESS_WORDS = new Set([\n \"active\",\n \"success\",\n \"successful\",\n \"complete\",\n \"completed\",\n \"done\",\n \"passed\",\n \"pass\",\n \"approved\",\n \"ok\",\n \"online\",\n \"enabled\",\n \"healthy\",\n \"live\",\n \"paid\",\n \"yes\",\n \"true\",\n]);\nconst WARNING_WORDS = new Set([\n \"pending\",\n \"warning\",\n \"in progress\",\n \"in-progress\",\n \"review\",\n \"in review\",\n \"waiting\",\n \"partial\",\n \"degraded\",\n \"low\",\n \"hold\",\n \"on hold\",\n]);\nconst DESTRUCTIVE_WORDS = new Set([\n \"failed\",\n \"fail\",\n \"error\",\n \"rejected\",\n \"inactive\",\n \"offline\",\n \"disabled\",\n \"blocked\",\n \"cancelled\",\n \"canceled\",\n \"overdue\",\n \"no\",\n \"false\",\n \"critical\",\n \"high\",\n \"expired\",\n]);\nconst INFO_WORDS = new Set([\"info\", \"new\", \"draft\", \"queued\", \"scheduled\", \"beta\", \"todo\", \"open\"]);\n\n/** Infer a badge tone from a value's semantics (status vocabulary). */\nexport function badgeToneForValue(value: unknown): BadgeTone {\n const key = String(value).trim().toLowerCase();\n if (SUCCESS_WORDS.has(key)) return \"success\";\n if (WARNING_WORDS.has(key)) return \"warning\";\n if (DESTRUCTIVE_WORDS.has(key)) return \"destructive\";\n if (INFO_WORDS.has(key)) return \"info\";\n return \"secondary\";\n}\n\n// ---------------------------------------------------------------------------\n// Sorting\n// ---------------------------------------------------------------------------\n\n/** Compare two cell values for sorting, honoring numeric/date formats. */\nexport function compareCellValues(a: unknown, b: unknown, format: CellFormat | undefined): number {\n const aEmpty = isEmptyCell(a);\n const bEmpty = isEmptyCell(b);\n if (aEmpty && bEmpty) return 0;\n if (aEmpty) return 1; // empties sort last\n if (bEmpty) return -1;\n\n if (isNumericFormat(format)) {\n return toNumber(a) - toNumber(b);\n }\n if (format === \"date\") {\n const da = new Date(String(a)).getTime();\n const db = new Date(String(b)).getTime();\n return (Number.isNaN(da) ? 0 : da) - (Number.isNaN(db) ? 0 : db);\n }\n // Mixed/auto: numeric when both parse as numbers, else locale string compare.\n const na = toNumber(a);\n const nb = toNumber(b);\n if (!Number.isNaN(na) && !Number.isNaN(nb)) return na - nb;\n return String(a).localeCompare(String(b));\n}\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n Command,\n CommandEmpty,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@elabs-ai/components-ui\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { ChevronsUpDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nconst deviceIdRegex = /\\(([\\da-fA-F]{4}:[\\da-fA-F]{4})\\)$/;\n\ninterface MicSelectorContextType {\n data: MediaDeviceInfo[];\n value: string | undefined;\n onValueChange?: (value: string) => void;\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n width: number;\n setWidth?: (width: number) => void;\n}\n\nconst MicSelectorContext = createContext<MicSelectorContextType>({\n data: [],\n onOpenChange: undefined,\n onValueChange: undefined,\n open: false,\n setWidth: undefined,\n value: undefined,\n width: 200,\n});\n\nexport const useAudioDevices = () => {\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [hasPermission, setHasPermission] = useState(false);\n\n const loadDevicesWithoutPermission = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n\n const deviceList = await navigator.mediaDevices.enumerateDevices();\n const audioInputs = deviceList.filter((device) => device.kind === \"audioinput\");\n\n setDevices(audioInputs);\n } catch (caughtError) {\n const message =\n caughtError instanceof Error ? caughtError.message : \"Failed to get audio devices\";\n\n setError(message);\n console.error(\"Error getting audio devices:\", message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const loadDevicesWithPermission = useCallback(async () => {\n if (loading) {\n return;\n }\n\n try {\n setLoading(true);\n setError(null);\n\n const tempStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n for (const track of tempStream.getTracks()) {\n track.stop();\n }\n\n const deviceList = await navigator.mediaDevices.enumerateDevices();\n const audioInputs = deviceList.filter((device) => device.kind === \"audioinput\");\n\n setDevices(audioInputs);\n setHasPermission(true);\n } catch (caughtError) {\n const message =\n caughtError instanceof Error ? caughtError.message : \"Failed to get audio devices\";\n\n setError(message);\n console.error(\"Error getting audio devices:\", message);\n } finally {\n setLoading(false);\n }\n }, [loading]);\n\n useEffect(() => {\n loadDevicesWithoutPermission();\n }, [loadDevicesWithoutPermission]);\n\n useEffect(() => {\n const handleDeviceChange = () => {\n if (hasPermission) {\n loadDevicesWithPermission();\n } else {\n loadDevicesWithoutPermission();\n }\n };\n\n navigator.mediaDevices.addEventListener(\"devicechange\", handleDeviceChange);\n\n return () => {\n navigator.mediaDevices.removeEventListener(\"devicechange\", handleDeviceChange);\n };\n }, [hasPermission, loadDevicesWithPermission, loadDevicesWithoutPermission]);\n\n return {\n devices,\n error,\n hasPermission,\n loadDevices: loadDevicesWithPermission,\n loading,\n };\n};\n\nexport type MicSelectorProps = ComponentProps<typeof Popover> & {\n defaultValue?: string;\n value?: string | undefined;\n onValueChange?: (value: string | undefined) => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const MicSelector = ({\n defaultValue,\n value: controlledValue,\n onValueChange: controlledOnValueChange,\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n ...props\n}: MicSelectorProps) => {\n const [value, onValueChange] = useControllableState<string | undefined>({\n defaultProp: defaultValue,\n onChange: controlledOnValueChange,\n prop: controlledValue,\n });\n const [open, onOpenChange] = useControllableState({\n defaultProp: defaultOpen,\n onChange: controlledOnOpenChange,\n prop: controlledOpen,\n });\n const [width, setWidth] = useState(200);\n const { devices, loading, hasPermission, loadDevices } = useAudioDevices();\n\n useEffect(() => {\n if (open && !hasPermission && !loading) {\n loadDevices();\n }\n }, [open, hasPermission, loading, loadDevices]);\n\n const contextValue = useMemo(\n () => ({\n data: devices,\n onOpenChange,\n onValueChange,\n open,\n setWidth,\n value,\n width,\n }),\n [devices, onOpenChange, onValueChange, open, setWidth, value, width],\n );\n\n return (\n <MicSelectorContext.Provider value={contextValue}>\n <Popover {...props} onOpenChange={onOpenChange} open={open} />\n </MicSelectorContext.Provider>\n );\n};\n\nexport type MicSelectorTriggerProps = ComponentProps<typeof Button>;\n\nexport const MicSelectorTrigger = ({ children, ...props }: MicSelectorTriggerProps) => {\n const { setWidth } = useContext(MicSelectorContext);\n const ref = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n // Create a ResizeObserver to detect width changes\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const newWidth = (entry.target as HTMLElement).offsetWidth;\n if (newWidth) {\n setWidth?.(newWidth);\n }\n }\n });\n\n if (ref.current) {\n resizeObserver.observe(ref.current);\n }\n\n // Clean up the observer when component unmounts\n return () => {\n resizeObserver.disconnect();\n };\n }, [setWidth]);\n\n return (\n <PopoverTrigger asChild>\n <Button variant=\"outline\" {...props} ref={ref}>\n {children}\n <ChevronsUpDownIcon className=\"shrink-0 text-muted-foreground\" size={16} />\n </Button>\n </PopoverTrigger>\n );\n};\n\nexport type MicSelectorContentProps = ComponentProps<typeof Command> & {\n popoverOptions?: ComponentProps<typeof PopoverContent>;\n};\n\nexport const MicSelectorContent = ({\n className,\n popoverOptions,\n ...props\n}: MicSelectorContentProps) => {\n const { width, onValueChange, value } = useContext(MicSelectorContext);\n\n return (\n <PopoverContent className={cn(\"p-0\", className)} style={{ width }} {...popoverOptions}>\n <Command onValueChange={onValueChange} value={value} {...props} />\n </PopoverContent>\n );\n};\n\nexport type MicSelectorInputProps = ComponentProps<typeof CommandInput> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n};\n\nexport const MicSelectorInput = ({ ...props }: MicSelectorInputProps) => {\n const { t } = useLocale();\n return <CommandInput placeholder={t(\"ai.micSelector.searchPlaceholder\")} {...props} />;\n};\n\nexport type MicSelectorListProps = Omit<ComponentProps<typeof CommandList>, \"children\"> & {\n children: (devices: MediaDeviceInfo[]) => ReactNode;\n};\n\nexport const MicSelectorList = ({ children, ...props }: MicSelectorListProps) => {\n const { data } = useContext(MicSelectorContext);\n\n return <CommandList {...props}>{children(data)}</CommandList>;\n};\n\nexport type MicSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const MicSelectorEmpty = ({\n children = \"No microphone found.\",\n ...props\n}: MicSelectorEmptyProps) => <CommandEmpty {...props}>{children}</CommandEmpty>;\n\nexport type MicSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const MicSelectorItem = (props: MicSelectorItemProps) => {\n const { onValueChange, onOpenChange } = useContext(MicSelectorContext);\n\n const handleSelect = useCallback(\n (currentValue: string) => {\n onValueChange?.(currentValue);\n onOpenChange?.(false);\n },\n [onValueChange, onOpenChange],\n );\n\n return <CommandItem onSelect={handleSelect} {...props} />;\n};\n\nexport type MicSelectorLabelProps = ComponentProps<\"span\"> & {\n device: MediaDeviceInfo;\n};\n\nexport const MicSelectorLabel = ({ device, className, ...props }: MicSelectorLabelProps) => {\n const matches = device.label.match(deviceIdRegex);\n\n if (!matches) {\n return (\n <span className={className} {...props}>\n {device.label}\n </span>\n );\n }\n\n const [, deviceId] = matches;\n const name = device.label.replace(deviceIdRegex, \"\");\n\n return (\n <span className={className} {...props}>\n <span>{name}</span>\n <span className=\"text-muted-foreground\"> ({deviceId})</span>\n </span>\n );\n};\n\nexport type MicSelectorValueProps = ComponentProps<\"span\">;\n\nexport const MicSelectorValue = ({ className, ...props }: MicSelectorValueProps) => {\n const { data, value } = useContext(MicSelectorContext);\n const currentDevice = data.find((d) => d.deviceId === value);\n\n if (!currentDevice) {\n return (\n <span className={cn(\"flex-1 text-start\", className)} {...props}>\n Select microphone...\n </span>\n );\n }\n\n return (\n <MicSelectorLabel\n className={cn(\"flex-1 text-start\", className)}\n device={currentDevice}\n {...props}\n />\n );\n};\n","import { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { BotIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\n/**\n * Where provider logos are fetched from by default.\n *\n * This is a REMOTE origin: a deployment with a restrictive `img-src` blocks it.\n * Self-host the SVGs and pass `src` (or set a `fallback`) — see\n * `docs/CSP-AND-NETWORK.md`.\n */\nexport const MODEL_PROVIDER_LOGO_BASE_URL = \"https://models.dev/logos\";\n\nexport type ModelProviderLogoProps = Omit<ComponentProps<\"img\">, \"alt\"> & {\n /**\n * Override the logo URL — point at a self-hosted or bundled asset when a CSP\n * blocks `models.dev`. Defaults to `${MODEL_PROVIDER_LOGO_BASE_URL}/<provider>.svg`.\n */\n src?: string;\n /**\n * Rendered when the logo fails to load (blocked, offline, or unknown\n * provider). Defaults to a neutral Lucide glyph, so the row never collapses\n * to a broken image.\n */\n fallback?: ReactNode;\n provider:\n | \"moonshotai-cn\"\n | \"lucidquery\"\n | \"moonshotai\"\n | \"zai-coding-plan\"\n | \"alibaba\"\n | \"xai\"\n | \"vultr\"\n | \"nvidia\"\n | \"upstage\"\n | \"groq\"\n | \"github-copilot\"\n | \"mistral\"\n | \"vercel\"\n | \"nebius\"\n | \"deepseek\"\n | \"alibaba-cn\"\n | \"google-vertex-anthropic\"\n | \"venice\"\n | \"chutes\"\n | \"cortecs\"\n | \"github-models\"\n | \"togetherai\"\n | \"azure\"\n | \"baseten\"\n | \"huggingface\"\n | \"opencode\"\n | \"fastrouter\"\n | \"google\"\n | \"google-vertex\"\n | \"cloudflare-workers-ai\"\n | \"inception\"\n | \"wandb\"\n | \"openai\"\n | \"zhipuai-coding-plan\"\n | \"perplexity\"\n | \"openrouter\"\n | \"zenmux\"\n | \"v0\"\n | \"iflowcn\"\n | \"synthetic\"\n | \"deepinfra\"\n | \"zhipuai\"\n | \"submodel\"\n | \"zai\"\n | \"inference\"\n | \"requesty\"\n | \"morph\"\n | \"lmstudio\"\n | \"anthropic\"\n | \"aihubmix\"\n | \"fireworks-ai\"\n | \"modelscope\"\n | \"llama\"\n | \"scaleway\"\n | \"amazon-bedrock\"\n | \"cerebras\"\n // oxlint-disable-next-line typescript-eslint(ban-types) -- intentional pattern for autocomplete-friendly string union\n | (string & {});\n};\n\n/**\n * The mark of an AI model provider (`anthropic`, `openai`, `google`, …), sized\n * for a row in a model list.\n *\n * **`ModelProviderLogo` vs `ServiceLogo` (`@elabs-ai/components-icons`).** An AI\n * provider mark with a zero-config remote default — name the provider and a logo\n * appears, no registration step — is this component. Any other third-party\n * service mark, resolved from a registry the app supplies and never fetched, is\n * `ServiceLogo`. The two are not interchangeable: `ServiceLogo` has no\n * per-instance `src` and no `onError`, and this one reaches a remote origin by\n * default (see `docs/CSP-AND-NETWORK.md`).\n */\nexport const ModelProviderLogo = ({\n provider,\n className,\n src,\n fallback,\n onError,\n ...props\n}: ModelProviderLogoProps) => {\n const [failed, setFailed] = useState(false);\n\n // A blocked/missing logo must not leave a broken-image glyph in the row.\n if (failed) {\n return (\n <>\n {fallback ?? (\n <BotIcon aria-label={`${provider} logo`} className={cn(\"size-3\", className)} role=\"img\" />\n )}\n </>\n );\n }\n\n return (\n <img\n {...props}\n alt={`${provider} logo`}\n className={cn(\"size-3 dark:invert\", className)}\n height={12}\n onError={(event) => {\n setFailed(true);\n onError?.(event);\n }}\n // AFTER the spread, so the caller's `src` wins via the destructured\n // default rather than being silently overwritten.\n src={src ?? `${MODEL_PROVIDER_LOGO_BASE_URL}/${provider}.svg`}\n width={12}\n />\n );\n};\n\nexport type ModelProviderLogoGroupProps = ComponentProps<\"div\">;\n\nexport const ModelProviderLogoGroup = ({ className, ...props }: ModelProviderLogoGroupProps) => (\n <div\n className={cn(\n \"flex shrink-0 items-center -space-x-1 [&>img]:rounded-full [&>img]:bg-background [&>img]:p-px [&>img]:ring-1 dark:[&>img]:bg-foreground\",\n className,\n )}\n {...props}\n />\n);\n","\"use client\";\n\nimport { useReducedMotion } from \"@elabs-ai/components-tokens\";\nimport { MotionConfig, type Transition } from \"motion/react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * Default transition fed to descendant Motion components — mirrors the\n * `--duration-base` (180ms) and `--ease-standard` tokens in @elabs-ai/components-tokens so\n * JS-driven motion matches the CSS layer's timing. Override via the `transition`\n * prop. (Motion durations are in SECONDS; ease is a cubic-bezier [x1,y1,x2,y2].)\n */\nconst DEFAULT_MOTION_TRANSITION: Transition = {\n duration: 0.18,\n ease: [0.2, 0, 0, 1],\n};\n\nexport interface BrandMotionConfigProps {\n children: ReactNode;\n /** Override the default transition handed to descendant Motion components. */\n transition?: Transition;\n}\n\n/**\n * App-level wrapper that bridges the brand-ui motion preference into Motion\n * (motion.dev). It drives Motion's `reducedMotion` from `useReducedMotion()`\n * (user choice > OS setting) so JS-driven Motion components honor the SAME gate\n * as the CSS `--motion-factor` layer, and supplies a token-mirrored default\n * transition. Provider-OPTIONAL: without a `<ThemeProvider>` it degrades to\n * OS-only reduced-motion detection.\n *\n * Wrap the Motion-using subtree (e.g. the chat surface) once near the app root.\n *\n * NOTE: Motion's `reducedMotion=\"always\"` disables only transform/layout\n * animations (opacity/color persist — \"reduced != none\"). Components that loop\n * on other properties (e.g. {@link Shimmer}, which animates backgroundPosition)\n * must still branch on `useReducedMotion()` themselves.\n */\nexport function BrandMotionConfig({\n children,\n transition = DEFAULT_MOTION_TRANSITION,\n}: BrandMotionConfigProps) {\n const reducedMotion = useReducedMotion();\n return (\n <MotionConfig reducedMotion={reducedMotion ? \"always\" : \"never\"} transition={transition}>\n {children}\n </MotionConfig>\n );\n}\n","\"use client\";\n\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type NodeProps = ComponentProps<typeof Card> & {\n handles: {\n target: boolean;\n source: boolean;\n };\n};\n\n/**\n * React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019.\n * The WHOLE node (card + handles) is behind the boundary rather than just the\n * two `<Handle>`s: React Flow re-reads a node's handle bounds when its measured\n * box changes, so handles appearing inside an already-measured card could leave\n * the bounds stale. Going 0 → full size guarantees the re-measure.\n */\nconst NodeImpl = lazyFlowPart<NodeProps>((m) => m.Node);\n\nexport const Node = (props: NodeProps) => (\n <Suspense fallback={null}>\n <NodeImpl {...props} />\n </Suspense>\n);\n\nexport type NodeHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const NodeHeader = ({ className, ...props }: NodeHeaderProps) => (\n <CardHeader\n className={cn(\"gap-0.5 rounded-t-md border-b bg-secondary p-3!\", className)}\n {...props}\n />\n);\n\nexport type NodeTitleProps = ComponentProps<typeof CardTitle>;\n\nexport const NodeTitle = (props: NodeTitleProps) => <CardTitle {...props} />;\n\nexport type NodeDescriptionProps = ComponentProps<typeof CardDescription>;\n\nexport const NodeDescription = (props: NodeDescriptionProps) => <CardDescription {...props} />;\n\nexport type NodeActionProps = ComponentProps<typeof CardAction>;\n\nexport const NodeAction = (props: NodeActionProps) => <CardAction {...props} />;\n\nexport type NodeContentProps = ComponentProps<typeof CardContent>;\n\nexport const NodeContent = ({ className, ...props }: NodeContentProps) => (\n <CardContent className={cn(\"p-3\", className)} {...props} />\n);\n\nexport type NodeFooterProps = ComponentProps<typeof CardFooter>;\n\nexport const NodeFooter = ({ className, ...props }: NodeFooterProps) => (\n <CardFooter className={cn(\"rounded-b-md border-t bg-secondary p-3!\", className)} {...props} />\n);\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronDownIcon, ExternalLinkIcon, MessageCircleIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nconst providers = {\n chatgpt: {\n createUrl: (prompt: string) =>\n `https://chatgpt.com/?${new URLSearchParams({\n hints: \"search\",\n prompt,\n })}`,\n icon: (\n <svg fill=\"currentColor\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>OpenAI</title>\n <path d=\"M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z\" />\n </svg>\n ),\n title: \"Open in ChatGPT\",\n },\n claude: {\n createUrl: (q: string) =>\n `https://claude.ai/new?${new URLSearchParams({\n q,\n })}`,\n icon: (\n <svg fill=\"currentColor\" role=\"img\" viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>Claude</title>\n <path\n clipRule=\"evenodd\"\n d=\"M2.3545 7.9775L4.7145 6.654L4.7545 6.539L4.7145 6.475H4.6L4.205 6.451L2.856 6.4145L1.6865 6.366L0.5535 6.305L0.268 6.2445L0 5.892L0.0275 5.716L0.2675 5.5555L0.6105 5.5855L1.3705 5.637L2.5095 5.716L3.3355 5.7645L4.56 5.892H4.7545L4.782 5.8135L4.715 5.7645L4.6635 5.716L3.4845 4.918L2.2085 4.074L1.5405 3.588L1.1785 3.3425L0.9965 3.1115L0.9175 2.6075L1.2455 2.2465L1.686 2.2765L1.7985 2.307L2.245 2.65L3.199 3.388L4.4445 4.3045L4.627 4.4565L4.6995 4.405L4.709 4.3685L4.627 4.2315L3.9495 3.0085L3.2265 1.7635L2.9045 1.2475L2.8195 0.938C2.78711 0.819128 2.76965 0.696687 2.7675 0.5735L3.1415 0.067L3.348 0L3.846 0.067L4.056 0.249L4.366 0.956L4.867 2.0705L5.6445 3.5855L5.8725 4.0345L5.994 4.4505L6.0395 4.578H6.1185V4.505L6.1825 3.652L6.301 2.6045L6.416 1.257L6.456 0.877L6.644 0.422L7.0175 0.176L7.3095 0.316L7.5495 0.6585L7.516 0.8805L7.373 1.806L7.0935 3.2575L6.9115 4.2285H7.0175L7.139 4.1075L7.6315 3.4545L8.4575 2.4225L8.8225 2.0125L9.2475 1.5605L9.521 1.345H10.0375L10.4175 1.9095L10.2475 2.4925L9.7155 3.166L9.275 3.737L8.643 4.587L8.248 5.267L8.2845 5.322L8.3785 5.312L9.8065 5.009L10.578 4.869L11.4985 4.7115L11.915 4.9055L11.9605 5.103L11.7965 5.5065L10.812 5.7495L9.6575 5.9805L7.938 6.387L7.917 6.402L7.9415 6.4325L8.716 6.5055L9.047 6.5235H9.858L11.368 6.636L11.763 6.897L12 7.216L11.9605 7.4585L11.353 7.7685L10.533 7.574L8.6185 7.119L7.9625 6.9545H7.8715V7.0095L8.418 7.5435L9.421 8.4485L10.6755 9.6135L10.739 9.9025L10.578 10.13L10.408 10.1055L9.3055 9.277L8.88 8.9035L7.917 8.0935H7.853V8.1785L8.075 8.503L9.2475 10.2635L9.3085 10.8035L9.2235 10.98L8.9195 11.0865L8.5855 11.0255L7.8985 10.063L7.191 8.9795L6.6195 8.008L6.5495 8.048L6.2125 11.675L6.0545 11.86L5.69 12L5.3865 11.7695L5.2255 11.396L5.3865 10.658L5.581 9.696L5.7385 8.931L5.8815 7.981L5.9665 7.665L5.9605 7.644L5.8905 7.653L5.1735 8.6365L4.0835 10.109L3.2205 11.0315L3.0135 11.1135L2.655 10.9285L2.6885 10.5975L2.889 10.303L4.083 8.785L4.803 7.844L5.268 7.301L5.265 7.222H5.2375L2.066 9.28L1.501 9.353L1.2575 9.125L1.288 8.752L1.4035 8.6305L2.3575 7.9745L2.3545 7.9775Z\"\n fillRule=\"evenodd\"\n />\n </svg>\n ),\n title: \"Open in Claude\",\n },\n cursor: {\n createUrl: (text: string) => {\n const url = new URL(\"https://cursor.com/link/prompt\");\n url.searchParams.set(\"text\", text);\n return url.toString();\n },\n icon: (\n <svg version=\"1.1\" viewBox=\"0 0 466.73 532.09\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>Cursor</title>\n <path\n d=\"M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n title: \"Open in Cursor\",\n },\n github: {\n createUrl: (url: string) => url,\n icon: (\n <svg fill=\"currentColor\" role=\"img\" viewBox=\"0 0 24 24\">\n <title>GitHub</title>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n ),\n title: \"Open in GitHub\",\n },\n scira: {\n createUrl: (q: string) =>\n `https://scira.ai/?${new URLSearchParams({\n q,\n })}`,\n icon: (\n <svg\n fill=\"none\"\n height=\"934\"\n viewBox=\"0 0 910 934\"\n width=\"910\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <title>Scira AI</title>\n <path\n d=\"M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"8\"\n />\n <path\n d=\"M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"8\"\n />\n <path\n d=\"M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"20\"\n />\n <path\n d=\"M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"20\"\n />\n <path\n d=\"M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"8\"\n />\n <path\n d=\"M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"8\"\n />\n <path\n d=\"M760.632 764.337C720.719 814.616 669.835 855.1 611.872 882.692C553.91 910.285 490.404 924.255 426.213 923.533C362.022 922.812 298.846 907.419 241.518 878.531C184.19 849.643 134.228 808.026 95.4548 756.863C56.6815 705.7 30.1238 646.346 17.8129 583.343C5.50207 520.339 7.76433 455.354 24.4266 393.359C41.089 331.364 71.7099 274.001 113.947 225.658C156.184 177.315 208.919 139.273 268.117 114.442\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"30\"\n />\n </svg>\n ),\n title: \"Open in Scira\",\n },\n t3: {\n createUrl: (q: string) =>\n `https://t3.chat/new?${new URLSearchParams({\n q,\n })}`,\n icon: <MessageCircleIcon />,\n title: \"Open in T3 Chat\",\n },\n v0: {\n createUrl: (q: string) =>\n `https://v0.app?${new URLSearchParams({\n q,\n })}`,\n icon: (\n <svg fill=\"currentColor\" viewBox=\"0 0 147 70\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>v0</title>\n <path d=\"M56 50.2031V14H70V60.1562C70 65.5928 65.5928 70 60.1562 70C57.5605 70 54.9982 68.9992 53.1562 67.1573L0 14H19.7969L56 50.2031Z\" />\n <path d=\"M147 56H133V23.9531L100.953 56H133V70H96.6875C85.8144 70 77 61.1856 77 50.3125V14H91V46.1562L123.156 14H91V0H127.312C138.186 0 147 8.81439 147 19.6875V56Z\" />\n </svg>\n ),\n title: \"Open in v0\",\n },\n};\n\nconst OpenInContext = createContext<{ query: string } | undefined>(undefined);\n\nconst useOpenInContext = () => {\n const context = useContext(OpenInContext);\n if (!context) {\n throw new Error(\"OpenIn components must be used within an OpenIn provider\");\n }\n return context;\n};\n\nexport type OpenInProps = ComponentProps<typeof DropdownMenu> & {\n query: string;\n};\n\nexport const OpenIn = ({ query, ...props }: OpenInProps) => {\n const contextValue = useMemo(() => ({ query }), [query]);\n\n return (\n <OpenInContext.Provider value={contextValue}>\n <DropdownMenu {...props} />\n </OpenInContext.Provider>\n );\n};\n\nexport type OpenInContentProps = ComponentProps<typeof DropdownMenuContent>;\n\nexport const OpenInContent = ({ className, ...props }: OpenInContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(\"w-[240px]\", className)} {...props} />\n);\n\nexport type OpenInItemProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInItem = (props: OpenInItemProps) => <DropdownMenuItem {...props} />;\n\nexport type OpenInLabelProps = ComponentProps<typeof DropdownMenuLabel>;\n\nexport const OpenInLabel = (props: OpenInLabelProps) => <DropdownMenuLabel {...props} />;\n\nexport type OpenInSeparatorProps = ComponentProps<typeof DropdownMenuSeparator>;\n\nexport const OpenInSeparator = (props: OpenInSeparatorProps) => (\n <DropdownMenuSeparator {...props} />\n);\n\nexport type OpenInTriggerProps = ComponentProps<typeof DropdownMenuTrigger>;\n\nexport const OpenInTrigger = ({ children, ...props }: OpenInTriggerProps) => (\n <DropdownMenuTrigger {...props} asChild>\n {children ?? (\n <Button type=\"button\" variant=\"outline\">\n Open in chat\n <ChevronDownIcon className=\"size-4\" />\n </Button>\n )}\n </DropdownMenuTrigger>\n);\n\nexport type OpenInChatGPTProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInChatGPT = (props: OpenInChatGPTProps) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.chatgpt.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.chatgpt.icon}</span>\n <span className=\"flex-1\">{providers.chatgpt.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n\nexport type OpenInClaudeProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInClaude = (props: OpenInClaudeProps) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.claude.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.claude.icon}</span>\n <span className=\"flex-1\">{providers.claude.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n\nexport type OpenInT3Props = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInT3 = (props: OpenInT3Props) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.t3.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.t3.icon}</span>\n <span className=\"flex-1\">{providers.t3.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n\nexport type OpenInSciraProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInScira = (props: OpenInSciraProps) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.scira.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.scira.icon}</span>\n <span className=\"flex-1\">{providers.scira.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n\nexport type OpenInv0Props = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInv0 = (props: OpenInv0Props) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.v0.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.v0.icon}</span>\n <span className=\"flex-1\">{providers.v0.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n\nexport type OpenInCursorProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInCursor = (props: OpenInCursorProps) => {\n const { query } = useOpenInContext();\n return (\n <DropdownMenuItem asChild {...props}>\n <a\n className=\"flex items-center gap-2\"\n href={providers.cursor.createUrl(query)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <span className=\"shrink-0\">{providers.cursor.icon}</span>\n <span className=\"flex-1\">{providers.cursor.title}</span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n","\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ArrowRightIcon, MinusIcon, PackageIcon, PlusIcon } from \"lucide-react\";\nimport type { HTMLAttributes } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype ChangeType = \"major\" | \"minor\" | \"patch\" | \"added\" | \"removed\";\n\ninterface PackageInfoContextType {\n name: string;\n currentVersion?: string;\n newVersion?: string;\n changeType?: ChangeType;\n}\n\nconst PackageInfoContext = createContext<PackageInfoContextType>({\n name: \"\",\n});\n\nexport type PackageInfoHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoHeader = ({ className, children, ...props }: PackageInfoHeaderProps) => (\n <div className={cn(\"flex items-center justify-between gap-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type PackageInfoNameProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoName = ({ className, children, ...props }: PackageInfoNameProps) => {\n const { name } = useContext(PackageInfoContext);\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)} {...props}>\n <PackageIcon className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium font-mono text-sm\">{children ?? name}</span>\n </div>\n );\n};\n\nconst changeTypeStyles: Record<ChangeType, string> = {\n added: \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400\",\n major: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\n minor: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400\",\n patch: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n removed: \"bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400\",\n};\n\nconst changeTypeIcons: Record<ChangeType, React.ReactNode> = {\n added: <PlusIcon className=\"size-3\" />,\n major: <ArrowRightIcon className=\"size-3\" />,\n minor: <ArrowRightIcon className=\"size-3\" />,\n patch: <ArrowRightIcon className=\"size-3\" />,\n removed: <MinusIcon className=\"size-3\" />,\n};\n\nexport type PackageInfoChangeTypeProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoChangeType = ({\n className,\n children,\n ...props\n}: PackageInfoChangeTypeProps) => {\n const { changeType } = useContext(PackageInfoContext);\n\n if (!changeType) {\n return null;\n }\n\n return (\n <Badge\n className={cn(\"gap-1 text-xs capitalize\", changeTypeStyles[changeType], className)}\n variant=\"secondary\"\n {...props}\n >\n {changeTypeIcons[changeType]}\n {children ?? changeType}\n </Badge>\n );\n};\n\nexport type PackageInfoVersionProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoVersion = ({ className, children, ...props }: PackageInfoVersionProps) => {\n const { currentVersion, newVersion } = useContext(PackageInfoContext);\n\n if (!(currentVersion || newVersion)) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"mt-2 flex items-center gap-2 font-mono text-muted-foreground text-sm\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n {currentVersion && <span>{currentVersion}</span>}\n {currentVersion && newVersion && <ArrowRightIcon className=\"size-3\" />}\n {newVersion && <span className=\"font-medium text-foreground\">{newVersion}</span>}\n </>\n )}\n </div>\n );\n};\n\nexport type PackageInfoProps = HTMLAttributes<HTMLDivElement> & {\n name: string;\n currentVersion?: string;\n newVersion?: string;\n changeType?: ChangeType;\n};\n\nexport const PackageInfo = ({\n name,\n currentVersion,\n newVersion,\n changeType,\n className,\n children,\n ...props\n}: PackageInfoProps) => {\n const contextValue = useMemo(\n () => ({ changeType, currentVersion, name, newVersion }),\n [changeType, currentVersion, name, newVersion],\n );\n\n return (\n <PackageInfoContext.Provider value={contextValue}>\n <div className={cn(\"rounded-lg border bg-background p-4\", className)} {...props}>\n {children ?? (\n <>\n <PackageInfoHeader>\n <PackageInfoName />\n {changeType && <PackageInfoChangeType />}\n </PackageInfoHeader>\n {(currentVersion || newVersion) && <PackageInfoVersion />}\n </>\n )}\n </div>\n </PackageInfoContext.Provider>\n );\n};\n\nexport type PackageInfoDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const PackageInfoDescription = ({\n className,\n children,\n ...props\n}: PackageInfoDescriptionProps) => (\n <p className={cn(\"mt-2 text-muted-foreground text-sm\", className)} {...props}>\n {children}\n </p>\n);\n\nexport type PackageInfoContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoContent = ({ className, children, ...props }: PackageInfoContentProps) => (\n <div className={cn(\"mt-3 border-t pt-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type PackageInfoDependenciesProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PackageInfoDependencies = ({\n className,\n children,\n ...props\n}: PackageInfoDependenciesProps) => (\n <div className={cn(\"space-y-2\", className)} {...props}>\n <span className=\"font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n Dependencies\n </span>\n <div className=\"space-y-1\">{children}</div>\n </div>\n);\n\nexport type PackageInfoDependencyProps = HTMLAttributes<HTMLDivElement> & {\n name: string;\n version?: string;\n};\n\nexport const PackageInfoDependency = ({\n name,\n version,\n className,\n children,\n ...props\n}: PackageInfoDependencyProps) => (\n <div className={cn(\"flex items-center justify-between text-sm\", className)} {...props}>\n {children ?? (\n <>\n <span className=\"font-mono text-muted-foreground\">{name}</span>\n {version && <span className=\"font-mono text-xs\">{version}</span>}\n </>\n )}\n </div>\n);\n","\"use client\";\n\nimport type { Panel as PanelPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type PanelProps = ComponentProps<typeof PanelPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst PanelImpl = lazyFlowPart<PanelProps>((m) => m.Panel);\n\nexport const Panel = (props: PanelProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <PanelImpl {...props} />\n </Suspense>\n);\n","\"use client\";\n\nimport { forwardRef, useId, type ComponentProps } from \"react\";\nimport { Badge, Kbd, Label, RadioGroup, RadioGroupItem, useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\n\n/**\n * PermissionModeSelect — the standing-permission-policy chooser (#104).\n *\n * Distinct from `Confirmation`/`ApprovalCard` (#103): those render ONE\n * per-call decision (\"may I run this command?\"). This renders the POLICY\n * that governs how many of those per-call decisions ever occur (\"how much\n * may you do without asking?\"). The two stay separate components with a\n * documented relationship rather than one growing a boolean \"policy mode\"\n * prop — see `.claude/rules/component-api.md` (\"Avoid boolean-prop\n * proliferation\").\n *\n * The mode vocabulary is entirely app-defined: no agent's mode names are\n * hardcoded in this file or in `PermissionMode`/`PermissionModeSelectProps`.\n * `consequence` is a REQUIRED field — a mode whose effect is unstated is\n * exactly the failure this component exists to prevent (three unlabelled\n * radio buttons).\n *\n * Built on `@elabs-ai/components-ui`'s `RadioGroup` (Radix) for roving\n * focus / arrow-key navigation / Space-Enter selection / announcement — this\n * component does not hand-roll any of that. The in-force mode is marked in\n * TEXT: a \"Current\" badge lives inside the `<Label>` associated with that\n * mode's radio input, so it is part of the control's accessible name and\n * recoverable in greyscale — never colour alone (WCAG 1.4.1).\n */\nexport interface PermissionMode {\n id: string;\n label: string;\n /** What this mode actually permits — required, not optional. */\n consequence: string;\n keyHint?: string;\n}\n\nexport interface PermissionModeSelectProps extends ComponentProps<\"div\"> {\n modes: PermissionMode[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (id: string) => void;\n /** The mode currently in force, marked distinctly from the highlighted one. */\n currentId?: string;\n}\n\nexport const PermissionModeSelect = forwardRef<HTMLDivElement, PermissionModeSelectProps>(\n function PermissionModeSelect(\n { modes, value, defaultValue, onValueChange, currentId, className, dir, ...props },\n ref,\n ) {\n const { t } = useLocale();\n const baseId = useId();\n\n return (\n <RadioGroup\n ref={ref}\n // `dir` on a plain <div> is a free-form HTML string; Radix's RadioGroup\n // narrows it to \"ltr\" | \"rtl\". Cast at this single call site rather\n // than widening (and so weakening) the public prop type.\n dir={dir as \"ltr\" | \"rtl\" | undefined}\n // The RadioGroup's own highlighted value is independent of `currentId`\n // (the mode already in force) — they answer different questions, so\n // neither prop ever derives the other except as an uncontrolled\n // starting point: with nothing else specified, pre-select the mode\n // that is currently in force.\n defaultValue={defaultValue ?? currentId}\n value={value}\n onValueChange={onValueChange}\n data-slot=\"permission-mode-select\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n >\n {modes.map((mode) => {\n const isCurrent = mode.id === currentId;\n const itemId = `${baseId}-${mode.id}`;\n // The consequence sentence is the whole point of this component (see\n // the `consequence` prop doc above), so it has to reach assistive\n // tech as a DESCRIPTION of the radio — not merely sit next to it in\n // the DOM. Without this link a screen-reader user arrowing through\n // the modes hears \"Unrestricted\" and never hears what unrestricted\n // costs them. Same wiring as `ApprovalCardOptions` in\n // `confirmation.tsx`, deliberately: one convention, not two.\n const consequenceId = `${itemId}-consequence`;\n\n return (\n <div\n key={mode.id}\n data-slot=\"permission-mode-select-option\"\n className={cn(\n \"flex items-start gap-3 rounded-lg border border-border bg-card p-4\",\n \"has-[[data-state=checked]]:border-primary\",\n )}\n >\n <RadioGroupItem\n aria-describedby={consequenceId}\n className=\"mt-1\"\n data-slot=\"permission-mode-select-input\"\n id={itemId}\n value={mode.id}\n />\n <div className=\"grid flex-1 gap-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label\n className=\"text-body flex items-center gap-2 font-medium\"\n data-slot=\"permission-mode-select-label\"\n htmlFor={itemId}\n >\n {mode.label}\n {isCurrent ? (\n <Badge data-slot=\"permission-mode-select-current\" variant=\"secondary\">\n {t(\"ai.permissionModeSelect.current\")}\n </Badge>\n ) : null}\n </Label>\n {mode.keyHint ? (\n <Kbd data-slot=\"permission-mode-select-key-hint\">{mode.keyHint}</Kbd>\n ) : null}\n </div>\n <p\n className=\"text-meta text-muted-foreground\"\n data-slot=\"permission-mode-select-consequence\"\n id={consequenceId}\n >\n {mode.consequence}\n </p>\n </div>\n </div>\n );\n })}\n </RadioGroup>\n );\n },\n);\n\nPermissionModeSelect.displayName = \"PermissionModeSelect\";\n","\"use client\";\n\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport type { FC, ReactNode } from \"react\";\nimport { lazy, memo, Suspense, useCallback, useState } from \"react\";\n\nimport { LazyEngineBoundary } from \"./_lazy-engine-boundary\";\nimport { PERSONA_SOURCES, type PersonaState, type PersonaVariant } from \"./persona-sources\";\n\nexport { PERSONA_SOURCES };\nexport type { PersonaState, PersonaVariant };\n\n/**\n * The Rive runtime lives behind a dynamic import — `@rive-app/react-webgl2`\n * declares no `sideEffects`, so a static import would put the whole WebGL2\n * runtime and its `.wasm` in every consumer's entry chunk, `Persona` rendered or\n * not. See ADR 0019.\n *\n * Issue #101: `@rive-app/react-webgl2` (and, transitively, `@rive-app/webgl2`,\n * which re-exports `RiveParameters`) is an OPTIONAL peer, so no PUBLIC export's\n * type may structurally reference it — doing so would name the peer's module\n * specifier in this package's generated root `.d.ts` and hand a\n * `skipLibCheck: false` consumer who has not installed the peer a `TS2307` just\n * for importing the barrel. `PersonaRiveEvent`/`PersonaRiveEventCallback` below\n * are an OWNED mirror of the peer's `Event`/`EventCallback` (from\n * `@rive-app/webgl2`'s `rive.d.ts`) — every one of `RiveParameters`'s\n * `onLoad`/`onLoadError`/`onPause`/`onPlay`/`onStop` callbacks share that exact\n * same `EventCallback` shape, so one owned type covers all five. The\n * conformance assertion in `_persona-rive.tsx` (which still imports the real\n * peer types — that module is reached only through `lazy()` and never sits in\n * the barrel's declaration graph) proves this mirror stays assignable to the\n * real peer type; a future Rive release that changes `Event`'s shape fails\n * `pnpm --filter @elabs-ai/components-ai typecheck` locally instead of\n * reaching a consumer as silent drift. Mirrors the identical pattern\n * `packages/terminal/src/interactive-terminal.tsx` already established for\n * `@xterm/xterm`'s `ITheme` (also issue #101).\n */\nconst PersonaRive = lazy(() => import(\"./_persona-rive\"));\n\n/**\n * Owned mirror of `@rive-app/webgl2`'s `Event` (the parameter type every\n * `RiveParameters` callback receives) — see the module doc comment above.\n * `data` is deliberately widened to `unknown` rather than replicating Rive's\n * `RiveEventPayload`/`LoopEvent`/`RiveFile` union: no callback in this package\n * (or, realistically, a consumer's) narrows it, and `unknown` remains a safe,\n * structurally-compatible supertype of the real union for the conformance\n * assertion in `_persona-rive.tsx`.\n */\nexport interface PersonaRiveEvent {\n type: string;\n data?: unknown;\n}\n\n/** Owned mirror of `@rive-app/webgl2`'s `EventCallback`. */\nexport type PersonaRiveEventCallback = (event: PersonaRiveEvent) => void;\n\n/**\n * Localized status announced when `state` changes, one key per `PersonaState`.\n * Typed as a `Record` (not a bare template string) so a `PersonaState` value\n * added later without a matching key here fails to typecheck.\n */\nconst PERSONA_STATE_KEYS: Record<PersonaState, string> = {\n idle: \"ai.persona.idle\",\n listening: \"ai.persona.listening\",\n thinking: \"ai.persona.thinking\",\n speaking: \"ai.persona.speaking\",\n asleep: \"ai.persona.asleep\",\n};\n\nexport interface PersonaProps {\n className?: string;\n /**\n * Rendered while the artwork loads, and permanently if it fails (blocked by a\n * `connect-src` CSP, offline, or a bad `src`). Defaults to a token-driven orb,\n * so a blocked fetch never leaves an empty box.\n */\n fallback?: ReactNode;\n onLoad?: PersonaRiveEventCallback;\n onLoadError?: PersonaRiveEventCallback;\n onPause?: PersonaRiveEventCallback;\n onPlay?: PersonaRiveEventCallback;\n onReady?: () => void;\n onStop?: PersonaRiveEventCallback;\n /**\n * Override the `.riv` artwork URL — point at a self-hosted copy when a CSP\n * blocks the default origin. Defaults to `PERSONA_SOURCES[variant].source`.\n * Mirrors the `mapStyle` override on `MapCanvas`.\n */\n src?: string;\n state: PersonaState;\n /**\n * Visually-hidden text announced when `state` changes. Defaults to a\n * localized label for the current `state`; pass `null` when the consuming\n * surface already renders its own `role=\"status\"` line, so AT is not told\n * twice.\n */\n statusLabel?: ReactNode | null;\n variant?: PersonaVariant;\n}\n\n/**\n * The offline/blocked stand-in: a token-driven orb.\n *\n * Opacity-only pulse (no transform), neutralised under reduced motion.\n */\nconst PersonaFallback = ({ className }: { className?: string }) => (\n <div\n aria-hidden=\"true\"\n className={cn(\"grid size-16 shrink-0 place-items-center rounded-full bg-primary/10\", className)}\n >\n <span className=\"size-6 animate-pulse rounded-full bg-primary/40 motion-reduce:animate-none\" />\n </div>\n);\n\nexport const Persona: FC<PersonaProps> = memo(\n ({\n className,\n fallback,\n onLoad,\n onLoadError,\n onPause,\n onPlay,\n onReady,\n onStop,\n src,\n state = \"idle\",\n statusLabel,\n variant = \"obsidian\",\n }) => {\n const source = PERSONA_SOURCES[variant];\n\n if (!source) {\n throw new Error(`Invalid variant: ${variant}`);\n }\n\n const { t } = useLocale();\n const [failed, setFailed] = useState(false);\n\n const handleLoadError = useCallback<PersonaRiveEventCallback>(\n (event) => {\n setFailed(true);\n onLoadError?.(event);\n },\n [onLoadError],\n );\n\n const placeholder = fallback ?? <PersonaFallback className={className} />;\n\n const label = statusLabel === null ? null : (statusLabel ?? t(PERSONA_STATE_KEYS[state]));\n\n const visual = failed ? (\n placeholder\n ) : (\n // The Rive runtime is an optional peer (`@rive-app/react-webgl2`, issue\n // #33) reached via `lazy()` — a REJECTED import throws during render,\n // which `Suspense` alone cannot catch (it only covers the pending\n // state). `LazyEngineBoundary` catches that throw and falls back to the\n // same placeholder a load-time `onLoadError` already renders.\n // `renderMissing` stays pure — `LazyEngineBoundary.componentDidCatch`\n // already logs the error once, correctly; logging it again here would\n // double-report on every render this fallback re-mounts under.\n <LazyEngineBoundary renderMissing={() => placeholder}>\n <Suspense fallback={placeholder}>\n <PersonaRive\n className={className}\n onLoad={onLoad}\n onLoadError={handleLoadError}\n onPause={onPause}\n onPlay={onPlay}\n onReady={onReady}\n onStop={onStop}\n source={source}\n src={src ?? source.source}\n state={state}\n />\n </Suspense>\n </LazyEngineBoundary>\n );\n\n return (\n <>\n {visual}\n {label !== null && (\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {label}\n </span>\n )}\n </>\n );\n },\n);\n\nPersona.displayName = \"Persona\";\n","/**\n * Persona artwork sources — a plain data module shared by `persona.tsx` (the\n * public shell) and `_persona-rive.tsx` (the lazily-loaded Rive half), so\n * neither has to import the other.\n */\n\nexport type PersonaState = \"idle\" | \"listening\" | \"thinking\" | \"speaking\" | \"asleep\";\n\nexport interface PersonaSource {\n /** The artwork exposes a colour view-model that follows the light/dark theme. */\n dynamicColor: boolean;\n /** The artwork has a Rive view-model (vs. a plain state machine). */\n hasModel: boolean;\n /** Absolute URL of the `.riv` artwork. */\n source: string;\n}\n\n/**\n * Where the shipped `.riv` artwork is fetched from.\n *\n * ⚠️ These are REMOTE origins fetched at runtime by the Rive runtime — a\n * deployment with a restrictive `connect-src` blocks them, and the component\n * falls back to a token-driven orb. Self-host the six files and pass\n * `<Persona src={…}>` to point at your own copies. See `docs/CSP-AND-NETWORK.md`.\n */\nexport const PERSONA_SOURCES = {\n command: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/command-2.0.riv\",\n },\n glint: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/glint-2.0.riv\",\n },\n halo: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/halo-2.0.riv\",\n },\n mana: {\n dynamicColor: false,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/mana-2.0.riv\",\n },\n obsidian: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/obsidian-2.0.riv\",\n },\n opal: {\n dynamicColor: false,\n hasModel: false,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/orb-1.2.riv\",\n },\n} as const satisfies Record<string, PersonaSource>;\n\nexport type PersonaVariant = keyof typeof PERSONA_SOURCES;\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { StatusBadge, type StatusTone } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { CheckCircle2, ChevronsUpDownIcon, Clock, PencilLine, type LucideIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useContext, useId, useMemo } from \"react\";\n\nimport { Shimmer } from \"./shimmer\";\n\n/**\n * The plan's decision status (#108). Additive: a `Plan` rendered with no\n * `status` behaves exactly as before (no ARIA region, no rail, no status\n * line) — every prop below this point is opt-in.\n */\nexport type PlanStatus = \"streaming\" | \"awaiting\" | \"approved\" | \"changes-requested\";\n\ninterface PlanContextValue {\n isStreaming: boolean;\n /** `undefined` when the plan is rendered via the legacy `isStreaming`-only API. */\n status?: PlanStatus;\n /** Wired to `PlanTitle` so the awaiting region can be labelled by it. */\n titleId?: string;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlan = () => {\n const context = useContext(PlanContext);\n if (!context) {\n throw new Error(\"Plan components must be used within Plan\");\n }\n return context;\n};\n\nexport type PlanProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n /**\n * The plan's decision status. Omit it to keep today's display-only\n * behaviour. When both `status` and `isStreaming` are given, `status`\n * wins (a `status=\"approved\"` plan never shimmers, even if `isStreaming`\n * is still `true`).\n */\n status?: PlanStatus;\n};\n\nexport const Plan = ({\n className,\n isStreaming = false,\n status,\n role,\n children,\n ...props\n}: PlanProps) => {\n const titleId = useId();\n const hasStatus = status !== undefined;\n const resolvedIsStreaming = hasStatus ? status === \"streaming\" : isStreaming;\n\n // A pending decision containing focusable controls is a labelled region,\n // NOT an assertive live region; a settled outcome is `role=\"alert\"` — the\n // same convention `Confirmation` already proves (packages/ai/src/confirmation.tsx:100-101).\n const isPending = status === \"awaiting\";\n const isSettled = status === \"approved\" || status === \"changes-requested\";\n const resolvedRole = hasStatus\n ? isPending\n ? \"group\"\n : isSettled\n ? \"alert\"\n : undefined\n : undefined;\n\n // Quiet structural rail per outcome — the outcome itself is always ALSO\n // carried in text + glyph via `PlanStatusLine` (WCAG 1.4.1), the rail is a\n // redundant, hue-independent cue on top of it.\n const railClass = !hasStatus\n ? undefined\n : status === \"approved\"\n ? \"border-s-4 border-s-success\"\n : status === \"changes-requested\"\n ? \"border-s-4 border-s-warning\"\n : isPending\n ? \"border-s-4 border-s-border-strong\"\n : undefined;\n\n const contextValue = useMemo<PlanContextValue>(\n () => ({\n isStreaming: resolvedIsStreaming,\n status: hasStatus ? status : undefined,\n titleId: hasStatus ? titleId : undefined,\n }),\n [resolvedIsStreaming, hasStatus, status, titleId],\n );\n\n return (\n <PlanContext.Provider value={contextValue}>\n <Collapsible asChild data-slot=\"plan\" {...props}>\n <Card\n role={role ?? resolvedRole}\n aria-labelledby={isPending ? titleId : undefined}\n className={cn(\"shadow-none\", railClass, className)}\n >\n {children}\n </Card>\n </Collapsible>\n </PlanContext.Provider>\n );\n};\n\nexport type PlanHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const PlanHeader = ({ className, ...props }: PlanHeaderProps) => (\n <CardHeader\n className={cn(\"flex items-start justify-between\", className)}\n data-slot=\"plan-header\"\n {...props}\n />\n);\n\nexport type PlanTitleProps = Omit<ComponentProps<typeof CardTitle>, \"children\"> & {\n children: string;\n};\n\nexport const PlanTitle = ({ id, children, ...props }: PlanTitleProps) => {\n const { isStreaming, titleId } = usePlan();\n\n return (\n <CardTitle id={id ?? titleId} data-slot=\"plan-title\" {...props}>\n {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n </CardTitle>\n );\n};\n\nexport type PlanDescriptionProps = Omit<ComponentProps<typeof CardDescription>, \"children\"> & {\n children: string;\n};\n\nexport const PlanDescription = ({ className, children, ...props }: PlanDescriptionProps) => {\n const { isStreaming } = usePlan();\n\n return (\n <CardDescription\n className={cn(\"text-balance\", className)}\n data-slot=\"plan-description\"\n {...props}\n >\n {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n </CardDescription>\n );\n};\n\nexport type PlanActionProps = ComponentProps<typeof CardAction>;\n\n/** The header's layout slot (e.g. a menu trigger) — unrelated to the decision actions below. */\nexport const PlanAction = (props: PlanActionProps) => (\n <CardAction data-slot=\"plan-action\" {...props} />\n);\n\nexport type PlanContentProps = ComponentProps<typeof CardContent>;\n\nexport const PlanContent = ({ className, ...props }: PlanContentProps) => (\n <CollapsibleContent asChild>\n <CardContent\n className={cn(\n \"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\",\n className,\n )}\n data-slot=\"plan-content\"\n {...props}\n />\n </CollapsibleContent>\n);\n\nexport type PlanFooterProps = ComponentProps<\"div\">;\n\nexport const PlanFooter = (props: PlanFooterProps) => (\n <CardFooter data-slot=\"plan-footer\" {...props} />\n);\n\nexport type PlanTriggerProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const PlanTrigger = ({ className, ...props }: PlanTriggerProps) => {\n const { t } = useLocale();\n return (\n <CollapsibleTrigger asChild>\n <Button\n className={cn(\"size-8\", className)}\n data-slot=\"plan-trigger\"\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n <ChevronsUpDownIcon className=\"size-4\" />\n <span className=\"sr-only\">{t(\"ai.plan.togglePlan\")}</span>\n </Button>\n </CollapsibleTrigger>\n );\n};\n\ntype PlanOutcomeStatus = Exclude<PlanStatus, \"streaming\">;\n\n/**\n * Default label/tone/glyph per non-streaming status (#108). Every entry is a\n * CALM tone (the `StatusBadge` out-of-vocabulary escape hatch, #363) — the\n * decision is carried in text + glyph, never by rail colour alone (WCAG 1.4.1).\n */\nconst PLAN_STATUS_CONTENT: Record<\n PlanOutcomeStatus,\n { label: string; tone: StatusTone; icon: LucideIcon }\n> = {\n awaiting: { label: \"Waiting on plan approval\", tone: \"warning\", icon: Clock },\n approved: { label: \"Approved\", tone: \"success\", icon: CheckCircle2 },\n \"changes-requested\": { label: \"Changes requested\", tone: \"warning\", icon: PencilLine },\n};\n\nexport type PlanStatusLineProps = Omit<ComponentProps<typeof StatusBadge>, \"status\"> & {\n children?: ReactNode;\n};\n\n/**\n * The decision status line (#108) — text + glyph, never rail colour alone.\n * Renders nothing while `status` is unset or `\"streaming\"` (nothing has been\n * decided yet); shows the outcome once the plan is awaiting a decision or\n * settled.\n */\nexport const PlanStatusLine = ({ className, children, ...props }: PlanStatusLineProps) => {\n const { status } = usePlan();\n\n if (!status || status === \"streaming\") {\n return null;\n }\n\n const { label, tone, icon } = PLAN_STATUS_CONTENT[status];\n\n return (\n <StatusBadge\n data-slot=\"plan-status-line\"\n className={cn(\"self-start\", className)}\n status={{ label, tone, icon }}\n {...props}\n >\n {children}\n </StatusBadge>\n );\n};\n\nexport type PlanDecisionActionProps = ComponentProps<typeof Button>;\n\n/**\n * Shared decision-button primitive. Renders only while `status === \"awaiting\"`\n * — mirrors the gating `ConfirmationActions` uses (packages/ai/src/confirmation.tsx)\n * — so a settled or still-streaming plan never shows stale controls.\n */\nconst PlanDecisionAction = ({ className, ...props }: PlanDecisionActionProps) => {\n const { status } = usePlan();\n\n if (status !== \"awaiting\") {\n return null;\n }\n\n return <Button className={cn(\"h-8 px-3 text-body\", className)} type=\"button\" {...props} />;\n};\n\nexport type PlanApproveProps = PlanDecisionActionProps;\n\n/**\n * The proceed action — presets the filled primary variant so the primary path\n * can't drift to a quieter variant (same reasoning as `ConfirmationApprove`).\n */\nexport const PlanApprove = (props: PlanApproveProps) => (\n <PlanDecisionAction data-slot=\"plan-approve\" variant=\"default\" {...props} />\n);\n\nexport type PlanRequestChangesProps = PlanDecisionActionProps;\n\n/** Sends the plan back for revision — a quieter, non-primary action. */\nexport const PlanRequestChanges = (props: PlanRequestChangesProps) => (\n <PlanDecisionAction data-slot=\"plan-request-changes\" variant=\"outline\" {...props} />\n);\n\nexport type PlanCommentProps = PlanDecisionActionProps;\n\n/** Leaves feedback without settling the decision — the quietest action. */\nexport const PlanComment = (props: PlanCommentProps) => (\n <PlanDecisionAction data-slot=\"plan-comment\" variant=\"ghost\" {...props} />\n);\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { ScrollArea } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronDownIcon, PaperclipIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nexport interface QueueMessagePart {\n type: string;\n text?: string;\n url?: string;\n filename?: string;\n mediaType?: string;\n}\n\nexport interface QueueMessage {\n id: string;\n parts: QueueMessagePart[];\n}\n\nexport interface QueueTodo {\n id: string;\n title: string;\n description?: string;\n status?: \"pending\" | \"completed\";\n}\n\nexport type QueueItemProps = ComponentProps<\"li\">;\n\nexport const QueueItem = ({ className, ...props }: QueueItemProps) => (\n <li\n className={cn(\n \"group flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors hover:bg-muted\",\n className,\n )}\n {...props}\n />\n);\n\nexport type QueueItemIndicatorProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemIndicator = ({\n completed = false,\n className,\n ...props\n}: QueueItemIndicatorProps) => (\n <span\n className={cn(\n \"mt-0.5 inline-block size-2.5 rounded-full border\",\n completed\n ? \"border-muted-foreground/20 bg-muted-foreground/10\"\n : \"border-muted-foreground/50\",\n className,\n )}\n {...props}\n />\n);\n\nexport type QueueItemContentProps = ComponentProps<\"span\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemContent = ({\n completed = false,\n className,\n ...props\n}: QueueItemContentProps) => (\n <span\n className={cn(\n \"line-clamp-1 grow break-words\",\n completed ? \"text-muted-foreground/50 line-through\" : \"text-muted-foreground\",\n className,\n )}\n {...props}\n />\n);\n\nexport type QueueItemDescriptionProps = ComponentProps<\"div\"> & {\n completed?: boolean;\n};\n\nexport const QueueItemDescription = ({\n completed = false,\n className,\n ...props\n}: QueueItemDescriptionProps) => (\n <div\n className={cn(\n \"ms-6 text-xs\",\n completed ? \"text-muted-foreground/40 line-through\" : \"text-muted-foreground\",\n className,\n )}\n {...props}\n />\n);\n\nexport type QueueItemActionsProps = ComponentProps<\"div\">;\n\nexport const QueueItemActions = ({ className, ...props }: QueueItemActionsProps) => (\n <div className={cn(\"flex gap-1\", className)} {...props} />\n);\n\nexport type QueueItemActionProps = Omit<ComponentProps<typeof Button>, \"variant\" | \"size\">;\n\nexport const QueueItemAction = ({ className, ...props }: QueueItemActionProps) => (\n <Button\n className={cn(\n \"size-auto rounded p-1 text-muted-foreground opacity-0 transition-opacity hover:bg-muted-foreground/10 hover:text-foreground group-hover:opacity-100\",\n className,\n )}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n />\n);\n\nexport type QueueItemAttachmentProps = ComponentProps<\"div\">;\n\nexport const QueueItemAttachment = ({ className, ...props }: QueueItemAttachmentProps) => (\n <div className={cn(\"mt-1 flex flex-wrap gap-2\", className)} {...props} />\n);\n\nexport type QueueItemImageProps = ComponentProps<\"img\">;\n\nexport const QueueItemImage = ({ className, ...props }: QueueItemImageProps) => (\n <img\n alt=\"\"\n className={cn(\"h-8 w-8 rounded border object-cover\", className)}\n height={32}\n width={32}\n {...props}\n />\n);\n\nexport type QueueItemFileProps = ComponentProps<\"span\">;\n\nexport const QueueItemFile = ({ children, className, ...props }: QueueItemFileProps) => (\n <span\n className={cn(\"flex items-center gap-1 rounded border bg-muted px-2 py-1 text-xs\", className)}\n {...props}\n >\n <PaperclipIcon size={12} />\n <span className=\"max-w-[100px] truncate\">{children}</span>\n </span>\n);\n\nexport type QueueListProps = ComponentProps<typeof ScrollArea>;\n\nexport const QueueList = ({ children, className, ...props }: QueueListProps) => (\n <ScrollArea className={cn(\"mt-2 -mb-1\", className)} {...props}>\n <div className=\"max-h-40 pe-4\">\n <ul>{children}</ul>\n </div>\n </ScrollArea>\n);\n\n// QueueSection - collapsible section container\nexport type QueueSectionProps = ComponentProps<typeof Collapsible>;\n\nexport const QueueSection = ({ className, defaultOpen = true, ...props }: QueueSectionProps) => (\n <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />\n);\n\n// QueueSectionTrigger - section header/trigger\nexport type QueueSectionTriggerProps = ComponentProps<\"button\">;\n\nexport const QueueSectionTrigger = ({\n children,\n className,\n ...props\n}: QueueSectionTriggerProps) => (\n <CollapsibleTrigger asChild>\n <button\n className={cn(\n \"group flex w-full items-center justify-between rounded-md bg-muted/40 px-3 py-2 text-start font-medium text-muted-foreground text-sm transition-colors hover:bg-muted\",\n className,\n )}\n type=\"button\"\n {...props}\n >\n {children}\n </button>\n </CollapsibleTrigger>\n);\n\n// QueueSectionLabel - label content with icon and count\nexport type QueueSectionLabelProps = ComponentProps<\"span\"> & {\n count?: number;\n label: string;\n icon?: React.ReactNode;\n};\n\nexport const QueueSectionLabel = ({\n count,\n label,\n icon,\n className,\n ...props\n}: QueueSectionLabelProps) => (\n <span className={cn(\"flex items-center gap-2\", className)} {...props}>\n <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=closed]:-rotate-90\" />\n {icon}\n <span>\n {count} {label}\n </span>\n </span>\n);\n\n// QueueSectionContent - collapsible content area\nexport type QueueSectionContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const QueueSectionContent = ({ className, ...props }: QueueSectionContentProps) => (\n <CollapsibleContent\n className={cn(\n \"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\",\n className,\n )}\n {...props}\n />\n);\n\nexport type QueueProps = ComponentProps<\"div\">;\n\nexport const Queue = ({ className, ...props }: QueueProps) => (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-xl border border-border bg-background px-3 pt-2 pb-2 shadow-xs\",\n className,\n )}\n {...props}\n />\n);\n","\"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-sm\">{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-sm 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-sm\", className)} {...props} />\n);\n","\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ninterface SchemaParameter {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n location?: \"path\" | \"query\" | \"header\";\n}\n\ninterface SchemaProperty {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n properties?: SchemaProperty[];\n items?: SchemaProperty;\n}\n\ninterface SchemaDisplayContextType {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n}\n\nconst SchemaDisplayContext = createContext<SchemaDisplayContextType>({\n method: \"GET\",\n path: \"\",\n});\n\nconst methodStyles: Record<HttpMethod, string> = {\n DELETE: \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400\",\n GET: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n PATCH: \"bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400\",\n POST: \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400\",\n PUT: \"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400\",\n};\n\nexport type SchemaDisplayHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayHeader = ({\n className,\n children,\n ...props\n}: SchemaDisplayHeaderProps) => (\n <div className={cn(\"flex items-center gap-3 border-b px-4 py-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayMethodProps = ComponentProps<typeof Badge>;\n\nexport const SchemaDisplayMethod = ({\n className,\n children,\n ...props\n}: SchemaDisplayMethodProps) => {\n const { method } = useContext(SchemaDisplayContext);\n\n return (\n <Badge\n className={cn(\"font-mono text-xs\", methodStyles[method], className)}\n variant=\"secondary\"\n {...props}\n >\n {children ?? method}\n </Badge>\n );\n};\n\nexport type SchemaDisplayPathProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const SchemaDisplayPath = ({ className, children, ...props }: SchemaDisplayPathProps) => {\n const { path } = useContext(SchemaDisplayContext);\n\n // Highlight path parameters\n const highlightedPath = path.replaceAll(\n /\\{([^}]+)\\}/g,\n '<span class=\"text-blue-600 dark:text-blue-400\">{$1}</span>',\n );\n\n return (\n <span\n className={cn(\"font-mono text-sm\", className)}\n // oxlint-disable-next-line eslint-plugin-react(no-danger)\n dangerouslySetInnerHTML={{ __html: children ?? highlightedPath }}\n {...props}\n />\n );\n};\n\nexport type SchemaDisplayDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const SchemaDisplayDescription = ({\n className,\n children,\n ...props\n}: SchemaDisplayDescriptionProps) => {\n const { description } = useContext(SchemaDisplayContext);\n\n return (\n <p className={cn(\"border-b px-4 py-3 text-muted-foreground text-sm\", className)} {...props}>\n {children ?? description}\n </p>\n );\n};\n\nexport type SchemaDisplayContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayContent = ({\n className,\n children,\n ...props\n}: SchemaDisplayContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayParameterProps = HTMLAttributes<HTMLDivElement> & SchemaParameter;\n\nexport const SchemaDisplayParameter = ({\n name,\n type,\n required,\n description,\n location,\n className,\n ...props\n}: SchemaDisplayParameterProps) => (\n <div className={cn(\"px-4 py-3 ps-10\", className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm\">{name}</span>\n <Badge className=\"text-xs\" variant=\"outline\">\n {type}\n </Badge>\n {location && (\n <Badge className=\"text-xs\" variant=\"secondary\">\n {location}\n </Badge>\n )}\n {required && (\n <Badge\n className=\"bg-red-100 text-red-700 text-xs dark:bg-red-900/30 dark:text-red-400\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 text-muted-foreground text-sm\">{description}</p>}\n </div>\n);\n\nexport type SchemaDisplayParametersProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayParameters = ({\n className,\n children,\n ...props\n}: SchemaDisplayParametersProps) => {\n const { parameters } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-sm\">{t(\"ai.schemaDisplay.parameters\")}</span>\n <Badge className=\"ms-auto text-xs\" variant=\"secondary\">\n {parameters?.length}\n </Badge>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {children ??\n parameters?.map((param) => <SchemaDisplayParameter key={param.name} {...param} />)}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayPropertyProps = HTMLAttributes<HTMLDivElement> &\n SchemaProperty & {\n depth?: number;\n };\n\nexport const SchemaDisplayProperty = ({\n name,\n type,\n required,\n description,\n properties,\n items,\n depth = 0,\n className,\n ...props\n}: SchemaDisplayPropertyProps) => {\n const hasChildren = properties || items;\n const paddingLeft = 40 + depth * 16;\n\n if (hasChildren) {\n return (\n <Collapsible defaultOpen={depth < 2}>\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n style={{ paddingLeft }}\n >\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-mono text-sm\">{name}</span>\n <Badge className=\"text-xs\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"bg-red-100 text-red-700 text-xs dark:bg-red-900/30 dark:text-red-400\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </CollapsibleTrigger>\n {description && (\n <p\n className=\"pb-2 text-muted-foreground text-sm\"\n style={{ paddingLeft: paddingLeft + 24 }}\n >\n {description}\n </p>\n )}\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {properties?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={depth + 1} />\n ))}\n {items && <SchemaDisplayProperty {...items} depth={depth + 1} name={`${name}[]`} />}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n }\n\n return (\n <div className={cn(\"py-3 pe-4\", className)} style={{ paddingLeft }} {...props}>\n <div className=\"flex items-center gap-2\">\n {/* Spacer for alignment */}\n <span className=\"size-4\" />\n <span className=\"font-mono text-sm\">{name}</span>\n <Badge className=\"text-xs\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"bg-red-100 text-red-700 text-xs dark:bg-red-900/30 dark:text-red-400\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 ps-6 text-muted-foreground text-sm\">{description}</p>}\n </div>\n );\n};\n\nexport type SchemaDisplayRequestProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayRequest = ({\n className,\n children,\n ...props\n}: SchemaDisplayRequestProps) => {\n const { requestBody } = useContext(SchemaDisplayContext);\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-sm\">Request Body</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n requestBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayResponseProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayResponse = ({\n className,\n children,\n ...props\n}: SchemaDisplayResponseProps) => {\n const { responseBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-sm\">{t(\"ai.schemaDisplay.response\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n responseBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayProps = HTMLAttributes<HTMLDivElement> & {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n};\n\nexport const SchemaDisplay = ({\n method,\n path,\n description,\n parameters,\n requestBody,\n responseBody,\n className,\n children,\n ...props\n}: SchemaDisplayProps) => {\n const contextValue = useMemo(\n () => ({\n description,\n method,\n parameters,\n path,\n requestBody,\n responseBody,\n }),\n [description, method, parameters, path, requestBody, responseBody],\n );\n\n return (\n <SchemaDisplayContext.Provider value={contextValue}>\n <div className={cn(\"overflow-hidden rounded-lg border bg-background\", className)} {...props}>\n {children ?? (\n <>\n <SchemaDisplayHeader>\n <div className=\"flex items-center gap-3\">\n <SchemaDisplayMethod />\n <SchemaDisplayPath />\n </div>\n </SchemaDisplayHeader>\n {description && <SchemaDisplayDescription />}\n <SchemaDisplayContent>\n {parameters && parameters.length > 0 && <SchemaDisplayParameters />}\n {requestBody && requestBody.length > 0 && <SchemaDisplayRequest />}\n {responseBody && responseBody.length > 0 && <SchemaDisplayResponse />}\n </SchemaDisplayContent>\n </>\n )}\n </div>\n </SchemaDisplayContext.Provider>\n );\n};\n\nexport type SchemaDisplayBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayBody = ({ className, children, ...props }: SchemaDisplayBodyProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayExampleProps = HTMLAttributes<HTMLPreElement>;\n\nexport const SchemaDisplayExample = ({\n className,\n children,\n ...props\n}: SchemaDisplayExampleProps) => (\n <pre\n className={cn(\"mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-sm\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n","\"use client\";\n\n/**\n * SelectionToolbar — a floating toolbar over selected transcript text.\n *\n * Wrap a transcript region; when the user selects text inside it, a small\n * toolbar floats above the selection with a single default action: Quote.\n * `onQuote(selectedText)` fires — the consumer prepends a `>`-prefixed\n * blockquote into the composer. Positioned with the `@elabs-ai/components-ui` Popover\n * primitives (a virtual anchor at the selection rect); dismisses when the\n * selection collapses. Presentational only.\n */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Quote } from \"lucide-react\";\nimport { Button, Popover, PopoverAnchor, PopoverContent } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\n/** A captured selection snapshot: the trimmed text + its viewport rect. */\nexport interface SelectionSnapshot {\n text: string;\n rect: { top: number; left: number; width: number; height: number };\n}\n\nfunction isEditableNode(node: Node | null): boolean {\n let el: Node | null = node;\n while (el) {\n if (el instanceof HTMLElement) {\n const tag = el.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\" || el.isContentEditable) return true;\n }\n el = el.parentNode;\n }\n return false;\n}\n\n/**\n * Read the current selection if it is a non-empty range fully inside\n * `container` (and not inside a form field / editor). Returns `null` otherwise.\n * Exported for testing + custom integrations.\n */\nexport function readSelectionWithin(container: HTMLElement | null): SelectionSnapshot | null {\n if (!container || typeof window === \"undefined\") return null;\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) return null;\n\n const text = selection.toString().trim();\n if (text.length === 0) return null;\n\n const { anchorNode, focusNode } = selection;\n if (!anchorNode || !focusNode) return null;\n if (!container.contains(anchorNode) || !container.contains(focusNode)) return null;\n if (isEditableNode(anchorNode)) return null;\n\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n if (rect.width <= 0 && rect.height <= 0) return null;\n\n return {\n text,\n rect: { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n };\n}\n\nexport interface SelectionToolbarProps extends HTMLAttributes<HTMLDivElement> {\n /** Called with the selected text when the user clicks Quote. */\n onQuote?: (selectedText: string) => void;\n /** Quote button label. @default \"Quote\" */\n quoteLabel?: string;\n /** Extra toolbar controls rendered after the Quote button. */\n actions?: ReactNode;\n /** Disable selection detection entirely. */\n disabled?: boolean;\n /** The transcript region to watch for selections. */\n children: ReactNode;\n}\n\n/**\n * Wraps a region and shows a floating Quote toolbar over selected text.\n * The wrapper renders inline (`display: contents` is avoided — it's a real\n * relative box) so the anchor + portal position correctly.\n */\nexport const SelectionToolbar = forwardRef<HTMLDivElement, SelectionToolbarProps>(\n function SelectionToolbar(\n { onQuote, quoteLabel = \"Quote\", actions, disabled = false, className, children, ...props },\n ref,\n ) {\n const { t } = useLocale();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [snapshot, setSnapshot] = useState<SelectionSnapshot | null>(null);\n const open = snapshot !== null;\n\n const setContainer = useCallback(\n (node: HTMLDivElement | null) => {\n containerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n const refresh = useCallback(() => {\n if (disabled) return;\n setSnapshot(readSelectionWithin(containerRef.current));\n }, [disabled]);\n\n const dismiss = useCallback(() => setSnapshot(null), []);\n\n // Open after the user finishes selecting; close when the selection collapses.\n useEffect(() => {\n if (disabled || typeof document === \"undefined\") return;\n const onSelectionChange = () => {\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || sel.toString().trim().length === 0) dismiss();\n };\n const onScroll = () => dismiss();\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") dismiss();\n };\n document.addEventListener(\"selectionchange\", onSelectionChange);\n window.addEventListener(\"scroll\", onScroll, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"selectionchange\", onSelectionChange);\n window.removeEventListener(\"scroll\", onScroll, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [disabled, dismiss]);\n\n const handleQuote = () => {\n if (snapshot) onQuote?.(snapshot.text);\n dismiss();\n };\n\n const rect = snapshot?.rect;\n\n return (\n <div\n ref={setContainer}\n className={cn(\"relative\", className)}\n onPointerUp={refresh}\n onKeyUp={refresh}\n {...props}\n >\n {children}\n\n <Popover open={open} onOpenChange={(next) => (next ? undefined : dismiss())}>\n {/* Virtual anchor positioned at the selection rect (viewport coords). */}\n <PopoverAnchor asChild>\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed\"\n style={\n rect\n ? { top: rect.top, left: rect.left, width: rect.width, height: rect.height }\n : { top: 0, left: 0, width: 0, height: 0 }\n }\n />\n </PopoverAnchor>\n <PopoverContent\n side=\"top\"\n align=\"center\"\n sideOffset={8}\n // On open, let focus move to the Quote button so the action is\n // keyboard-reachable (a11y: mouse-operable ⇒ keyboard-operable). The\n // captured snapshot text drives the quote, so a grayed selection is\n // fine. On close, DON'T return focus to the anchor (it's an\n // aria-hidden virtual span) — prevent that jump.\n onCloseAutoFocus={(e) => e.preventDefault()}\n className=\"flex w-auto items-center gap-1 p-1\"\n role=\"toolbar\"\n aria-label={t(\"ai.selectionToolbar.label\")}\n >\n <Button size=\"sm\" variant=\"ghost\" onClick={handleQuote}>\n <Quote aria-hidden=\"true\" className=\"size-4\" />\n {quoteLabel}\n </Button>\n {actions}\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n","\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { forwardRef } from \"react\";\nimport { Folder, Sparkles } from \"lucide-react\";\nimport { BrandLogo } from \"@elabs-ai/components-icons\";\nimport {\n Button,\n cn,\n Heading,\n Kbd,\n useLocale,\n type HeadingLevel,\n type SessionCapability,\n type SessionQuickAction,\n type SessionWhatsNewItem,\n} from \"@elabs-ai/components-ui\";\n\n// `SessionCapability`, `SessionWhatsNewItem` and `SessionQuickAction` moved\n// to `@elabs-ai/components-ui` (`lib/session-launch.ts`) — the terminal CLI\n// look-alike family's own session header (issue #117) reuses the same\n// vocabulary shape, and `@elabs-ai/components-ai`/\n// `@elabs-ai/components-terminal` are layer-2 DAG siblings that may not\n// import each other (T0; see\n// docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported\n// above; NOT re-exported from here — a consumer imports these from\n// `@elabs-ai/components-ui`.\n\nexport interface SessionHeaderProps extends ComponentProps<\"div\"> {\n /**\n * Session/agent name, e.g. \"Codex\". Anchors the card — every other section\n * is independently optional and renders nothing when omitted.\n */\n title?: string;\n /** Active model, e.g. \"gpt-5.1-codex\". */\n model?: string;\n /** Working directory / project path. Truncates instead of overflowing. */\n workspace?: string;\n /** Build/version string, e.g. \"v2.4.0\". */\n version?: string;\n /** What this session can reach. */\n capabilities?: SessionCapability[];\n /** Recent changes, shown as a short list. */\n whatsNew?: SessionWhatsNewItem[];\n /** Shortcut actions, rendered as real buttons with optional shortcut hints. */\n quickActions?: SessionQuickAction[];\n /**\n * Semantic heading level for `title`. Default `2` (a session header\n * typically sits above a `ChatGreeting`'s level-1 headline, or inside a\n * page that already owns its own `<h1>`).\n */\n level?: HeadingLevel;\n}\n\n/**\n * SessionHeader — the launch card for an empty agent session: model,\n * workspace, version, capabilities, what's new, and quick actions with\n * shortcut hints. Pair it above `ChatGreeting` (or inside `ChatShell`'s\n * `header` slot) for the standard first-run agent session state.\n *\n * Distinct from `ChatGreeting`, which is the centered display-scale greeting\n * for a general assistant chat — `SessionHeader` answers different questions\n * (what workspace am I in, what model, what can this thing reach, what\n * changed) that a greeting has no home for.\n *\n * **Every section is independently optional.** With only `title` supplied,\n * the card renders the identity row alone — no empty section scaffolding,\n * no stray separators.\n */\nexport const SessionHeader = forwardRef<HTMLDivElement, SessionHeaderProps>(function SessionHeader(\n {\n title,\n model,\n workspace,\n version,\n capabilities,\n whatsNew,\n quickActions,\n level = 2,\n className,\n ...props\n },\n ref,\n) {\n const { t } = useLocale();\n const hasMeta = model != null || version != null;\n const hasIdentity = title != null || hasMeta || workspace != null;\n const hasCapabilities = (capabilities?.length ?? 0) > 0;\n const hasWhatsNew = (whatsNew?.length ?? 0) > 0;\n const hasQuickActions = (quickActions?.length ?? 0) > 0;\n\n return (\n <div\n ref={ref}\n data-slot=\"session-header\"\n className={cn(\n \"min-w-0 rounded-xl border bg-card p-5 text-card-foreground shadow-xs\",\n className,\n )}\n {...props}\n >\n <div className=\"flex min-w-0 flex-col gap-4\">\n {hasIdentity ? (\n <div data-slot=\"session-header-identity\" className=\"flex min-w-0 flex-col gap-1\">\n {title != null ? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {/* Decorative — the visible Heading already carries the\n accessible name, so the mark is hidden from AT rather than\n announced a second time via BrandLogo's own `role=\"img\"`. */}\n <span aria-hidden=\"true\" className=\"shrink-0\">\n <BrandLogo variant=\"mark\" height={24} title={title} />\n </span>\n <Heading\n data-slot=\"session-header-title\"\n level={level}\n size=\"subtitle\"\n className=\"min-w-0 truncate\"\n >\n {title}\n </Heading>\n </div>\n ) : null}\n\n {hasMeta ? (\n <p\n data-slot=\"session-header-meta\"\n className=\"min-w-0 truncate text-meta text-muted-foreground\"\n >\n {model}\n {model != null && version != null ? \" · \" : null}\n {version}\n </p>\n ) : null}\n\n {workspace != null ? (\n <div\n data-slot=\"session-header-workspace\"\n className=\"flex min-w-0 items-center gap-1.5 text-body text-muted-foreground\"\n >\n <Folder aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{workspace}</span>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {hasCapabilities ? (\n <div data-slot=\"session-header-capabilities\" className=\"flex min-w-0 flex-col gap-2\">\n <p className=\"text-meta font-medium text-muted-foreground\">\n {t(\"ai.sessionHeader.capabilities\")}\n </p>\n <ul className=\"flex min-w-0 flex-col gap-2\">\n {capabilities?.map((capability) => (\n <li\n key={capability.label}\n data-slot=\"session-header-capability\"\n className=\"flex min-w-0 items-start gap-2\"\n >\n {capability.icon != null ? (\n <span\n aria-hidden=\"true\"\n className=\"mt-0.5 shrink-0 text-muted-foreground [&_svg]:size-4\"\n >\n {capability.icon}\n </span>\n ) : null}\n <div className=\"min-w-0\">\n <p className=\"min-w-0 truncate text-body text-foreground\">{capability.label}</p>\n {capability.description != null ? (\n <p className=\"min-w-0 truncate text-meta text-muted-foreground\">\n {capability.description}\n </p>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {hasWhatsNew ? (\n <div data-slot=\"session-header-whats-new\" className=\"flex min-w-0 flex-col gap-2\">\n <p className=\"flex items-center gap-1.5 text-meta font-medium text-muted-foreground\">\n <Sparkles aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n {t(\"ai.sessionHeader.whatsNew\")}\n </p>\n <ul className=\"flex min-w-0 flex-col gap-1\">\n {whatsNew?.map((item) => (\n <li\n key={item.label}\n data-slot=\"session-header-whats-new-item\"\n className=\"min-w-0 truncate text-body\"\n >\n {item.href != null ? (\n <a\n href={item.href}\n className=\"text-primary-text underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n {item.label}\n </a>\n ) : (\n <span className=\"text-foreground\">{item.label}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {hasQuickActions ? (\n <div\n data-slot=\"session-header-quick-actions\"\n role=\"group\"\n aria-label={t(\"ai.sessionHeader.quickActions\")}\n className=\"flex min-w-0 flex-wrap gap-2\"\n >\n {quickActions?.map((action) => (\n <Button\n key={action.label}\n type=\"button\"\n data-slot=\"session-header-quick-action\"\n variant=\"outline\"\n size=\"sm\"\n onClick={action.onSelect}\n >\n <span>{action.label}</span>\n {/* An explicit space text node (not just flex `gap-2`) keeps\n \"New chat\"/\"⌘N\" apart in the button's computed accessible\n name, not only its visual layout. */}\n {action.keyHint != null ? (\n <>\n {\" \"}\n <Kbd>{action.keyHint}</Kbd>\n </>\n ) : null}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n );\n});\n","\"use client\";\n\nimport { cn, useLocale } from \"@elabs-ai/components-ui\";\nimport { Cpu, Folder, GitBranch, Loader2Icon, PlugZapIcon } from \"lucide-react\";\nimport type { ComponentProps, ComponentType, ReactNode, SVGProps } from \"react\";\nimport { forwardRef } from \"react\";\n\nexport interface SessionStatusBarConnections {\n /** Number of integrations/MCP servers currently connected. */\n connected: number;\n /** Total number of configured integrations/MCP servers. */\n total: number;\n /** Renders a spinner in place of the connection icon while establishing. */\n connecting?: boolean;\n}\n\nexport interface SessionStatusBarProps extends ComponentProps<\"div\"> {\n /** Current workspace/project name. */\n workspace?: string;\n /** Current git branch. */\n branch?: string;\n /** Active model id/label. */\n model?: string;\n /** Integration/MCP connection progress; renders a spinner while connecting. */\n connections?: SessionStatusBarConnections;\n /**\n * Docks another component alongside the ambient segments — most often\n * `<TokenUsage />` (`@elabs-ai/components-ai`), so token usage/cost keeps\n * its one owner (`token-usage.tsx`, tokenlens) instead of being re-implemented\n * here. Rendered flush to the end of the bar.\n */\n children?: ReactNode;\n}\n\ntype SegmentIcon = ComponentType<SVGProps<SVGSVGElement>>;\n\nconst SessionStatusBarSegment = ({\n icon: Icon,\n slot,\n value,\n}: {\n icon: SegmentIcon;\n slot: string;\n value: string;\n}) => (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\" data-slot={slot}>\n <Icon aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{value}</span>\n </span>\n);\n\n/**\n * SessionStatusBar — the ambient session row: workspace, branch, model, and\n * integration-connection progress (#105). Every segment is independently\n * optional and renders only when its prop is supplied; with nothing supplied\n * the bar renders nothing at all, not an empty shell.\n *\n * Docks `Context` (or any other node) via `children` rather than\n * re-implementing token-usage/cost maths — `context.tsx` stays the one owner\n * of that calculation (tokenlens).\n */\nexport const SessionStatusBar = forwardRef<HTMLDivElement, SessionStatusBarProps>(\n function SessionStatusBar(\n { workspace, branch, model, connections, children, className, ...props },\n ref,\n ) {\n const { formatNumber, t } = useLocale();\n const hasContent = Boolean(workspace ?? branch ?? model ?? connections ?? children);\n\n if (!hasContent) {\n return null;\n }\n\n // Computed once and reused for BOTH the connections region's name (for a\n // user who navigates to it deliberately) and its real, non-hidden text\n // content — what a polite announcement actually reads on change. An\n // aria-label alone is NOT that (#155): a live region announces its\n // content, not its own accessible name.\n const connectionsAnnouncement = connections\n ? connections.connecting\n ? t(\"ai.sessionStatusBar.connecting\")\n : t(\"ai.sessionStatusBar.connections\", {\n connected: connections.connected,\n total: connections.total,\n })\n : undefined;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex w-full items-center gap-4 border-t bg-surface-muted px-3 py-1.5 text-meta text-muted-foreground\",\n className,\n )}\n data-slot=\"session-status-bar\"\n {...props}\n >\n {workspace ? (\n <SessionStatusBarSegment\n icon={Folder}\n slot=\"session-status-bar-workspace\"\n value={workspace}\n />\n ) : null}\n {branch ? (\n <SessionStatusBarSegment\n icon={GitBranch}\n slot=\"session-status-bar-branch\"\n value={branch}\n />\n ) : null}\n {model ? (\n <SessionStatusBarSegment icon={Cpu} slot=\"session-status-bar-model\" value={model} />\n ) : null}\n {connections ? (\n <span\n aria-live=\"polite\"\n className=\"inline-flex shrink-0 items-center gap-1.5\"\n data-slot=\"session-status-bar-connections\"\n role=\"status\"\n >\n {connections.connecting ? (\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin motion-reduce:animate-none\"\n />\n ) : (\n <PlugZapIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n )}\n <span aria-hidden=\"true\" className=\"tabular-nums\">\n {formatNumber(connections.connected)}/{formatNumber(connections.total)}\n </span>\n {/* The live region's only NON-hidden text — mirrors\n terminal-status-bar.tsx's aria-hidden-visual +\n sr-only-sentence pair (#155). Without this, every polite\n update announced an empty string: the counter above is\n aria-hidden, so it was the region's ONLY text content.\n Deliberately no `aria-label` here (unlike\n terminal-status-bar.tsx, where the label lives on the OUTER\n bar as a generic region name distinct from any segment's\n content): an explicit `aria-label` here would give this\n span an ACCESSIBLE NAME byte-identical to its announced\n CONTENT, which risks a double announcement (\"Connecting…\n Connecting…\") on ATs that speak a live region's name\n alongside its changed content. Leaving `aria-label` off\n does NOT relocate the name to this text — `role=\"status\"`\n is `nameFrom: author`, so it never falls back to content\n the way e.g. a `button` does. The span simply has no\n accessible name, which is fine: no acceptance criterion\n needs one here, only the announced content does. */}\n <span className=\"sr-only\">{connectionsAnnouncement}</span>\n </span>\n ) : null}\n {children ? (\n <div\n className=\"ms-auto flex shrink-0 items-center\"\n data-slot=\"session-status-bar-context\"\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n },\n);\n","\"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 { useLocale } from \"@elabs-ai/components-ui\";\nimport { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} 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 = 2000,\n children,\n className,\n ...props\n}: SnippetCopyButtonProps) => {\n const { t } = useLocale();\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { code } = useContext(SnippetContext);\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n if (!isCopied) {\n await navigator.clipboard.writeText(code);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n }\n } catch (error) {\n onError?.(error as Error);\n }\n }, [code, onCopy, onError, timeout, isCopied]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n [],\n );\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","\"use client\";\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n <Collapsible className={cn(\"not-prose mb-4 text-success-text text-meta\", className)} {...props} />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n count: number;\n};\n\nexport const SourcesTrigger = ({ className, count, children, ...props }: SourcesTriggerProps) => (\n <CollapsibleTrigger className={cn(\"group flex items-center gap-2\", className)} {...props}>\n {children ?? (\n <>\n <p className=\"font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"h-4 w-4 transition-transform group-data-[state=open]:rotate-180\" />\n </>\n )}\n </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({ className, ...props }: SourcesContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-3 flex w-fit flex-col gap-2\",\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);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, className, ...props }: SourceProps) => (\n <a\n className={cn(\"flex items-center gap-2\", className)}\n href={href}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n {...props}\n >\n {children ?? (\n <>\n <BookIcon className=\"h-4 w-4\" />\n <span className=\"block text-caption font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n\nexport interface SourceListItem {\n href: string;\n title?: string;\n}\n\nexport type SourceListProps = Omit<ComponentProps<typeof Sources>, \"children\"> & {\n /** The grounding sources, rendered as the named list. */\n sources: SourceListItem[];\n /** Extra rows appended after the named list (escape hatch). */\n children?: ReactNode;\n};\n\n/**\n * SourceList — the per-answer grounding footer (research 11 §B.4): a green\n * \"Grounded in N sources\" header + the named source list. Sugar over the fixed\n * `Sources`/`Source` primitives, reused by the context panel (research 09).\n */\nexport const SourceList = ({ sources, children, ...props }: SourceListProps) => (\n <Sources {...props}>\n <SourcesTrigger count={sources.length}>\n <p className=\"font-medium\">\n Grounded in {sources.length} {sources.length === 1 ? \"source\" : \"sources\"}\n </p>\n <ChevronDownIcon className=\"h-4 w-4 transition-transform group-data-[state=open]:rotate-180\" />\n </SourcesTrigger>\n <SourcesContent>\n {sources.map((source) => (\n <Source href={source.href} key={source.href} title={source.title} />\n ))}\n {children}\n </SourcesContent>\n </Sources>\n);\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Spinner } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { MicIcon, SquareIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onstart: ((this: SpeechRecognition, ev: Event) => void) | null;\n onend: ((this: SpeechRecognition, ev: Event) => void) | null;\n onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => void) | null;\n onerror: ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => void) | null;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n resultIndex: number;\n}\n\ninterface SpeechRecognitionResultList {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n readonly length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition: new () => SpeechRecognition;\n webkitSpeechRecognition: new () => SpeechRecognition;\n }\n}\n\ntype SpeechInputMode = \"speech-recognition\" | \"media-recorder\" | \"none\";\n\nexport type SpeechInputProps = ComponentProps<typeof Button> & {\n onTranscriptionChange?: (text: string) => void;\n /**\n * Callback for when audio is recorded using MediaRecorder fallback.\n * This is called in browsers that don't support the Web Speech API (Firefox, Safari).\n * The callback receives an audio Blob that should be sent to a transcription service.\n * Return the transcribed text, which will be passed to onTranscriptionChange.\n */\n onAudioRecorded?: (audioBlob: Blob) => Promise<string>;\n lang?: string;\n};\n\nconst detectSpeechInputMode = (): SpeechInputMode => {\n if (typeof window === \"undefined\") {\n return \"none\";\n }\n\n if (\"SpeechRecognition\" in window || \"webkitSpeechRecognition\" in window) {\n return \"speech-recognition\";\n }\n\n if (\"MediaRecorder\" in window && \"mediaDevices\" in navigator) {\n return \"media-recorder\";\n }\n\n return \"none\";\n};\n\nexport const SpeechInput = ({\n className,\n onTranscriptionChange,\n onAudioRecorded,\n lang = \"en-US\",\n ...props\n}: SpeechInputProps) => {\n const [isListening, setIsListening] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [mode] = useState<SpeechInputMode>(detectSpeechInputMode);\n const [isRecognitionReady, setIsRecognitionReady] = useState(false);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const audioChunksRef = useRef<Blob[]>([]);\n const onTranscriptionChangeRef =\n useRef<SpeechInputProps[\"onTranscriptionChange\"]>(onTranscriptionChange);\n const onAudioRecordedRef = useRef<SpeechInputProps[\"onAudioRecorded\"]>(onAudioRecorded);\n\n // Keep refs in sync\n onTranscriptionChangeRef.current = onTranscriptionChange;\n onAudioRecordedRef.current = onAudioRecorded;\n\n // Initialize Speech Recognition when mode is speech-recognition\n useEffect(() => {\n if (mode !== \"speech-recognition\") {\n return;\n }\n\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n const speechRecognition = new SpeechRecognition();\n\n speechRecognition.continuous = true;\n speechRecognition.interimResults = true;\n speechRecognition.lang = lang;\n\n const handleStart = () => {\n setIsListening(true);\n };\n\n const handleEnd = () => {\n setIsListening(false);\n };\n\n const handleResult = (event: Event) => {\n const speechEvent = event as SpeechRecognitionEvent;\n let finalTranscript = \"\";\n\n for (let i = speechEvent.resultIndex; i < speechEvent.results.length; i += 1) {\n const result = speechEvent.results[i];\n if (result?.isFinal) {\n finalTranscript += result[0]?.transcript ?? \"\";\n }\n }\n\n if (finalTranscript) {\n onTranscriptionChangeRef.current?.(finalTranscript);\n }\n };\n\n const handleError = () => {\n setIsListening(false);\n };\n\n speechRecognition.addEventListener(\"start\", handleStart);\n speechRecognition.addEventListener(\"end\", handleEnd);\n speechRecognition.addEventListener(\"result\", handleResult);\n speechRecognition.addEventListener(\"error\", handleError);\n\n recognitionRef.current = speechRecognition;\n setIsRecognitionReady(true);\n\n return () => {\n speechRecognition.removeEventListener(\"start\", handleStart);\n speechRecognition.removeEventListener(\"end\", handleEnd);\n speechRecognition.removeEventListener(\"result\", handleResult);\n speechRecognition.removeEventListener(\"error\", handleError);\n speechRecognition.stop();\n recognitionRef.current = null;\n setIsRecognitionReady(false);\n };\n }, [mode, lang]);\n\n // Cleanup MediaRecorder and stream on unmount\n useEffect(\n () => () => {\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.stop();\n }\n if (streamRef.current) {\n for (const track of streamRef.current.getTracks()) {\n track.stop();\n }\n }\n },\n [],\n );\n\n // Start MediaRecorder recording\n const startMediaRecorder = useCallback(async () => {\n if (!onAudioRecordedRef.current) {\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n streamRef.current = stream;\n const mediaRecorder = new MediaRecorder(stream);\n audioChunksRef.current = [];\n\n const handleDataAvailable = (event: BlobEvent) => {\n if (event.data.size > 0) {\n audioChunksRef.current.push(event.data);\n }\n };\n\n const handleStop = async () => {\n for (const track of stream.getTracks()) {\n track.stop();\n }\n streamRef.current = null;\n\n const audioBlob = new Blob(audioChunksRef.current, {\n type: \"audio/webm\",\n });\n\n if (audioBlob.size > 0 && onAudioRecordedRef.current) {\n setIsProcessing(true);\n try {\n const transcript = await onAudioRecordedRef.current(audioBlob);\n if (transcript) {\n onTranscriptionChangeRef.current?.(transcript);\n }\n } catch {\n // Error handling delegated to the onAudioRecorded caller\n } finally {\n setIsProcessing(false);\n }\n }\n };\n\n const handleError = () => {\n setIsListening(false);\n for (const track of stream.getTracks()) {\n track.stop();\n }\n streamRef.current = null;\n };\n\n mediaRecorder.addEventListener(\"dataavailable\", handleDataAvailable);\n mediaRecorder.addEventListener(\"stop\", handleStop);\n mediaRecorder.addEventListener(\"error\", handleError);\n\n mediaRecorderRef.current = mediaRecorder;\n mediaRecorder.start();\n setIsListening(true);\n } catch {\n setIsListening(false);\n }\n }, []);\n\n // Stop MediaRecorder recording\n const stopMediaRecorder = useCallback(() => {\n if (mediaRecorderRef.current?.state === \"recording\") {\n mediaRecorderRef.current.stop();\n }\n setIsListening(false);\n }, []);\n\n const toggleListening = useCallback(() => {\n if (mode === \"speech-recognition\" && recognitionRef.current) {\n if (isListening) {\n recognitionRef.current.stop();\n } else {\n recognitionRef.current.start();\n }\n } else if (mode === \"media-recorder\") {\n if (isListening) {\n stopMediaRecorder();\n } else {\n startMediaRecorder();\n }\n }\n }, [mode, isListening, startMediaRecorder, stopMediaRecorder]);\n\n // Determine if button should be disabled\n const isDisabled =\n mode === \"none\" ||\n (mode === \"speech-recognition\" && !isRecognitionReady) ||\n (mode === \"media-recorder\" && !onAudioRecorded) ||\n isProcessing;\n\n return (\n <div className=\"relative inline-flex items-center justify-center\">\n {/* Animated pulse rings */}\n {isListening &&\n [0, 1, 2].map((index) => (\n <div\n className=\"absolute inset-0 animate-ping rounded-full border-2 border-red-400/30\"\n key={index}\n style={{\n animationDelay: `${index * 0.3}s`,\n animationDuration: \"2s\",\n }}\n />\n ))}\n\n {/* Main record button */}\n <Button\n className={cn(\n \"relative z-10 rounded-full transition-colors duration-slow ease-standard motion-reduce:transition-none\",\n isListening\n ? \"bg-destructive text-white hover:bg-destructive/80 hover:text-white\"\n : \"bg-primary text-primary-foreground hover:bg-primary/80 hover:text-primary-foreground\",\n className,\n )}\n disabled={isDisabled}\n onClick={toggleListening}\n {...props}\n >\n {isProcessing && <Spinner />}\n {!isProcessing && isListening && <SquareIcon className=\"size-4\" />}\n {!(isProcessing || isListening) && <MicIcon className=\"size-4\" />}\n </Button>\n </div>\n );\n};\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { AlertTriangleIcon, CheckIcon, ChevronDownIcon, CopyIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\n// Regex patterns for parsing stack traces\nconst STACK_FRAME_WITH_PARENS_REGEX = /^at\\s+(.+?)\\s+\\((.+):(\\d+):(\\d+)\\)$/;\nconst STACK_FRAME_WITHOUT_FN_REGEX = /^at\\s+(.+):(\\d+):(\\d+)$/;\nconst ERROR_TYPE_REGEX = /^(\\w+Error|Error):\\s*(.*)$/;\nconst AT_PREFIX_REGEX = /^at\\s+/;\n\ninterface StackFrame {\n raw: string;\n functionName: string | null;\n filePath: string | null;\n lineNumber: number | null;\n columnNumber: number | null;\n isInternal: boolean;\n}\n\ninterface ParsedStackTrace {\n errorType: string | null;\n errorMessage: string;\n frames: StackFrame[];\n raw: string;\n}\n\ninterface StackTraceContextValue {\n trace: ParsedStackTrace;\n raw: string;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n onFilePathClick?: (filePath: string, line?: number, column?: number) => void;\n}\n\nconst StackTraceContext = createContext<StackTraceContextValue | null>(null);\n\nconst useStackTrace = () => {\n const context = useContext(StackTraceContext);\n if (!context) {\n throw new Error(\"StackTrace components must be used within StackTrace\");\n }\n return context;\n};\n\nconst parseStackFrame = (line: string): StackFrame => {\n const trimmed = line.trim();\n\n // Pattern: at functionName (filePath:line:column)\n const withParensMatch = trimmed.match(STACK_FRAME_WITH_PARENS_REGEX);\n if (withParensMatch) {\n const [, functionName, filePath, lineNum, colNum] = withParensMatch;\n const isInternal =\n (filePath?.includes(\"node_modules\") ?? false) ||\n (filePath?.startsWith(\"node:\") ?? false) ||\n (filePath?.includes(\"internal/\") ?? false);\n return {\n columnNumber: colNum ? Number.parseInt(colNum, 10) : null,\n filePath: filePath ?? null,\n functionName: functionName ?? null,\n isInternal,\n lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,\n raw: trimmed,\n };\n }\n\n // Pattern: at filePath:line:column (no function name)\n const withoutFnMatch = trimmed.match(STACK_FRAME_WITHOUT_FN_REGEX);\n if (withoutFnMatch) {\n const [, filePath, lineNum, colNum] = withoutFnMatch;\n const isInternal =\n (filePath?.includes(\"node_modules\") ?? false) ||\n (filePath?.startsWith(\"node:\") ?? false) ||\n (filePath?.includes(\"internal/\") ?? false);\n return {\n columnNumber: colNum ? Number.parseInt(colNum, 10) : null,\n filePath: filePath ?? null,\n functionName: null,\n isInternal,\n lineNumber: lineNum ? Number.parseInt(lineNum, 10) : null,\n raw: trimmed,\n };\n }\n\n // Fallback: unparseable line\n return {\n columnNumber: null,\n filePath: null,\n functionName: null,\n isInternal: trimmed.includes(\"node_modules\") || trimmed.includes(\"node:\"),\n lineNumber: null,\n raw: trimmed,\n };\n};\n\nconst parseStackTrace = (trace: string): ParsedStackTrace => {\n const lines = trace.split(\"\\n\").filter((line) => line.trim());\n\n if (lines.length === 0) {\n return {\n errorMessage: trace,\n errorType: null,\n frames: [],\n raw: trace,\n };\n }\n\n const firstLine = lines[0]?.trim() ?? \"\";\n let errorType: string | null = null;\n let errorMessage = firstLine;\n\n // Try to extract error type from \"ErrorType: message\" format\n const errorMatch = firstLine.match(ERROR_TYPE_REGEX);\n if (errorMatch) {\n const [, type, msg] = errorMatch;\n errorType = type ?? null;\n errorMessage = msg || \"\";\n }\n\n // Parse stack frames (lines starting with \"at\")\n const frames = lines\n .slice(1)\n .filter((line) => line.trim().startsWith(\"at \"))\n .map(parseStackFrame);\n\n return {\n errorMessage,\n errorType,\n frames,\n raw: trace,\n };\n};\n\nexport type StackTraceProps = ComponentProps<\"div\"> & {\n trace: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onFilePathClick?: (filePath: string, line?: number, column?: number) => void;\n};\n\nexport const StackTrace = memo(\n ({\n trace,\n className,\n open,\n defaultOpen = false,\n onOpenChange,\n onFilePathClick,\n children,\n ...props\n }: StackTraceProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n prop: open,\n });\n\n const parsedTrace = useMemo(() => parseStackTrace(trace), [trace]);\n\n const contextValue = useMemo(\n () => ({\n isOpen,\n onFilePathClick,\n raw: trace,\n setIsOpen,\n trace: parsedTrace,\n }),\n [parsedTrace, trace, isOpen, setIsOpen, onFilePathClick],\n );\n\n return (\n <StackTraceContext.Provider value={contextValue}>\n <div\n className={cn(\n \"not-prose w-full overflow-hidden rounded-lg border bg-background font-mono text-sm\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </StackTraceContext.Provider>\n );\n },\n);\n\nexport type StackTraceHeaderProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const StackTraceHeader = memo(({ className, children, ...props }: StackTraceHeaderProps) => {\n const { isOpen, setIsOpen } = useStackTrace();\n\n return (\n <Collapsible onOpenChange={setIsOpen} open={isOpen}>\n <CollapsibleTrigger asChild {...props}>\n <div\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 p-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n >\n {children}\n </div>\n </CollapsibleTrigger>\n </Collapsible>\n );\n});\n\nexport type StackTraceErrorProps = ComponentProps<\"div\">;\n\nexport const StackTraceError = memo(({ className, children, ...props }: StackTraceErrorProps) => (\n <div className={cn(\"flex flex-1 items-center gap-2 overflow-hidden\", className)} {...props}>\n <AlertTriangleIcon className=\"size-4 shrink-0 text-destructive\" />\n {children}\n </div>\n));\n\nexport type StackTraceErrorTypeProps = ComponentProps<\"span\">;\n\nexport const StackTraceErrorType = memo(\n ({ className, children, ...props }: StackTraceErrorTypeProps) => {\n const { trace } = useStackTrace();\n\n return (\n // #124: the error type NAME is running text (e.g. \"TypeError\"), not a\n // mark — ink rung, unlike the AlertTriangleIcon mark above.\n <span className={cn(\"shrink-0 font-semibold text-destructive-text\", className)} {...props}>\n {children ?? trace.errorType}\n </span>\n );\n },\n);\n\nexport type StackTraceErrorMessageProps = ComponentProps<\"span\">;\n\nexport const StackTraceErrorMessage = memo(\n ({ className, children, ...props }: StackTraceErrorMessageProps) => {\n const { trace } = useStackTrace();\n\n return (\n <span className={cn(\"truncate text-foreground\", className)} {...props}>\n {children ?? trace.errorMessage}\n </span>\n );\n },\n);\n\nexport type StackTraceActionsProps = ComponentProps<\"div\">;\n\nconst handleActionsClick = (e: React.MouseEvent) => e.stopPropagation();\nconst handleActionsKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.stopPropagation();\n }\n};\n\nexport const StackTraceActions = memo(\n ({ className, children, ...props }: StackTraceActionsProps) => (\n <div\n className={cn(\"flex shrink-0 items-center gap-1\", className)}\n onClick={handleActionsClick}\n onKeyDown={handleActionsKeyDown}\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n ),\n);\n\nexport type StackTraceCopyButtonProps = ComponentProps<typeof Button> & {\n onCopy?: () => void;\n onError?: (error: Error) => void;\n timeout?: number;\n};\n\nexport const StackTraceCopyButton = memo(\n ({\n onCopy,\n onError,\n timeout = 2000,\n className,\n children,\n ...props\n }: StackTraceCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n const timeoutRef = useRef<number>(0);\n const { raw } = useStackTrace();\n\n const copyToClipboard = useCallback(async () => {\n if (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) {\n onError?.(new Error(\"Clipboard API not available\"));\n return;\n }\n\n try {\n await navigator.clipboard.writeText(raw);\n setIsCopied(true);\n onCopy?.();\n timeoutRef.current = window.setTimeout(() => setIsCopied(false), timeout);\n } catch (error) {\n onError?.(error as Error);\n }\n }, [raw, onCopy, onError, timeout]);\n\n useEffect(\n () => () => {\n window.clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n className={cn(\"size-7\", className)}\n onClick={copyToClipboard}\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <Icon size={14} />}\n </Button>\n );\n },\n);\n\nexport type StackTraceExpandButtonProps = ComponentProps<\"div\">;\n\nexport const StackTraceExpandButton = memo(\n ({ className, ...props }: StackTraceExpandButtonProps) => {\n const { isOpen } = useStackTrace();\n\n return (\n <div className={cn(\"flex size-7 items-center justify-center\", className)} {...props}>\n <ChevronDownIcon\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n isOpen ? \"rotate-180\" : \"rotate-0\",\n )}\n />\n </div>\n );\n },\n);\n\nexport type StackTraceContentProps = ComponentProps<typeof CollapsibleContent> & {\n maxHeight?: number;\n};\n\nexport const StackTraceContent = memo(\n ({ className, maxHeight = 400, children, ...props }: StackTraceContentProps) => {\n const { isOpen } = useStackTrace();\n\n return (\n <Collapsible open={isOpen}>\n <CollapsibleContent\n className={cn(\n \"overflow-auto border-t bg-muted/30\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className,\n )}\n style={{ maxHeight }}\n {...props}\n >\n {children}\n </CollapsibleContent>\n </Collapsible>\n );\n },\n);\n\nexport type StackTraceFramesProps = ComponentProps<\"div\"> & {\n showInternalFrames?: boolean;\n};\n\ninterface FilePathButtonProps {\n frame: StackFrame;\n onFilePathClick?: (filePath: string, lineNumber?: number, columnNumber?: number) => void;\n}\n\nconst FilePathButton = memo(({ frame, onFilePathClick }: FilePathButtonProps) => {\n const handleClick = useCallback(() => {\n if (frame.filePath) {\n onFilePathClick?.(\n frame.filePath,\n frame.lineNumber ?? undefined,\n frame.columnNumber ?? undefined,\n );\n }\n }, [frame, onFilePathClick]);\n\n return (\n <button\n className={cn(\n // #399 — a frame link is body text; the hover ink takes the `-text` rung.\n \"underline decoration-dotted hover:text-primary-text\",\n onFilePathClick && \"cursor-pointer\",\n )}\n disabled={!onFilePathClick}\n onClick={handleClick}\n type=\"button\"\n >\n {frame.filePath}\n {frame.lineNumber !== null && `:${frame.lineNumber}`}\n {frame.columnNumber !== null && `:${frame.columnNumber}`}\n </button>\n );\n});\n\nFilePathButton.displayName = \"FilePathButton\";\n\nexport const StackTraceFrames = memo(\n ({ className, showInternalFrames = true, ...props }: StackTraceFramesProps) => {\n const { trace, onFilePathClick } = useStackTrace();\n const { t } = useLocale();\n\n const framesToShow = showInternalFrames\n ? trace.frames\n : trace.frames.filter((f) => !f.isInternal);\n\n return (\n <div className={cn(\"space-y-1 p-3\", className)} {...props}>\n {framesToShow.map((frame) => (\n <div\n className={cn(\n \"text-xs\",\n frame.isInternal ? \"text-muted-foreground/50\" : \"text-foreground/90\",\n )}\n key={frame.raw}\n >\n <span className=\"text-muted-foreground\">at </span>\n {frame.functionName && (\n <span className={frame.isInternal ? \"\" : \"text-foreground\"}>\n {frame.functionName}{\" \"}\n </span>\n )}\n {frame.filePath && (\n <>\n <span className=\"text-muted-foreground\">(</span>\n <FilePathButton frame={frame} onFilePathClick={onFilePathClick} />\n <span className=\"text-muted-foreground\">)</span>\n </>\n )}\n {!(frame.filePath || frame.functionName) && (\n <span>{frame.raw.replace(AT_PREFIX_REGEX, \"\")}</span>\n )}\n </div>\n ))}\n {framesToShow.length === 0 && (\n <div className=\"text-muted-foreground text-xs\">{t(\"ai.stackTrace.empty\")}</div>\n )}\n </div>\n );\n },\n);\n\nStackTrace.displayName = \"StackTrace\";\nStackTraceHeader.displayName = \"StackTraceHeader\";\nStackTraceError.displayName = \"StackTraceError\";\nStackTraceErrorType.displayName = \"StackTraceErrorType\";\nStackTraceErrorMessage.displayName = \"StackTraceErrorMessage\";\nStackTraceActions.displayName = \"StackTraceActions\";\nStackTraceCopyButton.displayName = \"StackTraceCopyButton\";\nStackTraceExpandButton.displayName = \"StackTraceExpandButton\";\nStackTraceContent.displayName = \"StackTraceContent\";\nStackTraceFrames.displayName = \"StackTraceFrames\";\n","\"use client\";\n\n/**\n * Task — a collapsed \"what got done\" run summary (#192, research 10 §B.6).\n *\n * The body rides the canonical execution-trace rail (`AgentTimeline` /\n * `AgentStep`, research 10 §B.3) instead of the pre-#192 hand-rolled\n * `border-s-2` content rail. Collapsed by default — in a settled transcript\n * only the focal surfaces (the produced artifact + the final answer) stay\n * open, not every trace.\n */\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\n\nimport { AgentStep, AgentTimeline, type AgentStepProps } from \"./agent-timeline\";\n\nexport type TaskItemFileProps = ComponentProps<\"span\">;\n\n/**\n * A quiet inline file chip. Unbordered since #192 (the fill is the gesture;\n * a border on a filled chip is the redundant-border anti-pattern). For a\n * navigable list of produced files, prefer the asset-tree idiom (research 09).\n */\nexport const TaskItemFile = ({ children, className, ...props }: TaskItemFileProps) => (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-md bg-secondary px-1.5 py-0.5 text-meta text-secondary-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </span>\n);\n\nexport type TaskItemProps = Omit<AgentStepProps, \"name\" | \"children\"> & {\n children?: ReactNode;\n};\n\n/**\n * One line of the run summary — an `AgentStep` on the canonical rail.\n * Defaults to `status=\"complete\"` (the task reports finished work) with the\n * badge hidden (the rail node carries the status; a badge per log line would\n * shout).\n */\nexport const TaskItem = ({\n children,\n status = \"complete\",\n hideBadge = true,\n ...props\n}: TaskItemProps) => <AgentStep hideBadge={hideBadge} name={children} status={status} {...props} />;\n\nexport type TaskProps = ComponentProps<typeof Collapsible>;\n\n/** Collapsed by default since #192 (`defaultOpen` flipped `true`→`false`). */\nexport const Task = ({ className, ...props }: TaskProps) => (\n <Collapsible className={cn(className)} {...props} />\n);\n\nexport type TaskTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n title: string;\n};\n\nexport const TaskTrigger = ({ children, className, title, ...props }: TaskTriggerProps) => (\n <CollapsibleTrigger asChild className={cn(\"group\", className)} {...props}>\n {children ?? (\n <div className=\"flex w-full cursor-pointer items-center gap-2 text-body text-muted-foreground transition-colors hover:text-foreground\">\n <p>{title}</p>\n <ChevronDownIcon className=\"size-4 transition-transform group-data-[state=open]:rotate-180\" />\n </div>\n )}\n </CollapsibleTrigger>\n);\n\nexport type TaskContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const TaskContent = ({ children, className, ...props }: TaskContentProps) => (\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 text-popover-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)]\",\n className,\n )}\n {...props}\n >\n <AgentTimeline className=\"mt-4\">{children}</AgentTimeline>\n </CollapsibleContent>\n);\n","\"use client\";\n\nimport { StatusBadge, StatusIcon, 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-sm 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\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 {summary.passed} passed\n </StatusBadge>\n {summary.failed > 0 && (\n <StatusBadge size=\"sm\" status=\"failed\">\n {summary.failed} failed\n </StatusBadge>\n )}\n {summary.skipped > 0 && (\n <StatusBadge size=\"sm\" status=\"skipped\">\n {summary.skipped} 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\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-xs tabular-nums\">\n <span>\n {summary.passed}/{summary.total} tests passed\n </span>\n <span>{passedPercent.toFixed(0)}%</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-sm\">{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 <div\n className={cn(\"ms-auto flex shrink-0 items-center gap-3 text-xs tabular-nums\", className)}\n {...props}\n >\n {children ?? (\n <>\n {passed > 0 && <span className=\"text-success-text\">{passed} passed</span>}\n {failed > 0 && <span className=\"text-destructive-text\">{failed} failed</span>}\n {skipped > 0 && <span className=\"text-muted-foreground\">{skipped} skipped</span>}\n </>\n )}\n </div>\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-xs 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-sm\", 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-sm\", 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-xs\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from \"@elabs-ai/components-ui\";\nimport { Progress } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { LanguageModelUsage } from \"ai\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { getUsage } from \"tokenlens\";\n\nconst PERCENT_MAX = 100;\nconst ICON_RADIUS = 10;\nconst ICON_VIEWBOX = 24;\nconst ICON_CENTER = 12;\nconst ICON_STROKE_WIDTH = 2;\n\ntype ModelId = string;\n\ninterface TokenUsageSchema {\n usedTokens: number;\n maxTokens: number;\n usage?: LanguageModelUsage;\n modelId?: ModelId;\n}\n\nconst TokenUsageContext = createContext<TokenUsageSchema | null>(null);\n\nconst useTokenUsageValue = () => {\n const context = useContext(TokenUsageContext);\n\n if (!context) {\n throw new Error(\"TokenUsage components must be used within TokenUsage\");\n }\n\n return context;\n};\n\nexport type TokenUsageProps = ComponentProps<typeof HoverCard> & TokenUsageSchema;\n\nexport const TokenUsage = ({\n usedTokens,\n maxTokens,\n usage,\n modelId,\n ...props\n}: TokenUsageProps) => {\n const contextValue = useMemo(\n () => ({ maxTokens, modelId, usage, usedTokens }),\n [maxTokens, modelId, usage, usedTokens],\n );\n\n return (\n <TokenUsageContext.Provider value={contextValue}>\n <HoverCard closeDelay={0} openDelay={0} {...props} />\n </TokenUsageContext.Provider>\n );\n};\n\nconst TokenUsageIcon = () => {\n const { t } = useLocale();\n const { usedTokens, maxTokens } = useTokenUsageValue();\n const circumference = 2 * Math.PI * ICON_RADIUS;\n const usedPercent = usedTokens / maxTokens;\n const dashOffset = circumference * (1 - usedPercent);\n\n return (\n <svg\n aria-label={t(\"ai.tokenUsage.usage\")}\n height=\"20\"\n role=\"img\"\n style={{ color: \"currentcolor\" }}\n viewBox={`0 0 ${ICON_VIEWBOX} ${ICON_VIEWBOX}`}\n width=\"20\"\n >\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.25\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeWidth={ICON_STROKE_WIDTH}\n />\n <circle\n cx={ICON_CENTER}\n cy={ICON_CENTER}\n fill=\"none\"\n opacity=\"0.7\"\n r={ICON_RADIUS}\n stroke=\"currentColor\"\n strokeDasharray={`${circumference} ${circumference}`}\n strokeDashoffset={dashOffset}\n strokeLinecap=\"round\"\n strokeWidth={ICON_STROKE_WIDTH}\n style={{ transform: \"rotate(-90deg)\", transformOrigin: \"center\" }}\n />\n </svg>\n );\n};\n\nexport type TokenUsageTriggerProps = ComponentProps<typeof Button>;\n\nexport const TokenUsageTrigger = ({ children, ...props }: TokenUsageTriggerProps) => {\n const { formatNumber } = useLocale();\n const { usedTokens, maxTokens } = useTokenUsageValue();\n const usedPercent = usedTokens / maxTokens;\n const renderedPercent = formatNumber(usedPercent, {\n maximumFractionDigits: 1,\n style: \"percent\",\n });\n\n return (\n <HoverCardTrigger asChild>\n {children ?? (\n <Button type=\"button\" variant=\"ghost\" {...props}>\n <span className=\"font-medium text-muted-foreground\">{renderedPercent}</span>\n <TokenUsageIcon />\n </Button>\n )}\n </HoverCardTrigger>\n );\n};\n\nexport type TokenUsageContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const TokenUsageContent = ({ className, ...props }: TokenUsageContentProps) => (\n <HoverCardContent className={cn(\"min-w-60 divide-y overflow-hidden p-0\", className)} {...props} />\n);\n\nexport type TokenUsageContentHeaderProps = ComponentProps<\"div\">;\n\nexport const TokenUsageContentHeader = ({\n children,\n className,\n ...props\n}: TokenUsageContentHeaderProps) => {\n const { formatNumber } = useLocale();\n const { usedTokens, maxTokens } = useTokenUsageValue();\n const usedPercent = usedTokens / maxTokens;\n const displayPct = formatNumber(usedPercent, {\n maximumFractionDigits: 1,\n style: \"percent\",\n });\n const used = formatNumber(usedTokens, {\n notation: \"compact\",\n });\n const total = formatNumber(maxTokens, {\n notation: \"compact\",\n });\n\n return (\n <div className={cn(\"w-full space-y-2 p-3\", className)} {...props}>\n {children ?? (\n <>\n <div className=\"flex items-center justify-between gap-3 text-xs\">\n <p>{displayPct}</p>\n <p className=\"font-mono text-muted-foreground\">\n {used} / {total}\n </p>\n </div>\n <div className=\"space-y-2\">\n <Progress className=\"bg-muted\" value={usedPercent * PERCENT_MAX} />\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport type TokenUsageContentBodyProps = ComponentProps<\"div\">;\n\nexport const TokenUsageContentBody = ({\n children,\n className,\n ...props\n}: TokenUsageContentBodyProps) => (\n <div className={cn(\"w-full p-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type TokenUsageContentFooterProps = ComponentProps<\"div\">;\n\nexport const TokenUsageContentFooter = ({\n children,\n className,\n ...props\n}: TokenUsageContentFooterProps) => {\n const { formatNumber, t } = useLocale();\n const { modelId, usage } = useTokenUsageValue();\n const costUSD = modelId\n ? getUsage({\n modelId,\n usage: {\n input: usage?.inputTokens ?? 0,\n output: usage?.outputTokens ?? 0,\n },\n }).costUSD?.totalUSD\n : undefined;\n const totalCost = formatNumber(costUSD ?? 0, {\n currency: \"USD\",\n style: \"currency\",\n });\n\n return (\n <div\n className={cn(\n \"flex w-full items-center justify-between gap-3 bg-secondary p-3 text-xs\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n <span className=\"text-muted-foreground\">{t(\"ai.tokenUsage.totalCost\")}</span>\n <span>{totalCost}</span>\n </>\n )}\n </div>\n );\n};\n\nconst TokensWithCost = ({ tokens, costText }: { tokens?: number; costText?: string }) => {\n const { formatNumber } = useLocale();\n return (\n <span>\n {tokens === undefined ? \"—\" : formatNumber(tokens, { notation: \"compact\" })}\n {costText ? <span className=\"ms-2 text-muted-foreground\">• {costText}</span> : null}\n </span>\n );\n};\n\nexport type TokenUsageInputProps = ComponentProps<\"div\">;\n\nexport const TokenUsageInput = ({ className, children, ...props }: TokenUsageInputProps) => {\n const { formatNumber, t } = useLocale();\n const { usage, modelId } = useTokenUsageValue();\n const inputTokens = usage?.inputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!inputTokens) {\n return null;\n }\n\n const inputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: inputTokens, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const inputCostText = formatNumber(inputCost ?? 0, {\n currency: \"USD\",\n style: \"currency\",\n });\n\n return (\n <div className={cn(\"flex items-center justify-between text-xs\", className)} {...props}>\n <span className=\"text-muted-foreground\">{t(\"ai.tokenUsage.input\")}</span>\n <TokensWithCost costText={inputCostText} tokens={inputTokens} />\n </div>\n );\n};\n\nexport type TokenUsageOutputProps = ComponentProps<\"div\">;\n\nexport const TokenUsageOutput = ({ className, children, ...props }: TokenUsageOutputProps) => {\n const { formatNumber, t } = useLocale();\n const { usage, modelId } = useTokenUsageValue();\n const outputTokens = usage?.outputTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!outputTokens) {\n return null;\n }\n\n const outputCost = modelId\n ? getUsage({\n modelId,\n usage: { input: 0, output: outputTokens },\n }).costUSD?.totalUSD\n : undefined;\n const outputCostText = formatNumber(outputCost ?? 0, {\n currency: \"USD\",\n style: \"currency\",\n });\n\n return (\n <div className={cn(\"flex items-center justify-between text-xs\", className)} {...props}>\n <span className=\"text-muted-foreground\">{t(\"ai.tokenUsage.output\")}</span>\n <TokensWithCost costText={outputCostText} tokens={outputTokens} />\n </div>\n );\n};\n\nexport type TokenUsageReasoningProps = ComponentProps<\"div\">;\n\nexport const TokenUsageReasoning = ({\n className,\n children,\n ...props\n}: TokenUsageReasoningProps) => {\n const { formatNumber, t } = useLocale();\n const { usage, modelId } = useTokenUsageValue();\n // `reasoningTokens` moved under `outputTokenDetails` in ai@7 (the flat,\n // deprecated top-level alias from ai@6 was removed).\n const reasoningTokens = usage?.outputTokenDetails?.reasoningTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!reasoningTokens) {\n return null;\n }\n\n const reasoningCost = modelId\n ? getUsage({\n modelId,\n usage: { reasoningTokens },\n }).costUSD?.totalUSD\n : undefined;\n const reasoningCostText = formatNumber(reasoningCost ?? 0, {\n currency: \"USD\",\n style: \"currency\",\n });\n\n return (\n <div className={cn(\"flex items-center justify-between text-xs\", className)} {...props}>\n <span className=\"text-muted-foreground\">{t(\"ai.tokenUsage.reasoning\")}</span>\n <TokensWithCost costText={reasoningCostText} tokens={reasoningTokens} />\n </div>\n );\n};\n\nexport type TokenUsageCacheProps = ComponentProps<\"div\">;\n\nexport const TokenUsageCache = ({ className, children, ...props }: TokenUsageCacheProps) => {\n const { formatNumber, t } = useLocale();\n const { usage, modelId } = useTokenUsageValue();\n // `cachedInputTokens` moved under `inputTokenDetails.cacheReadTokens` in\n // ai@7 (the flat, deprecated top-level alias from ai@6 was removed).\n const cacheTokens = usage?.inputTokenDetails?.cacheReadTokens ?? 0;\n\n if (children) {\n return children;\n }\n\n if (!cacheTokens) {\n return null;\n }\n\n const cacheCost = modelId\n ? getUsage({\n modelId,\n usage: { cacheReads: cacheTokens, input: 0, output: 0 },\n }).costUSD?.totalUSD\n : undefined;\n const cacheCostText = formatNumber(cacheCost ?? 0, {\n currency: \"USD\",\n style: \"currency\",\n });\n\n return (\n <div className={cn(\"flex items-center justify-between text-xs\", className)} {...props}>\n <span className=\"text-muted-foreground\">{t(\"ai.tokenUsage.cache\")}</span>\n <TokensWithCost costText={cacheCostText} tokens={cacheTokens} />\n </div>\n );\n};\n","\"use client\";\n\n/**\n * ToolResultCard — an artifact the agent PRODUCED, presented as the headline\n * (#192, research 10 §B.4).\n *\n * The elevation channel of the surface-separation system (research 08 §H):\n * raised fill + shadow, NO border (elevation is the separation gesture — a\n * border here would be the redundant-border anti-pattern). A separate\n * component from `Tool` by design: `Tool` owns the rail/inspect idiom (a step\n * that ran, JSON behind disclosure); `ToolResultCard` hosts the produced\n * chart/table/file as `children` — so an agent picks the channel by NAME,\n * not by a behavioural mode flag.\n *\n * Presentational and dependency-light: it does NOT import `@elabs-ai/components-charts` or\n * `@elabs-ai/components-data` (one-way dep graph) — the consumer passes the artifact (an\n * `<AutoChart>`, `<DataTable>`, file preview, …) as children, and maps an\n * AI-SDK tool state to `status` via `statusFromToolState` (tool.tsx).\n *\n * **The card owns artifact-scoped chrome in its header row** — `title |\n * actions | status`, matching `ArtifactActions`, `DialogSection.actions` and\n * `SectionHeader.actions` elsewhere in the system. `actions` is scoped to the\n * artifact AS A WHOLE (expand it, download it, open it somewhere else); the\n * payload's own controls — a chart's flip-to-table, a table's sort — stay in\n * the payload's own frame, in the body. A card that hoisted them would present\n * one row of buttons that act on two different things.\n */\nimport { StatusBadge, type Status } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface ToolResultCardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Headline of the produced artifact (`text-subtitle`). */\n title?: ReactNode;\n /** The business summary line under the title (`text-meta`), not JSON. */\n summary?: ReactNode;\n /** Canonical execution status (closed enum); renders a `StatusBadge`. */\n status?: Status;\n /**\n * Controls scoped to the whole artifact — expand, download, open. Rendered in\n * the header row between the title and the status.\n *\n * A `ReactNode` slot, not a `role=\"toolbar\"`: that role promises roving-tabindex\n * traversal, which this row does not implement. Keep the payload's own controls\n * out of here (see the note at the top of this file).\n */\n actions?: ReactNode;\n /**\n * The technical view, kept behind disclosure — pass a default-collapsed\n * `<ToolDetails>` holding `ToolInput`/`ToolOutput` (research 10 §B.5).\n */\n details?: ReactNode;\n}\n\n/** The produced artifact IS the headline; pass it as `children`. */\nexport const ToolResultCard = forwardRef<HTMLDivElement, ToolResultCardProps>(\n function ToolResultCard(\n { title, summary, status, actions, details, className, children, ...props },\n ref,\n ) {\n const hasHeader = title != null || summary != null || status != null || actions != null;\n return (\n <div\n ref={ref}\n className={cn(\n \"not-prose w-full space-y-3 rounded-lg bg-surface-elevated p-4 shadow-sm\",\n className,\n )}\n {...props}\n >\n {hasHeader ? (\n <div className=\"space-y-0.5\">\n <div className=\"flex items-center justify-between gap-3\">\n {title ? <h3 className=\"min-w-0 truncate text-subtitle\">{title}</h3> : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n {status ? <StatusBadge className=\"shrink-0\" size=\"sm\" status={status} /> : null}\n </div>\n {summary ? <p className=\"text-meta text-muted-foreground\">{summary}</p> : null}\n </div>\n ) : null}\n {children}\n {details}\n </div>\n );\n },\n);\n","\"use client\";\n\nimport type { NodeToolbar as FlowNodeToolbar } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type NodeToolbarProps = ComponentProps<typeof FlowNodeToolbar>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst NodeToolbarImpl = lazyFlowPart<NodeToolbarProps>((m) => m.Toolbar);\n\n/**\n * The floating control strip attached to a selected canvas NODE — it portals out\n * of the node and follows it, and it is meaningless outside a `<Canvas>`.\n *\n * Named `NodeToolbar` (after the React Flow primitive it wraps) because\n * `Toolbar` now means the general-purpose WAI-ARIA toolbar in\n * `@elabs-ai/components-ui`: a keyboard row with a roving tabindex.\n * The two solve unrelated problems, and the collision made \"use the Toolbar\"\n * ambiguous at every call site.\n */\nexport const NodeToolbar = (props: NodeToolbarProps) => (\n // `NodeToolbar` only ever renders inside a `<Canvas>` (it portals out of the\n // node), so the engine chunk is already in cache; it is wrapped anyway because\n // it is independently barrel-exported.\n <Suspense fallback={null}>\n {/* The strip portals out of the node it belongs to, so it is nowhere near\n that node in the DOM — a stable selector is the only way a consumer or a\n test can find it. Overridable, like every other `data-slot`. */}\n <NodeToolbarImpl data-slot=\"node-toolbar\" {...props} />\n </Suspense>\n);\n\n/**\n * @deprecated Renamed to {@link NodeToolbar}. `Toolbar` is now the WAI-ARIA\n * toolbar in `@elabs-ai/components-ui`. This alias will be removed in\n * the next major.\n */\nexport const Toolbar = NodeToolbar;\n\n/** @deprecated Renamed to {@link NodeToolbarProps}. */\nexport type ToolbarProps = NodeToolbarProps;\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { Experimental_TranscriptionResult as TranscriptionResult } from \"ai\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\ntype TranscriptionSegment = TranscriptionResult[\"segments\"][number];\n\ninterface TranscriptionContextValue {\n segments: TranscriptionSegment[];\n currentTime: number;\n onTimeUpdate: (time: number) => void;\n onSeek?: (time: number) => void;\n}\n\nconst TranscriptionContext = createContext<TranscriptionContextValue | null>(null);\n\nconst useTranscription = () => {\n const context = useContext(TranscriptionContext);\n if (!context) {\n throw new Error(\"Transcription components must be used within Transcription\");\n }\n return context;\n};\n\nexport type TranscriptionProps = Omit<ComponentProps<\"div\">, \"children\"> & {\n segments: TranscriptionSegment[];\n currentTime?: number;\n onSeek?: (time: number) => void;\n children: (segment: TranscriptionSegment, index: number) => ReactNode;\n};\n\nexport const Transcription = ({\n segments,\n currentTime: externalCurrentTime,\n onSeek,\n className,\n children,\n ...props\n}: TranscriptionProps) => {\n const [currentTime, setCurrentTime] = useControllableState({\n defaultProp: 0,\n onChange: onSeek,\n prop: externalCurrentTime,\n });\n\n const contextValue = useMemo(\n () => ({ currentTime, onSeek, onTimeUpdate: setCurrentTime, segments }),\n [currentTime, onSeek, setCurrentTime, segments],\n );\n\n return (\n <TranscriptionContext.Provider value={contextValue}>\n <div\n className={cn(\"flex flex-wrap gap-1 text-sm leading-relaxed\", className)}\n data-slot=\"transcription\"\n {...props}\n >\n {segments\n .filter((segment) => segment.text.trim())\n .map((segment, index) => children(segment, index))}\n </div>\n </TranscriptionContext.Provider>\n );\n};\n\nexport type TranscriptionSegmentProps = ComponentProps<\"button\"> & {\n segment: TranscriptionSegment;\n index: number;\n};\n\nexport const TranscriptionSegment = ({\n segment,\n index,\n className,\n onClick,\n ...props\n}: TranscriptionSegmentProps) => {\n const { currentTime, onSeek } = useTranscription();\n\n const isActive = currentTime >= segment.startSecond && currentTime < segment.endSecond;\n const isPast = currentTime >= segment.endSecond;\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (onSeek) {\n onSeek(segment.startSecond);\n }\n onClick?.(event);\n },\n [onSeek, segment.startSecond, onClick],\n );\n\n return (\n <button\n className={cn(\n \"inline text-start\",\n // #399 — the active word is transcript TEXT: `-text` rung, not the fill.\n isActive && \"text-primary-text\",\n isPast && \"text-muted-foreground\",\n !(isActive || isPast) && \"text-muted-foreground/60\",\n onSeek && \"cursor-pointer hover:text-foreground\",\n !onSeek && \"cursor-default\",\n className,\n )}\n data-active={isActive}\n data-index={index}\n data-slot=\"transcription-segment\"\n onClick={handleClick}\n type=\"button\"\n {...props}\n >\n {segment.text}\n </button>\n );\n};\n","\"use client\";\n\nimport { Button, cn, formatElapsed, useLocale } from \"@elabs-ai/components-ui\";\nimport { ArrowDownIcon, SquareIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { forwardRef } from \"react\";\n\nexport interface TurnStatusTokens {\n input?: number;\n output?: number;\n}\n\nexport interface TurnStatusProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /**\n * What the turn is doing right now, e.g. `\"Working…\"`, `\"Editing files…\"`.\n * Caller-supplied and rendered verbatim — `TurnStatus` never invents this\n * text, so it carries no default and needs no translation key of its own.\n */\n label?: string;\n /** Elapsed time in the current turn, in milliseconds. Rendered via `formatElapsed`. */\n elapsedMs?: number;\n /** Token counts for the turn so far. */\n tokens?: TurnStatusTokens;\n /** 1-based index of the current turn. */\n turn?: number;\n /** Total number of turns, when known. */\n turnTotal?: number;\n /**\n * `\"working\"` (default) renders the live stats + stop control and keeps\n * announcing `label` changes. `\"settled\"` renders the completed-turn line\n * instead and stops announcing (the elapsed/tokens/turn stats and the stop\n * control are hidden — the turn is over).\n */\n status?: \"working\" | \"settled\";\n /** Renders a focusable stop button, reachable by keyboard, while `status=\"working\"`. */\n onStop?: () => void;\n /** Renders a \"scroll to bottom\" affordance. */\n showScrollToBottom?: boolean;\n onScrollToBottom?: () => void;\n}\n\n/**\n * TurnStatus — the in-turn footer: a working/settled label, elapsed time,\n * token counts, turn progress, and a stop affordance, all in one place (#105).\n *\n * Exactly ONE `role=\"status\" aria-live=\"polite\"` region is rendered — a\n * visually-hidden node that announces `label` while working and the\n * completed-turn line once `status=\"settled\"`. The ticking elapsed time and\n * token/turn counts are plain (non-live) visible text: they update every\n * render without re-announcing on every tick, which would flood assistive\n * tech (see `.claude/rules/loading-states.md`). This mirrors `Persona`'s\n * visible-content/`sr-only`-announcement split.\n */\nexport const TurnStatus = forwardRef<HTMLDivElement, TurnStatusProps>(function TurnStatus(\n {\n label,\n elapsedMs,\n tokens,\n turn,\n turnTotal,\n status = \"working\",\n onStop,\n showScrollToBottom,\n onScrollToBottom,\n className,\n ...props\n },\n ref,\n) {\n const { t, formatNumber } = useLocale();\n const isSettled = status === \"settled\";\n const formattedElapsed = elapsedMs === undefined ? undefined : formatElapsed(elapsedMs);\n\n const settledText = isSettled\n ? (label ??\n (formattedElapsed\n ? t(\"ai.turnStatus.completedIn\", { elapsed: formattedElapsed })\n : t(\"ai.turnStatus.completed\")))\n : undefined;\n\n /** The one thing this component ever announces: `label`, or the settled line. */\n const announced = isSettled ? (settledText ?? \"\") : (label ?? \"\");\n\n const hasTokens = tokens?.input !== undefined || tokens?.output !== undefined;\n const hasTurn = turn !== undefined;\n const visibleLabel = isSettled ? settledText : label;\n const hasMeta = !isSettled && (formattedElapsed !== undefined || hasTokens || hasTurn);\n const showStop = !isSettled && Boolean(onStop);\n const hasTrailing = hasMeta || showScrollToBottom || showStop;\n\n return (\n <div\n ref={ref}\n className={cn(\"flex w-full items-center gap-3 text-body text-foreground\", className)}\n data-slot=\"turn-status\"\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n \"size-2 shrink-0 rounded-full\",\n isSettled ? \"bg-success\" : \"animate-pulse bg-primary motion-reduce:animate-none\",\n )}\n data-slot=\"turn-status-indicator\"\n />\n\n {visibleLabel ? (\n <span className=\"truncate\" data-slot=\"turn-status-label\">\n {visibleLabel}\n </span>\n ) : null}\n\n {/* The single live region — see the component doc comment above. */}\n <span aria-live=\"polite\" className=\"sr-only\" data-slot=\"turn-status-live\" role=\"status\">\n {announced}\n </span>\n\n {hasTrailing ? (\n <div className=\"ms-auto flex shrink-0 items-center gap-3\" data-slot=\"turn-status-trailing\">\n {hasMeta ? (\n <div\n className=\"flex items-center gap-3 text-meta text-muted-foreground tabular-nums\"\n data-slot=\"turn-status-meta\"\n >\n {formattedElapsed ? (\n <span data-slot=\"turn-status-elapsed\">{formattedElapsed}</span>\n ) : null}\n {hasTokens ? (\n <span data-slot=\"turn-status-tokens\">\n {formatNumber(tokens?.input ?? 0, { notation: \"compact\" })}\n {\"↑ \"}\n {formatNumber(tokens?.output ?? 0, { notation: \"compact\" })}\n {\"↓\"}\n </span>\n ) : null}\n {hasTurn ? (\n <span data-slot=\"turn-status-turn\">\n {turn}\n {turnTotal === undefined ? \"\" : `/${turnTotal}`}\n </span>\n ) : null}\n </div>\n ) : null}\n\n {showScrollToBottom ? (\n <Button\n aria-label={t(\"ai.turnStatus.scrollToBottom\")}\n data-slot=\"turn-status-scroll-to-bottom\"\n onClick={onScrollToBottom}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n ) : null}\n\n {showStop ? (\n <Button\n aria-label={t(\"ai.promptInput.stop\")}\n data-slot=\"turn-status-stop\"\n onClick={onStop}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"outline\"\n >\n <SquareIcon className=\"size-4\" />\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n});\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * The OPT-IN analyser-plumbing hook for `AudioVisualizer` (issue #21). It is a\n * separate export a consumer may ignore entirely — `AudioVisualizer` itself\n * never imports or calls this. brand-ui is a presentation layer (D5): this\n * hook never calls `getUserMedia` and never creates an `AudioContext` until a\n * `MediaStream` the CONSUMER already obtained is actually passed in.\n */\n\nexport interface UseAudioLevelOptions {\n /** `AnalyserNode.fftSize` — controls how many frequency bins `levels` has\n * (`fftSize / 2`). Must be a power of two in [32, 32768]. */\n fftSize?: number;\n /** `AnalyserNode.smoothingTimeConstant` (0–1) — the analyser's OWN frame-to-frame\n * smoothing, independent of `AudioVisualizer`'s reduced-motion smoothing. */\n smoothingTimeConstant?: number;\n}\n\nexport interface UseAudioLevelResult {\n /** Normalized 0–1 frequency-bin samples for the current frame — feed this\n * directly to `<AudioVisualizer levels={levels} />`. Empty while `stream`\n * is `null`/`undefined` or the Web Audio API is unavailable. */\n levels: number[];\n /** The mean of `levels` — a single 0–1 scalar for a simple level meter. */\n level: number;\n}\n\nconst DEFAULT_FFT_SIZE = 64;\nconst DEFAULT_SMOOTHING_TIME_CONSTANT = 0.6;\n\ntype AudioContextCtor = new () => AudioContext;\n\n/** Feature-detects the Web Audio API — absent under SSR, in a test runner\n * with no Web Audio shim, and in older Safari (`webkitAudioContext`). */\nfunction resolveAudioContextConstructor(): AudioContextCtor | null {\n if (typeof window === \"undefined\") return null;\n const w = window as typeof window & { webkitAudioContext?: AudioContextCtor };\n return w.AudioContext ?? w.webkitAudioContext ?? null;\n}\n\n/**\n * Polls a `MediaStream` the caller already obtained (their own `getUserMedia`\n * call — this hook never requests one) via a Web Audio `AnalyserNode`, on a\n * `requestAnimationFrame` loop, and returns normalized levels.\n *\n * Pass `null`/`undefined` for `stream` (e.g. before the user grants mic\n * permission) and the hook is a no-op returning empty levels — safe to call\n * unconditionally, including with no stream ever provided at all.\n */\nexport function useAudioLevel(\n stream: MediaStream | null | undefined,\n options: UseAudioLevelOptions = {},\n): UseAudioLevelResult {\n const { fftSize = DEFAULT_FFT_SIZE, smoothingTimeConstant = DEFAULT_SMOOTHING_TIME_CONSTANT } =\n options;\n const [levels, setLevels] = useState<number[]>([]);\n const [level, setLevel] = useState(0);\n\n useEffect(() => {\n if (!stream) {\n setLevels([]);\n setLevel(0);\n return undefined;\n }\n\n const AudioContextConstructor = resolveAudioContextConstructor();\n if (!AudioContextConstructor) {\n return undefined;\n }\n\n const audioContext = new AudioContextConstructor();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = fftSize;\n analyser.smoothingTimeConstant = smoothingTimeConstant;\n source.connect(analyser);\n\n const buffer = new Uint8Array(analyser.frequencyBinCount);\n let rafId = 0;\n\n const tick = () => {\n analyser.getByteFrequencyData(buffer);\n const normalized = Array.from(buffer, (value) => value / 255);\n setLevels(normalized);\n setLevel(normalized.reduce((sum, value) => sum + value, 0) / (normalized.length || 1));\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n\n return () => {\n cancelAnimationFrame(rafId);\n source.disconnect();\n analyser.disconnect();\n if (audioContext.state !== \"closed\") {\n void audioContext.close();\n }\n };\n }, [stream, fftSize, smoothingTimeConstant]);\n\n return { level, levels };\n}\n","\"use client\";\n\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from \"@elabs-ai/components-ui\";\nimport { Dialog, DialogContent, DialogTitle, DialogTrigger } from \"@elabs-ai/components-ui\";\nimport { Spinner } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport {\n CircleSmallIcon,\n MarsIcon,\n MarsStrokeIcon,\n NonBinaryIcon,\n PauseIcon,\n PlayIcon,\n TransgenderIcon,\n VenusAndMarsIcon,\n VenusIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\ninterface VoiceSelectorContextValue {\n value: string | undefined;\n setValue: (value: string | undefined) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst VoiceSelectorContext = createContext<VoiceSelectorContextValue | null>(null);\n\nexport const useVoiceSelector = () => {\n const context = useContext(VoiceSelectorContext);\n if (!context) {\n throw new Error(\"VoiceSelector components must be used within VoiceSelector\");\n }\n return context;\n};\n\nexport type VoiceSelectorProps = ComponentProps<typeof Dialog> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string | undefined) => void;\n};\n\nexport const VoiceSelector = ({\n value: valueProp,\n defaultValue,\n onValueChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n ...props\n}: VoiceSelectorProps) => {\n const [value, setValue] = useControllableState({\n defaultProp: defaultValue,\n onChange: onValueChange,\n prop: valueProp,\n });\n\n const [open, setOpen] = useControllableState({\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n prop: openProp,\n });\n\n const voiceSelectorContext = useMemo(\n () => ({ open, setOpen, setValue, value }),\n [value, setValue, open, setOpen],\n );\n\n return (\n <VoiceSelectorContext.Provider value={voiceSelectorContext}>\n <Dialog onOpenChange={setOpen} open={open} {...props}>\n {children}\n </Dialog>\n </VoiceSelectorContext.Provider>\n );\n};\n\nexport type VoiceSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;\n\nexport const VoiceSelectorTrigger = (props: VoiceSelectorTriggerProps) => (\n <DialogTrigger {...props} />\n);\n\nexport type VoiceSelectorContentProps = ComponentProps<typeof DialogContent> & {\n title?: ReactNode;\n};\n\nexport const VoiceSelectorContent = ({\n className,\n children,\n title = \"Voice Selector\",\n ...props\n}: VoiceSelectorContentProps) => (\n <DialogContent aria-describedby={undefined} className={cn(\"p-0\", className)} {...props}>\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <Command className=\"**:data-[slot=command-input-wrapper]:h-auto\">{children}</Command>\n </DialogContent>\n);\n\nexport type VoiceSelectorDialogProps = ComponentProps<typeof CommandDialog>;\n\nexport const VoiceSelectorDialog = (props: VoiceSelectorDialogProps) => (\n <CommandDialog {...props} />\n);\n\nexport type VoiceSelectorInputProps = ComponentProps<typeof CommandInput>;\n\nexport const VoiceSelectorInput = ({ className, ...props }: VoiceSelectorInputProps) => (\n <CommandInput className={cn(\"h-auto py-3.5\", className)} {...props} />\n);\n\nexport type VoiceSelectorListProps = ComponentProps<typeof CommandList>;\n\nexport const VoiceSelectorList = (props: VoiceSelectorListProps) => <CommandList {...props} />;\n\nexport type VoiceSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const VoiceSelectorEmpty = (props: VoiceSelectorEmptyProps) => <CommandEmpty {...props} />;\n\nexport type VoiceSelectorGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const VoiceSelectorGroup = (props: VoiceSelectorGroupProps) => <CommandGroup {...props} />;\n\nexport type VoiceSelectorItemProps = ComponentProps<typeof CommandItem>;\n\nexport const VoiceSelectorItem = ({ className, ...props }: VoiceSelectorItemProps) => (\n <CommandItem className={cn(\"px-4 py-2\", className)} {...props} />\n);\n\nexport type VoiceSelectorShortcutProps = ComponentProps<typeof CommandShortcut>;\n\nexport const VoiceSelectorShortcut = (props: VoiceSelectorShortcutProps) => (\n <CommandShortcut {...props} />\n);\n\nexport type VoiceSelectorSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const VoiceSelectorSeparator = (props: VoiceSelectorSeparatorProps) => (\n <CommandSeparator {...props} />\n);\n\nexport type VoiceSelectorGenderProps = ComponentProps<\"span\"> & {\n value?: \"male\" | \"female\" | \"transgender\" | \"androgyne\" | \"non-binary\" | \"intersex\";\n};\n\nexport const VoiceSelectorGender = ({\n className,\n value,\n children,\n ...props\n}: VoiceSelectorGenderProps) => {\n let icon: ReactNode | null = null;\n\n switch (value) {\n case \"male\": {\n icon = <MarsIcon className=\"size-4\" />;\n break;\n }\n case \"female\": {\n icon = <VenusIcon className=\"size-4\" />;\n break;\n }\n case \"transgender\": {\n icon = <TransgenderIcon className=\"size-4\" />;\n break;\n }\n case \"androgyne\": {\n icon = <MarsStrokeIcon className=\"size-4\" />;\n break;\n }\n case \"non-binary\": {\n icon = <NonBinaryIcon className=\"size-4\" />;\n break;\n }\n case \"intersex\": {\n icon = <VenusAndMarsIcon className=\"size-4\" />;\n break;\n }\n default: {\n icon = <CircleSmallIcon className=\"size-4\" />;\n }\n }\n\n return (\n <span className={cn(\"text-muted-foreground text-xs\", className)} {...props}>\n {children ?? icon}\n </span>\n );\n};\n\nexport type VoiceSelectorAccentProps = ComponentProps<\"span\"> & {\n value?:\n | \"american\"\n | \"british\"\n | \"australian\"\n | \"canadian\"\n | \"irish\"\n | \"scottish\"\n | \"indian\"\n | \"south-african\"\n | \"new-zealand\"\n | \"spanish\"\n | \"french\"\n | \"german\"\n | \"italian\"\n | \"portuguese\"\n | \"brazilian\"\n | \"mexican\"\n | \"argentinian\"\n | \"japanese\"\n | \"chinese\"\n | \"korean\"\n | \"russian\"\n | \"arabic\"\n | \"dutch\"\n | \"swedish\"\n | \"norwegian\"\n | \"danish\"\n | \"finnish\"\n | \"polish\"\n | \"turkish\"\n | \"greek\"\n | string;\n};\n\nexport const VoiceSelectorAccent = ({\n className,\n value,\n children,\n ...props\n}: VoiceSelectorAccentProps) => {\n let emoji: string | null = null;\n\n switch (value) {\n case \"american\": {\n emoji = \"🇺🇸\";\n break;\n }\n case \"british\": {\n emoji = \"🇬🇧\";\n break;\n }\n case \"australian\": {\n emoji = \"🇦🇺\";\n break;\n }\n case \"canadian\": {\n emoji = \"🇨🇦\";\n break;\n }\n case \"irish\": {\n emoji = \"🇮🇪\";\n break;\n }\n case \"scottish\": {\n emoji = \"🏴\";\n break;\n }\n case \"indian\": {\n emoji = \"🇮🇳\";\n break;\n }\n case \"south-african\": {\n emoji = \"🇿🇦\";\n break;\n }\n case \"new-zealand\": {\n emoji = \"🇳🇿\";\n break;\n }\n case \"spanish\": {\n emoji = \"🇪🇸\";\n break;\n }\n case \"french\": {\n emoji = \"🇫🇷\";\n break;\n }\n case \"german\": {\n emoji = \"🇩🇪\";\n break;\n }\n case \"italian\": {\n emoji = \"🇮🇹\";\n break;\n }\n case \"portuguese\": {\n emoji = \"🇵🇹\";\n break;\n }\n case \"brazilian\": {\n emoji = \"🇧🇷\";\n break;\n }\n case \"mexican\": {\n emoji = \"🇲🇽\";\n break;\n }\n case \"argentinian\": {\n emoji = \"🇦🇷\";\n break;\n }\n case \"japanese\": {\n emoji = \"🇯🇵\";\n break;\n }\n case \"chinese\": {\n emoji = \"🇨🇳\";\n break;\n }\n case \"korean\": {\n emoji = \"🇰🇷\";\n break;\n }\n case \"russian\": {\n emoji = \"🇷🇺\";\n break;\n }\n case \"arabic\": {\n emoji = \"🇸🇦\";\n break;\n }\n case \"dutch\": {\n emoji = \"🇳🇱\";\n break;\n }\n case \"swedish\": {\n emoji = \"🇸🇪\";\n break;\n }\n case \"norwegian\": {\n emoji = \"🇳🇴\";\n break;\n }\n case \"danish\": {\n emoji = \"🇩🇰\";\n break;\n }\n case \"finnish\": {\n emoji = \"🇫🇮\";\n break;\n }\n case \"polish\": {\n emoji = \"🇵🇱\";\n break;\n }\n case \"turkish\": {\n emoji = \"🇹🇷\";\n break;\n }\n case \"greek\": {\n emoji = \"🇬🇷\";\n break;\n }\n default: {\n emoji = null;\n }\n }\n\n return (\n <span className={cn(\"text-muted-foreground text-xs\", className)} {...props}>\n {children ?? emoji}\n </span>\n );\n};\n\nexport type VoiceSelectorAgeProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorAge = ({ className, ...props }: VoiceSelectorAgeProps) => (\n <span className={cn(\"text-muted-foreground text-xs tabular-nums\", className)} {...props} />\n);\n\nexport type VoiceSelectorNameProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorName = ({ className, ...props }: VoiceSelectorNameProps) => (\n <span className={cn(\"flex-1 truncate text-start font-medium\", className)} {...props} />\n);\n\nexport type VoiceSelectorDescriptionProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorDescription = ({\n className,\n ...props\n}: VoiceSelectorDescriptionProps) => (\n <span className={cn(\"text-muted-foreground text-xs\", className)} {...props} />\n);\n\nexport type VoiceSelectorAttributesProps = ComponentProps<\"div\">;\n\nexport const VoiceSelectorAttributes = ({\n className,\n children,\n ...props\n}: VoiceSelectorAttributesProps) => (\n <div className={cn(\"flex items-center text-xs\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type VoiceSelectorBulletProps = ComponentProps<\"span\">;\n\nexport const VoiceSelectorBullet = ({ className, ...props }: VoiceSelectorBulletProps) => (\n <span aria-hidden=\"true\" className={cn(\"select-none text-border\", className)} {...props}>\n •\n </span>\n);\n\nexport type VoiceSelectorPreviewProps = Omit<ComponentProps<\"button\">, \"children\"> & {\n playing?: boolean;\n loading?: boolean;\n onPlay?: () => void;\n};\n\nexport const VoiceSelectorPreview = ({\n className,\n playing,\n loading,\n onPlay,\n onClick,\n ...props\n}: VoiceSelectorPreviewProps) => {\n const { t } = useLocale();\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n onClick?.(event);\n onPlay?.();\n },\n [onClick, onPlay],\n );\n\n let icon = <PlayIcon className=\"size-3\" />;\n\n if (loading) {\n icon = <Spinner className=\"size-3\" />;\n } else if (playing) {\n icon = <PauseIcon className=\"size-3\" />;\n }\n\n return (\n <Button\n aria-label={playing ? t(\"ai.voiceSelector.pausePreview\") : t(\"ai.voiceSelector.playPreview\")}\n className={cn(\"size-6\", className)}\n disabled={loading}\n onClick={handleClick}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n {icon}\n </Button>\n );\n};\n","\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { Input } from \"@elabs-ai/components-ui\";\nimport { Skeleton } from \"@elabs-ai/components-ui\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useCallback, useContext, useMemo, useState } from \"react\";\n\nexport interface WebPreviewContextValue {\n url: string;\n setUrl: (url: string) => void;\n consoleOpen: boolean;\n setConsoleOpen: (open: boolean) => void;\n}\n\nconst WebPreviewContext = createContext<WebPreviewContextValue | null>(null);\n\nconst useWebPreview = () => {\n const context = useContext(WebPreviewContext);\n if (!context) {\n throw new Error(\"WebPreview components must be used within a WebPreview\");\n }\n return context;\n};\n\nexport type WebPreviewProps = ComponentProps<\"div\"> & {\n defaultUrl?: string;\n onUrlChange?: (url: string) => void;\n};\n\nexport const WebPreview = ({\n className,\n children,\n defaultUrl = \"\",\n onUrlChange,\n ...props\n}: WebPreviewProps) => {\n const [url, setUrl] = useState(defaultUrl);\n const [consoleOpen, setConsoleOpen] = useState(false);\n\n const handleUrlChange = useCallback(\n (newUrl: string) => {\n setUrl(newUrl);\n onUrlChange?.(newUrl);\n },\n [onUrlChange],\n );\n\n const contextValue = useMemo<WebPreviewContextValue>(\n () => ({\n consoleOpen,\n setConsoleOpen,\n setUrl: handleUrlChange,\n url,\n }),\n [consoleOpen, handleUrlChange, url],\n );\n\n return (\n <WebPreviewContext.Provider value={contextValue}>\n <div\n className={cn(\"flex size-full flex-col rounded-lg border bg-card\", className)}\n {...props}\n >\n {children}\n </div>\n </WebPreviewContext.Provider>\n );\n};\n\nexport type WebPreviewNavigationProps = ComponentProps<\"div\">;\n\nexport const WebPreviewNavigation = ({\n className,\n children,\n ...props\n}: WebPreviewNavigationProps) => (\n <div className={cn(\"flex items-center gap-1 border-b p-2\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type WebPreviewNavigationButtonProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n};\n\nexport const WebPreviewNavigationButton = ({\n onClick,\n disabled,\n tooltip,\n children,\n ...props\n}: WebPreviewNavigationButtonProps) => (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n // These buttons are icon-only, and a Radix tooltip only contributes\n // `aria-describedby` while it is OPEN — so at rest the control had no\n // accessible name at all and axe's `button-name` red every story that\n // mounted one (#386). The tooltip text IS the name; spreading\n // `...props` afterwards keeps an explicit `aria-label` winning, and a\n // button that ships real text children keeps its own content as the\n // name because `tooltip` is then undefined. Mirrors `MessageAction`'s\n // `sr-only` label in message.tsx.\n aria-label={tooltip}\n className=\"h-8 w-8 p-0 hover:text-foreground\"\n disabled={disabled}\n onClick={onClick}\n size=\"sm\"\n variant=\"ghost\"\n {...props}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n);\n\nexport type WebPreviewUrlProps = ComponentProps<typeof Input>;\n\nexport const WebPreviewUrl = ({ value, onChange, onKeyDown, ...props }: WebPreviewUrlProps) => {\n const { t } = useLocale();\n const { url, setUrl } = useWebPreview();\n const [prevUrl, setPrevUrl] = useState(url);\n const [inputValue, setInputValue] = useState(url);\n\n // Sync input value with context URL when it changes externally (derived state pattern)\n if (url !== prevUrl) {\n setPrevUrl(url);\n setInputValue(url);\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n onChange?.(event);\n };\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n const target = event.target as HTMLInputElement;\n setUrl(target.value);\n }\n onKeyDown?.(event);\n },\n [setUrl, onKeyDown],\n );\n\n return (\n <Input\n className=\"h-8 flex-1 text-sm\"\n onChange={onChange ?? handleChange}\n onKeyDown={handleKeyDown}\n placeholder={t(\"ai.webPreview.urlPlaceholder\")}\n value={value ?? inputValue}\n {...props}\n />\n );\n};\n\nexport type WebPreviewBodyProps = Omit<ComponentProps<\"iframe\">, \"loading\"> & {\n /**\n * Not-ready placeholder over the iframe (loading-states.md `loading`\n * signal). Pass `true` for the default layout-shaped Skeleton filling the\n * iframe box, or a ReactNode to override with custom placeholder content.\n * `false`/`undefined` (default) renders nothing. Shadows (rather than\n * forwards) the native `<iframe loading=\"eager\"|\"lazy\">` attribute — this\n * component's box is always fully reserved, so lazy-loading the iframe\n * itself is not a use case here.\n * @default false\n */\n loading?: boolean | ReactNode;\n};\n\nexport const WebPreviewBody = ({ className, loading, src, ...props }: WebPreviewBodyProps) => {\n const { url } = useWebPreview();\n const { t } = useLocale();\n\n return (\n <div className=\"relative flex-1\">\n <iframe\n className={cn(\"size-full\", className)}\n // oxlint-disable-next-line eslint-plugin-react(iframe-missing-sandbox)\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-presentation\"\n src={(src ?? url) || undefined}\n title=\"Preview\"\n {...props}\n />\n {loading === true ? (\n <div\n className=\"absolute inset-0 flex flex-col gap-2 bg-card p-4\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"flex-1\" />\n </div>\n ) : (\n loading\n )}\n </div>\n );\n};\n\nexport type WebPreviewConsoleProps = ComponentProps<\"div\"> & {\n logs?: {\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n timestamp: Date;\n }[];\n};\n\nexport const WebPreviewConsole = ({\n className,\n logs = [],\n children,\n ...props\n}: WebPreviewConsoleProps) => {\n const { consoleOpen, setConsoleOpen } = useWebPreview();\n const { t } = useLocale();\n\n return (\n <Collapsible\n className={cn(\"border-t bg-muted/50 font-mono text-sm\", className)}\n onOpenChange={setConsoleOpen}\n open={consoleOpen}\n {...props}\n >\n <CollapsibleTrigger asChild>\n <Button\n className=\"flex w-full items-center justify-between p-4 text-start font-medium hover:bg-muted/50\"\n variant=\"ghost\"\n >\n Console\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform duration-base ease-standard\",\n consoleOpen && \"rotate-180\",\n )}\n />\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent\n className={cn(\n \"px-4 pb-4\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n )}\n >\n <div className=\"max-h-48 space-y-1 overflow-y-auto\">\n {logs.length === 0 ? (\n <p className=\"text-muted-foreground\">{t(\"ai.webPreview.noConsoleOutput\")}</p>\n ) : (\n logs.map((log) => (\n <div\n className={cn(\n \"text-xs\",\n // #124: console log lines are running text — ink rung, not\n // the mark rung. `text-yellow-600` was also a raw, untokened\n // Tailwind palette colour (styling-and-tokens.md); replaced\n // with the warning tone's own ink rung.\n log.level === \"error\" && \"text-destructive-text\",\n log.level === \"warn\" && \"text-warning-text\",\n log.level === \"log\" && \"text-foreground\",\n )}\n key={`${log.timestamp.getTime()}-${log.level}-${log.message}`}\n >\n <span className=\"text-muted-foreground\">{log.timestamp.toLocaleTimeString()}</span>{\" \"}\n {log.message}\n </div>\n ))\n )}\n {children}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\n\nexport interface ChatShellProps {\n /** Scrollable transcript — typically a <Conversation>. */\n children: ReactNode;\n /** Sticky composer — typically a <Composer> (the standard chat input). */\n composer?: ReactNode;\n /** Optional header row (title, model picker, actions). */\n header?: ReactNode;\n /** Optional right-side context rail (sources, files, memory). */\n aside?: ReactNode;\n /**\n * Layout treatment:\n * - `\"card\"` (default) — a self-contained rounded, bordered chat card. Use\n * when the shell sits on a page among other content and needs its own frame.\n * - `\"bare\"` — an immersive pane that fills its container with NO frame: the\n * transcript fades under the header and above the composer (a token-driven\n * top/bottom scrim) and the composer floats on the pane background instead\n * of a hard bordered bar. Use when the shell already lives inside a bounded\n * region (an AppShell `SidebarInset`, a full-page workspace) so it doesn't\n * draw a redundant second frame.\n */\n variant?: \"card\" | \"bare\";\n className?: string;\n}\n\n/**\n * Layout shell for an AI chat built from the AI Elements: a header, a scrollable\n * transcript (give it a <Conversation>, which is `flex-1`), a sticky composer\n * (a <Composer>, the standard chat input), and an optional context rail. Fills\n * its parent's height.\n *\n * Two layout modes (`variant`): a framed `\"card\"` for in-page use, and a\n * frameless `\"bare\"` immersive pane for when the shell already sits inside a\n * bounded region and a second frame would just read as boxy.\n */\nexport function ChatShell({\n children,\n composer,\n header,\n aside,\n variant = \"card\",\n className,\n}: ChatShellProps) {\n const bare = variant === \"bare\";\n return (\n <div\n className={cn(\n \"flex h-full min-h-0 w-full overflow-hidden bg-background\",\n bare ? null : \"rounded-xl border\",\n className,\n )}\n >\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n {header ? (\n <div className={cn(\"flex h-12 shrink-0 items-center px-4\", bare ? null : \"border-b\")}>\n {header}\n </div>\n ) : null}\n\n {bare ? (\n // Immersive transcript: the scroll area fades at both edges so content\n // dissolves under the header and above the composer instead of hitting\n // a hard bordered bar. The overlays are token-driven (`from-background`)\n // so they fade to the shell's own ground in every theme, and inert\n // (`pointer-events-none` + `aria-hidden`) so they never block scroll,\n // steal a tap, or get announced.\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n {children}\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 top-0 z-10 h-8 bg-gradient-to-b from-background to-transparent\"\n />\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 bottom-0 z-10 h-12 bg-gradient-to-t from-background to-transparent\"\n />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col\">{children}</div>\n )}\n\n {composer ? (\n // Bare: the composer floats on the pane ground (transparent, no\n // divider) above the fade; card: the classic bordered footer.\n <div className={cn(\"shrink-0\", bare ? \"relative z-20 px-4 pb-4\" : \"border-t p-3\")}>\n {composer}\n </div>\n ) : null}\n </div>\n {aside ? <div className=\"hidden w-80 shrink-0 border-s lg:block\">{aside}</div> : null}\n </div>\n );\n}\n"],"mappings":"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","names":["useLocale","cn","memo","cn","Component","memo","useMemo","jsx","cn","memo","useMemo","jsx","jsxs","memo","cn","useLocale","forwardRef","useLocale","cn","cn","memo","jsx","jsxs","AgentTimeline","AgentStep","jsx","jsxs","useLocale","cn","forwardRef","AgentEvent","Button","useLocale","cn","createContext","useMemo","jsx","jsxs","Button","cn","useMemo","useState","Button","useLocale","cn","createContext","forwardRef","use","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","ContextPanel","ContextPanelTrigger","ContextPanelHeader","ContextPanelBody","ContextPanelSection","ContextPanelDetail","cn","useEffect","useMemo","useState","Button","useLocale","jsx","useState","useEffect","useMemo","useMemo","jsx","cn","jsx","jsxs","useMemo","useState","Button","cn","Button","cn","XIcon","createContext","useCallback","useContext","useMemo","jsx","jsxs","Skeleton","useLocale","cn","jsx","jsxs","useLocale","cn","Skeleton","useReducedMotion","cn","useLocale","forwardRef","useEffect","useMemo","useRef","useState","jsx","jsxs","AudioVisualizer","Skeleton","cn","Suspense","lazy","jsx","Suspense","Skeleton","cn","Badge","cn","createContext","memo","useContext","useMemo","jsx","jsxs","createContext","useContext","memo","useMemo","cn","Badge","forwardRef","cn","Fragment","jsx","jsxs","ChatGreeting","Button","Tooltip","TooltipContent","TooltipTrigger","cn","jsx","jsxs","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","useLocale","cn","CheckIcon","CopyIcon","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","useCallback","useRef","useState","cn","Kbd","useLocale","HoverCard","HoverCardContent","HoverCardTrigger","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Tooltip","TooltipContent","TooltipProvider","TooltipTrigger","cn","useLocale","ImageIcon","PlusIcon","XIcon","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","forwardRef","useControllableState","cn","jsx","jsxs","PromptInputEffort","forwardRef","useId","useControllableState","DropdownMenu","DropdownMenuContent","DropdownMenuTrigger","cn","jsx","jsxs","forwardRef","PromptInputMode","useControllableState","useId","cn","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","createContext","forwardRef","use","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","cn","useLocale","jsx","jsxs","createContext","forwardRef","PromptInputSlash","useLocale","useRef","useMemo","useState","useCallback","useLayoutEffect","useEffect","cn","PromptInputSlashTextarea","use","Button","cn","useCallback","jsx","jsxs","cn","useCallback","Button","jsx","jsxs","useLocale","useRef","useState","useCallback","cn","Kbd","Kbd","RadioGroup","RadioGroupItem","StatusBadge","useLocale","Button","cn","createContext","forwardRef","useContext","useId","useMemo","useState","jsx","jsxs","ApprovalCardOptions","ApprovalCardTarget","ApprovalCardReason","jsx","jsxs","Suspense","jsx","Suspense","Button","cn","useCallback","Fragment","jsx","jsxs","forwardRef","useCallback","useEffect","useMemo","useRef","useState","Skeleton","useLocale","cn","Fragment","jsx","jsxs","getThemeScope","useMemo","useState","useEffect","useLocale","cn","Skeleton","useRef","useCallback","forwardRef","DiffView","Suspense","jsx","Suspense","Badge","Button","cn","useLocale","CheckIcon","CopyIcon","EyeOffIcon","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","cva","FileIcon","FileTextIcon","ImageIcon","createContext","forwardRef","useCallback","useContext","useMemo","useState","Fragment","jsx","jsxs","noop","FileTree","ProducedAssetTree","Button","Skeleton","cn","useLocale","useReducedMotion","createContext","forwardRef","use","useCallback","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","Gallery","Fragment","useMemo","BrainIcon","ChevronDownIcon","Badge","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","useControllableState","Collapsible","CollapsibleContent","CollapsibleTrigger","useLocale","cn","BrainIcon","ChevronDownIcon","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","Streamdown","Fragment","jsx","jsxs","createContext","useContext","memo","useControllableState","useRef","useState","useEffect","useCallback","useMemo","Collapsible","cn","useLocale","CollapsibleTrigger","BrainIcon","ChevronDownIcon","CollapsibleContent","Streamdown","Skeleton","StatusBadge","useLocale","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","ChevronDownIcon","isValidElement","jsx","jsxs","Collapsible","cn","StatusBadge","CollapsibleTrigger","ChevronDownIcon","CollapsibleContent","useLocale","isValidElement","Skeleton","Fragment","jsx","jsxs","Collapsible","CollapsibleTrigger","cn","BrainIcon","Badge","ChevronDownIcon","CollapsibleContent","useMemo","Skeleton","useLocale","cn","ImageOff","forwardRef","useEffect","useRef","useState","jsx","jsxs","Image","Badge","Carousel","CarouselContent","CarouselItem","HoverCard","HoverCardContent","HoverCardTrigger","cn","useLocale","createContext","useCallback","useContext","useEffect","useState","Fragment","jsx","jsxs","Skeleton","cn","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","Avatar","AvatarFallback","Button","Skeleton","Tooltip","TooltipContent","TooltipProvider","TooltipTrigger","cn","useLocale","cva","BotIcon","ChevronLeftIcon","ChevronRightIcon","createContext","memo","useCallback","useContext","useEffect","useMemo","useState","Streamdown","jsx","jsxs","cn","Avatar","AvatarFallback","cva","useLocale","Button","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Skeleton","createContext","forwardRef","useCallback","useEffect","useId","useMemo","useRef","useState","use","Children","Fragment","useIsMobile","useLocale","cn","jsx","jsxs","createContext","use","useState","useIsMobile","useCallback","useRef","useEffect","useMemo","forwardRef","MessageCompare","MessageCompareLayout","useLocale","Children","cn","props","Fragment","MessageCompareColumn","useId","createContext","forwardRef","use","useCallback","useEffect","useId","useMemo","useRef","useState","Button","Textarea","cn","useLocale","Fragment","jsx","jsxs","MessageEditForm","MessageEditContent","MessageEditTrigger","MessageEdit","forwardRef","useState","cva","Button","cn","useLocale","jsx","jsxs","MessageFeedback","createContext","forwardRef","use","useCallback","useId","useMemo","useState","Check","Badge","Button","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Skeleton","Spinner","Textarea","cn","useLocale","jsx","jsxs","createContext","use","useId","useState","useCallback","value","useMemo","Textarea","Label","useLocale","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","forwardRef","MessageFormField","cn","MessageFormFields","Skeleton","MessageFormSubmit","Badge","Check","Button","Spinner","MessageFormRoot","MessageFormTitle","MessageFormDescription","MessageFormFallback","MessageForm","forwardRef","useId","useMemo","useState","ChevronDown","Badge","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","cn","useLocale","z","jsx","jsxs","forwardRef","MessageTableFallback","cn","MessageTable","useLocale","useId","useState","useMemo","Skeleton","Badge","Table","TableHeader","TableRow","TableHead","ChevronDown","TableBody","TableCell","useControllableState","Button","Command","CommandEmpty","CommandInput","CommandItem","CommandList","Popover","PopoverContent","cn","useLocale","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","jsxs","cn","BotIcon","useState","Fragment","jsx","useReducedMotion","jsx","cn","Suspense","jsx","Suspense","cn","Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","cn","ChevronDownIcon","createContext","useContext","useMemo","jsx","jsxs","Badge","cn","ArrowRightIcon","MinusIcon","PlusIcon","createContext","useContext","useMemo","Fragment","jsx","jsxs","Suspense","jsx","Suspense","forwardRef","useId","Badge","Kbd","Label","RadioGroup","RadioGroupItem","useLocale","cn","jsx","jsxs","PermissionModeSelect","cn","useLocale","lazy","memo","Suspense","useCallback","useState","Fragment","jsx","jsxs","lazy","jsx","cn","memo","useLocale","useState","useCallback","Suspense","jsxs","Fragment","Button","Card","CardAction","CardContent","CardDescription","CardFooter","CardHeader","CardTitle","Collapsible","CollapsibleContent","CollapsibleTrigger","StatusBadge","useLocale","cn","ChevronsUpDownIcon","createContext","useContext","useId","useMemo","jsx","jsxs","createContext","useContext","useId","useMemo","Collapsible","Card","cn","CardHeader","CardTitle","CardDescription","CardAction","CollapsibleContent","CardContent","CardFooter","useLocale","CollapsibleTrigger","Button","ChevronsUpDownIcon","StatusBadge","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","ScrollArea","cn","ChevronDownIcon","PaperclipIcon","jsx","jsxs","Collapsible","CollapsibleContent","CollapsibleTrigger","Skeleton","Tabs","TabsContent","TabsList","TabsTrigger","useLocale","cn","ChevronDownIcon","createContext","use","useMemo","jsx","jsxs","createContext","useMemo","Collapsible","cn","CollapsibleTrigger","ChevronDownIcon","use","useLocale","CollapsibleContent","Skeleton","Tabs","TabsList","TabsTrigger","TabsContent","Badge","Collapsible","CollapsibleContent","CollapsibleTrigger","useLocale","cn","ChevronRightIcon","createContext","useContext","useMemo","Fragment","jsx","jsxs","forwardRef","useCallback","useEffect","useRef","useState","Button","Popover","PopoverAnchor","PopoverContent","cn","useLocale","jsx","jsxs","SelectionToolbar","forwardRef","Sparkles","Button","cn","Heading","Kbd","useLocale","Fragment","jsx","jsxs","SessionHeader","cn","useLocale","Folder","forwardRef","jsx","jsxs","SessionStatusBar","InputGroup","InputGroupAddon","InputGroupButton","cn","useLocale","CheckIcon","CopyIcon","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","jsx","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","ChevronDownIcon","Fragment","jsx","jsxs","Button","Spinner","cn","SquareIcon","useCallback","useEffect","useRef","useState","jsx","jsxs","useControllableState","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","useLocale","cn","AlertTriangleIcon","CheckIcon","ChevronDownIcon","CopyIcon","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","handleActionsClick","handleActionsKeyDown","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","ChevronDownIcon","jsx","jsxs","cn","Collapsible","CollapsibleTrigger","ChevronDownIcon","CollapsibleContent","StatusBadge","StatusIcon","Collapsible","CollapsibleContent","CollapsibleTrigger","cn","ChevronRightIcon","createContext","useContext","useMemo","Fragment","jsx","jsxs","Button","HoverCard","HoverCardContent","HoverCardTrigger","useLocale","cn","createContext","useContext","useMemo","Fragment","jsx","jsxs","StatusBadge","cn","forwardRef","jsx","jsxs","ToolResultCard","Suspense","jsx","Suspense","useControllableState","cn","createContext","useCallback","useContext","useMemo","jsx","Button","cn","formatElapsed","useLocale","ArrowDownIcon","SquareIcon","forwardRef","jsx","jsxs","TurnStatus","useEffect","useState","useControllableState","Button","Command","CommandEmpty","CommandGroup","CommandInput","CommandItem","CommandList","CommandSeparator","Dialog","DialogContent","DialogTitle","Spinner","cn","useLocale","createContext","useCallback","useContext","useMemo","jsx","jsxs","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Input","Skeleton","Tooltip","TooltipContent","TooltipProvider","TooltipTrigger","cn","useLocale","ChevronDownIcon","createContext","useCallback","useContext","useMemo","useState","jsx","jsxs","cn","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|