@elabs-ai/components-ai 4.2.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
- package/dist/_code-block-theme.js +12 -0
- package/dist/_code-block-theme.js.map +1 -0
- package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
- package/dist/_flow-boundary.js.map +1 -0
- package/dist/_flow-lazy.js +8 -0
- package/dist/_flow-lazy.js.map +1 -0
- package/dist/_lazy-boundary-conformance.js +2 -0
- package/dist/_lazy-boundary-conformance.js.map +1 -0
- package/dist/_lazy-cjk.js +13 -0
- package/dist/_lazy-cjk.js.map +1 -0
- package/dist/_lazy-engine-boundary.js +9 -0
- package/dist/_lazy-engine-boundary.js.map +1 -0
- package/dist/_lazy-math.js +13 -0
- package/dist/_lazy-math.js.map +1 -0
- package/dist/_lazy-mermaid.js +12 -0
- package/dist/_lazy-mermaid.js.map +1 -0
- package/dist/_mermaid-error-panel.js +9 -0
- package/dist/_mermaid-error-panel.js.map +1 -0
- package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
- package/dist/_persona-rive.js.map +1 -0
- package/dist/_streamdown-i18n.js +21 -0
- package/dist/_streamdown-i18n.js.map +1 -0
- package/dist/_streamdown-safety.js +10 -0
- package/dist/_streamdown-safety.js.map +1 -0
- package/dist/_theme-scope-store.js +13 -0
- package/dist/_theme-scope-store.js.map +1 -0
- package/dist/a2ui/a2ui-surface.js +17 -0
- package/dist/a2ui/a2ui-surface.js.map +1 -0
- package/dist/a2ui/core/catalog.generated.js +10 -0
- package/dist/a2ui/core/catalog.generated.js.map +1 -0
- package/dist/a2ui/core/complete-json.js +10 -0
- package/dist/a2ui/core/complete-json.js.map +1 -0
- package/dist/a2ui/core/index.js +37 -0
- package/dist/a2ui/core/index.js.map +1 -0
- package/dist/a2ui/core/schema.js +11 -0
- package/dist/a2ui/core/schema.js.map +1 -0
- package/dist/a2ui/core/spec.js +10 -0
- package/dist/a2ui/core/spec.js.map +1 -0
- package/dist/a2ui/core/validate.js +16 -0
- package/dist/a2ui/core/validate.js.map +1 -0
- package/dist/a2ui/index.js +54 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/ui-catalog.js +18 -0
- package/dist/a2ui/ui-catalog.js.map +1 -0
- package/dist/agent-event.js +10 -0
- package/dist/agent-event.js.map +1 -0
- package/dist/agent-timeline.js +11 -0
- package/dist/agent-timeline.js.map +1 -0
- package/dist/agent.js +25 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.js +23 -0
- package/dist/artifact.js.map +1 -0
- package/dist/asset-preview.js +22 -0
- package/dist/asset-preview.js.map +1 -0
- package/dist/attachments.js +33 -0
- package/dist/attachments.js.map +1 -0
- package/dist/audio-player.js +30 -0
- package/dist/audio-player.js.map +1 -0
- package/dist/audio-visualizer.js +9 -0
- package/dist/audio-visualizer.js.map +1 -0
- package/dist/canvas.js +10 -0
- package/dist/canvas.js.map +1 -0
- package/dist/chain-of-thought.js +22 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/chat-greeting.js +8 -0
- package/dist/chat-greeting.js.map +1 -0
- package/dist/chat-shell.js +9 -0
- package/dist/chat-shell.js.map +1 -0
- package/dist/checkpoint.js +13 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/chunk-2XOIG5TG.js +72 -0
- package/dist/chunk-2XOIG5TG.js.map +1 -0
- package/dist/chunk-34CQ2VHM.js +172 -0
- package/dist/chunk-34CQ2VHM.js.map +1 -0
- package/dist/chunk-3TDHPXZZ.js +60 -0
- package/dist/chunk-3TDHPXZZ.js.map +1 -0
- package/dist/chunk-3XNPMDZY.js +478 -0
- package/dist/chunk-3XNPMDZY.js.map +1 -0
- package/dist/chunk-3YPT3V7L.js +56 -0
- package/dist/chunk-3YPT3V7L.js.map +1 -0
- package/dist/chunk-475UEU2Q.js +87 -0
- package/dist/chunk-475UEU2Q.js.map +1 -0
- package/dist/chunk-4CBTII2I.js +95 -0
- package/dist/chunk-4CBTII2I.js.map +1 -0
- package/dist/chunk-4XRNIZMG.js +22 -0
- package/dist/chunk-4XRNIZMG.js.map +1 -0
- package/dist/chunk-5NNWUKK5.js +2 -0
- package/dist/chunk-5NNWUKK5.js.map +1 -0
- package/dist/chunk-5UOMU27Z.js +164 -0
- package/dist/chunk-5UOMU27Z.js.map +1 -0
- package/dist/chunk-5VGYZ62I.js +264 -0
- package/dist/chunk-5VGYZ62I.js.map +1 -0
- package/dist/chunk-6IQPH2OS.js +21 -0
- package/dist/chunk-6IQPH2OS.js.map +1 -0
- package/dist/chunk-6PB2MXCI.js +482 -0
- package/dist/chunk-6PB2MXCI.js.map +1 -0
- package/dist/chunk-7FD5CZEU.js +215 -0
- package/dist/chunk-7FD5CZEU.js.map +1 -0
- package/dist/chunk-7RL6KZDF.js +266 -0
- package/dist/chunk-7RL6KZDF.js.map +1 -0
- package/dist/chunk-ADOYAGGK.js +482 -0
- package/dist/chunk-ADOYAGGK.js.map +1 -0
- package/dist/chunk-AXMNJMMH.js +984 -0
- package/dist/chunk-AXMNJMMH.js.map +1 -0
- package/dist/chunk-BA3AEMOU.js +21 -0
- package/dist/chunk-BA3AEMOU.js.map +1 -0
- package/dist/chunk-BBHFOYML.js +336 -0
- package/dist/chunk-BBHFOYML.js.map +1 -0
- package/dist/chunk-BHUVISIY.js +221 -0
- package/dist/chunk-BHUVISIY.js.map +1 -0
- package/dist/chunk-BM2LWERA.js +100 -0
- package/dist/chunk-BM2LWERA.js.map +1 -0
- package/dist/chunk-CMOYXNPJ.js +211 -0
- package/dist/chunk-CMOYXNPJ.js.map +1 -0
- package/dist/chunk-CZP3RHC4.js +74 -0
- package/dist/chunk-CZP3RHC4.js.map +1 -0
- package/dist/chunk-DDG5JHQT.js +112 -0
- package/dist/chunk-DDG5JHQT.js.map +1 -0
- package/dist/chunk-DJODXO7I.js +38 -0
- package/dist/chunk-DJODXO7I.js.map +1 -0
- package/dist/chunk-DWJDJLPU.js +192 -0
- package/dist/chunk-DWJDJLPU.js.map +1 -0
- package/dist/chunk-DZW6LM22.js +45 -0
- package/dist/chunk-DZW6LM22.js.map +1 -0
- package/dist/chunk-ELGCZLZF.js +305 -0
- package/dist/chunk-ELGCZLZF.js.map +1 -0
- package/dist/chunk-EV3U6ZZB.js +209 -0
- package/dist/chunk-EV3U6ZZB.js.map +1 -0
- package/dist/chunk-EY7LVUKQ.js +87 -0
- package/dist/chunk-EY7LVUKQ.js.map +1 -0
- package/dist/chunk-F4C74F7M.js +230 -0
- package/dist/chunk-F4C74F7M.js.map +1 -0
- package/dist/chunk-FERYDFZA.js +108 -0
- package/dist/chunk-FERYDFZA.js.map +1 -0
- package/dist/chunk-FUIYG2DS.js +166 -0
- package/dist/chunk-FUIYG2DS.js.map +1 -0
- package/dist/chunk-GKYZT3LA.js +136 -0
- package/dist/chunk-GKYZT3LA.js.map +1 -0
- package/dist/chunk-H42LRUQ4.js +102 -0
- package/dist/chunk-H42LRUQ4.js.map +1 -0
- package/dist/chunk-HVXM2G5F.js +222 -0
- package/dist/chunk-HVXM2G5F.js.map +1 -0
- package/dist/chunk-I4RDAGVY.js +53 -0
- package/dist/chunk-I4RDAGVY.js.map +1 -0
- package/dist/chunk-IQJG4IDX.js +208 -0
- package/dist/chunk-IQJG4IDX.js.map +1 -0
- package/dist/chunk-IX2PXG4Y.js +144 -0
- package/dist/chunk-IX2PXG4Y.js.map +1 -0
- package/dist/chunk-IXICSOOP.js +287 -0
- package/dist/chunk-IXICSOOP.js.map +1 -0
- package/dist/chunk-JY5HSN4D.js +84 -0
- package/dist/chunk-JY5HSN4D.js.map +1 -0
- package/dist/chunk-LMNSBOBG.js +19 -0
- package/dist/chunk-LMNSBOBG.js.map +1 -0
- package/dist/chunk-MBI7D6IL.js +42 -0
- package/dist/chunk-MBI7D6IL.js.map +1 -0
- package/dist/chunk-MLFMYCPH.js +192 -0
- package/dist/chunk-MLFMYCPH.js.map +1 -0
- package/dist/chunk-MOK66734.js +33 -0
- package/dist/chunk-MOK66734.js.map +1 -0
- package/dist/chunk-MXTAWPYM.js +196 -0
- package/dist/chunk-MXTAWPYM.js.map +1 -0
- package/dist/chunk-NCL2UZKI.js +96 -0
- package/dist/chunk-NCL2UZKI.js.map +1 -0
- package/dist/chunk-NET4YLRY.js +107 -0
- package/dist/chunk-NET4YLRY.js.map +1 -0
- package/dist/chunk-NIG67CFM.js +329 -0
- package/dist/chunk-NIG67CFM.js.map +1 -0
- package/dist/chunk-NMVNNO3L.js +10 -0
- package/dist/chunk-NMVNNO3L.js.map +1 -0
- package/dist/chunk-NP7VID4K.js +2 -0
- package/dist/chunk-NP7VID4K.js.map +1 -0
- package/dist/chunk-NPUCMAG2.js +382 -0
- package/dist/chunk-NPUCMAG2.js.map +1 -0
- package/dist/chunk-NSCLRHES.js +102 -0
- package/dist/chunk-NSCLRHES.js.map +1 -0
- package/dist/chunk-OEUXHVFW.js +86 -0
- package/dist/chunk-OEUXHVFW.js.map +1 -0
- package/dist/chunk-ONBHFIMZ.js +137 -0
- package/dist/chunk-ONBHFIMZ.js.map +1 -0
- package/dist/chunk-OPH2HHL2.js +228 -0
- package/dist/chunk-OPH2HHL2.js.map +1 -0
- package/dist/chunk-OQERHIQP.js +287 -0
- package/dist/chunk-OQERHIQP.js.map +1 -0
- package/dist/chunk-P6YJAZFG.js +103 -0
- package/dist/chunk-P6YJAZFG.js.map +1 -0
- package/dist/chunk-PG7ERDOD.js +65 -0
- package/dist/chunk-PG7ERDOD.js.map +1 -0
- package/dist/chunk-PIB5JBMA.js +90 -0
- package/dist/chunk-PIB5JBMA.js.map +1 -0
- package/dist/chunk-PQ5BPIWQ.js +22 -0
- package/dist/chunk-PQ5BPIWQ.js.map +1 -0
- package/dist/chunk-PQBF6ZIQ.js +55 -0
- package/dist/chunk-PQBF6ZIQ.js.map +1 -0
- package/dist/chunk-PTWCTSZL.js +173 -0
- package/dist/chunk-PTWCTSZL.js.map +1 -0
- package/dist/chunk-QJUNPVOS.js +101 -0
- package/dist/chunk-QJUNPVOS.js.map +1 -0
- package/dist/chunk-QUDZOTRV.js +43 -0
- package/dist/chunk-QUDZOTRV.js.map +1 -0
- package/dist/chunk-RB7G65JC.js +213 -0
- package/dist/chunk-RB7G65JC.js.map +1 -0
- package/dist/chunk-RPHAOR7P.js +45 -0
- package/dist/chunk-RPHAOR7P.js.map +1 -0
- package/dist/chunk-RTCSH2AN.js +331 -0
- package/dist/chunk-RTCSH2AN.js.map +1 -0
- package/dist/chunk-S3ISPW3A.js +28 -0
- package/dist/chunk-S3ISPW3A.js.map +1 -0
- package/dist/chunk-SEVN656N.js +36 -0
- package/dist/chunk-SEVN656N.js.map +1 -0
- package/dist/chunk-SKVG672B.js +64 -0
- package/dist/chunk-SKVG672B.js.map +1 -0
- package/dist/chunk-SPQIU7GA.js +236 -0
- package/dist/chunk-SPQIU7GA.js.map +1 -0
- package/dist/chunk-SSGJ6MEM.js +1076 -0
- package/dist/chunk-SSGJ6MEM.js.map +1 -0
- package/dist/chunk-SSKZ2AED.js +118 -0
- package/dist/chunk-SSKZ2AED.js.map +1 -0
- package/dist/chunk-T56JFGXI.js +561 -0
- package/dist/chunk-T56JFGXI.js.map +1 -0
- package/dist/chunk-TCB6O74A.js +137 -0
- package/dist/chunk-TCB6O74A.js.map +1 -0
- package/dist/chunk-TTEYPO6X.js +57 -0
- package/dist/chunk-TTEYPO6X.js.map +1 -0
- package/dist/chunk-TWPHAJNM.js +462 -0
- package/dist/chunk-TWPHAJNM.js.map +1 -0
- package/dist/chunk-TXJJLP4O.js +336 -0
- package/dist/chunk-TXJJLP4O.js.map +1 -0
- package/dist/chunk-TZ6TB7VM.js +245 -0
- package/dist/chunk-TZ6TB7VM.js.map +1 -0
- package/dist/chunk-UBLKJJ7K.js +278 -0
- package/dist/chunk-UBLKJJ7K.js.map +1 -0
- package/dist/chunk-UCJ6IUFS.js +52 -0
- package/dist/chunk-UCJ6IUFS.js.map +1 -0
- package/dist/chunk-UCKFJ3QF.js +197 -0
- package/dist/chunk-UCKFJ3QF.js.map +1 -0
- package/dist/chunk-UPXSLILN.js +20 -0
- package/dist/chunk-UPXSLILN.js.map +1 -0
- package/dist/chunk-V4DORGWJ.js +92 -0
- package/dist/chunk-V4DORGWJ.js.map +1 -0
- package/dist/chunk-V6E5DYZD.js +80 -0
- package/dist/chunk-V6E5DYZD.js.map +1 -0
- package/dist/chunk-VLLYKF3P.js +96 -0
- package/dist/chunk-VLLYKF3P.js.map +1 -0
- package/dist/chunk-VLNBTOH6.js +43 -0
- package/dist/chunk-VLNBTOH6.js.map +1 -0
- package/dist/chunk-WMDSMSPL.js +303 -0
- package/dist/chunk-WMDSMSPL.js.map +1 -0
- package/dist/chunk-WU5BLGTF.js +149 -0
- package/dist/chunk-WU5BLGTF.js.map +1 -0
- package/dist/chunk-WYTZVSGK.js +245 -0
- package/dist/chunk-WYTZVSGK.js.map +1 -0
- package/dist/chunk-X47QMM6K.js +187 -0
- package/dist/chunk-X47QMM6K.js.map +1 -0
- package/dist/chunk-XNBKO32Y.js +174 -0
- package/dist/chunk-XNBKO32Y.js.map +1 -0
- package/dist/chunk-YHUSW7D2.js +40 -0
- package/dist/chunk-YHUSW7D2.js.map +1 -0
- package/dist/chunk-YSKD7UXX.js +126 -0
- package/dist/chunk-YSKD7UXX.js.map +1 -0
- package/dist/chunk-YYRDGWOU.js +72 -0
- package/dist/chunk-YYRDGWOU.js.map +1 -0
- package/dist/chunk-ZIGZMWM7.js +19 -0
- package/dist/chunk-ZIGZMWM7.js.map +1 -0
- package/dist/chunk-ZKRTUKNP.js +40 -0
- package/dist/chunk-ZKRTUKNP.js.map +1 -0
- package/dist/code-block.js +38 -0
- package/dist/code-block.js.map +1 -0
- package/dist/commit.js +51 -0
- package/dist/commit.js.map +1 -0
- package/dist/composer.js +15 -0
- package/dist/composer.js.map +1 -0
- package/dist/confirmation.js +53 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/connection.js +8 -0
- package/dist/connection.js.map +1 -0
- package/dist/context-panel.js +25 -0
- package/dist/context-panel.js.map +1 -0
- package/dist/controls.js +10 -0
- package/dist/controls.js.map +1 -0
- package/dist/conversation.js +19 -0
- package/dist/conversation.js.map +1 -0
- package/dist/diff-view.js +15 -0
- package/dist/diff-view.js.map +1 -0
- package/dist/edge.js +10 -0
- package/dist/edge.js.map +1 -0
- package/dist/environment-variables.js +29 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/file-tree.js +23 -0
- package/dist/file-tree.js.map +1 -0
- package/dist/gallery.js +9 -0
- package/dist/gallery.js.map +1 -0
- package/dist/grouped-parts.js +21 -0
- package/dist/grouped-parts.js.map +1 -0
- package/dist/image.js +9 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +366 -98
- package/dist/index.js +672 -13577
- package/dist/index.js.map +1 -1
- package/dist/inline-citation.js +39 -0
- package/dist/inline-citation.js.map +1 -0
- package/dist/jsx-preview.js +17 -0
- package/dist/jsx-preview.js.map +1 -0
- package/dist/markdown-view.js +17 -0
- package/dist/markdown-view.js.map +1 -0
- package/dist/message-compare.js +12 -0
- package/dist/message-compare.js.map +1 -0
- package/dist/message-edit.js +19 -0
- package/dist/message-edit.js.map +1 -0
- package/dist/message-feedback.js +11 -0
- package/dist/message-feedback.js.map +1 -0
- package/dist/message-form-spec.js +38 -0
- package/dist/message-form-spec.js.map +1 -0
- package/dist/message-form.js +26 -0
- package/dist/message-form.js.map +1 -0
- package/dist/message-table-spec.js +26 -0
- package/dist/message-table-spec.js.map +1 -0
- package/dist/message-table.js +12 -0
- package/dist/message-table.js.map +1 -0
- package/dist/message.js +51 -0
- package/dist/message.js.map +1 -0
- package/dist/mic-selector.js +27 -0
- package/dist/mic-selector.js.map +1 -0
- package/dist/model-provider-logo.js +13 -0
- package/dist/model-provider-logo.js.map +1 -0
- package/dist/motion-config.js +9 -0
- package/dist/motion-config.js.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/open-in-chat.js +31 -0
- package/dist/open-in-chat.js.map +1 -0
- package/dist/package-info.js +25 -0
- package/dist/package-info.js.map +1 -0
- package/dist/panel.js +10 -0
- package/dist/panel.js.map +1 -0
- package/dist/part-groups.js +18 -0
- package/dist/part-groups.js.map +1 -0
- package/dist/permission-mode-select.js +9 -0
- package/dist/permission-mode-select.js.map +1 -0
- package/dist/persona-sources.js +8 -0
- package/dist/persona-sources.js.map +1 -0
- package/dist/persona.js +14 -0
- package/dist/persona.js.map +1 -0
- package/dist/plan.js +32 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompt-input-effort.js +9 -0
- package/dist/prompt-input-effort.js.map +1 -0
- package/dist/prompt-input-mode.js +10 -0
- package/dist/prompt-input-mode.js.map +1 -0
- package/dist/prompt-input-slash.js +12 -0
- package/dist/prompt-input-slash.js.map +1 -0
- package/dist/prompt-input.js +89 -0
- package/dist/prompt-input.js.map +1 -0
- package/dist/queue.js +37 -0
- package/dist/queue.js.map +1 -0
- package/dist/reasoning.js +23 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/sandbox.js +28 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/schema-display.js +33 -0
- package/dist/schema-display.js.map +1 -0
- package/dist/selection-toolbar.js +11 -0
- package/dist/selection-toolbar.js.map +1 -0
- package/dist/session-header.js +9 -0
- package/dist/session-header.js.map +1 -0
- package/dist/session-status-bar.js +9 -0
- package/dist/session-status-bar.js.map +1 -0
- package/dist/shimmer.js +9 -0
- package/dist/shimmer.js.map +1 -0
- package/dist/snippet.js +17 -0
- package/dist/snippet.js.map +1 -0
- package/dist/sources.js +17 -0
- package/dist/sources.js.map +1 -0
- package/dist/speech-input.js +9 -0
- package/dist/speech-input.js.map +1 -0
- package/dist/stack-trace.js +27 -0
- package/dist/stack-trace.js.map +1 -0
- package/dist/suggestion.js +16 -0
- package/dist/suggestion.js.map +1 -0
- package/dist/task.js +18 -0
- package/dist/task.js.map +1 -0
- package/dist/test-results.js +43 -0
- package/dist/test-results.js.map +1 -0
- package/dist/token-usage.js +27 -0
- package/dist/token-usage.js.map +1 -0
- package/dist/tool-result-card.js +9 -0
- package/dist/tool-result-card.js.map +1 -0
- package/dist/tool.js +27 -0
- package/dist/tool.js.map +1 -0
- package/dist/toolbar.js +10 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/transcription.js +11 -0
- package/dist/transcription.js.map +1 -0
- package/dist/turn-status.js +9 -0
- package/dist/turn-status.js.map +1 -0
- package/dist/use-audio-level.js +9 -0
- package/dist/use-audio-level.js.map +1 -0
- package/dist/voice-selector.js +47 -0
- package/dist/voice-selector.js.map +1 -0
- package/dist/web-preview.js +19 -0
- package/dist/web-preview.js.map +1 -0
- package/package.json +11 -9
- package/schemas/a2ui-surface.v1.schema.json +5425 -0
- package/src/_chat-shell-rail.tsx +3 -1
- package/src/_flow-boundary.tsx +2 -2
- package/src/_persona-rive.tsx +27 -41
- package/src/a2ui/a2ui-surface.stories.tsx +662 -0
- package/src/a2ui/a2ui-surface.test.tsx +201 -0
- package/src/a2ui/a2ui-surface.tsx +354 -0
- package/src/a2ui/catalog.source.json +772 -0
- package/src/a2ui/core/a2ui-core.test.ts +178 -0
- package/src/a2ui/core/catalog.generated.ts +1006 -0
- package/src/a2ui/core/complete-json.ts +81 -0
- package/src/a2ui/core/index.ts +10 -0
- package/src/a2ui/core/schema.ts +111 -0
- package/src/a2ui/core/spec.ts +148 -0
- package/src/a2ui/core/validate.ts +266 -0
- package/src/a2ui/index.ts +7 -0
- package/src/a2ui/ui-catalog.tsx +225 -0
- package/src/a2ui/wave1-chart-spec.test.ts +87 -0
- package/src/a2ui/wave2-chart-spec.test.ts +108 -0
- package/src/agentic-workspace.stories.tsx +6 -45
- package/src/chat-shell.test.tsx +40 -10
- package/src/chat-shell.tsx +90 -44
- package/src/chat.stories.tsx +47 -42
- package/src/composer.stories.tsx +4 -5
- package/src/composer.test.tsx +45 -0
- package/src/composer.tsx +104 -21
- package/src/context-panel.stories.tsx +1 -1
- package/src/context-panel.tsx +1 -1
- package/src/conversation.stories.tsx +1 -0
- package/src/conversation.test.tsx +16 -0
- package/src/conversation.tsx +16 -2
- package/src/diff-view.stories.tsx +79 -0
- package/src/diff-view.tsx +3 -2
- package/src/file-tree.tsx +24 -17
- package/src/gallery.stories.tsx +42 -0
- package/src/gallery.tsx +2 -2
- package/src/grouped-parts.stories.tsx +23 -0
- package/src/grouped-parts.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/message-compare.stories.tsx +40 -0
- package/src/message-compare.tsx +2 -1
- package/src/message-form.tsx +1 -1
- package/src/message-table.stories.tsx +24 -0
- package/src/message-table.tsx +1 -1
- package/src/package-info.tsx +12 -9
- package/src/reasoning.stories.tsx +27 -0
- package/src/reasoning.tsx +1 -1
- package/src/session-header.stories.tsx +35 -1
- package/src/session-header.tsx +1 -1
- package/src/sources.stories.tsx +30 -0
- package/src/sources.tsx +4 -1
- package/src/templates-ai-assistant.stories.tsx +151 -87
- package/src/tool.stories.tsx +39 -0
- package/src/tool.tsx +3 -3
- package/src/toolbar.tsx +0 -10
- package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
- package/dist/_persona-rive-JEG44YHX.js.map +0 -1
- /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/schema-display.tsx
|
|
4
|
+
import { Badge } from "@elabs-ai/components-ui";
|
|
5
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
|
|
6
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
7
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
8
|
+
import { ChevronRightIcon } from "lucide-react";
|
|
9
|
+
import { createContext, Fragment, useContext, useMemo } from "react";
|
|
10
|
+
import { Fragment as Fragment2, jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var SchemaDisplayContext = createContext({
|
|
12
|
+
method: "GET",
|
|
13
|
+
path: ""
|
|
14
|
+
});
|
|
15
|
+
var methodStyles = {
|
|
16
|
+
DELETE: "border-destructive/40 bg-destructive/10 text-destructive-text",
|
|
17
|
+
GET: "border-success/40 bg-success/10 text-success-text",
|
|
18
|
+
PATCH: "border-warning/40 bg-warning/10 text-warning-text",
|
|
19
|
+
POST: "border-info/40 bg-info/10 text-info-text",
|
|
20
|
+
PUT: "border-warning/40 bg-warning/10 text-warning-text"
|
|
21
|
+
};
|
|
22
|
+
function splitSchemaPath(path) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
const regex = /\{([^}]+)\}/g;
|
|
25
|
+
let lastIndex = 0;
|
|
26
|
+
let match = regex.exec(path);
|
|
27
|
+
while (match !== null) {
|
|
28
|
+
if (match.index > lastIndex) {
|
|
29
|
+
parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });
|
|
30
|
+
}
|
|
31
|
+
parts.push({ isParam: true, text: match[0] });
|
|
32
|
+
lastIndex = match.index + match[0].length;
|
|
33
|
+
match = regex.exec(path);
|
|
34
|
+
}
|
|
35
|
+
if (lastIndex < path.length) {
|
|
36
|
+
parts.push({ isParam: false, text: path.slice(lastIndex) });
|
|
37
|
+
}
|
|
38
|
+
return parts;
|
|
39
|
+
}
|
|
40
|
+
var SchemaDisplayHeader = ({
|
|
41
|
+
className,
|
|
42
|
+
children,
|
|
43
|
+
...props
|
|
44
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-3 border-b px-4 py-3", className), ...props, children });
|
|
45
|
+
var SchemaDisplayMethod = ({
|
|
46
|
+
className,
|
|
47
|
+
children,
|
|
48
|
+
...props
|
|
49
|
+
}) => {
|
|
50
|
+
const { method } = useContext(SchemaDisplayContext);
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
Badge,
|
|
53
|
+
{
|
|
54
|
+
className: cn("font-mono text-meta", methodStyles[method], className),
|
|
55
|
+
variant: "secondary",
|
|
56
|
+
...props,
|
|
57
|
+
children: children ?? method
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
var SchemaDisplayPath = ({ className, children, ...props }) => {
|
|
62
|
+
const { path } = useContext(SchemaDisplayContext);
|
|
63
|
+
const pathNodes = useMemo(
|
|
64
|
+
() => splitSchemaPath(path).map(
|
|
65
|
+
(part, index) => part.isParam ? /* @__PURE__ */ jsx("span", { className: "text-info-text", children: part.text }, `${part.text}-${index}`) : /* @__PURE__ */ jsx(Fragment, { children: part.text }, `${part.text}-${index}`)
|
|
66
|
+
),
|
|
67
|
+
[path]
|
|
68
|
+
);
|
|
69
|
+
return /* @__PURE__ */ jsx("span", { className: cn("font-mono text-body", className), ...props, children: children ?? pathNodes });
|
|
70
|
+
};
|
|
71
|
+
var SchemaDisplayDescription = ({
|
|
72
|
+
className,
|
|
73
|
+
children,
|
|
74
|
+
...props
|
|
75
|
+
}) => {
|
|
76
|
+
const { description } = useContext(SchemaDisplayContext);
|
|
77
|
+
return /* @__PURE__ */ jsx("p", { className: cn("border-b px-4 py-3 text-muted-foreground text-body", className), ...props, children: children ?? description });
|
|
78
|
+
};
|
|
79
|
+
var SchemaDisplayContent = ({
|
|
80
|
+
className,
|
|
81
|
+
children,
|
|
82
|
+
...props
|
|
83
|
+
}) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
|
|
84
|
+
var SchemaDisplayParameter = ({
|
|
85
|
+
name,
|
|
86
|
+
type,
|
|
87
|
+
required,
|
|
88
|
+
description,
|
|
89
|
+
location,
|
|
90
|
+
className,
|
|
91
|
+
...props
|
|
92
|
+
}) => /* @__PURE__ */ jsxs("div", { className: cn("px-4 py-3 ps-10", className), ...props, children: [
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
94
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
95
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
96
|
+
location && /* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "secondary", children: location }),
|
|
97
|
+
required && /* @__PURE__ */ jsx(
|
|
98
|
+
Badge,
|
|
99
|
+
{
|
|
100
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
101
|
+
variant: "secondary",
|
|
102
|
+
children: "required"
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
] }),
|
|
106
|
+
description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-muted-foreground text-body", children: description })
|
|
107
|
+
] });
|
|
108
|
+
var SchemaDisplayParameters = ({
|
|
109
|
+
className,
|
|
110
|
+
children,
|
|
111
|
+
...props
|
|
112
|
+
}) => {
|
|
113
|
+
const { parameters } = useContext(SchemaDisplayContext);
|
|
114
|
+
const { t } = useLocale();
|
|
115
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
116
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
117
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
118
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.parameters") }),
|
|
119
|
+
/* @__PURE__ */ jsx(Badge, { className: "ms-auto text-meta", variant: "secondary", children: parameters?.length })
|
|
120
|
+
] }),
|
|
121
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "divide-y border-t", children: children ?? parameters?.map((param) => /* @__PURE__ */ jsx(SchemaDisplayParameter, { ...param }, param.name)) }) })
|
|
122
|
+
] });
|
|
123
|
+
};
|
|
124
|
+
var SchemaDisplayProperty = ({
|
|
125
|
+
name,
|
|
126
|
+
type,
|
|
127
|
+
required,
|
|
128
|
+
description,
|
|
129
|
+
properties,
|
|
130
|
+
items,
|
|
131
|
+
depth = 0,
|
|
132
|
+
className,
|
|
133
|
+
...props
|
|
134
|
+
}) => {
|
|
135
|
+
const hasChildren = properties || items;
|
|
136
|
+
const paddingLeft = 40 + depth * 16;
|
|
137
|
+
if (hasChildren) {
|
|
138
|
+
return /* @__PURE__ */ jsxs(Collapsible, { defaultOpen: depth < 2, children: [
|
|
139
|
+
/* @__PURE__ */ jsxs(
|
|
140
|
+
CollapsibleTrigger,
|
|
141
|
+
{
|
|
142
|
+
className: cn(
|
|
143
|
+
"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50",
|
|
144
|
+
className
|
|
145
|
+
),
|
|
146
|
+
style: { paddingLeft },
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
149
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
150
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
151
|
+
required && /* @__PURE__ */ jsx(
|
|
152
|
+
Badge,
|
|
153
|
+
{
|
|
154
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
155
|
+
variant: "secondary",
|
|
156
|
+
children: "required"
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
description && /* @__PURE__ */ jsx(
|
|
163
|
+
"p",
|
|
164
|
+
{
|
|
165
|
+
className: "pb-2 text-muted-foreground text-body",
|
|
166
|
+
style: { paddingLeft: paddingLeft + 24 },
|
|
167
|
+
children: description
|
|
168
|
+
}
|
|
169
|
+
),
|
|
170
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxs("div", { className: "divide-y border-t", children: [
|
|
171
|
+
properties?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: depth + 1 }, prop.name)),
|
|
172
|
+
items && /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...items, depth: depth + 1, name: `${name}[]` })
|
|
173
|
+
] }) })
|
|
174
|
+
] });
|
|
175
|
+
}
|
|
176
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("py-3 pe-4", className), style: { paddingLeft }, ...props, children: [
|
|
177
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "size-4" }),
|
|
179
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-body", children: name }),
|
|
180
|
+
/* @__PURE__ */ jsx(Badge, { className: "text-meta", variant: "outline", children: type }),
|
|
181
|
+
required && /* @__PURE__ */ jsx(
|
|
182
|
+
Badge,
|
|
183
|
+
{
|
|
184
|
+
className: "border-destructive/40 bg-destructive/10 text-destructive-text text-meta",
|
|
185
|
+
variant: "secondary",
|
|
186
|
+
children: "required"
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
] }),
|
|
190
|
+
description && /* @__PURE__ */ jsx("p", { className: "mt-1 ps-6 text-muted-foreground text-body", children: description })
|
|
191
|
+
] });
|
|
192
|
+
};
|
|
193
|
+
var SchemaDisplayRequest = ({
|
|
194
|
+
className,
|
|
195
|
+
children,
|
|
196
|
+
...props
|
|
197
|
+
}) => {
|
|
198
|
+
const { requestBody } = useContext(SchemaDisplayContext);
|
|
199
|
+
const { t } = useLocale();
|
|
200
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
201
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
202
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
203
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.requestBody") })
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? requestBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
|
|
206
|
+
] });
|
|
207
|
+
};
|
|
208
|
+
var SchemaDisplayResponse = ({
|
|
209
|
+
className,
|
|
210
|
+
children,
|
|
211
|
+
...props
|
|
212
|
+
}) => {
|
|
213
|
+
const { responseBody } = useContext(SchemaDisplayContext);
|
|
214
|
+
const { t } = useLocale();
|
|
215
|
+
return /* @__PURE__ */ jsxs(Collapsible, { className: cn(className), defaultOpen: true, ...props, children: [
|
|
216
|
+
/* @__PURE__ */ jsxs(CollapsibleTrigger, { className: "group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50", children: [
|
|
217
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90" }),
|
|
218
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: t("ai.schemaDisplay.response") })
|
|
219
|
+
] }),
|
|
220
|
+
/* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", { className: "border-t", children: children ?? responseBody?.map((prop) => /* @__PURE__ */ jsx(SchemaDisplayProperty, { ...prop, depth: 0 }, prop.name)) }) })
|
|
221
|
+
] });
|
|
222
|
+
};
|
|
223
|
+
var SchemaDisplay = ({
|
|
224
|
+
method,
|
|
225
|
+
path,
|
|
226
|
+
description,
|
|
227
|
+
parameters,
|
|
228
|
+
requestBody,
|
|
229
|
+
responseBody,
|
|
230
|
+
className,
|
|
231
|
+
children,
|
|
232
|
+
...props
|
|
233
|
+
}) => {
|
|
234
|
+
const contextValue = useMemo(
|
|
235
|
+
() => ({
|
|
236
|
+
description,
|
|
237
|
+
method,
|
|
238
|
+
parameters,
|
|
239
|
+
path,
|
|
240
|
+
requestBody,
|
|
241
|
+
responseBody
|
|
242
|
+
}),
|
|
243
|
+
[description, method, parameters, path, requestBody, responseBody]
|
|
244
|
+
);
|
|
245
|
+
return /* @__PURE__ */ jsx(SchemaDisplayContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-lg border bg-background", className), ...props, children: children ?? /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
246
|
+
/* @__PURE__ */ jsx(SchemaDisplayHeader, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
247
|
+
/* @__PURE__ */ jsx(SchemaDisplayMethod, {}),
|
|
248
|
+
/* @__PURE__ */ jsx(SchemaDisplayPath, {})
|
|
249
|
+
] }) }),
|
|
250
|
+
description && /* @__PURE__ */ jsx(SchemaDisplayDescription, {}),
|
|
251
|
+
/* @__PURE__ */ jsxs(SchemaDisplayContent, { children: [
|
|
252
|
+
parameters && parameters.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayParameters, {}),
|
|
253
|
+
requestBody && requestBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayRequest, {}),
|
|
254
|
+
responseBody && responseBody.length > 0 && /* @__PURE__ */ jsx(SchemaDisplayResponse, {})
|
|
255
|
+
] })
|
|
256
|
+
] }) }) });
|
|
257
|
+
};
|
|
258
|
+
var SchemaDisplayBody = ({ className, children, ...props }) => /* @__PURE__ */ jsx("div", { className: cn("divide-y", className), ...props, children });
|
|
259
|
+
var SchemaDisplayExample = ({
|
|
260
|
+
className,
|
|
261
|
+
children,
|
|
262
|
+
...props
|
|
263
|
+
}) => /* @__PURE__ */ jsx(
|
|
264
|
+
"pre",
|
|
265
|
+
{
|
|
266
|
+
className: cn("mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body", className),
|
|
267
|
+
...props,
|
|
268
|
+
children
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
export {
|
|
273
|
+
SchemaDisplayHeader,
|
|
274
|
+
SchemaDisplayMethod,
|
|
275
|
+
SchemaDisplayPath,
|
|
276
|
+
SchemaDisplayDescription,
|
|
277
|
+
SchemaDisplayContent,
|
|
278
|
+
SchemaDisplayParameter,
|
|
279
|
+
SchemaDisplayParameters,
|
|
280
|
+
SchemaDisplayProperty,
|
|
281
|
+
SchemaDisplayRequest,
|
|
282
|
+
SchemaDisplayResponse,
|
|
283
|
+
SchemaDisplay,
|
|
284
|
+
SchemaDisplayBody,
|
|
285
|
+
SchemaDisplayExample
|
|
286
|
+
};
|
|
287
|
+
//# sourceMappingURL=chunk-IXICSOOP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema-display.tsx"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { createContext, Fragment, useContext, useMemo } from \"react\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n\ninterface SchemaParameter {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n location?: \"path\" | \"query\" | \"header\";\n}\n\ninterface SchemaProperty {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n properties?: SchemaProperty[];\n items?: SchemaProperty;\n}\n\ninterface SchemaDisplayContextType {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n}\n\nconst SchemaDisplayContext = createContext<SchemaDisplayContextType>({\n method: \"GET\",\n path: \"\",\n});\n\nconst methodStyles: Record<HttpMethod, string> = {\n DELETE: \"border-destructive/40 bg-destructive/10 text-destructive-text\",\n GET: \"border-success/40 bg-success/10 text-success-text\",\n PATCH: \"border-warning/40 bg-warning/10 text-warning-text\",\n POST: \"border-info/40 bg-info/10 text-info-text\",\n PUT: \"border-warning/40 bg-warning/10 text-warning-text\",\n};\n\n/** Splits a `{param}` path into plain-text and parameter segments for safe rendering. */\nfunction splitSchemaPath(path: string): Array<{ text: string; isParam: boolean }> {\n const parts: Array<{ text: string; isParam: boolean }> = [];\n const regex = /\\{([^}]+)\\}/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null = regex.exec(path);\n\n while (match !== null) {\n if (match.index > lastIndex) {\n parts.push({ isParam: false, text: path.slice(lastIndex, match.index) });\n }\n parts.push({ isParam: true, text: match[0] });\n lastIndex = match.index + match[0].length;\n match = regex.exec(path);\n }\n\n if (lastIndex < path.length) {\n parts.push({ isParam: false, text: path.slice(lastIndex) });\n }\n\n return parts;\n}\n\nexport type SchemaDisplayHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayHeader = ({\n className,\n children,\n ...props\n}: SchemaDisplayHeaderProps) => (\n <div className={cn(\"flex items-center gap-3 border-b px-4 py-3\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayMethodProps = ComponentProps<typeof Badge>;\n\nexport const SchemaDisplayMethod = ({\n className,\n children,\n ...props\n}: SchemaDisplayMethodProps) => {\n const { method } = useContext(SchemaDisplayContext);\n\n return (\n <Badge\n className={cn(\"font-mono text-meta\", methodStyles[method], className)}\n variant=\"secondary\"\n {...props}\n >\n {children ?? method}\n </Badge>\n );\n};\n\nexport type SchemaDisplayPathProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const SchemaDisplayPath = ({ className, children, ...props }: SchemaDisplayPathProps) => {\n const { path } = useContext(SchemaDisplayContext);\n\n // Highlight path parameters as real elements — the path is untrusted\n // (tool/model output) and must never reach dangerouslySetInnerHTML.\n const pathNodes = useMemo<ReactNode>(\n () =>\n splitSchemaPath(path).map((part, index) =>\n part.isParam ? (\n <span className=\"text-info-text\" key={`${part.text}-${index}`}>\n {part.text}\n </span>\n ) : (\n <Fragment key={`${part.text}-${index}`}>{part.text}</Fragment>\n ),\n ),\n [path],\n );\n\n return (\n <span className={cn(\"font-mono text-body\", className)} {...props}>\n {children ?? pathNodes}\n </span>\n );\n};\n\nexport type SchemaDisplayDescriptionProps = HTMLAttributes<HTMLParagraphElement>;\n\nexport const SchemaDisplayDescription = ({\n className,\n children,\n ...props\n}: SchemaDisplayDescriptionProps) => {\n const { description } = useContext(SchemaDisplayContext);\n\n return (\n <p className={cn(\"border-b px-4 py-3 text-muted-foreground text-body\", className)} {...props}>\n {children ?? description}\n </p>\n );\n};\n\nexport type SchemaDisplayContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayContent = ({\n className,\n children,\n ...props\n}: SchemaDisplayContentProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayParameterProps = HTMLAttributes<HTMLDivElement> & SchemaParameter;\n\nexport const SchemaDisplayParameter = ({\n name,\n type,\n required,\n description,\n location,\n className,\n ...props\n}: SchemaDisplayParameterProps) => (\n <div className={cn(\"px-4 py-3 ps-10\", className)} {...props}>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {location && (\n <Badge className=\"text-meta\" variant=\"secondary\">\n {location}\n </Badge>\n )}\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 text-muted-foreground text-body\">{description}</p>}\n </div>\n);\n\nexport type SchemaDisplayParametersProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayParameters = ({\n className,\n children,\n ...props\n}: SchemaDisplayParametersProps) => {\n const { parameters } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.parameters\")}</span>\n <Badge className=\"ms-auto text-meta\" variant=\"secondary\">\n {parameters?.length}\n </Badge>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {children ??\n parameters?.map((param) => <SchemaDisplayParameter key={param.name} {...param} />)}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayPropertyProps = HTMLAttributes<HTMLDivElement> &\n SchemaProperty & {\n depth?: number;\n };\n\nexport const SchemaDisplayProperty = ({\n name,\n type,\n required,\n description,\n properties,\n items,\n depth = 0,\n className,\n ...props\n}: SchemaDisplayPropertyProps) => {\n const hasChildren = properties || items;\n const paddingLeft = 40 + depth * 16;\n\n if (hasChildren) {\n return (\n <Collapsible defaultOpen={depth < 2}>\n <CollapsibleTrigger\n className={cn(\n \"group flex w-full items-center gap-2 py-3 text-start transition-colors hover:bg-muted/50\",\n className,\n )}\n style={{ paddingLeft }}\n >\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </CollapsibleTrigger>\n {description && (\n <p\n className=\"pb-2 text-muted-foreground text-body\"\n style={{ paddingLeft: paddingLeft + 24 }}\n >\n {description}\n </p>\n )}\n <CollapsibleContent>\n <div className=\"divide-y border-t\">\n {properties?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={depth + 1} />\n ))}\n {items && <SchemaDisplayProperty {...items} depth={depth + 1} name={`${name}[]`} />}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n }\n\n return (\n <div className={cn(\"py-3 pe-4\", className)} style={{ paddingLeft }} {...props}>\n <div className=\"flex items-center gap-2\">\n {/* Spacer for alignment */}\n <span className=\"size-4\" />\n <span className=\"font-mono text-body\">{name}</span>\n <Badge className=\"text-meta\" variant=\"outline\">\n {type}\n </Badge>\n {required && (\n <Badge\n className=\"border-destructive/40 bg-destructive/10 text-destructive-text text-meta\"\n variant=\"secondary\"\n >\n required\n </Badge>\n )}\n </div>\n {description && <p className=\"mt-1 ps-6 text-muted-foreground text-body\">{description}</p>}\n </div>\n );\n};\n\nexport type SchemaDisplayRequestProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayRequest = ({\n className,\n children,\n ...props\n}: SchemaDisplayRequestProps) => {\n const { requestBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.requestBody\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n requestBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayResponseProps = ComponentProps<typeof Collapsible>;\n\nexport const SchemaDisplayResponse = ({\n className,\n children,\n ...props\n}: SchemaDisplayResponseProps) => {\n const { responseBody } = useContext(SchemaDisplayContext);\n const { t } = useLocale();\n\n return (\n <Collapsible className={cn(className)} defaultOpen {...props}>\n <CollapsibleTrigger className=\"group flex w-full items-center gap-2 px-4 py-3 text-start transition-colors hover:bg-muted/50\">\n <ChevronRightIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n <span className=\"font-medium text-body\">{t(\"ai.schemaDisplay.response\")}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"border-t\">\n {children ??\n responseBody?.map((prop) => (\n <SchemaDisplayProperty key={prop.name} {...prop} depth={0} />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n};\n\nexport type SchemaDisplayProps = HTMLAttributes<HTMLDivElement> & {\n method: HttpMethod;\n path: string;\n description?: string;\n parameters?: SchemaParameter[];\n requestBody?: SchemaProperty[];\n responseBody?: SchemaProperty[];\n};\n\nexport const SchemaDisplay = ({\n method,\n path,\n description,\n parameters,\n requestBody,\n responseBody,\n className,\n children,\n ...props\n}: SchemaDisplayProps) => {\n const contextValue = useMemo(\n () => ({\n description,\n method,\n parameters,\n path,\n requestBody,\n responseBody,\n }),\n [description, method, parameters, path, requestBody, responseBody],\n );\n\n return (\n <SchemaDisplayContext.Provider value={contextValue}>\n <div className={cn(\"overflow-hidden rounded-lg border bg-background\", className)} {...props}>\n {children ?? (\n <>\n <SchemaDisplayHeader>\n <div className=\"flex items-center gap-3\">\n <SchemaDisplayMethod />\n <SchemaDisplayPath />\n </div>\n </SchemaDisplayHeader>\n {description && <SchemaDisplayDescription />}\n <SchemaDisplayContent>\n {parameters && parameters.length > 0 && <SchemaDisplayParameters />}\n {requestBody && requestBody.length > 0 && <SchemaDisplayRequest />}\n {responseBody && responseBody.length > 0 && <SchemaDisplayResponse />}\n </SchemaDisplayContent>\n </>\n )}\n </div>\n </SchemaDisplayContext.Provider>\n );\n};\n\nexport type SchemaDisplayBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const SchemaDisplayBody = ({ className, children, ...props }: SchemaDisplayBodyProps) => (\n <div className={cn(\"divide-y\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type SchemaDisplayExampleProps = HTMLAttributes<HTMLPreElement>;\n\nexport const SchemaDisplayExample = ({\n className,\n children,\n ...props\n}: SchemaDisplayExampleProps) => (\n <pre\n className={cn(\"mx-4 mb-4 overflow-auto rounded-md bg-muted p-4 font-mono text-body\", className)}\n {...props}\n >\n {children}\n </pre>\n);\n"],"mappings":";;;AAEA,SAAS,aAAa;AACtB,SAAS,aAAa,oBAAoB,0BAA0B;AACpE,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AACnB,SAAS,wBAAwB;AAEjC,SAAS,eAAe,UAAU,YAAY,eAAe;AAyE3D,SAmUQ,YAAAA,WAnUR,KA6FE,YA7FF;AA3CF,IAAM,uBAAuB,cAAwC;AAAA,EACnE,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AAED,IAAM,eAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AACP;AAGA,SAAS,gBAAgB,MAAyD;AAChF,QAAM,QAAmD,CAAC;AAC1D,QAAM,QAAQ;AACd,MAAI,YAAY;AAChB,MAAI,QAAgC,MAAM,KAAK,IAAI;AAEnD,SAAO,UAAU,MAAM;AACrB,QAAI,MAAM,QAAQ,WAAW;AAC3B,YAAM,KAAK,EAAE,SAAS,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM,KAAK,EAAE,CAAC;AAAA,IACzE;AACA,UAAM,KAAK,EAAE,SAAS,MAAM,MAAM,MAAM,CAAC,EAAE,CAAC;AAC5C,gBAAY,MAAM,QAAQ,MAAM,CAAC,EAAE;AACnC,YAAQ,MAAM,KAAK,IAAI;AAAA,EACzB;AAEA,MAAI,YAAY,KAAK,QAAQ;AAC3B,UAAM,KAAK,EAAE,SAAS,OAAO,MAAM,KAAK,MAAM,SAAS,EAAE,CAAC;AAAA,EAC5D;AAEA,SAAO;AACT;AAIO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,oBAAC,SAAI,WAAW,GAAG,8CAA8C,SAAS,GAAI,GAAG,OAC9E,UACH;AAKK,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAgC;AAC9B,QAAM,EAAE,OAAO,IAAI,WAAW,oBAAoB;AAElD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,uBAAuB,aAAa,MAAM,GAAG,SAAS;AAAA,MACpE,SAAQ;AAAA,MACP,GAAG;AAAA,MAEH,sBAAY;AAAA;AAAA,EACf;AAEJ;AAIO,IAAM,oBAAoB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAA8B;AAC9F,QAAM,EAAE,KAAK,IAAI,WAAW,oBAAoB;AAIhD,QAAM,YAAY;AAAA,IAChB,MACE,gBAAgB,IAAI,EAAE;AAAA,MAAI,CAAC,MAAM,UAC/B,KAAK,UACH,oBAAC,UAAK,WAAU,kBACb,eAAK,QAD8B,GAAG,KAAK,IAAI,IAAI,KAAK,EAE3D,IAEA,oBAAC,YAAwC,eAAK,QAA/B,GAAG,KAAK,IAAI,IAAI,KAAK,EAAe;AAAA,IAEvD;AAAA,IACF,CAAC,IAAI;AAAA,EACP;AAEA,SACE,oBAAC,UAAK,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OACxD,sBAAY,WACf;AAEJ;AAIO,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAqC;AACnC,QAAM,EAAE,YAAY,IAAI,WAAW,oBAAoB;AAEvD,SACE,oBAAC,OAAE,WAAW,GAAG,sDAAsD,SAAS,GAAI,GAAG,OACpF,sBAAY,aACf;AAEJ;AAIO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,oBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC5C,UACH;AAKK,IAAM,yBAAyB,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE,qBAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,OACpD;AAAA,uBAAC,SAAI,WAAU,2BACb;AAAA,wBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,IAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,IACC,YACC,oBAAC,SAAM,WAAU,aAAY,SAAQ,aAClC,oBACH;AAAA,IAED,YACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAQ;AAAA,QACT;AAAA;AAAA,IAED;AAAA,KAEJ;AAAA,EACC,eAAe,oBAAC,OAAE,WAAU,wCAAwC,uBAAY;AAAA,GACnF;AAKK,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAoC;AAClC,QAAM,EAAE,WAAW,IAAI,WAAW,oBAAoB;AACtD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,6BAA6B,GAAE;AAAA,MAC1E,oBAAC,SAAM,WAAU,qBAAoB,SAAQ,aAC1C,sBAAY,QACf;AAAA,OACF;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,qBACZ,sBACC,YAAY,IAAI,CAAC,UAAU,oBAAC,0BAAyC,GAAG,SAAhB,MAAM,IAAiB,CAAE,GACrF,GACF;AAAA,KACF;AAEJ;AAOO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,cAAc,cAAc;AAClC,QAAM,cAAc,KAAK,QAAQ;AAEjC,MAAI,aAAa;AACf,WACE,qBAAC,eAAY,aAAa,QAAQ,GAChC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAO,EAAE,YAAY;AAAA,UAErB;AAAA,gCAAC,oBAAiB,WAAU,gGAA+F;AAAA,YAC3H,oBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,YAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,YACC,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACT;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MAEJ;AAAA,MACC,eACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,aAAa,cAAc,GAAG;AAAA,UAEtC;AAAA;AAAA,MACH;AAAA,MAEF,oBAAC,sBACC,+BAAC,SAAI,WAAU,qBACZ;AAAA,oBAAY,IAAI,CAAC,SAChB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,QAAQ,KAApC,KAAK,IAAkC,CACpE;AAAA,QACA,SAAS,oBAAC,yBAAuB,GAAG,OAAO,OAAO,QAAQ,GAAG,MAAM,GAAG,IAAI,MAAM;AAAA,SACnF,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GAAG,OAAO,EAAE,YAAY,GAAI,GAAG,OACtE;AAAA,yBAAC,SAAI,WAAU,2BAEb;AAAA,0BAAC,UAAK,WAAU,UAAS;AAAA,MACzB,oBAAC,UAAK,WAAU,uBAAuB,gBAAK;AAAA,MAC5C,oBAAC,SAAM,WAAU,aAAY,SAAQ,WAClC,gBACH;AAAA,MACC,YACC;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAQ;AAAA,UACT;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IACC,eAAe,oBAAC,OAAE,WAAU,6CAA6C,uBAAY;AAAA,KACxF;AAEJ;AAIO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAiC;AAC/B,QAAM,EAAE,YAAY,IAAI,WAAW,oBAAoB;AACvD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,8BAA8B,GAAE;AAAA,OAC7E;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,YACZ,sBACC,aAAa,IAAI,CAAC,SAChB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,KAA5B,KAAK,IAA0B,CAC5D,GACL,GACF;AAAA,KACF;AAEJ;AAIO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAkC;AAChC,QAAM,EAAE,aAAa,IAAI,WAAW,oBAAoB;AACxD,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE,qBAAC,eAAY,WAAW,GAAG,SAAS,GAAG,aAAW,MAAE,GAAG,OACrD;AAAA,yBAAC,sBAAmB,WAAU,iGAC5B;AAAA,0BAAC,oBAAiB,WAAU,gGAA+F;AAAA,MAC3H,oBAAC,UAAK,WAAU,yBAAyB,YAAE,2BAA2B,GAAE;AAAA,OAC1E;AAAA,IACA,oBAAC,sBACC,8BAAC,SAAI,WAAU,YACZ,sBACC,cAAc,IAAI,CAAC,SACjB,oBAAC,yBAAuC,GAAG,MAAM,OAAO,KAA5B,KAAK,IAA0B,CAC5D,GACL,GACF;AAAA,KACF;AAEJ;AAWO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA0B;AACxB,QAAM,eAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,aAAa,QAAQ,YAAY,MAAM,aAAa,YAAY;AAAA,EACnE;AAEA,SACE,oBAAC,qBAAqB,UAArB,EAA8B,OAAO,cACpC,8BAAC,SAAI,WAAW,GAAG,mDAAmD,SAAS,GAAI,GAAG,OACnF,sBACC,qBAAAA,WAAA,EACE;AAAA,wBAAC,uBACC,+BAAC,SAAI,WAAU,2BACb;AAAA,0BAAC,uBAAoB;AAAA,MACrB,oBAAC,qBAAkB;AAAA,OACrB,GACF;AAAA,IACC,eAAe,oBAAC,4BAAyB;AAAA,IAC1C,qBAAC,wBACE;AAAA,oBAAc,WAAW,SAAS,KAAK,oBAAC,2BAAwB;AAAA,MAChE,eAAe,YAAY,SAAS,KAAK,oBAAC,wBAAqB;AAAA,MAC/D,gBAAgB,aAAa,SAAS,KAAK,oBAAC,yBAAsB;AAAA,OACrE;AAAA,KACF,GAEJ,GACF;AAEJ;AAIO,IAAM,oBAAoB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAChE,oBAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC5C,UACH;AAKK,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,uEAAuE,SAAS;AAAA,IAC7F,GAAG;AAAA,IAEH;AAAA;AACH;","names":["Fragment"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/message-feedback.tsx
|
|
4
|
+
import { forwardRef, useState } from "react";
|
|
5
|
+
import { ThumbsDown, ThumbsUp } from "lucide-react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { Button } from "@elabs-ai/components-ui";
|
|
8
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
9
|
+
import { useLocale } from "@elabs-ai/components-ui";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var messageFeedbackVariants = cva("inline-flex items-center", {
|
|
12
|
+
variants: {
|
|
13
|
+
compact: { true: "gap-0.5", false: "gap-1" }
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: { compact: false }
|
|
16
|
+
});
|
|
17
|
+
var MessageFeedback = forwardRef(
|
|
18
|
+
function MessageFeedback2({
|
|
19
|
+
value: valueProp,
|
|
20
|
+
defaultValue = null,
|
|
21
|
+
onSubmit,
|
|
22
|
+
disabled = false,
|
|
23
|
+
compact = false,
|
|
24
|
+
positiveLabel = "Good response",
|
|
25
|
+
negativeLabel = "Bad response",
|
|
26
|
+
className,
|
|
27
|
+
...props
|
|
28
|
+
}, ref) {
|
|
29
|
+
const { t } = useLocale();
|
|
30
|
+
const isControlled = valueProp !== void 0;
|
|
31
|
+
const [internal, setInternal] = useState(defaultValue);
|
|
32
|
+
const selected = isControlled ? valueProp : internal;
|
|
33
|
+
const submitted = selected != null;
|
|
34
|
+
const choose = (type) => {
|
|
35
|
+
if (submitted || disabled) return;
|
|
36
|
+
if (!isControlled) setInternal(type);
|
|
37
|
+
onSubmit?.({ type });
|
|
38
|
+
};
|
|
39
|
+
const compactBtn = compact ? "size-7 [&_svg]:size-3.5" : void 0;
|
|
40
|
+
const renderButton = (type, label, Icon) => {
|
|
41
|
+
const active = selected === type;
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
Button,
|
|
44
|
+
{
|
|
45
|
+
type: "button",
|
|
46
|
+
variant: "ghost",
|
|
47
|
+
size: "icon-sm",
|
|
48
|
+
"aria-label": label,
|
|
49
|
+
"aria-pressed": active,
|
|
50
|
+
disabled: disabled || submitted,
|
|
51
|
+
onClick: () => choose(type),
|
|
52
|
+
className: cn(
|
|
53
|
+
"text-muted-foreground hover:text-foreground",
|
|
54
|
+
active && "text-primary disabled:opacity-100 [&_svg]:fill-current",
|
|
55
|
+
compactBtn
|
|
56
|
+
),
|
|
57
|
+
children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ jsxs(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
ref,
|
|
65
|
+
role: "group",
|
|
66
|
+
"aria-label": t("ai.message.feedback"),
|
|
67
|
+
"data-submitted": submitted || void 0,
|
|
68
|
+
"data-feedback": selected ?? void 0,
|
|
69
|
+
className: cn(messageFeedbackVariants({ compact }), className),
|
|
70
|
+
...props,
|
|
71
|
+
children: [
|
|
72
|
+
renderButton("positive", positiveLabel, ThumbsUp),
|
|
73
|
+
renderButton("negative", negativeLabel, ThumbsDown)
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
messageFeedbackVariants,
|
|
82
|
+
MessageFeedback
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=chunk-JY5HSN4D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/message-feedback.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * MessageFeedback — thumbs up / down for a single assistant message.\n *\n * Presentational only: it emits `onSubmit({ type })` and reflects the chosen\n * state; it does NOT persist anything (the host owns storage). After a choice\n * the buttons auto-disable (feedback is submit-once) and the root carries\n * `data-submitted` + `data-feedback`. Controlled (`value`) or uncontrolled.\n */\n\nimport { forwardRef, useState, type HTMLAttributes } from \"react\";\nimport { ThumbsDown, ThumbsUp } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Button } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\n\nexport type FeedbackType = \"positive\" | \"negative\";\n\nexport const messageFeedbackVariants = cva(\"inline-flex items-center\", {\n variants: {\n compact: { true: \"gap-0.5\", false: \"gap-1\" },\n },\n defaultVariants: { compact: false },\n});\n\nexport interface MessageFeedbackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, \"onSubmit\" | \"defaultValue\">,\n VariantProps<typeof messageFeedbackVariants> {\n /** Controlled selected feedback. When set, `onSubmit` is the only updater. */\n value?: FeedbackType | null;\n /** Uncontrolled initial selection. @default null */\n defaultValue?: FeedbackType | null;\n /** Called once with the chosen feedback. No persistence — host-owned. */\n onSubmit?: (feedback: { type: FeedbackType }) => void;\n /** Force-disable both controls (e.g. while the message is still streaming). */\n disabled?: boolean;\n /** aria-label for the positive control. @default \"Good response\" */\n positiveLabel?: string;\n /** aria-label for the negative control. @default \"Bad response\" */\n negativeLabel?: string;\n}\n\n/**\n * Two icon buttons. The chosen one stays prominent after submit; the other\n * recedes. `compact` tightens spacing/size for message toolbars.\n */\nexport const MessageFeedback = forwardRef<HTMLDivElement, MessageFeedbackProps>(\n function MessageFeedback(\n {\n value: valueProp,\n defaultValue = null,\n onSubmit,\n disabled = false,\n compact = false,\n positiveLabel = \"Good response\",\n negativeLabel = \"Bad response\",\n className,\n ...props\n },\n ref,\n ) {\n const { t } = useLocale();\n const isControlled = valueProp !== undefined;\n const [internal, setInternal] = useState<FeedbackType | null>(defaultValue);\n const selected = isControlled ? (valueProp as FeedbackType | null) : internal;\n const submitted = selected != null;\n\n const choose = (type: FeedbackType) => {\n if (submitted || disabled) return;\n if (!isControlled) setInternal(type);\n onSubmit?.({ type });\n };\n\n const compactBtn = compact ? \"size-7 [&_svg]:size-3.5\" : undefined;\n\n const renderButton = (type: FeedbackType, label: string, Icon: typeof ThumbsUp) => {\n const active = selected === type;\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={label}\n aria-pressed={active}\n // After submit both are inert; keep the chosen one at full opacity.\n disabled={disabled || submitted}\n onClick={() => choose(type)}\n className={cn(\n \"text-muted-foreground hover:text-foreground\",\n active && \"text-primary disabled:opacity-100 [&_svg]:fill-current\",\n compactBtn,\n )}\n >\n <Icon aria-hidden=\"true\" />\n </Button>\n );\n };\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={t(\"ai.message.feedback\")}\n data-submitted={submitted || undefined}\n data-feedback={selected ?? undefined}\n className={cn(messageFeedbackVariants({ compact }), className)}\n {...props}\n >\n {renderButton(\"positive\", positiveLabel, ThumbsUp)}\n {renderButton(\"negative\", negativeLabel, ThumbsDown)}\n </div>\n );\n },\n);\n"],"mappings":";;;AAWA,SAAS,YAAY,gBAAqC;AAC1D,SAAS,YAAY,gBAAgB;AACrC,SAAS,WAA8B;AACvC,SAAS,cAAc;AACvB,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAgFhB,cAMJ,YANI;AA5EH,IAAM,0BAA0B,IAAI,4BAA4B;AAAA,EACrE,UAAU;AAAA,IACR,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ;AAAA,EAC7C;AAAA,EACA,iBAAiB,EAAE,SAAS,MAAM;AACpC,CAAC;AAwBM,IAAM,kBAAkB;AAAA,EAC7B,SAASA,iBACP;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,EAAE,EAAE,IAAI,UAAU;AACxB,UAAM,eAAe,cAAc;AACnC,UAAM,CAAC,UAAU,WAAW,IAAI,SAA8B,YAAY;AAC1E,UAAM,WAAW,eAAgB,YAAoC;AACrE,UAAM,YAAY,YAAY;AAE9B,UAAM,SAAS,CAAC,SAAuB;AACrC,UAAI,aAAa,SAAU;AAC3B,UAAI,CAAC,aAAc,aAAY,IAAI;AACnC,iBAAW,EAAE,KAAK,CAAC;AAAA,IACrB;AAEA,UAAM,aAAa,UAAU,4BAA4B;AAEzD,UAAM,eAAe,CAAC,MAAoB,OAAe,SAA0B;AACjF,YAAM,SAAS,aAAa;AAC5B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,gBAAc;AAAA,UAEd,UAAU,YAAY;AAAA,UACtB,SAAS,MAAM,OAAO,IAAI;AAAA,UAC1B,WAAW;AAAA,YACT;AAAA,YACA,UAAU;AAAA,YACV;AAAA,UACF;AAAA,UAEA,8BAAC,QAAK,eAAY,QAAO;AAAA;AAAA,MAC3B;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,EAAE,qBAAqB;AAAA,QACnC,kBAAgB,aAAa;AAAA,QAC7B,iBAAe,YAAY;AAAA,QAC3B,WAAW,GAAG,wBAAwB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,QAC5D,GAAG;AAAA,QAEH;AAAA,uBAAa,YAAY,eAAe,QAAQ;AAAA,UAChD,aAAa,YAAY,eAAe,UAAU;AAAA;AAAA;AAAA,IACrD;AAAA,EAEJ;AACF;","names":["MessageFeedback"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
lazyFlowPart
|
|
4
|
+
} from "./chunk-NMVNNO3L.js";
|
|
5
|
+
|
|
6
|
+
// src/panel.tsx
|
|
7
|
+
import { Suspense } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
var PanelImpl = lazyFlowPart((m) => m.Panel);
|
|
10
|
+
var Panel = (props) => (
|
|
11
|
+
// An overlay inside an already-loaded `<Canvas>`, so there is no box to
|
|
12
|
+
// reserve — the engine chunk it needs is the one the canvas already fetched.
|
|
13
|
+
/* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(PanelImpl, { ...props }) })
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
Panel
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=chunk-LMNSBOBG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/panel.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Panel as PanelPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type PanelProps = ComponentProps<typeof PanelPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst PanelImpl = lazyFlowPart<PanelProps>((m) => m.Panel);\n\nexport const Panel = (props: PanelProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <PanelImpl {...props} />\n </Suspense>\n);\n"],"mappings":";;;;;;AAIA,SAAS,gBAAgB;AAarB;AANJ,IAAM,YAAY,aAAyB,CAAC,MAAM,EAAE,KAAK;AAElD,IAAM,QAAQ,CAAC;AAAA;AAAA;AAAA,EAGpB,oBAAC,YAAS,UAAU,MAClB,8BAAC,aAAW,GAAG,OAAO,GACxB;AAAA;","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
lazyFlowPart
|
|
4
|
+
} from "./chunk-NMVNNO3L.js";
|
|
5
|
+
|
|
6
|
+
// src/node.tsx
|
|
7
|
+
import {
|
|
8
|
+
CardAction,
|
|
9
|
+
CardContent,
|
|
10
|
+
CardDescription,
|
|
11
|
+
CardFooter,
|
|
12
|
+
CardHeader,
|
|
13
|
+
CardTitle
|
|
14
|
+
} from "@elabs-ai/components-ui";
|
|
15
|
+
import { cn } from "@elabs-ai/components-ui/lib/cn";
|
|
16
|
+
import { Suspense } from "react";
|
|
17
|
+
import { jsx } from "react/jsx-runtime";
|
|
18
|
+
var NodeImpl = lazyFlowPart((m) => m.Node);
|
|
19
|
+
var Node = (props) => /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(NodeImpl, { ...props }) });
|
|
20
|
+
var NodeHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
21
|
+
CardHeader,
|
|
22
|
+
{
|
|
23
|
+
className: cn("gap-0.5 rounded-t-md border-b bg-secondary p-3!", className),
|
|
24
|
+
...props
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
var NodeTitle = (props) => /* @__PURE__ */ jsx(CardTitle, { ...props });
|
|
28
|
+
var NodeDescription = (props) => /* @__PURE__ */ jsx(CardDescription, { ...props });
|
|
29
|
+
var NodeAction = (props) => /* @__PURE__ */ jsx(CardAction, { ...props });
|
|
30
|
+
var NodeContent = ({ className, ...props }) => /* @__PURE__ */ jsx(CardContent, { className: cn("p-3", className), ...props });
|
|
31
|
+
var NodeFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(CardFooter, { className: cn("rounded-b-md border-t bg-secondary p-3!", className), ...props });
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
Node,
|
|
35
|
+
NodeHeader,
|
|
36
|
+
NodeTitle,
|
|
37
|
+
NodeDescription,
|
|
38
|
+
NodeAction,
|
|
39
|
+
NodeContent,
|
|
40
|
+
NodeFooter
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=chunk-MBI7D6IL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type NodeProps = ComponentProps<typeof Card> & {\n handles: {\n target: boolean;\n source: boolean;\n };\n};\n\n/**\n * React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019.\n * The WHOLE node (card + handles) is behind the boundary rather than just the\n * two `<Handle>`s: React Flow re-reads a node's handle bounds when its measured\n * box changes, so handles appearing inside an already-measured card could leave\n * the bounds stale. Going 0 → full size guarantees the re-measure.\n */\nconst NodeImpl = lazyFlowPart<NodeProps>((m) => m.Node);\n\nexport const Node = (props: NodeProps) => (\n <Suspense fallback={null}>\n <NodeImpl {...props} />\n </Suspense>\n);\n\nexport type NodeHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const NodeHeader = ({ className, ...props }: NodeHeaderProps) => (\n <CardHeader\n className={cn(\"gap-0.5 rounded-t-md border-b bg-secondary p-3!\", className)}\n {...props}\n />\n);\n\nexport type NodeTitleProps = ComponentProps<typeof CardTitle>;\n\nexport const NodeTitle = (props: NodeTitleProps) => <CardTitle {...props} />;\n\nexport type NodeDescriptionProps = ComponentProps<typeof CardDescription>;\n\nexport const NodeDescription = (props: NodeDescriptionProps) => <CardDescription {...props} />;\n\nexport type NodeActionProps = ComponentProps<typeof CardAction>;\n\nexport const NodeAction = (props: NodeActionProps) => <CardAction {...props} />;\n\nexport type NodeContentProps = ComponentProps<typeof CardContent>;\n\nexport const NodeContent = ({ className, ...props }: NodeContentProps) => (\n <CardContent className={cn(\"p-3\", className)} {...props} />\n);\n\nexport type NodeFooterProps = ComponentProps<typeof CardFooter>;\n\nexport const NodeFooter = ({ className, ...props }: NodeFooterProps) => (\n <CardFooter className={cn(\"rounded-b-md border-t bg-secondary p-3!\", className)} {...props} />\n);\n"],"mappings":";;;;;;AAEA;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AAEnB,SAAS,gBAAgB;AAsBrB;AAJJ,IAAM,WAAW,aAAwB,CAAC,MAAM,EAAE,IAAI;AAE/C,IAAM,OAAO,CAAC,UACnB,oBAAC,YAAS,UAAU,MAClB,8BAAC,YAAU,GAAG,OAAO,GACvB;AAKK,IAAM,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,MAC/C;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,mDAAmD,SAAS;AAAA,IACzE,GAAG;AAAA;AACN;AAKK,IAAM,YAAY,CAAC,UAA0B,oBAAC,aAAW,GAAG,OAAO;AAInE,IAAM,kBAAkB,CAAC,UAAgC,oBAAC,mBAAiB,GAAG,OAAO;AAIrF,IAAM,aAAa,CAAC,UAA2B,oBAAC,cAAY,GAAG,OAAO;AAItE,IAAM,cAAc,CAAC,EAAE,WAAW,GAAG,MAAM,MAChD,oBAAC,eAAY,WAAW,GAAG,OAAO,SAAS,GAAI,GAAG,OAAO;AAKpD,IAAM,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,MAC/C,oBAAC,cAAW,WAAW,GAAG,2CAA2C,SAAS,GAAI,GAAG,OAAO;","names":[]}
|