@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/a2ui/core/catalog.generated.ts"],"sourcesContent":["// GENERATED by packages/cli/scripts/gen-a2ui-catalog.mjs from\n// packages/ai/src/a2ui/catalog.source.json + brand-ui.manifest.json — do not edit;\n// edit the source file (or the component) and run `pnpm gen`.\nimport type { A2uiCatalogSchema } from \"./spec\";\n\nexport const A2UI_CATALOG_VERSION = \"1\";\n\nexport const A2UI_CATALOG_SCHEMA: A2uiCatalogSchema = {\n Accordion: {\n children: true,\n props: {\n collapsible: {\n type: \"boolean\",\n },\n defaultValue: {\n type: \"string\",\n },\n type: {\n enum: [\"single\", \"multiple\"],\n required: true,\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n AccordionContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionItem: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AccordionTrigger: {\n children: true,\n props: {\n headingLevel: {\n type: \"number\",\n enum: [2, 3, 4, 5, 6],\n description:\n \"The heading level Radix's `Accordion.Header` renders. Radix hardcodes `h3`, which skips a level whenever the accordion sits directly under the page `h1` — so…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Alert: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"destructive\", \"success\", \"warning\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AlertTitle + AlertDescription inside.\",\n },\n AlertDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, label-style descriptions…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n AlertTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Avatar: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose AvatarFallback (initials) inside.\",\n },\n AvatarFallback: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Badge: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"outline\", \"success\", \"warning\", \"destructive\", \"info\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compact status/label chip (status, count, category).\",\n },\n BentoGrid: {\n children: true,\n props: {\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight on every tile in this grid. Individual tiles can still opt out (or in) with their own `spotlight` prop. Disabled entire…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Feature/bento grid; children are BentoGridItem.\",\n },\n BentoGridItem: {\n children: true,\n props: {\n size: {\n type: \"string\",\n description:\n 'Size preset. Resolves to a col + row span. Overridden by explicit `span`. @default \"sm\"',\n enum: [\"sm\", \"md\", \"lg\", \"hero\"],\n },\n span: {\n type: \"object\",\n description:\n \"Explicit grid span. Wins over `size`. Spans clamp gracefully on narrow layouts — a `col: 4` on a 2-col grid becomes `span min(4, 2)`.\",\n },\n spotlight: {\n type: \"boolean\",\n description:\n \"Enable the cursor-following spotlight gradient on this tile. Omit to inherit the parent `BentoGrid`'s `spotlight` (itself `false` by default) — so the effect…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Button: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\", \"lg\", \"icon\", \"icon-sm\", \"icon-lg\"],\n default: \"default\",\n },\n type: {\n enum: [\"button\", \"submit\"],\n default: \"button\",\n type: \"string\",\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"secondary\", \"destructive\", \"outline\", \"outline-subtle\", \"ghost\", \"link\"],\n default: \"default\",\n },\n },\n events: {\n click: \"onClick\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: 'An action. Bind `on.click`; one `variant: \"default\"` per group.',\n },\n ButtonGroup: {\n children: true,\n props: {\n orientation: {\n type: \"string\",\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Card: {\n children: true,\n props: {\n detail: {\n type: \"node\",\n description:\n \"Optional detail-panel content. **Undefined → a plain card** (today's single `<div>` — no grid, no panel, zero behaviour change).\",\n },\n detailLabel: {\n type: \"string\",\n description: 'Accessible label for the detail region. @default \"Details\"',\n },\n detailPlacement: {\n type: \"string\",\n enum: [\"side\", \"bottom\"],\n description: 'Which edge the detail panel sits on. @default \"side\"',\n },\n interactive: {\n type: \"string\",\n enum: [\"true\", \"false\"],\n default: \"false\",\n },\n stacked: {\n type: \"boolean\",\n description:\n \"Opt-in hairline gesture: the edges of two sheets stacked behind the card's top edge (the `hairline-stack` utility). It draws OUTSIDE the card, so it needs ~1…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The one generic surface — compose CardHeader / CardContent / CardFooter inside.\",\n },\n CardAction: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"The header's trailing action slot (a Button, a Badge).\",\n },\n CardContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardDescription: {\n children: true,\n props: {\n measure: {\n type: \"boolean\",\n description:\n \"Cap the line length to a readable prose measure (`max-w-prose`, ~65ch) for genuine paragraph content (#339). Off by default — short, subtitle-style descripti…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CardTitle: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Checkbox: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Binary on/off toggle within a form (multi-select within a group).\",\n },\n Collapsible: {\n children: true,\n props: {\n defaultOpen: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onOpenChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n CollapsibleContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n CollapsibleTrigger: {\n children: true,\n props: {\n asChild: {\n type: \"boolean\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Descriptions: {\n children: true,\n props: {\n columns: {\n type: \"number\",\n enum: [1, 2, 3],\n description:\n \"Number of columns at the widest breakpoint. Collapses to a single column on small screens. Default 1.\",\n },\n layout: {\n type: \"string\",\n description:\n \"`horizontal` places the label beside the value; `vertical` stacks the label above the value. Default `horizontal`.\",\n enum: [\"horizontal\", \"vertical\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Key–value list; children are DescriptionsItem.\",\n },\n DescriptionsItem: {\n children: true,\n props: {\n label: {\n type: \"node\",\n required: true,\n description: \"The term / label for this entry.\",\n },\n numeric: {\n type: \"boolean\",\n description:\n \"When the value is numeric, set this so the value uses `tabular-nums` for aligned digits.\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n EmptyState: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary/secondary actions.\",\n },\n description: {\n type: \"node\",\n },\n icon: {\n type: \"node\",\n description:\n \"Optional icon shown above the title, clamped to a fixed 40×40 (this wrapper only ever forwards `icon` to `StatePanel`, never `illustration` — for a larger, u…\",\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Nothing here yet — title, description, optional actions.\",\n },\n Grid: {\n builtin: true,\n children: true,\n props: {\n columns: {\n enum: [1, 2, 3, 4],\n default: 2,\n type: \"number\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n },\n events: {},\n source: \"builtin\",\n summary: \"Responsive CSS grid, 1–4 equal columns (collapses to one column on narrow screens).\",\n },\n Heading: {\n children: true,\n props: {\n level: {\n type: \"number\",\n description: \"Semantic heading level — drives the rendered tag AND the default size.\",\n enum: [1, 2, 3, 4, 5, 6],\n default: 2,\n },\n size: {\n type: \"string\",\n enum: [\"display-lg\", \"display\", \"title\", \"subtitle\"],\n default: \"title\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Section heading; `level` sets the HTML rank (1–6), `size` the type role.\",\n },\n Input: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n required: {\n type: \"boolean\",\n },\n type: {\n enum: [\"text\", \"email\", \"number\", \"password\", \"search\", \"tel\", \"url\", \"date\"],\n type: \"string\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Single-line text field — the base form input.\",\n },\n Kbd: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Label: {\n children: true,\n props: {\n htmlFor: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n MetricCard: {\n children: false,\n props: {\n currency: {\n type: \"string\",\n description: 'ISO 4217 code for `valueFormat: \"currency\"`. Default: `\"USD\"`.',\n },\n delta: {\n type: \"string\",\n description: 'Signed change, e.g. \"+12.4%\". Direction colors it.',\n },\n deltaDirection: {\n type: \"string\",\n enum: [\"up\", \"down\", \"neutral\"],\n },\n description: {\n type: \"node\",\n description: \"Secondary line under the value — sublabel / context.\",\n },\n evidence: {\n type: \"node\",\n description:\n \"Optional grounding footer (research 11 §B.5 KPI-3) — connects a cited figure to its source (e.g. an `EvidenceChip` from `@elabs-ai/components-ai`). Rendered …\",\n },\n label: {\n type: \"node\",\n required: true,\n },\n loading: {\n type: \"boolean\",\n description:\n \"Loading vs ready — renders a layout-shaped skeleton (matching the real box height) instead of the value/label/delta text. Default: `false`.\",\n },\n positiveIsGood: {\n type: \"boolean\",\n description: 'Whether \"up\" is good (green) — flip for metrics where down is good.',\n },\n sparkline: {\n type: \"node\",\n description:\n 'Trend slot rendered directly under the value (RM-072) — pass a `<Sparkline …/>` from `@elabs-ai/components-charts`. Hidden at `size=\"sm\"`.',\n },\n value: {\n type: \"node\",\n required: true,\n },\n valueFormat: {\n type: \"string\",\n description:\n 'How to render a NUMERIC `value`. Default: `\"compact\"`. Ignored for every other `ReactNode` — a string you already formatted is rendered verbatim.',\n enum: [\"number\", \"compact\", \"currency\", \"percent\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"One KPI: label, value, optional delta. Put several in a Grid.\",\n },\n Progress: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n marker: {\n type: \"number\",\n description:\n 'Reference point (0–100, same scale as `value`) — e.g. an \"expected by today\" pace or a target — rendered as a thin vertical tick on the track. Unset (default…',\n },\n markerLabel: {\n type: \"string\",\n description:\n 'What `marker` represents (already localized by the caller — e.g. `\"expected 70% by today\"`). When set, it is appended to the progress bar\\'s accessible value …',\n },\n max: {\n type: \"number\",\n },\n value: {\n type: \"number\",\n required: true,\n },\n variant: {\n type: \"string\",\n enum: [\"default\", \"success\", \"warning\", \"destructive\"],\n default: \"default\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n RadioGroup: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Mutually-exclusive single choice from a small visible set.\",\n },\n RadioGroupItem: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SectionHeader: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Right-aligned actions (buttons, menus).\",\n },\n description: {\n type: \"node\",\n },\n eyebrow: {\n type: \"node\",\n description: \"Optional element rendered above the title (eyebrow / breadcrumbs).\",\n },\n size: {\n type: \"string\",\n enum: [\"default\", \"lg\"],\n description:\n 'Title size: `\"default\"` (`text-title`) for a section inside a screen; `\"lg\"` (`text-display`, description at a readable measure) for the sections of a LONG p…',\n },\n title: {\n type: \"node\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Title + description + optional actions above a region.\",\n },\n Select: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose SelectTrigger (SelectValue) + SelectContent (SelectItem…).\",\n },\n SelectContent: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectItem: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectTrigger: {\n children: true,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n autoTitle: {\n type: \"boolean\",\n description:\n \"Auto-set a native `title` from the trigger's rendered text — but ONLY while that text is actually clipped (default `true`). Set `false` when the trigger is a…\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"default\"],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n SelectValue: {\n children: false,\n props: {\n placeholder: {\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Separator: {\n children: false,\n props: {\n orientation: {\n enum: [\"horizontal\", \"vertical\"],\n default: \"horizontal\",\n type: \"string\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Slider: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"array\",\n },\n max: {\n type: \"number\",\n },\n min: {\n type: \"number\",\n },\n step: {\n type: \"number\",\n },\n thumbProps: {\n type: \"array\",\n description:\n \"Escape hatch spread onto the thumb LAST — for `data-*`/`style`/etc, or to deliberately override `aria-label`/`aria-labelledby`/`aria-valuetext` (an explicit …\",\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n Stack: {\n builtin: true,\n children: true,\n props: {\n align: {\n enum: [\"start\", \"center\", \"end\", \"stretch\"],\n default: \"stretch\",\n type: \"string\",\n },\n direction: {\n enum: [\"column\", \"row\"],\n default: \"column\",\n type: \"string\",\n },\n gap: {\n enum: [\"none\", \"xs\", \"sm\", \"md\", \"lg\"],\n default: \"md\",\n type: \"string\",\n },\n justify: {\n enum: [\"start\", \"center\", \"end\", \"between\"],\n default: \"start\",\n type: \"string\",\n },\n wrap: {\n type: \"boolean\",\n default: false,\n },\n },\n events: {},\n source: \"builtin\",\n summary:\n \"Vertical or horizontal flex group. The default container — put siblings in a Stack, never bare.\",\n },\n StatePanel: {\n children: false,\n props: {\n actions: {\n type: \"node\",\n description: \"Primary / secondary action buttons.\",\n },\n description: {\n type: \"node\",\n description: \"Supporting description below the title.\",\n },\n icon: {\n type: \"node\",\n description:\n 'Icon shown above the title, clamped to a uniform 40×40 so mismatched glyphs stay tidy. For `\"error\"` defaults to a built-in warning triangle. For `\"loading\"`…',\n },\n illustration: {\n type: \"node\",\n description:\n \"A larger illustration (one of `@elabs-ai/components-ui`'s shipped `*Illustration` components, or a consumer's own `ReactNode`) shown above the title instead …\",\n },\n kind: {\n type: \"string\",\n enum: [\"empty\", \"error\", \"loading\"],\n default: \"empty\",\n },\n loadingLabel: {\n type: \"string\",\n description: 'Accessible label for the spinner in loading state. @default \"Loading…\"',\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\", \"lg\"],\n description: 'Spinner size (loading kind only). @default \"md\"',\n },\n title: {\n type: \"node\",\n description: \"Heading text.\",\n },\n titleAs: {\n type: \"string\",\n enum: [\"div\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"],\n description:\n \"Heading level for the panel's title (#328 convention). Set this to the level that correctly follows whatever heading precedes this panel in the document outl…\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"An empty / error / loading message panel.\",\n },\n StatusBadge: {\n children: false,\n props: {\n hideIcon: {\n type: \"boolean\",\n description: \"Render label-only (no status icon).\",\n },\n size: {\n type: \"string\",\n enum: [\"sm\", \"md\"],\n default: \"md\",\n },\n status: {\n type: \"string\",\n required: true,\n description: \"The canonical execution status, or a mapped out-of-vocabulary one (#363).\",\n enum: [\n \"pending\",\n \"running\",\n \"complete\",\n \"awaiting-approval\",\n \"denied\",\n \"failed\",\n \"skipped\",\n ],\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A closed status vocabulary with icon + text (never colour alone).\",\n },\n Switch: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultChecked: {\n type: \"boolean\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n },\n events: {\n change: \"onCheckedChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Immediate on/off setting toggle (applies on change, not on submit).\",\n },\n Table: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TableHeader/TableBody → TableRow → TableHead/TableCell.\",\n },\n TableBody: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCaption: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableCell: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableFooter: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHead: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableHeader: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TableRow: {\n children: true,\n props: {},\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Tabs: {\n children: true,\n props: {\n defaultValue: {\n type: \"string\",\n required: true,\n },\n },\n events: {\n change: \"onValueChange\",\n },\n source: \"@elabs-ai/components-ui\",\n summary: \"Compose TabsList (TabsTrigger…) + TabsContent per value.\",\n },\n TabsContent: {\n children: true,\n props: {\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsList: {\n children: true,\n props: {\n variant: {\n type: \"string\",\n enum: [\"segmented\", \"underline\"],\n default: \"segmented\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n TabsTrigger: {\n children: true,\n props: {\n disabled: {\n type: \"boolean\",\n },\n value: {\n type: \"string\",\n required: true,\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n },\n Text: {\n children: true,\n props: {\n tone: {\n type: \"string\",\n enum: [\"default\", \"muted\", \"primary\"],\n default: \"default\",\n },\n variant: {\n type: \"string\",\n enum: [\"lead\", \"body\", \"caption\", \"meta\", \"kpi\", \"kpi-sm\", \"eyebrow\", \"code\"],\n default: \"body\",\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"A paragraph or inline run of text with a type role and tone.\",\n },\n Textarea: {\n children: false,\n props: {\n \"aria-label\": {\n type: \"string\",\n },\n defaultValue: {\n type: \"string\",\n },\n disabled: {\n type: \"boolean\",\n },\n id: {\n type: \"string\",\n },\n placeholder: {\n type: \"string\",\n },\n rows: {\n type: \"number\",\n },\n },\n events: {\n change: \"onChange\",\n },\n source: \"@elabs-ai/components-ui\",\n },\n Timeline: {\n children: false,\n props: {\n items: {\n type: \"array\",\n required: true,\n description: '[{ title, description?, status?: \"done\"|\"active\"|\"pending\", timestamp? }]',\n },\n },\n events: {},\n source: \"@elabs-ai/components-ui\",\n summary: \"Ordered status timeline from `items` (title, status, timestamp, description).\",\n },\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/_lazy-cjk.ts
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
var CJK_RANGE_RE = /[ -〿-ヿ㐀-䶿一-鿿가-힣・-゚]/u;
|
|
6
|
+
function needsCjkPlugin(text) {
|
|
7
|
+
return CJK_RANGE_RE.test(text);
|
|
8
|
+
}
|
|
9
|
+
var cachedPlugin;
|
|
10
|
+
var loadPromise;
|
|
11
|
+
function loadCjkPlugin() {
|
|
12
|
+
loadPromise ??= import("@streamdown/cjk").then((mod) => {
|
|
13
|
+
cachedPlugin = mod.cjk;
|
|
14
|
+
return cachedPlugin;
|
|
15
|
+
});
|
|
16
|
+
return loadPromise;
|
|
17
|
+
}
|
|
18
|
+
var preloadCjk = () => {
|
|
19
|
+
void loadCjkPlugin();
|
|
20
|
+
};
|
|
21
|
+
function useLazyCjkPlugin(text) {
|
|
22
|
+
const needed = needsCjkPlugin(text);
|
|
23
|
+
const [plugin, setPlugin] = useState(cachedPlugin);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!needed || cachedPlugin) return;
|
|
26
|
+
let cancelled = false;
|
|
27
|
+
loadCjkPlugin().then((loaded) => {
|
|
28
|
+
if (!cancelled) setPlugin(loaded);
|
|
29
|
+
});
|
|
30
|
+
return () => {
|
|
31
|
+
cancelled = true;
|
|
32
|
+
};
|
|
33
|
+
}, [needed]);
|
|
34
|
+
if (!needed) return void 0;
|
|
35
|
+
return plugin ?? cachedPlugin;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
needsCjkPlugin,
|
|
40
|
+
preloadCjk,
|
|
41
|
+
useLazyCjkPlugin
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chunk-QUDZOTRV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/_lazy-cjk.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Lazy-loaded replacement for `@streamdown/cjk`'s eager `cjk` export.\n *\n * Same rationale and mechanism as `_lazy-math.ts` — `remark-cjk-friendly` +\n * `remark-cjk-friendly-gfm-strikethrough` load only once `needsCjkPlugin(text)`\n * sees a CJK codepoint, instead of shipping in every consumer's entry chunk.\n * See `_lazy-math.ts` for why a remark `Pluggable` cannot be deferred the way\n * `DiagramPlugin` defers Mermaid's render, and for the one-paint literal-text\n * cost this trades for it.\n */\nimport type { CjkPlugin } from \"@streamdown/cjk\";\nimport { useEffect, useState } from \"react\";\n\n/**\n * Hiragana, Katakana, CJK Unified Ideographs (+ Extension A), Hangul Syllables,\n * CJK punctuation and halfwidth Katakana — the ranges `remark-cjk-friendly`\n * exists to handle (emphasis/strikethrough boundary rules around CJK text).\n */\n// The range's first codepoint is the ideographic full-width space, not\n// accidental whitespace — a deliberate boundary character, not noise.\n// eslint-disable-next-line no-irregular-whitespace -- see comment above\nconst CJK_RANGE_RE = /[ -〿-ヿ㐀-䶿一-鿿가-힣・-゚]/u;\n\n/** Does `text` contain a CJK codepoint? */\nexport function needsCjkPlugin(text: string): boolean {\n return CJK_RANGE_RE.test(text);\n}\n\n/** Module-level singleton: the plugin loads at most once. */\nlet cachedPlugin: CjkPlugin | undefined;\nlet loadPromise: Promise<CjkPlugin> | undefined;\n\nfunction loadCjkPlugin(): Promise<CjkPlugin> {\n loadPromise ??= import(\"@streamdown/cjk\").then((mod) => {\n cachedPlugin = mod.cjk;\n return cachedPlugin;\n });\n return loadPromise;\n}\n\n/**\n * Start fetching the CJK plugin ahead of time (e.g. once a conversation's\n * locale is known to be CJK). Optional; rendering CJK text loads it either way.\n */\nexport const preloadCjk = (): void => {\n void loadCjkPlugin();\n};\n\n/**\n * Returns the loaded `CjkPlugin` once `text` needs one, else `undefined`\n * (Streamdown treats an absent `plugins.cjk` slot as \"no CJK handling\" — plain\n * remark-gfm boundary rules apply until the plugin arrives).\n */\nexport function useLazyCjkPlugin(text: string): CjkPlugin | undefined {\n const needed = needsCjkPlugin(text);\n const [plugin, setPlugin] = useState<CjkPlugin | undefined>(cachedPlugin);\n\n useEffect(() => {\n if (!needed || cachedPlugin) return;\n let cancelled = false;\n loadCjkPlugin().then((loaded) => {\n if (!cancelled) setPlugin(loaded);\n });\n return () => {\n cancelled = true;\n };\n }, [needed]);\n\n if (!needed) return undefined;\n return plugin ?? cachedPlugin;\n}\n"],"mappings":";;;AAaA,SAAS,WAAW,gBAAgB;AAUpC,IAAM,eAAe;AAGd,SAAS,eAAe,MAAuB;AACpD,SAAO,aAAa,KAAK,IAAI;AAC/B;AAGA,IAAI;AACJ,IAAI;AAEJ,SAAS,gBAAoC;AAC3C,kBAAgB,OAAO,iBAAiB,EAAE,KAAK,CAAC,QAAQ;AACtD,mBAAe,IAAI;AACnB,WAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAMO,IAAM,aAAa,MAAY;AACpC,OAAK,cAAc;AACrB;AAOO,SAAS,iBAAiB,MAAqC;AACpE,QAAM,SAAS,eAAe,IAAI;AAClC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,YAAY;AAExE,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,aAAc;AAC7B,QAAI,YAAY;AAChB,kBAAc,EAAE,KAAK,CAAC,WAAW;AAC/B,UAAI,CAAC,UAAW,WAAU,MAAM;AAAA,IAClC,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,UAAU;AACnB;","names":[]}
|
|
@@ -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"]}
|