@elabs-ai/components-ai 4.2.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 +1 -1
- package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
- package/dist/_code-block-theme.js +12 -0
- package/dist/_code-block-theme.js.map +1 -0
- package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
- package/dist/_flow-boundary.js.map +1 -0
- package/dist/_flow-lazy.js +8 -0
- package/dist/_flow-lazy.js.map +1 -0
- package/dist/_lazy-boundary-conformance.js +2 -0
- package/dist/_lazy-boundary-conformance.js.map +1 -0
- package/dist/_lazy-cjk.js +13 -0
- package/dist/_lazy-cjk.js.map +1 -0
- package/dist/_lazy-engine-boundary.js +9 -0
- package/dist/_lazy-engine-boundary.js.map +1 -0
- package/dist/_lazy-math.js +13 -0
- package/dist/_lazy-math.js.map +1 -0
- package/dist/_lazy-mermaid.js +12 -0
- package/dist/_lazy-mermaid.js.map +1 -0
- package/dist/_mermaid-error-panel.js +9 -0
- package/dist/_mermaid-error-panel.js.map +1 -0
- package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
- package/dist/_persona-rive.js.map +1 -0
- package/dist/_streamdown-i18n.js +21 -0
- package/dist/_streamdown-i18n.js.map +1 -0
- package/dist/_streamdown-safety.js +10 -0
- package/dist/_streamdown-safety.js.map +1 -0
- package/dist/_theme-scope-store.js +13 -0
- package/dist/_theme-scope-store.js.map +1 -0
- package/dist/a2ui/a2ui-surface.js +17 -0
- package/dist/a2ui/a2ui-surface.js.map +1 -0
- package/dist/a2ui/core/catalog.generated.js +10 -0
- package/dist/a2ui/core/catalog.generated.js.map +1 -0
- package/dist/a2ui/core/complete-json.js +10 -0
- package/dist/a2ui/core/complete-json.js.map +1 -0
- package/dist/a2ui/core/index.js +37 -0
- package/dist/a2ui/core/index.js.map +1 -0
- package/dist/a2ui/core/schema.js +11 -0
- package/dist/a2ui/core/schema.js.map +1 -0
- package/dist/a2ui/core/spec.js +10 -0
- package/dist/a2ui/core/spec.js.map +1 -0
- package/dist/a2ui/core/validate.js +16 -0
- package/dist/a2ui/core/validate.js.map +1 -0
- package/dist/a2ui/index.js +54 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/ui-catalog.js +18 -0
- package/dist/a2ui/ui-catalog.js.map +1 -0
- package/dist/agent-event.js +10 -0
- package/dist/agent-event.js.map +1 -0
- package/dist/agent-timeline.js +11 -0
- package/dist/agent-timeline.js.map +1 -0
- package/dist/agent.js +25 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.js +23 -0
- package/dist/artifact.js.map +1 -0
- package/dist/asset-preview.js +22 -0
- package/dist/asset-preview.js.map +1 -0
- package/dist/attachments.js +33 -0
- package/dist/attachments.js.map +1 -0
- package/dist/audio-player.js +30 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-visualizer.js +9 -0
- package/dist/audio-visualizer.js.map +1 -0
- package/dist/canvas.js +10 -0
- package/dist/canvas.js.map +1 -0
- package/dist/chain-of-thought.js +22 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/chat-greeting.js +8 -0
- package/dist/chat-greeting.js.map +1 -0
- package/dist/chat-shell.js +9 -0
- package/dist/chat-shell.js.map +1 -0
- package/dist/checkpoint.js +13 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/chunk-2XOIG5TG.js +72 -0
- package/dist/chunk-2XOIG5TG.js.map +1 -0
- package/dist/chunk-34CQ2VHM.js +172 -0
- package/dist/chunk-34CQ2VHM.js.map +1 -0
- package/dist/chunk-3TDHPXZZ.js +60 -0
- package/dist/chunk-3TDHPXZZ.js.map +1 -0
- package/dist/chunk-3XNPMDZY.js +478 -0
- package/dist/chunk-3XNPMDZY.js.map +1 -0
- package/dist/chunk-3YPT3V7L.js +56 -0
- package/dist/chunk-3YPT3V7L.js.map +1 -0
- package/dist/chunk-475UEU2Q.js +87 -0
- package/dist/chunk-475UEU2Q.js.map +1 -0
- package/dist/chunk-4CBTII2I.js +95 -0
- package/dist/chunk-4CBTII2I.js.map +1 -0
- package/dist/chunk-4XRNIZMG.js +22 -0
- package/dist/chunk-4XRNIZMG.js.map +1 -0
- package/dist/chunk-5NNWUKK5.js +2 -0
- package/dist/chunk-5NNWUKK5.js.map +1 -0
- package/dist/chunk-5UOMU27Z.js +164 -0
- package/dist/chunk-5UOMU27Z.js.map +1 -0
- package/dist/chunk-5VGYZ62I.js +264 -0
- package/dist/chunk-5VGYZ62I.js.map +1 -0
- package/dist/chunk-6IQPH2OS.js +21 -0
- package/dist/chunk-6IQPH2OS.js.map +1 -0
- package/dist/chunk-6PB2MXCI.js +482 -0
- package/dist/chunk-6PB2MXCI.js.map +1 -0
- package/dist/chunk-7FD5CZEU.js +215 -0
- package/dist/chunk-7FD5CZEU.js.map +1 -0
- package/dist/chunk-7RL6KZDF.js +266 -0
- package/dist/chunk-7RL6KZDF.js.map +1 -0
- package/dist/chunk-ADOYAGGK.js +482 -0
- package/dist/chunk-ADOYAGGK.js.map +1 -0
- package/dist/chunk-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 +366 -98
- package/dist/index.js +672 -13577
- package/dist/index.js.map +1 -1
- package/dist/inline-citation.js +39 -0
- package/dist/inline-citation.js.map +1 -0
- package/dist/jsx-preview.js +17 -0
- package/dist/jsx-preview.js.map +1 -0
- package/dist/markdown-view.js +17 -0
- package/dist/markdown-view.js.map +1 -0
- package/dist/message-compare.js +12 -0
- package/dist/message-compare.js.map +1 -0
- package/dist/message-edit.js +19 -0
- package/dist/message-edit.js.map +1 -0
- package/dist/message-feedback.js +11 -0
- package/dist/message-feedback.js.map +1 -0
- package/dist/message-form-spec.js +38 -0
- package/dist/message-form-spec.js.map +1 -0
- package/dist/message-form.js +26 -0
- package/dist/message-form.js.map +1 -0
- package/dist/message-table-spec.js +26 -0
- package/dist/message-table-spec.js.map +1 -0
- package/dist/message-table.js +12 -0
- package/dist/message-table.js.map +1 -0
- package/dist/message.js +51 -0
- package/dist/message.js.map +1 -0
- package/dist/mic-selector.js +27 -0
- package/dist/mic-selector.js.map +1 -0
- package/dist/model-provider-logo.js +13 -0
- package/dist/model-provider-logo.js.map +1 -0
- package/dist/motion-config.js +9 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/open-in-chat.js +31 -0
- package/dist/open-in-chat.js.map +1 -0
- package/dist/package-info.js +25 -0
- package/dist/package-info.js.map +1 -0
- package/dist/panel.js +10 -0
- package/dist/panel.js.map +1 -0
- package/dist/part-groups.js +18 -0
- package/dist/part-groups.js.map +1 -0
- package/dist/permission-mode-select.js +9 -0
- package/dist/permission-mode-select.js.map +1 -0
- package/dist/persona-sources.js +8 -0
- package/dist/persona-sources.js.map +1 -0
- package/dist/persona.js +14 -0
- package/dist/persona.js.map +1 -0
- package/dist/plan.js +32 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompt-input-effort.js +9 -0
- package/dist/prompt-input-effort.js.map +1 -0
- package/dist/prompt-input-mode.js +10 -0
- package/dist/prompt-input-mode.js.map +1 -0
- package/dist/prompt-input-slash.js +12 -0
- package/dist/prompt-input-slash.js.map +1 -0
- package/dist/prompt-input.js +89 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/queue.js +37 -0
- package/dist/queue.js.map +1 -0
- package/dist/reasoning.js +23 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/sandbox.js +28 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-display.js +33 -0
- package/dist/schema-display.js.map +1 -0
- package/dist/selection-toolbar.js +11 -0
- package/dist/selection-toolbar.js.map +1 -0
- package/dist/session-header.js +9 -0
- package/dist/session-header.js.map +1 -0
- package/dist/session-status-bar.js +9 -0
- package/dist/session-status-bar.js.map +1 -0
- package/dist/shimmer.js +9 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/snippet.js +17 -0
- package/dist/snippet.js.map +1 -0
- package/dist/sources.js +17 -0
- package/dist/sources.js.map +1 -0
- package/dist/speech-input.js +9 -0
- package/dist/speech-input.js.map +1 -0
- package/dist/stack-trace.js +27 -0
- package/dist/stack-trace.js.map +1 -0
- package/dist/suggestion.js +16 -0
- package/dist/suggestion.js.map +1 -0
- package/dist/task.js +18 -0
- package/dist/task.js.map +1 -0
- package/dist/test-results.js +43 -0
- package/dist/test-results.js.map +1 -0
- package/dist/token-usage.js +27 -0
- package/dist/token-usage.js.map +1 -0
- package/dist/tool-result-card.js +9 -0
- package/dist/tool-result-card.js.map +1 -0
- package/dist/tool.js +27 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolbar.js +10 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/transcription.js +11 -0
- package/dist/transcription.js.map +1 -0
- package/dist/turn-status.js +9 -0
- package/dist/turn-status.js.map +1 -0
- package/dist/use-audio-level.js +9 -0
- package/dist/use-audio-level.js.map +1 -0
- package/dist/voice-selector.js +47 -0
- package/dist/voice-selector.js.map +1 -0
- package/dist/web-preview.js +19 -0
- package/dist/web-preview.js.map +1 -0
- package/package.json +11 -9
- package/schemas/a2ui-surface.v1.schema.json +5425 -0
- package/src/_chat-shell-rail.tsx +3 -1
- package/src/_flow-boundary.tsx +2 -2
- package/src/_persona-rive.tsx +27 -41
- package/src/a2ui/a2ui-surface.stories.tsx +662 -0
- package/src/a2ui/a2ui-surface.test.tsx +201 -0
- package/src/a2ui/a2ui-surface.tsx +354 -0
- package/src/a2ui/catalog.source.json +772 -0
- package/src/a2ui/core/a2ui-core.test.ts +178 -0
- package/src/a2ui/core/catalog.generated.ts +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/agentic-workspace.stories.tsx +6 -45
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +1 -1
- package/src/conversation.stories.tsx +1 -0
- package/src/conversation.test.tsx +16 -0
- package/src/conversation.tsx +16 -2
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.tsx +3 -2
- package/src/file-tree.tsx +24 -17
- package/src/gallery.stories.tsx +42 -0
- package/src/gallery.tsx +2 -2
- package/src/grouped-parts.stories.tsx +23 -0
- package/src/grouped-parts.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.tsx +1 -1
- package/src/message-table.stories.tsx +24 -0
- package/src/message-table.tsx +1 -1
- package/src/package-info.tsx +12 -9
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +1 -1
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/tool.stories.tsx +39 -0
- package/src/tool.tsx +3 -3
- package/src/toolbar.tsx +0 -10
- package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
- package/dist/_persona-rive-JEG44YHX.js.map +0 -1
- /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
MarkdownView
|
|
4
|
+
} from "./chunk-V4DORGWJ.js";
|
|
5
|
+
import {
|
|
6
|
+
useAssetPreviewRenderer
|
|
7
|
+
} from "./chunk-NPUCMAG2.js";
|
|
8
|
+
import {
|
|
9
|
+
CodeBlock
|
|
10
|
+
} from "./chunk-TWPHAJNM.js";
|
|
11
|
+
import {
|
|
12
|
+
Artifact,
|
|
13
|
+
ArtifactActions,
|
|
14
|
+
ArtifactContent,
|
|
15
|
+
ArtifactHeader,
|
|
16
|
+
ArtifactTitle
|
|
17
|
+
} from "./chunk-DDG5JHQT.js";
|
|
18
|
+
|
|
19
|
+
// src/asset-preview.tsx
|
|
20
|
+
import {
|
|
21
|
+
Button,
|
|
22
|
+
Table,
|
|
23
|
+
TableBody,
|
|
24
|
+
TableCell,
|
|
25
|
+
TableHead,
|
|
26
|
+
TableHeader,
|
|
27
|
+
TableRow,
|
|
28
|
+
useLocale
|
|
29
|
+
} from "@elabs-ai/components-ui";
|
|
30
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
31
|
+
import { useMemo, useState } from "react";
|
|
32
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
33
|
+
var DEFAULT_CODE_LANGUAGE = "typescript";
|
|
34
|
+
function assetLanguage(asset) {
|
|
35
|
+
switch (asset.type) {
|
|
36
|
+
case "markdown":
|
|
37
|
+
return "markdown";
|
|
38
|
+
case "sql":
|
|
39
|
+
return "sql";
|
|
40
|
+
case "csv":
|
|
41
|
+
return "csv";
|
|
42
|
+
case "code":
|
|
43
|
+
return asset.language ?? DEFAULT_CODE_LANGUAGE;
|
|
44
|
+
default:
|
|
45
|
+
return DEFAULT_CODE_LANGUAGE;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function parseCsvRows(content) {
|
|
49
|
+
const rows = [];
|
|
50
|
+
let row = [];
|
|
51
|
+
let field = "";
|
|
52
|
+
let wasQuoted = false;
|
|
53
|
+
let inQuotes = false;
|
|
54
|
+
const endField = () => {
|
|
55
|
+
row.push(wasQuoted ? field : field.trim());
|
|
56
|
+
field = "";
|
|
57
|
+
wasQuoted = false;
|
|
58
|
+
};
|
|
59
|
+
const endRow = () => {
|
|
60
|
+
endField();
|
|
61
|
+
rows.push(row);
|
|
62
|
+
row = [];
|
|
63
|
+
};
|
|
64
|
+
for (let i = 0; i < content.length; i++) {
|
|
65
|
+
const ch = content[i];
|
|
66
|
+
if (inQuotes) {
|
|
67
|
+
if (ch === '"') {
|
|
68
|
+
if (content[i + 1] === '"') {
|
|
69
|
+
field += '"';
|
|
70
|
+
i += 1;
|
|
71
|
+
} else {
|
|
72
|
+
inQuotes = false;
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
field += ch;
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (ch === '"' && field === "") {
|
|
80
|
+
inQuotes = true;
|
|
81
|
+
wasQuoted = true;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (ch === ",") {
|
|
85
|
+
endField();
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (ch === "\r") {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (ch === "\n") {
|
|
92
|
+
endRow();
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
field += ch;
|
|
96
|
+
}
|
|
97
|
+
if (field !== "" || row.length > 0) {
|
|
98
|
+
endRow();
|
|
99
|
+
}
|
|
100
|
+
return rows;
|
|
101
|
+
}
|
|
102
|
+
function parseCsv(content) {
|
|
103
|
+
const rows = parseCsvRows(content.trim()).filter((r) => !(r.length === 1 && r[0] === ""));
|
|
104
|
+
const [header = [], ...rest] = rows;
|
|
105
|
+
return { header, rows: rest };
|
|
106
|
+
}
|
|
107
|
+
var CsvPreview = ({ content }) => {
|
|
108
|
+
const { t } = useLocale();
|
|
109
|
+
const { header, rows } = useMemo(() => parseCsv(content), [content]);
|
|
110
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
111
|
+
/* @__PURE__ */ jsxs(Table, { className: "text-body tabular-nums", children: [
|
|
112
|
+
/* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsx(TableRow, { children: header.map((cell) => /* @__PURE__ */ jsx(TableHead, { children: cell }, cell)) }) }),
|
|
113
|
+
/* @__PURE__ */ jsx(TableBody, { children: rows.map((row, rowIndex) => (
|
|
114
|
+
// Rows have no stable identity in raw CSV — index is the key.
|
|
115
|
+
// oxlint-disable-next-line eslint-plugin-react(no-array-index-key)
|
|
116
|
+
/* @__PURE__ */ jsx(TableRow, { children: row.map((cell, cellIndex) => (
|
|
117
|
+
// oxlint-disable-next-line eslint-plugin-react(no-array-index-key)
|
|
118
|
+
/* @__PURE__ */ jsx(TableCell, { children: cell }, `cell-${rowIndex}-${cellIndex}`)
|
|
119
|
+
)) }, `row-${rowIndex}`)
|
|
120
|
+
)) })
|
|
121
|
+
] }),
|
|
122
|
+
/* @__PURE__ */ jsx("p", { className: "text-meta text-muted-foreground", children: t("ai.assetPreview.rowCount", { count: rows.length }) })
|
|
123
|
+
] });
|
|
124
|
+
};
|
|
125
|
+
var AssetPreview = ({
|
|
126
|
+
asset,
|
|
127
|
+
defaultMode = "preview",
|
|
128
|
+
renderPreview,
|
|
129
|
+
className,
|
|
130
|
+
...props
|
|
131
|
+
}) => {
|
|
132
|
+
const { t } = useLocale();
|
|
133
|
+
const [mode, setMode] = useState(defaultMode);
|
|
134
|
+
const injectedRenderer = useAssetPreviewRenderer();
|
|
135
|
+
const content = asset.content ?? "";
|
|
136
|
+
const hasRaw = asset.type !== "image" && content.length > 0;
|
|
137
|
+
const showRaw = mode === "raw" && hasRaw;
|
|
138
|
+
const render = renderPreview ?? injectedRenderer;
|
|
139
|
+
const injected = !showRaw && render ? render(asset) : null;
|
|
140
|
+
let body;
|
|
141
|
+
if (injected !== null) {
|
|
142
|
+
body = injected;
|
|
143
|
+
} else if (asset.type !== "image" && content.length === 0) {
|
|
144
|
+
body = /* @__PURE__ */ jsx("p", { className: "text-body text-muted-foreground", children: t("ai.assetPreview.noPreview") });
|
|
145
|
+
} else if (showRaw) {
|
|
146
|
+
body = /* @__PURE__ */ jsx(CodeBlock, { code: content, language: assetLanguage(asset), wrap: true });
|
|
147
|
+
} else {
|
|
148
|
+
switch (asset.type) {
|
|
149
|
+
case "markdown": {
|
|
150
|
+
body = /* @__PURE__ */ jsx(MarkdownView, { baseHeadingLevel: 2, children: content });
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case "code":
|
|
154
|
+
case "sql": {
|
|
155
|
+
body = /* @__PURE__ */ jsx(CodeBlock, { code: content, language: assetLanguage(asset), showLineNumbers: true, wrap: true });
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case "csv": {
|
|
159
|
+
body = /* @__PURE__ */ jsx(CsvPreview, { content });
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case "image": {
|
|
163
|
+
body = /* @__PURE__ */ jsx(
|
|
164
|
+
"img",
|
|
165
|
+
{
|
|
166
|
+
src: content || asset.path,
|
|
167
|
+
alt: asset.name,
|
|
168
|
+
loading: "lazy",
|
|
169
|
+
className: "max-w-full rounded-md"
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return /* @__PURE__ */ jsxs(Artifact, { "data-slot": "asset-preview", className, ...props, children: [
|
|
177
|
+
/* @__PURE__ */ jsxs(ArtifactHeader, { children: [
|
|
178
|
+
/* @__PURE__ */ jsx(ArtifactTitle, { className: "min-w-0 truncate", children: asset.name }),
|
|
179
|
+
hasRaw ? /* @__PURE__ */ jsxs(ArtifactActions, { children: [
|
|
180
|
+
/* @__PURE__ */ jsx(
|
|
181
|
+
Button,
|
|
182
|
+
{
|
|
183
|
+
type: "button",
|
|
184
|
+
variant: "ghost",
|
|
185
|
+
size: "sm",
|
|
186
|
+
"aria-pressed": !showRaw,
|
|
187
|
+
className: cn(!showRaw && "bg-accent text-accent-foreground"),
|
|
188
|
+
onClick: () => setMode("preview"),
|
|
189
|
+
children: t("ai.assetPreview.preview")
|
|
190
|
+
}
|
|
191
|
+
),
|
|
192
|
+
/* @__PURE__ */ jsx(
|
|
193
|
+
Button,
|
|
194
|
+
{
|
|
195
|
+
type: "button",
|
|
196
|
+
variant: "ghost",
|
|
197
|
+
size: "sm",
|
|
198
|
+
"aria-pressed": showRaw,
|
|
199
|
+
className: cn(showRaw && "bg-accent text-accent-foreground"),
|
|
200
|
+
onClick: () => setMode("raw"),
|
|
201
|
+
children: t("ai.assetPreview.raw")
|
|
202
|
+
}
|
|
203
|
+
)
|
|
204
|
+
] }) : null
|
|
205
|
+
] }),
|
|
206
|
+
/* @__PURE__ */ jsx(ArtifactContent, { children: body })
|
|
207
|
+
] });
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
export {
|
|
211
|
+
AssetPreview
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=chunk-RB7G65JC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/asset-preview.tsx"],"sourcesContent":["\"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 useLocale,\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/**\n * A small RFC 4180-ish CSV tokenizer: handles quoted fields (commas and\n * newlines inside quotes don't end the field/row) and the `\"\"` escaped-quote\n * convention. Single pass over the raw string — no line pre-split, so a\n * quoted field spanning multiple lines survives intact. Still preview-grade\n * (unquoted cells are trimmed for the glance table), not a full CSV grammar.\n */\nfunction parseCsvRows(content: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let wasQuoted = false;\n let inQuotes = false;\n\n const endField = () => {\n row.push(wasQuoted ? field : field.trim());\n field = \"\";\n wasQuoted = false;\n };\n const endRow = () => {\n endField();\n rows.push(row);\n row = [];\n };\n\n for (let i = 0; i < content.length; i++) {\n const ch = content[i];\n\n if (inQuotes) {\n if (ch === '\"') {\n if (content[i + 1] === '\"') {\n field += '\"';\n i += 1;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n\n if (ch === '\"' && field === \"\") {\n inQuotes = true;\n wasQuoted = true;\n continue;\n }\n\n if (ch === \",\") {\n endField();\n continue;\n }\n\n if (ch === \"\\r\") {\n continue;\n }\n\n if (ch === \"\\n\") {\n endRow();\n continue;\n }\n\n field += ch;\n }\n\n // A trailing field/row with no terminating newline.\n if (field !== \"\" || row.length > 0) {\n endRow();\n }\n\n return rows;\n}\n\nfunction parseCsv(content: string): ParsedCsv {\n const rows = parseCsvRows(content.trim()).filter((r) => !(r.length === 1 && r[0] === \"\"));\n const [header = [], ...rest] = rows;\n return { header, rows: rest };\n}\n\nconst CsvPreview = ({ content }: { content: string }) => {\n const { t } = useLocale();\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 {t(\"ai.assetPreview.rowCount\", { count: rows.length })}\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 { t } = useLocale();\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\">{t(\"ai.assetPreview.noPreview\")}</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 {t(\"ai.assetPreview.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 {t(\"ai.assetPreview.raw\")}\n </Button>\n </ArtifactActions>\n ) : null}\n </ArtifactHeader>\n <ArtifactContent>{body}</ArtifactContent>\n </Artifact>\n );\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/chat-greeting.tsx
|
|
4
|
+
import { forwardRef } from "react";
|
|
5
|
+
import { cn, Heading } from "@elabs-ai/components-ui";
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
var ChatGreeting = forwardRef(function ChatGreeting2({ title, subtitle, accent, orb = true, level = 1, className, ...props }, ref) {
|
|
8
|
+
const hasSecondLine = subtitle != null || accent != null;
|
|
9
|
+
return /* @__PURE__ */ jsxs(
|
|
10
|
+
"div",
|
|
11
|
+
{
|
|
12
|
+
ref,
|
|
13
|
+
"data-slot": "chat-greeting",
|
|
14
|
+
className: cn("relative isolate mb-10 text-center", className),
|
|
15
|
+
...props,
|
|
16
|
+
children: [
|
|
17
|
+
orb ? /* @__PURE__ */ jsx(
|
|
18
|
+
"div",
|
|
19
|
+
{
|
|
20
|
+
"aria-hidden": "true",
|
|
21
|
+
"data-slot": "chat-greeting-orb",
|
|
22
|
+
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"
|
|
23
|
+
}
|
|
24
|
+
) : null,
|
|
25
|
+
/* @__PURE__ */ jsxs(Heading, { "data-slot": "chat-greeting-title", level, size: "display", children: [
|
|
26
|
+
title,
|
|
27
|
+
hasSecondLine ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
29
|
+
subtitle,
|
|
30
|
+
subtitle != null && accent != null ? " " : null,
|
|
31
|
+
accent != null ? (
|
|
32
|
+
// #399 — accent phrase inside a headline is TEXT: `-text` rung.
|
|
33
|
+
/* @__PURE__ */ jsx("span", { className: "font-bold text-primary-text underline decoration-2 underline-offset-4", children: accent })
|
|
34
|
+
) : null
|
|
35
|
+
] }) : null
|
|
36
|
+
] })
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
ChatGreeting
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunk-RPHAOR7P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chat-greeting.tsx"],"sourcesContent":["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"],"mappings":";;;AACA,SAAS,kBAAkB;AAC3B,SAAS,IAAI,eAAkC;AAgEvC,SASE,UATF,KASE,YATF;AAnBD,IAAM,eAAe,WAA8C,SAASA,cACjF,EAAE,OAAO,UAAU,QAAQ,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,MAAM,GACtE,KACA;AACA,QAAM,gBAAgB,YAAY,QAAQ,UAAU;AAEpD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MAMV,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA,MAEH;AAAA,cACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,aAAU;AAAA,YACV,WAAU;AAAA;AAAA,QACZ,IACE;AAAA,QACJ,qBAAC,WAAQ,aAAU,uBAAsB,OAAc,MAAK,WACzD;AAAA;AAAA,UACA,gBACC,iCACE;AAAA,gCAAC,QAAG;AAAA,YACH;AAAA,YACA,YAAY,QAAQ,UAAU,OAAO,MAAM;AAAA,YAC3C,UAAU;AAAA;AAAA,cAET,oBAAC,UAAK,WAAU,yEACb,kBACH;AAAA,gBACE;AAAA,aACN,IACE;AAAA,WACN;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["ChatGreeting"]}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/voice-selector.tsx
|
|
4
|
+
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
5
|
+
import { Button } from "@elabs-ai/components-ui";
|
|
6
|
+
import {
|
|
7
|
+
Command,
|
|
8
|
+
CommandDialog,
|
|
9
|
+
CommandEmpty,
|
|
10
|
+
CommandGroup,
|
|
11
|
+
CommandInput,
|
|
12
|
+
CommandItem,
|
|
13
|
+
CommandList,
|
|
14
|
+
CommandSeparator,
|
|
15
|
+
CommandShortcut
|
|
16
|
+
} from "@elabs-ai/components-ui";
|
|
17
|
+
import { Dialog, DialogContent, DialogTitle, DialogTrigger } from "@elabs-ai/components-ui";
|
|
18
|
+
import { Spinner } from "@elabs-ai/components-ui";
|
|
19
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
20
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
21
|
+
import {
|
|
22
|
+
CircleSmallIcon,
|
|
23
|
+
MarsIcon,
|
|
24
|
+
MarsStrokeIcon,
|
|
25
|
+
NonBinaryIcon,
|
|
26
|
+
PauseIcon,
|
|
27
|
+
PlayIcon,
|
|
28
|
+
TransgenderIcon,
|
|
29
|
+
VenusAndMarsIcon,
|
|
30
|
+
VenusIcon
|
|
31
|
+
} from "lucide-react";
|
|
32
|
+
import { createContext, useCallback, useContext, useMemo } from "react";
|
|
33
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
34
|
+
var VoiceSelectorContext = createContext(null);
|
|
35
|
+
var useVoiceSelector = () => {
|
|
36
|
+
const context = useContext(VoiceSelectorContext);
|
|
37
|
+
if (!context) {
|
|
38
|
+
throw new Error("VoiceSelector components must be used within VoiceSelector");
|
|
39
|
+
}
|
|
40
|
+
return context;
|
|
41
|
+
};
|
|
42
|
+
var VoiceSelector = ({
|
|
43
|
+
value: valueProp,
|
|
44
|
+
defaultValue,
|
|
45
|
+
onValueChange,
|
|
46
|
+
open: openProp,
|
|
47
|
+
defaultOpen = false,
|
|
48
|
+
onOpenChange,
|
|
49
|
+
children,
|
|
50
|
+
...props
|
|
51
|
+
}) => {
|
|
52
|
+
const [value, setValue] = useControllableState({
|
|
53
|
+
defaultProp: defaultValue,
|
|
54
|
+
onChange: onValueChange,
|
|
55
|
+
prop: valueProp
|
|
56
|
+
});
|
|
57
|
+
const [open, setOpen] = useControllableState({
|
|
58
|
+
defaultProp: defaultOpen,
|
|
59
|
+
onChange: onOpenChange,
|
|
60
|
+
prop: openProp
|
|
61
|
+
});
|
|
62
|
+
const voiceSelectorContext = useMemo(
|
|
63
|
+
() => ({ open, setOpen, setValue, value }),
|
|
64
|
+
[value, setValue, open, setOpen]
|
|
65
|
+
);
|
|
66
|
+
return /* @__PURE__ */ jsx(VoiceSelectorContext.Provider, { value: voiceSelectorContext, children: /* @__PURE__ */ jsx(Dialog, { onOpenChange: setOpen, open, ...props, children }) });
|
|
67
|
+
};
|
|
68
|
+
var VoiceSelectorTrigger = (props) => /* @__PURE__ */ jsx(DialogTrigger, { ...props });
|
|
69
|
+
var VoiceSelectorContent = ({
|
|
70
|
+
className,
|
|
71
|
+
children,
|
|
72
|
+
title = "Voice Selector",
|
|
73
|
+
...props
|
|
74
|
+
}) => /* @__PURE__ */ jsxs(DialogContent, { "aria-describedby": void 0, className: cn("p-0", className), ...props, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(DialogTitle, { className: "sr-only", children: title }),
|
|
76
|
+
/* @__PURE__ */ jsx(Command, { className: "**:data-[slot=command-input-wrapper]:h-auto", children })
|
|
77
|
+
] });
|
|
78
|
+
var VoiceSelectorDialog = (props) => /* @__PURE__ */ jsx(CommandDialog, { ...props });
|
|
79
|
+
var VoiceSelectorInput = ({ className, ...props }) => /* @__PURE__ */ jsx(CommandInput, { className: cn("h-auto py-3.5", className), ...props });
|
|
80
|
+
var VoiceSelectorList = (props) => /* @__PURE__ */ jsx(CommandList, { ...props });
|
|
81
|
+
var VoiceSelectorEmpty = (props) => /* @__PURE__ */ jsx(CommandEmpty, { ...props });
|
|
82
|
+
var VoiceSelectorGroup = (props) => /* @__PURE__ */ jsx(CommandGroup, { ...props });
|
|
83
|
+
var VoiceSelectorItem = ({ className, ...props }) => /* @__PURE__ */ jsx(CommandItem, { className: cn("px-4 py-2", className), ...props });
|
|
84
|
+
var VoiceSelectorShortcut = (props) => /* @__PURE__ */ jsx(CommandShortcut, { ...props });
|
|
85
|
+
var VoiceSelectorSeparator = (props) => /* @__PURE__ */ jsx(CommandSeparator, { ...props });
|
|
86
|
+
var VoiceSelectorGender = ({
|
|
87
|
+
className,
|
|
88
|
+
value,
|
|
89
|
+
children,
|
|
90
|
+
...props
|
|
91
|
+
}) => {
|
|
92
|
+
let icon = null;
|
|
93
|
+
switch (value) {
|
|
94
|
+
case "male": {
|
|
95
|
+
icon = /* @__PURE__ */ jsx(MarsIcon, { className: "size-4" });
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case "female": {
|
|
99
|
+
icon = /* @__PURE__ */ jsx(VenusIcon, { className: "size-4" });
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "transgender": {
|
|
103
|
+
icon = /* @__PURE__ */ jsx(TransgenderIcon, { className: "size-4" });
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case "androgyne": {
|
|
107
|
+
icon = /* @__PURE__ */ jsx(MarsStrokeIcon, { className: "size-4" });
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case "non-binary": {
|
|
111
|
+
icon = /* @__PURE__ */ jsx(NonBinaryIcon, { className: "size-4" });
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
case "intersex": {
|
|
115
|
+
icon = /* @__PURE__ */ jsx(VenusAndMarsIcon, { className: "size-4" });
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
default: {
|
|
119
|
+
icon = /* @__PURE__ */ jsx(CircleSmallIcon, { className: "size-4" });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props, children: children ?? icon });
|
|
123
|
+
};
|
|
124
|
+
var VoiceSelectorAccent = ({
|
|
125
|
+
className,
|
|
126
|
+
value,
|
|
127
|
+
children,
|
|
128
|
+
...props
|
|
129
|
+
}) => {
|
|
130
|
+
let emoji = null;
|
|
131
|
+
switch (value) {
|
|
132
|
+
case "american": {
|
|
133
|
+
emoji = "\u{1F1FA}\u{1F1F8}";
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case "british": {
|
|
137
|
+
emoji = "\u{1F1EC}\u{1F1E7}";
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case "australian": {
|
|
141
|
+
emoji = "\u{1F1E6}\u{1F1FA}";
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
case "canadian": {
|
|
145
|
+
emoji = "\u{1F1E8}\u{1F1E6}";
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
case "irish": {
|
|
149
|
+
emoji = "\u{1F1EE}\u{1F1EA}";
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case "scottish": {
|
|
153
|
+
emoji = "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}";
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "indian": {
|
|
157
|
+
emoji = "\u{1F1EE}\u{1F1F3}";
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
case "south-african": {
|
|
161
|
+
emoji = "\u{1F1FF}\u{1F1E6}";
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
case "new-zealand": {
|
|
165
|
+
emoji = "\u{1F1F3}\u{1F1FF}";
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case "spanish": {
|
|
169
|
+
emoji = "\u{1F1EA}\u{1F1F8}";
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
case "french": {
|
|
173
|
+
emoji = "\u{1F1EB}\u{1F1F7}";
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case "german": {
|
|
177
|
+
emoji = "\u{1F1E9}\u{1F1EA}";
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "italian": {
|
|
181
|
+
emoji = "\u{1F1EE}\u{1F1F9}";
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case "portuguese": {
|
|
185
|
+
emoji = "\u{1F1F5}\u{1F1F9}";
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
case "brazilian": {
|
|
189
|
+
emoji = "\u{1F1E7}\u{1F1F7}";
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "mexican": {
|
|
193
|
+
emoji = "\u{1F1F2}\u{1F1FD}";
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case "argentinian": {
|
|
197
|
+
emoji = "\u{1F1E6}\u{1F1F7}";
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
case "japanese": {
|
|
201
|
+
emoji = "\u{1F1EF}\u{1F1F5}";
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
case "chinese": {
|
|
205
|
+
emoji = "\u{1F1E8}\u{1F1F3}";
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
case "korean": {
|
|
209
|
+
emoji = "\u{1F1F0}\u{1F1F7}";
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case "russian": {
|
|
213
|
+
emoji = "\u{1F1F7}\u{1F1FA}";
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case "arabic": {
|
|
217
|
+
emoji = "\u{1F1F8}\u{1F1E6}";
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
case "dutch": {
|
|
221
|
+
emoji = "\u{1F1F3}\u{1F1F1}";
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
case "swedish": {
|
|
225
|
+
emoji = "\u{1F1F8}\u{1F1EA}";
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case "norwegian": {
|
|
229
|
+
emoji = "\u{1F1F3}\u{1F1F4}";
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
case "danish": {
|
|
233
|
+
emoji = "\u{1F1E9}\u{1F1F0}";
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case "finnish": {
|
|
237
|
+
emoji = "\u{1F1EB}\u{1F1EE}";
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
case "polish": {
|
|
241
|
+
emoji = "\u{1F1F5}\u{1F1F1}";
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
case "turkish": {
|
|
245
|
+
emoji = "\u{1F1F9}\u{1F1F7}";
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "greek": {
|
|
249
|
+
emoji = "\u{1F1EC}\u{1F1F7}";
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
default: {
|
|
253
|
+
emoji = null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props, children: children ?? emoji });
|
|
257
|
+
};
|
|
258
|
+
var VoiceSelectorAge = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta tabular-nums", className), ...props });
|
|
259
|
+
var VoiceSelectorName = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { className: cn("flex-1 truncate text-start font-medium", className), ...props });
|
|
260
|
+
var VoiceSelectorDescription = ({
|
|
261
|
+
className,
|
|
262
|
+
...props
|
|
263
|
+
}) => /* @__PURE__ */ jsx("span", { className: cn("text-muted-foreground text-meta", className), ...props });
|
|
264
|
+
var VoiceSelectorAttributes = ({
|
|
265
|
+
className,
|
|
266
|
+
children,
|
|
267
|
+
...props
|
|
268
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("flex items-center text-meta", className), ...props, children });
|
|
269
|
+
var VoiceSelectorBullet = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: cn("select-none text-border", className), ...props, children: "\u2022" });
|
|
270
|
+
var VoiceSelectorPreview = ({
|
|
271
|
+
className,
|
|
272
|
+
playing,
|
|
273
|
+
loading,
|
|
274
|
+
onPlay,
|
|
275
|
+
onClick,
|
|
276
|
+
...props
|
|
277
|
+
}) => {
|
|
278
|
+
const { t } = useLocale();
|
|
279
|
+
const handleClick = useCallback(
|
|
280
|
+
(event) => {
|
|
281
|
+
event.stopPropagation();
|
|
282
|
+
onClick?.(event);
|
|
283
|
+
onPlay?.();
|
|
284
|
+
},
|
|
285
|
+
[onClick, onPlay]
|
|
286
|
+
);
|
|
287
|
+
let icon = /* @__PURE__ */ jsx(PlayIcon, { className: "size-3" });
|
|
288
|
+
if (loading) {
|
|
289
|
+
icon = /* @__PURE__ */ jsx(Spinner, { className: "size-3" });
|
|
290
|
+
} else if (playing) {
|
|
291
|
+
icon = /* @__PURE__ */ jsx(PauseIcon, { className: "size-3" });
|
|
292
|
+
}
|
|
293
|
+
return /* @__PURE__ */ jsx(
|
|
294
|
+
Button,
|
|
295
|
+
{
|
|
296
|
+
"aria-label": playing ? t("ai.voiceSelector.pausePreview") : t("ai.voiceSelector.playPreview"),
|
|
297
|
+
className: cn("size-6", className),
|
|
298
|
+
disabled: loading,
|
|
299
|
+
onClick: handleClick,
|
|
300
|
+
size: "icon-sm",
|
|
301
|
+
type: "button",
|
|
302
|
+
variant: "outline",
|
|
303
|
+
...props,
|
|
304
|
+
children: icon
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
export {
|
|
310
|
+
useVoiceSelector,
|
|
311
|
+
VoiceSelector,
|
|
312
|
+
VoiceSelectorTrigger,
|
|
313
|
+
VoiceSelectorContent,
|
|
314
|
+
VoiceSelectorDialog,
|
|
315
|
+
VoiceSelectorInput,
|
|
316
|
+
VoiceSelectorList,
|
|
317
|
+
VoiceSelectorEmpty,
|
|
318
|
+
VoiceSelectorGroup,
|
|
319
|
+
VoiceSelectorItem,
|
|
320
|
+
VoiceSelectorShortcut,
|
|
321
|
+
VoiceSelectorSeparator,
|
|
322
|
+
VoiceSelectorGender,
|
|
323
|
+
VoiceSelectorAccent,
|
|
324
|
+
VoiceSelectorAge,
|
|
325
|
+
VoiceSelectorName,
|
|
326
|
+
VoiceSelectorDescription,
|
|
327
|
+
VoiceSelectorAttributes,
|
|
328
|
+
VoiceSelectorBullet,
|
|
329
|
+
VoiceSelectorPreview
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=chunk-RTCSH2AN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/voice-selector.tsx"],"sourcesContent":["\"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-meta\", 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-meta\", 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-meta 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-meta\", 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-meta\", 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"],"mappings":"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","names":[]}
|