@elabs-ai/components-ai 4.2.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
- package/dist/_code-block-theme.js +12 -0
- package/dist/_code-block-theme.js.map +1 -0
- package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
- package/dist/_flow-boundary.js.map +1 -0
- package/dist/_flow-lazy.js +8 -0
- package/dist/_flow-lazy.js.map +1 -0
- package/dist/_lazy-boundary-conformance.js +2 -0
- package/dist/_lazy-boundary-conformance.js.map +1 -0
- package/dist/_lazy-cjk.js +13 -0
- package/dist/_lazy-cjk.js.map +1 -0
- package/dist/_lazy-engine-boundary.js +9 -0
- package/dist/_lazy-engine-boundary.js.map +1 -0
- package/dist/_lazy-math.js +13 -0
- package/dist/_lazy-math.js.map +1 -0
- package/dist/_lazy-mermaid.js +12 -0
- package/dist/_lazy-mermaid.js.map +1 -0
- package/dist/_mermaid-error-panel.js +9 -0
- package/dist/_mermaid-error-panel.js.map +1 -0
- package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
- package/dist/_persona-rive.js.map +1 -0
- package/dist/_streamdown-i18n.js +21 -0
- package/dist/_streamdown-i18n.js.map +1 -0
- package/dist/_streamdown-safety.js +10 -0
- package/dist/_streamdown-safety.js.map +1 -0
- package/dist/_theme-scope-store.js +13 -0
- package/dist/_theme-scope-store.js.map +1 -0
- package/dist/a2ui/a2ui-surface.js +17 -0
- package/dist/a2ui/a2ui-surface.js.map +1 -0
- package/dist/a2ui/core/catalog.generated.js +10 -0
- package/dist/a2ui/core/catalog.generated.js.map +1 -0
- package/dist/a2ui/core/complete-json.js +10 -0
- package/dist/a2ui/core/complete-json.js.map +1 -0
- package/dist/a2ui/core/index.js +37 -0
- package/dist/a2ui/core/index.js.map +1 -0
- package/dist/a2ui/core/schema.js +11 -0
- package/dist/a2ui/core/schema.js.map +1 -0
- package/dist/a2ui/core/spec.js +10 -0
- package/dist/a2ui/core/spec.js.map +1 -0
- package/dist/a2ui/core/validate.js +16 -0
- package/dist/a2ui/core/validate.js.map +1 -0
- package/dist/a2ui/index.js +54 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/ui-catalog.js +18 -0
- package/dist/a2ui/ui-catalog.js.map +1 -0
- package/dist/agent-event.js +10 -0
- package/dist/agent-event.js.map +1 -0
- package/dist/agent-timeline.js +11 -0
- package/dist/agent-timeline.js.map +1 -0
- package/dist/agent.js +25 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.js +23 -0
- package/dist/artifact.js.map +1 -0
- package/dist/asset-preview.js +22 -0
- package/dist/asset-preview.js.map +1 -0
- package/dist/attachments.js +33 -0
- package/dist/attachments.js.map +1 -0
- package/dist/audio-player.js +30 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-visualizer.js +9 -0
- package/dist/audio-visualizer.js.map +1 -0
- package/dist/canvas.js +10 -0
- package/dist/canvas.js.map +1 -0
- package/dist/chain-of-thought.js +22 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/chat-greeting.js +8 -0
- package/dist/chat-greeting.js.map +1 -0
- package/dist/chat-shell.js +9 -0
- package/dist/chat-shell.js.map +1 -0
- package/dist/checkpoint.js +13 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/chunk-2XOIG5TG.js +72 -0
- package/dist/chunk-2XOIG5TG.js.map +1 -0
- package/dist/chunk-34CQ2VHM.js +172 -0
- package/dist/chunk-34CQ2VHM.js.map +1 -0
- package/dist/chunk-3TDHPXZZ.js +60 -0
- package/dist/chunk-3TDHPXZZ.js.map +1 -0
- package/dist/chunk-3XNPMDZY.js +478 -0
- package/dist/chunk-3XNPMDZY.js.map +1 -0
- package/dist/chunk-3YPT3V7L.js +56 -0
- package/dist/chunk-3YPT3V7L.js.map +1 -0
- package/dist/chunk-475UEU2Q.js +87 -0
- package/dist/chunk-475UEU2Q.js.map +1 -0
- package/dist/chunk-4CBTII2I.js +95 -0
- package/dist/chunk-4CBTII2I.js.map +1 -0
- package/dist/chunk-4XRNIZMG.js +22 -0
- package/dist/chunk-4XRNIZMG.js.map +1 -0
- package/dist/chunk-5NNWUKK5.js +2 -0
- package/dist/chunk-5NNWUKK5.js.map +1 -0
- package/dist/chunk-5UOMU27Z.js +164 -0
- package/dist/chunk-5UOMU27Z.js.map +1 -0
- package/dist/chunk-5VGYZ62I.js +264 -0
- package/dist/chunk-5VGYZ62I.js.map +1 -0
- package/dist/chunk-6IQPH2OS.js +21 -0
- package/dist/chunk-6IQPH2OS.js.map +1 -0
- package/dist/chunk-6PB2MXCI.js +482 -0
- package/dist/chunk-6PB2MXCI.js.map +1 -0
- package/dist/chunk-7FD5CZEU.js +215 -0
- package/dist/chunk-7FD5CZEU.js.map +1 -0
- package/dist/chunk-7RL6KZDF.js +266 -0
- package/dist/chunk-7RL6KZDF.js.map +1 -0
- package/dist/chunk-ADOYAGGK.js +482 -0
- package/dist/chunk-ADOYAGGK.js.map +1 -0
- package/dist/chunk-BA3AEMOU.js +21 -0
- package/dist/chunk-BA3AEMOU.js.map +1 -0
- package/dist/chunk-BBHFOYML.js +336 -0
- package/dist/chunk-BBHFOYML.js.map +1 -0
- package/dist/chunk-BHUVISIY.js +221 -0
- package/dist/chunk-BHUVISIY.js.map +1 -0
- package/dist/chunk-BM2LWERA.js +100 -0
- package/dist/chunk-BM2LWERA.js.map +1 -0
- package/dist/chunk-CMOYXNPJ.js +211 -0
- package/dist/chunk-CMOYXNPJ.js.map +1 -0
- package/dist/chunk-CZP3RHC4.js +74 -0
- package/dist/chunk-CZP3RHC4.js.map +1 -0
- package/dist/chunk-DDG5JHQT.js +112 -0
- package/dist/chunk-DDG5JHQT.js.map +1 -0
- package/dist/chunk-DJODXO7I.js +38 -0
- package/dist/chunk-DJODXO7I.js.map +1 -0
- package/dist/chunk-DWJDJLPU.js +192 -0
- package/dist/chunk-DWJDJLPU.js.map +1 -0
- package/dist/chunk-DZW6LM22.js +45 -0
- package/dist/chunk-DZW6LM22.js.map +1 -0
- package/dist/chunk-ELGCZLZF.js +305 -0
- package/dist/chunk-ELGCZLZF.js.map +1 -0
- package/dist/chunk-EV3U6ZZB.js +209 -0
- package/dist/chunk-EV3U6ZZB.js.map +1 -0
- package/dist/chunk-EY7LVUKQ.js +87 -0
- package/dist/chunk-EY7LVUKQ.js.map +1 -0
- package/dist/chunk-F4C74F7M.js +230 -0
- package/dist/chunk-F4C74F7M.js.map +1 -0
- package/dist/chunk-FERYDFZA.js +108 -0
- package/dist/chunk-FERYDFZA.js.map +1 -0
- package/dist/chunk-FUIYG2DS.js +166 -0
- package/dist/chunk-FUIYG2DS.js.map +1 -0
- package/dist/chunk-GA7M34KU.js +236 -0
- package/dist/chunk-GA7M34KU.js.map +1 -0
- package/dist/chunk-GKYZT3LA.js +136 -0
- package/dist/chunk-GKYZT3LA.js.map +1 -0
- package/dist/chunk-H42LRUQ4.js +102 -0
- package/dist/chunk-H42LRUQ4.js.map +1 -0
- package/dist/chunk-HVXM2G5F.js +222 -0
- package/dist/chunk-HVXM2G5F.js.map +1 -0
- package/dist/chunk-I4RDAGVY.js +53 -0
- package/dist/chunk-I4RDAGVY.js.map +1 -0
- package/dist/chunk-IQJG4IDX.js +208 -0
- package/dist/chunk-IQJG4IDX.js.map +1 -0
- package/dist/chunk-IX2PXG4Y.js +144 -0
- package/dist/chunk-IX2PXG4Y.js.map +1 -0
- package/dist/chunk-IXICSOOP.js +287 -0
- package/dist/chunk-IXICSOOP.js.map +1 -0
- package/dist/chunk-JY5HSN4D.js +84 -0
- package/dist/chunk-JY5HSN4D.js.map +1 -0
- package/dist/chunk-L4SU3QJV.js +174 -0
- package/dist/chunk-L4SU3QJV.js.map +1 -0
- package/dist/chunk-LMNSBOBG.js +19 -0
- package/dist/chunk-LMNSBOBG.js.map +1 -0
- package/dist/chunk-MBI7D6IL.js +42 -0
- package/dist/chunk-MBI7D6IL.js.map +1 -0
- package/dist/chunk-MLFMYCPH.js +192 -0
- package/dist/chunk-MLFMYCPH.js.map +1 -0
- package/dist/chunk-MOK66734.js +33 -0
- package/dist/chunk-MOK66734.js.map +1 -0
- package/dist/chunk-MXTAWPYM.js +196 -0
- package/dist/chunk-MXTAWPYM.js.map +1 -0
- package/dist/chunk-NCL2UZKI.js +96 -0
- package/dist/chunk-NCL2UZKI.js.map +1 -0
- package/dist/chunk-NET4YLRY.js +107 -0
- package/dist/chunk-NET4YLRY.js.map +1 -0
- package/dist/chunk-NIG67CFM.js +329 -0
- package/dist/chunk-NIG67CFM.js.map +1 -0
- package/dist/chunk-NMVNNO3L.js +10 -0
- package/dist/chunk-NMVNNO3L.js.map +1 -0
- package/dist/chunk-NP7VID4K.js +2 -0
- package/dist/chunk-NP7VID4K.js.map +1 -0
- package/dist/chunk-NPUCMAG2.js +382 -0
- package/dist/chunk-NPUCMAG2.js.map +1 -0
- package/dist/chunk-NSCLRHES.js +102 -0
- package/dist/chunk-NSCLRHES.js.map +1 -0
- package/dist/chunk-OEUXHVFW.js +86 -0
- package/dist/chunk-OEUXHVFW.js.map +1 -0
- package/dist/chunk-ONBHFIMZ.js +137 -0
- package/dist/chunk-ONBHFIMZ.js.map +1 -0
- package/dist/chunk-OPH2HHL2.js +228 -0
- package/dist/chunk-OPH2HHL2.js.map +1 -0
- package/dist/chunk-OQERHIQP.js +287 -0
- package/dist/chunk-OQERHIQP.js.map +1 -0
- package/dist/chunk-P6YJAZFG.js +103 -0
- package/dist/chunk-P6YJAZFG.js.map +1 -0
- package/dist/chunk-PG7ERDOD.js +65 -0
- package/dist/chunk-PG7ERDOD.js.map +1 -0
- package/dist/chunk-PIB5JBMA.js +90 -0
- package/dist/chunk-PIB5JBMA.js.map +1 -0
- package/dist/chunk-PQ5BPIWQ.js +22 -0
- package/dist/chunk-PQ5BPIWQ.js.map +1 -0
- package/dist/chunk-PQBF6ZIQ.js +55 -0
- package/dist/chunk-PQBF6ZIQ.js.map +1 -0
- package/dist/chunk-PTWCTSZL.js +173 -0
- package/dist/chunk-PTWCTSZL.js.map +1 -0
- package/dist/chunk-QJUNPVOS.js +101 -0
- package/dist/chunk-QJUNPVOS.js.map +1 -0
- package/dist/chunk-QOBSEGCG.js +996 -0
- package/dist/chunk-QOBSEGCG.js.map +1 -0
- package/dist/chunk-QUDZOTRV.js +43 -0
- package/dist/chunk-QUDZOTRV.js.map +1 -0
- package/dist/chunk-RB7G65JC.js +213 -0
- package/dist/chunk-RB7G65JC.js.map +1 -0
- package/dist/chunk-RPHAOR7P.js +45 -0
- package/dist/chunk-RPHAOR7P.js.map +1 -0
- package/dist/chunk-RTCSH2AN.js +331 -0
- package/dist/chunk-RTCSH2AN.js.map +1 -0
- package/dist/chunk-S3ISPW3A.js +28 -0
- package/dist/chunk-S3ISPW3A.js.map +1 -0
- package/dist/chunk-SEVN656N.js +36 -0
- package/dist/chunk-SEVN656N.js.map +1 -0
- package/dist/chunk-SKVG672B.js +64 -0
- package/dist/chunk-SKVG672B.js.map +1 -0
- package/dist/chunk-SSGJ6MEM.js +1076 -0
- package/dist/chunk-SSGJ6MEM.js.map +1 -0
- package/dist/chunk-SSKZ2AED.js +118 -0
- package/dist/chunk-SSKZ2AED.js.map +1 -0
- package/dist/chunk-T56JFGXI.js +561 -0
- package/dist/chunk-T56JFGXI.js.map +1 -0
- package/dist/chunk-TCB6O74A.js +137 -0
- package/dist/chunk-TCB6O74A.js.map +1 -0
- package/dist/chunk-TTEYPO6X.js +57 -0
- package/dist/chunk-TTEYPO6X.js.map +1 -0
- package/dist/chunk-TWPHAJNM.js +462 -0
- package/dist/chunk-TWPHAJNM.js.map +1 -0
- package/dist/chunk-TXJJLP4O.js +336 -0
- package/dist/chunk-TXJJLP4O.js.map +1 -0
- package/dist/chunk-TZ6TB7VM.js +245 -0
- package/dist/chunk-TZ6TB7VM.js.map +1 -0
- package/dist/chunk-UBLKJJ7K.js +278 -0
- package/dist/chunk-UBLKJJ7K.js.map +1 -0
- package/dist/chunk-UCJ6IUFS.js +52 -0
- package/dist/chunk-UCJ6IUFS.js.map +1 -0
- package/dist/chunk-UCKFJ3QF.js +197 -0
- package/dist/chunk-UCKFJ3QF.js.map +1 -0
- package/dist/chunk-UPXSLILN.js +20 -0
- package/dist/chunk-UPXSLILN.js.map +1 -0
- package/dist/chunk-V4DORGWJ.js +92 -0
- package/dist/chunk-V4DORGWJ.js.map +1 -0
- package/dist/chunk-V6E5DYZD.js +80 -0
- package/dist/chunk-V6E5DYZD.js.map +1 -0
- package/dist/chunk-VLLYKF3P.js +96 -0
- package/dist/chunk-VLLYKF3P.js.map +1 -0
- package/dist/chunk-VLNBTOH6.js +43 -0
- package/dist/chunk-VLNBTOH6.js.map +1 -0
- package/dist/chunk-WMDSMSPL.js +303 -0
- package/dist/chunk-WMDSMSPL.js.map +1 -0
- package/dist/chunk-WU5BLGTF.js +149 -0
- package/dist/chunk-WU5BLGTF.js.map +1 -0
- package/dist/chunk-WYTZVSGK.js +245 -0
- package/dist/chunk-WYTZVSGK.js.map +1 -0
- package/dist/chunk-X47QMM6K.js +187 -0
- package/dist/chunk-X47QMM6K.js.map +1 -0
- package/dist/chunk-YHUSW7D2.js +40 -0
- package/dist/chunk-YHUSW7D2.js.map +1 -0
- package/dist/chunk-YSKD7UXX.js +126 -0
- package/dist/chunk-YSKD7UXX.js.map +1 -0
- package/dist/chunk-YYRDGWOU.js +72 -0
- package/dist/chunk-YYRDGWOU.js.map +1 -0
- package/dist/chunk-ZIGZMWM7.js +19 -0
- package/dist/chunk-ZIGZMWM7.js.map +1 -0
- package/dist/chunk-ZKRTUKNP.js +40 -0
- package/dist/chunk-ZKRTUKNP.js.map +1 -0
- package/dist/code-block.js +38 -0
- package/dist/code-block.js.map +1 -0
- package/dist/commit.js +51 -0
- package/dist/commit.js.map +1 -0
- package/dist/composer.js +15 -0
- package/dist/composer.js.map +1 -0
- package/dist/confirmation.js +53 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/connection.js +8 -0
- package/dist/connection.js.map +1 -0
- package/dist/context-panel.js +25 -0
- package/dist/context-panel.js.map +1 -0
- package/dist/controls.js +10 -0
- package/dist/controls.js.map +1 -0
- package/dist/conversation.js +19 -0
- package/dist/conversation.js.map +1 -0
- package/dist/diff-view.js +15 -0
- package/dist/diff-view.js.map +1 -0
- package/dist/edge.js +10 -0
- package/dist/edge.js.map +1 -0
- package/dist/environment-variables.js +29 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/file-tree.js +23 -0
- package/dist/file-tree.js.map +1 -0
- package/dist/gallery.js +9 -0
- package/dist/gallery.js.map +1 -0
- package/dist/grouped-parts.js +21 -0
- package/dist/grouped-parts.js.map +1 -0
- package/dist/image.js +9 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +366 -98
- package/dist/index.js +672 -13577
- package/dist/index.js.map +1 -1
- package/dist/inline-citation.js +39 -0
- package/dist/inline-citation.js.map +1 -0
- package/dist/jsx-preview.js +17 -0
- package/dist/jsx-preview.js.map +1 -0
- package/dist/markdown-view.js +17 -0
- package/dist/markdown-view.js.map +1 -0
- package/dist/message-compare.js +12 -0
- package/dist/message-compare.js.map +1 -0
- package/dist/message-edit.js +19 -0
- package/dist/message-edit.js.map +1 -0
- package/dist/message-feedback.js +11 -0
- package/dist/message-feedback.js.map +1 -0
- package/dist/message-form-spec.js +38 -0
- package/dist/message-form-spec.js.map +1 -0
- package/dist/message-form.js +26 -0
- package/dist/message-form.js.map +1 -0
- package/dist/message-table-spec.js +26 -0
- package/dist/message-table-spec.js.map +1 -0
- package/dist/message-table.js +12 -0
- package/dist/message-table.js.map +1 -0
- package/dist/message.js +51 -0
- package/dist/message.js.map +1 -0
- package/dist/mic-selector.js +27 -0
- package/dist/mic-selector.js.map +1 -0
- package/dist/model-provider-logo.js +13 -0
- package/dist/model-provider-logo.js.map +1 -0
- package/dist/motion-config.js +9 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/open-in-chat.js +31 -0
- package/dist/open-in-chat.js.map +1 -0
- package/dist/package-info.js +25 -0
- package/dist/package-info.js.map +1 -0
- package/dist/panel.js +10 -0
- package/dist/panel.js.map +1 -0
- package/dist/part-groups.js +18 -0
- package/dist/part-groups.js.map +1 -0
- package/dist/permission-mode-select.js +9 -0
- package/dist/permission-mode-select.js.map +1 -0
- package/dist/persona-sources.js +8 -0
- package/dist/persona-sources.js.map +1 -0
- package/dist/persona.js +14 -0
- package/dist/persona.js.map +1 -0
- package/dist/plan.js +32 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompt-input-effort.js +9 -0
- package/dist/prompt-input-effort.js.map +1 -0
- package/dist/prompt-input-mode.js +10 -0
- package/dist/prompt-input-mode.js.map +1 -0
- package/dist/prompt-input-slash.js +12 -0
- package/dist/prompt-input-slash.js.map +1 -0
- package/dist/prompt-input.js +89 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/queue.js +37 -0
- package/dist/queue.js.map +1 -0
- package/dist/reasoning.js +23 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/sandbox.js +28 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-display.js +33 -0
- package/dist/schema-display.js.map +1 -0
- package/dist/selection-toolbar.js +11 -0
- package/dist/selection-toolbar.js.map +1 -0
- package/dist/session-header.js +9 -0
- package/dist/session-header.js.map +1 -0
- package/dist/session-status-bar.js +9 -0
- package/dist/session-status-bar.js.map +1 -0
- package/dist/shimmer.js +9 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/snippet.js +17 -0
- package/dist/snippet.js.map +1 -0
- package/dist/sources.js +17 -0
- package/dist/sources.js.map +1 -0
- package/dist/speech-input.js +9 -0
- package/dist/speech-input.js.map +1 -0
- package/dist/stack-trace.js +27 -0
- package/dist/stack-trace.js.map +1 -0
- package/dist/suggestion.js +16 -0
- package/dist/suggestion.js.map +1 -0
- package/dist/task.js +18 -0
- package/dist/task.js.map +1 -0
- package/dist/test-results.js +43 -0
- package/dist/test-results.js.map +1 -0
- package/dist/token-usage.js +27 -0
- package/dist/token-usage.js.map +1 -0
- package/dist/tool-result-card.js +9 -0
- package/dist/tool-result-card.js.map +1 -0
- package/dist/tool.js +27 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolbar.js +10 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/transcription.js +11 -0
- package/dist/transcription.js.map +1 -0
- package/dist/turn-status.js +9 -0
- package/dist/turn-status.js.map +1 -0
- package/dist/use-audio-level.js +9 -0
- package/dist/use-audio-level.js.map +1 -0
- package/dist/voice-selector.js +47 -0
- package/dist/voice-selector.js.map +1 -0
- package/dist/web-preview.js +19 -0
- package/dist/web-preview.js.map +1 -0
- package/package.json +11 -9
- package/schemas/a2ui-surface.v1.schema.json +5434 -0
- package/src/_chat-shell-rail.tsx +3 -1
- package/src/_flow-boundary.tsx +2 -2
- package/src/_persona-rive.tsx +27 -41
- package/src/a2ui/a2ui-surface.stories.tsx +662 -0
- package/src/a2ui/a2ui-surface.test.tsx +201 -0
- package/src/a2ui/a2ui-surface.tsx +354 -0
- package/src/a2ui/catalog.source.json +772 -0
- package/src/a2ui/core/a2ui-core.test.ts +178 -0
- package/src/a2ui/core/catalog.generated.ts +1019 -0
- package/src/a2ui/core/complete-json.ts +81 -0
- package/src/a2ui/core/index.ts +10 -0
- package/src/a2ui/core/schema.ts +111 -0
- package/src/a2ui/core/spec.ts +148 -0
- package/src/a2ui/core/validate.ts +266 -0
- package/src/a2ui/index.ts +7 -0
- package/src/a2ui/ui-catalog.tsx +225 -0
- package/src/a2ui/wave1-chart-spec.test.ts +87 -0
- package/src/a2ui/wave2-chart-spec.test.ts +108 -0
- package/src/agentic-workspace.stories.tsx +6 -45
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +1 -1
- package/src/conversation.stories.tsx +1 -0
- package/src/conversation.test.tsx +16 -0
- package/src/conversation.tsx +16 -2
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.tsx +3 -2
- package/src/file-tree.tsx +24 -17
- package/src/gallery.stories.tsx +42 -0
- package/src/gallery.tsx +2 -2
- package/src/grouped-parts.stories.tsx +23 -0
- package/src/grouped-parts.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.tsx +1 -1
- package/src/message-table.stories.tsx +24 -0
- package/src/message-table.tsx +1 -1
- package/src/package-info.tsx +12 -9
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +1 -1
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/tool.stories.tsx +39 -0
- package/src/tool.tsx +3 -3
- package/src/toolbar.tsx +0 -10
- package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
- package/dist/_persona-rive-JEG44YHX.js.map +0 -1
- /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code-block.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button, useCopyToClipboard, 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 useReducer,\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\";\nimport { getThemeScope, useThemeScopeRevision } from \"./_theme-scope-store\";\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 — bounded to the `MAX_TOKENS_CACHE_ENTRIES` most recently used\n// entries (perf review 1.4a). Unbounded growth showed up while streaming: a\n// growing code string re-tokenizes on every token, and every intermediate\n// string used to get its own permanent cache entry — O(n²) memory that was\n// never released for the lifetime of the tab.\nconst MAX_TOKENS_CACHE_ENTRIES = 200;\nconst tokensCache = new Map<string, TokenizedCode>();\n\n/** Reads `key`, marking it most-recently-used (moves it to the end). */\nconst tokensCacheGet = (key: string): TokenizedCode | undefined => {\n const value = tokensCache.get(key);\n if (value === undefined) return undefined;\n tokensCache.delete(key);\n tokensCache.set(key, value);\n return value;\n};\n\n/** Writes `key`, evicting the least-recently-used entries over the cap. */\nconst tokensCacheSet = (key: string, value: TokenizedCode): void => {\n tokensCache.delete(key);\n tokensCache.set(key, value);\n while (tokensCache.size > MAX_TOKENS_CACHE_ENTRIES) {\n const oldestKey = tokensCache.keys().next().value;\n if (oldestKey === undefined) break;\n tokensCache.delete(oldestKey);\n }\n};\n\n// Subscribers for async token updates\nconst subscribers = new Map<string, Set<(result: TokenizedCode) => void>>();\n\n// FNV-1a 32-bit — cheap, and (unlike the previous length + first/last 100\n// chars key) hashes the FULL string, so two different strings of the same\n// length sharing a prefix and suffix longer than 100 chars (an edit to the\n// MIDDLE of a >200-char block — the common case for a diff or a streamed\n// correction) no longer collide onto the same cache entry and show stale,\n// wrong-content highlighting (#perf 1.4b).\nconst hashCode = (value: string): string => {\n let hash = 0x811c9dc5;\n for (let i = 0; i < value.length; i++) {\n // oxlint-disable-next-line eslint(no-bitwise)\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n // oxlint-disable-next-line eslint(no-bitwise)\n return (hash >>> 0).toString(36);\n};\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 `${themeId}:${language}:${code.length}:${hashCode(code)}`;\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.\n//\n// `skipCache` (fifth, purely-additive parameter, default `false`) is set by a\n// caller mid-stream (perf review 1.4a): a streaming code block re-tokenizes a\n// GROWING string on every token, so every intermediate value is, by\n// definition, never seen again — permanently caching it only pays rent\n// (bounded now by the LRU cap, but still pure waste) without ever paying off\n// with a hit. A cache HIT (the final, settled string matches an\n// already-cached entry) is still honored either way.\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 skipCache = false,\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 = tokensCacheGet(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 — unless the caller told us it is mid-stream, in\n // which case this exact string is very unlikely to recur.\n if (!skipCache) {\n tokensCacheSet(tokensCacheKey, tokenized);\n }\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-body\", wrap && \"whitespace-pre-wrap break-words\", className)}\n style={preStyle}\n >\n <code\n className={cn(\n \"font-mono text-body\",\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-meta\",\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\n// Streaming re-highlight throttle (perf review 1.4e / §3.2): re-tokenizing\n// on every single streamed token is O(n²) work over the life of a response.\n// At most one highlight pass per window, ALWAYS with a trailing call so the\n// final, settled string still gets highlighted the moment streaming stops.\nconst STREAM_HIGHLIGHT_THROTTLE_MS = 200;\n\nexport const CodeBlockContent = ({\n code,\n language,\n showLineNumbers = false,\n wrap = false,\n isStreaming = false,\n}: {\n code: string;\n language: BundledLanguage;\n showLineNumbers?: boolean;\n wrap?: boolean;\n isStreaming?: 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. `useThemeScopeRevision` (`_theme-scope-store.ts`)\n // shares ONE MutationObserver per scope element across every subscriber\n // watching it, instead of one per `CodeBlock` instance (perf review §3.3).\n const scopeRef = useRef<HTMLDivElement>(null);\n // The ref only attaches after the first commit, so the scope resolved\n // during the initial render (before mount) may have fallen back to\n // `<html>`. Force one more render right after mount — synchronously, before\n // paint, via `useLayoutEffect` — so a scoped code block never flashes the\n // document root's colors first; `useThemeScopeRevision` re-subscribes to\n // the now-correct scope on that render.\n const [, forceMountRerender] = useReducer((tick: number) => tick + 1, 0);\n useLayoutEffect(() => {\n forceMountRerender();\n }, []);\n\n const scopeEl = getThemeScope(scopeRef.current);\n const themeRevision = useThemeScopeRevision(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 const themeScopeKey = useMemo(\n () => getThemeScopeKey(scopeEl),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- themeRevision is the trigger; scopeEl's own identity already changes across the post-mount re-render above.\n [themeRevision, scopeEl],\n );\n\n // Memoized raw tokens for immediate display\n const rawTokens = useMemo(() => createRawTokens(code), [code]);\n\n // Synchronous cache PEEK — a plain, side-effect-free `Map.get`, never a\n // call into `highlightCode` (the OLD code called it here with no callback,\n // AND again in the effect below with one; on a cache miss both calls\n // independently kicked off `getHighlighter(language).then(...)` and\n // computed `codeToTokens` for the SAME code twice — perf review 1.4d).\n // Highlighting is now triggered from exactly ONE place: the effect.\n const themeId = codeBlockThemeId(themeScopeKey);\n const tokensCacheKey = getTokensCacheKey(code, language, themeId);\n const syncTokens = tokensCache.get(tokensCacheKey) ?? rawTokens;\n\n // Async highlighting result (populated after shiki loads, or synchronously\n // inside the effect on a cache hit).\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 // Last time THIS instance actually ran a highlight pass — the throttle\n // clock while `isStreaming` (perf review 1.4e).\n const lastHighlightAtRef = useRef(0);\n\n useEffect(() => {\n let cancelled = false;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const runHighlight = () => {\n lastHighlightAtRef.current = Date.now();\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 isStreaming,\n );\n if (cached && !cancelled) {\n setAsyncTokens(cached);\n }\n };\n\n if (!isStreaming) {\n // Not streaming: always highlight immediately (also the path a\n // just-finished stream's LAST token takes, guaranteeing the final,\n // settled code always gets a full, cacheable highlight even if the\n // throttle skipped some of the tokens before it).\n runHighlight();\n } else {\n const elapsed = Date.now() - lastHighlightAtRef.current;\n if (elapsed >= STREAM_HIGHLIGHT_THROTTLE_MS) {\n runHighlight();\n } else {\n timeoutId = setTimeout(runHighlight, STREAM_HIGHLIGHT_THROTTLE_MS - elapsed);\n }\n }\n\n return () => {\n cancelled = true;\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n };\n }, [code, language, themeScopeKey, scopeEl, isStreaming]);\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 isStreaming={isStreaming}\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,\n children,\n className,\n ...props\n}: CodeBlockCopyButtonProps) => {\n const { t } = useLocale();\n const { code } = useContext(CodeBlockContext);\n // Shared implementation (`@elabs-ai/components-ui`) instead of a private\n // copy of the same copy-to-clipboard state machine — this one used to\n // duplicate `SnippetCopyButton`'s (issue-workflow.md dedupe finding).\n const { copied: isCopied, copy } = useCopyToClipboard(\n timeout === undefined ? undefined : { resetAfterMs: timeout },\n );\n\n const copyToClipboard = useCallback(async () => {\n const ok = await copy(code);\n if (ok) {\n onCopy?.();\n } else {\n onError?.(new Error(\"Clipboard API not available\"));\n }\n }, [copy, code, onCopy, onError]);\n\n const Icon = isCopied ? CheckIcon : CopyIcon;\n\n return (\n <Button\n aria-label={t(\"copy\")}\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-meta 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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/open-in-chat.tsx
|
|
4
|
+
import { Button, useLocale } from "@elabs-ai/components-ui";
|
|
5
|
+
import {
|
|
6
|
+
DropdownMenu,
|
|
7
|
+
DropdownMenuContent,
|
|
8
|
+
DropdownMenuItem,
|
|
9
|
+
DropdownMenuLabel,
|
|
10
|
+
DropdownMenuSeparator,
|
|
11
|
+
DropdownMenuTrigger
|
|
12
|
+
} from "@elabs-ai/components-ui";
|
|
13
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
14
|
+
import { ChevronDownIcon, ExternalLinkIcon, MessageCircleIcon } from "lucide-react";
|
|
15
|
+
import { createContext, useContext, useMemo } from "react";
|
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
var providers = {
|
|
18
|
+
chatgpt: {
|
|
19
|
+
createUrl: (prompt) => `https://chatgpt.com/?${new URLSearchParams({
|
|
20
|
+
hints: "search",
|
|
21
|
+
prompt
|
|
22
|
+
})}`,
|
|
23
|
+
icon: /* @__PURE__ */ jsxs("svg", { fill: "currentColor", role: "img", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("title", { children: "OpenAI" }),
|
|
25
|
+
" ",
|
|
26
|
+
/* @__PURE__ */ jsx("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" })
|
|
27
|
+
] }),
|
|
28
|
+
title: "ChatGPT"
|
|
29
|
+
// i18n-exempt: brand name
|
|
30
|
+
},
|
|
31
|
+
claude: {
|
|
32
|
+
createUrl: (q) => `https://claude.ai/new?${new URLSearchParams({
|
|
33
|
+
q
|
|
34
|
+
})}`,
|
|
35
|
+
icon: /* @__PURE__ */ jsxs("svg", { fill: "currentColor", role: "img", viewBox: "0 0 12 12", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("title", { children: "Claude" }),
|
|
37
|
+
" ",
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
"path",
|
|
40
|
+
{
|
|
41
|
+
clipRule: "evenodd",
|
|
42
|
+
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",
|
|
43
|
+
fillRule: "evenodd"
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
] }),
|
|
47
|
+
title: "Claude"
|
|
48
|
+
// i18n-exempt: brand name
|
|
49
|
+
},
|
|
50
|
+
cursor: {
|
|
51
|
+
createUrl: (text) => {
|
|
52
|
+
const url = new URL("https://cursor.com/link/prompt");
|
|
53
|
+
url.searchParams.set("text", text);
|
|
54
|
+
return url.toString();
|
|
55
|
+
},
|
|
56
|
+
icon: /* @__PURE__ */ jsxs("svg", { version: "1.1", viewBox: "0 0 466.73 532.09", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
57
|
+
/* @__PURE__ */ jsx("title", { children: "Cursor" }),
|
|
58
|
+
" ",
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
"path",
|
|
61
|
+
{
|
|
62
|
+
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",
|
|
63
|
+
fill: "currentColor"
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] }),
|
|
67
|
+
title: "Cursor"
|
|
68
|
+
// i18n-exempt: brand name
|
|
69
|
+
},
|
|
70
|
+
github: {
|
|
71
|
+
createUrl: (url) => url,
|
|
72
|
+
icon: /* @__PURE__ */ jsxs("svg", { fill: "currentColor", role: "img", viewBox: "0 0 24 24", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("title", { children: "GitHub" }),
|
|
74
|
+
" ",
|
|
75
|
+
/* @__PURE__ */ jsx("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" })
|
|
76
|
+
] }),
|
|
77
|
+
title: "GitHub"
|
|
78
|
+
// i18n-exempt: brand name
|
|
79
|
+
},
|
|
80
|
+
scira: {
|
|
81
|
+
createUrl: (q) => `https://scira.ai/?${new URLSearchParams({
|
|
82
|
+
q
|
|
83
|
+
})}`,
|
|
84
|
+
icon: /* @__PURE__ */ jsxs(
|
|
85
|
+
"svg",
|
|
86
|
+
{
|
|
87
|
+
fill: "none",
|
|
88
|
+
height: "934",
|
|
89
|
+
viewBox: "0 0 910 934",
|
|
90
|
+
width: "910",
|
|
91
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx("title", { children: "Scira AI" }),
|
|
94
|
+
" ",
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
"path",
|
|
97
|
+
{
|
|
98
|
+
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",
|
|
99
|
+
fill: "currentColor",
|
|
100
|
+
stroke: "currentColor",
|
|
101
|
+
strokeLinejoin: "round",
|
|
102
|
+
strokeWidth: "8"
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ jsx(
|
|
106
|
+
"path",
|
|
107
|
+
{
|
|
108
|
+
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",
|
|
109
|
+
fill: "currentColor",
|
|
110
|
+
stroke: "currentColor",
|
|
111
|
+
strokeLinejoin: "round",
|
|
112
|
+
strokeWidth: "8"
|
|
113
|
+
}
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
"path",
|
|
117
|
+
{
|
|
118
|
+
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",
|
|
119
|
+
stroke: "currentColor",
|
|
120
|
+
strokeLinejoin: "round",
|
|
121
|
+
strokeWidth: "20"
|
|
122
|
+
}
|
|
123
|
+
),
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
"path",
|
|
126
|
+
{
|
|
127
|
+
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",
|
|
128
|
+
stroke: "currentColor",
|
|
129
|
+
strokeLinejoin: "round",
|
|
130
|
+
strokeWidth: "20"
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsx(
|
|
134
|
+
"path",
|
|
135
|
+
{
|
|
136
|
+
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",
|
|
137
|
+
fill: "currentColor",
|
|
138
|
+
stroke: "currentColor",
|
|
139
|
+
strokeLinejoin: "round",
|
|
140
|
+
strokeWidth: "8"
|
|
141
|
+
}
|
|
142
|
+
),
|
|
143
|
+
/* @__PURE__ */ jsx(
|
|
144
|
+
"path",
|
|
145
|
+
{
|
|
146
|
+
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",
|
|
147
|
+
fill: "currentColor",
|
|
148
|
+
stroke: "currentColor",
|
|
149
|
+
strokeLinejoin: "round",
|
|
150
|
+
strokeWidth: "8"
|
|
151
|
+
}
|
|
152
|
+
),
|
|
153
|
+
/* @__PURE__ */ jsx(
|
|
154
|
+
"path",
|
|
155
|
+
{
|
|
156
|
+
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",
|
|
157
|
+
stroke: "currentColor",
|
|
158
|
+
strokeLinecap: "round",
|
|
159
|
+
strokeLinejoin: "round",
|
|
160
|
+
strokeWidth: "30"
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
),
|
|
166
|
+
title: "Scira"
|
|
167
|
+
// i18n-exempt: brand name
|
|
168
|
+
},
|
|
169
|
+
t3: {
|
|
170
|
+
createUrl: (q) => `https://t3.chat/new?${new URLSearchParams({
|
|
171
|
+
q
|
|
172
|
+
})}`,
|
|
173
|
+
icon: /* @__PURE__ */ jsx(MessageCircleIcon, {}),
|
|
174
|
+
title: "T3 Chat"
|
|
175
|
+
// i18n-exempt: brand name
|
|
176
|
+
},
|
|
177
|
+
v0: {
|
|
178
|
+
createUrl: (q) => `https://v0.app?${new URLSearchParams({
|
|
179
|
+
q
|
|
180
|
+
})}`,
|
|
181
|
+
icon: /* @__PURE__ */ jsxs("svg", { fill: "currentColor", viewBox: "0 0 147 70", xmlns: "http://www.w3.org/2000/svg", children: [
|
|
182
|
+
/* @__PURE__ */ jsx("title", { children: "v0" }),
|
|
183
|
+
/* @__PURE__ */ jsx("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" }),
|
|
184
|
+
/* @__PURE__ */ jsx("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" })
|
|
185
|
+
] }),
|
|
186
|
+
title: "v0"
|
|
187
|
+
// i18n-exempt: brand name
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
var OpenInContext = createContext(void 0);
|
|
191
|
+
var useOpenInContext = () => {
|
|
192
|
+
const context = useContext(OpenInContext);
|
|
193
|
+
if (!context) {
|
|
194
|
+
throw new Error("OpenIn components must be used within an OpenIn provider");
|
|
195
|
+
}
|
|
196
|
+
return context;
|
|
197
|
+
};
|
|
198
|
+
var OpenIn = ({ query, ...props }) => {
|
|
199
|
+
const contextValue = useMemo(() => ({ query }), [query]);
|
|
200
|
+
return /* @__PURE__ */ jsx(OpenInContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(DropdownMenu, { ...props }) });
|
|
201
|
+
};
|
|
202
|
+
var OpenInContent = ({ className, ...props }) => /* @__PURE__ */ jsx(DropdownMenuContent, { align: "start", className: cn("w-[240px]", className), ...props });
|
|
203
|
+
var OpenInItem = (props) => /* @__PURE__ */ jsx(DropdownMenuItem, { ...props });
|
|
204
|
+
var OpenInLabel = (props) => /* @__PURE__ */ jsx(DropdownMenuLabel, { ...props });
|
|
205
|
+
var OpenInSeparator = (props) => /* @__PURE__ */ jsx(DropdownMenuSeparator, { ...props });
|
|
206
|
+
var OpenInTrigger = ({ children, ...props }) => {
|
|
207
|
+
const { t } = useLocale();
|
|
208
|
+
return /* @__PURE__ */ jsx(DropdownMenuTrigger, { ...props, asChild: true, children: children ?? /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", children: [
|
|
209
|
+
t("ai.openInChat.trigger"),
|
|
210
|
+
/* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4" })
|
|
211
|
+
] }) });
|
|
212
|
+
};
|
|
213
|
+
var OpenInChatGPT = (props) => {
|
|
214
|
+
const { query } = useOpenInContext();
|
|
215
|
+
const { t } = useLocale();
|
|
216
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
217
|
+
"a",
|
|
218
|
+
{
|
|
219
|
+
className: "flex items-center gap-2",
|
|
220
|
+
href: providers.chatgpt.createUrl(query),
|
|
221
|
+
rel: "noopener noreferrer",
|
|
222
|
+
target: "_blank",
|
|
223
|
+
children: [
|
|
224
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.chatgpt.icon }),
|
|
225
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.chatgpt.title }) }),
|
|
226
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
) });
|
|
230
|
+
};
|
|
231
|
+
var OpenInClaude = (props) => {
|
|
232
|
+
const { query } = useOpenInContext();
|
|
233
|
+
const { t } = useLocale();
|
|
234
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
235
|
+
"a",
|
|
236
|
+
{
|
|
237
|
+
className: "flex items-center gap-2",
|
|
238
|
+
href: providers.claude.createUrl(query),
|
|
239
|
+
rel: "noopener noreferrer",
|
|
240
|
+
target: "_blank",
|
|
241
|
+
children: [
|
|
242
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.claude.icon }),
|
|
243
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.claude.title }) }),
|
|
244
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
) });
|
|
248
|
+
};
|
|
249
|
+
var OpenInT3 = (props) => {
|
|
250
|
+
const { query } = useOpenInContext();
|
|
251
|
+
const { t } = useLocale();
|
|
252
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
253
|
+
"a",
|
|
254
|
+
{
|
|
255
|
+
className: "flex items-center gap-2",
|
|
256
|
+
href: providers.t3.createUrl(query),
|
|
257
|
+
rel: "noopener noreferrer",
|
|
258
|
+
target: "_blank",
|
|
259
|
+
children: [
|
|
260
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.t3.icon }),
|
|
261
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.t3.title }) }),
|
|
262
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
) });
|
|
266
|
+
};
|
|
267
|
+
var OpenInScira = (props) => {
|
|
268
|
+
const { query } = useOpenInContext();
|
|
269
|
+
const { t } = useLocale();
|
|
270
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
271
|
+
"a",
|
|
272
|
+
{
|
|
273
|
+
className: "flex items-center gap-2",
|
|
274
|
+
href: providers.scira.createUrl(query),
|
|
275
|
+
rel: "noopener noreferrer",
|
|
276
|
+
target: "_blank",
|
|
277
|
+
children: [
|
|
278
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.scira.icon }),
|
|
279
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.scira.title }) }),
|
|
280
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
) });
|
|
284
|
+
};
|
|
285
|
+
var OpenInv0 = (props) => {
|
|
286
|
+
const { query } = useOpenInContext();
|
|
287
|
+
const { t } = useLocale();
|
|
288
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
289
|
+
"a",
|
|
290
|
+
{
|
|
291
|
+
className: "flex items-center gap-2",
|
|
292
|
+
href: providers.v0.createUrl(query),
|
|
293
|
+
rel: "noopener noreferrer",
|
|
294
|
+
target: "_blank",
|
|
295
|
+
children: [
|
|
296
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.v0.icon }),
|
|
297
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.v0.title }) }),
|
|
298
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
) });
|
|
302
|
+
};
|
|
303
|
+
var OpenInCursor = (props) => {
|
|
304
|
+
const { query } = useOpenInContext();
|
|
305
|
+
const { t } = useLocale();
|
|
306
|
+
return /* @__PURE__ */ jsx(DropdownMenuItem, { asChild: true, ...props, children: /* @__PURE__ */ jsxs(
|
|
307
|
+
"a",
|
|
308
|
+
{
|
|
309
|
+
className: "flex items-center gap-2",
|
|
310
|
+
href: providers.cursor.createUrl(query),
|
|
311
|
+
rel: "noopener noreferrer",
|
|
312
|
+
target: "_blank",
|
|
313
|
+
children: [
|
|
314
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: providers.cursor.icon }),
|
|
315
|
+
/* @__PURE__ */ jsx("span", { className: "flex-1", children: t("ai.openInChat.openInProvider", { provider: providers.cursor.title }) }),
|
|
316
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4 shrink-0" })
|
|
317
|
+
]
|
|
318
|
+
}
|
|
319
|
+
) });
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
export {
|
|
323
|
+
OpenIn,
|
|
324
|
+
OpenInContent,
|
|
325
|
+
OpenInItem,
|
|
326
|
+
OpenInLabel,
|
|
327
|
+
OpenInSeparator,
|
|
328
|
+
OpenInTrigger,
|
|
329
|
+
OpenInChatGPT,
|
|
330
|
+
OpenInClaude,
|
|
331
|
+
OpenInT3,
|
|
332
|
+
OpenInScira,
|
|
333
|
+
OpenInv0,
|
|
334
|
+
OpenInCursor
|
|
335
|
+
};
|
|
336
|
+
//# sourceMappingURL=chunk-TXJJLP4O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/open-in-chat.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button, useLocale } 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> {/* i18n-exempt: brand name */}\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: \"ChatGPT\", // i18n-exempt: brand name\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> {/* i18n-exempt: brand name */}\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: \"Claude\", // i18n-exempt: brand name\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> {/* i18n-exempt: brand name */}\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: \"Cursor\", // i18n-exempt: brand name\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> {/* i18n-exempt: brand name */}\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: \"GitHub\", // i18n-exempt: brand name\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> {/* i18n-exempt: brand name */}\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: \"Scira\", // i18n-exempt: brand name\n },\n t3: {\n createUrl: (q: string) =>\n `https://t3.chat/new?${new URLSearchParams({\n q,\n })}`,\n icon: <MessageCircleIcon />,\n title: \"T3 Chat\", // i18n-exempt: brand name\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: \"v0\", // i18n-exempt: brand name\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 const { t } = useLocale();\n return (\n <DropdownMenuTrigger {...props} asChild>\n {children ?? (\n <Button type=\"button\" variant=\"outline\">\n {t(\"ai.openInChat.trigger\")}\n <ChevronDownIcon className=\"size-4\" />\n </Button>\n )}\n </DropdownMenuTrigger>\n );\n};\n\nexport type OpenInChatGPTProps = ComponentProps<typeof DropdownMenuItem>;\n\nexport const OpenInChatGPT = (props: OpenInChatGPTProps) => {\n const { query } = useOpenInContext();\n const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.chatgpt.title })}\n </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 const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.claude.title })}\n </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 const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.t3.title })}\n </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 const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.scira.title })}\n </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 const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.v0.title })}\n </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 const { t } = useLocale();\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\">\n {t(\"ai.openInChat.openInProvider\", { provider: providers.cursor.title })}\n </span>\n <ExternalLinkIcon className=\"size-4 shrink-0\" />\n </a>\n </DropdownMenuItem>\n );\n};\n"],"mappings":"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","names":[]}
|