@digithings-ai/ui 0.0.0-stage → 0.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 +48 -2
- package/package.json +143 -4
- package/src/components/NavShell.tsx +776 -0
- package/src/components/SocialRow.tsx +87 -0
- package/src/components/Spinner.tsx +27 -0
- package/src/components/StackLogo.tsx +40 -0
- package/src/components/Terminal.tsx +110 -0
- package/src/components/TerminalManifest.tsx +212 -0
- package/src/components/ThemeProvider.tsx +271 -0
- package/src/components/account/AuthCard.tsx +309 -0
- package/src/components/assistant-ui/elements/mermaid-diagram.aui.tsx +63 -0
- package/src/components/assistant-ui/elements/mermaid-diagram.tsx +340 -0
- package/src/components/brand/BrandWordmark.tsx +32 -0
- package/src/components/changelog/ReleaseRail.tsx +81 -0
- package/src/components/changelog/index.ts +1 -0
- package/src/components/chat/ChatCodeBlock.tsx +67 -0
- package/src/components/chat/ChatMarkdown.tsx +66 -0
- package/src/components/chat/ChatMarkdownSource.tsx +203 -0
- package/src/components/chat/ChatMermaidBlock.tsx +202 -0
- package/src/components/chat/ChatMessage.tsx +77 -0
- package/src/components/chat/ChatPlayback.tsx +422 -0
- package/src/components/chat/ChatStreamCursor.tsx +25 -0
- package/src/components/chat/ChatThinking.tsx +113 -0
- package/src/components/chat/ChatToolCall.tsx +190 -0
- package/src/components/chat/ChatTranscript.tsx +60 -0
- package/src/components/chat/ChatWidgetFrame.tsx +107 -0
- package/src/components/chat/DigichatBootLoader.tsx +683 -0
- package/src/components/chat/DigichatLauncher.tsx +361 -0
- package/src/components/chat/DigichatThread.tsx +118 -0
- package/src/components/chat/DigichatThreadList.tsx +54 -0
- package/src/components/chat/DigichatWordmark.tsx +24 -0
- package/src/components/chat/DotMatrix.tsx +650 -0
- package/src/components/chat/boot-lab.tsx +766 -0
- package/src/components/chat/boot-signal.ts +144 -0
- package/src/components/chat/chat-surfaces.ts +52 -0
- package/src/components/chat/connection-status.ts +40 -0
- package/src/components/chat/digichat-wordmark.ts +355 -0
- package/src/components/chat/disclosure-chevron.tsx +49 -0
- package/src/components/chat/followable-href.ts +9 -0
- package/src/components/chat/gallery-thread/action-icons.tsx +25 -0
- package/src/components/chat/gallery-thread/attachment.aui.tsx +262 -0
- package/src/components/chat/gallery-thread/block-caret.tsx +439 -0
- package/src/components/chat/gallery-thread/cn.ts +1 -0
- package/src/components/chat/gallery-thread/composer-keyboard.ts +106 -0
- package/src/components/chat/gallery-thread/composer-trigger-popover.aui.tsx +235 -0
- package/src/components/chat/gallery-thread/css.d.ts +6 -0
- package/src/components/chat/gallery-thread/file.tsx +238 -0
- package/src/components/chat/gallery-thread/follow-up-suggestions.aui.tsx +92 -0
- package/src/components/chat/gallery-thread/format-json-dump.ts +112 -0
- package/src/components/chat/gallery-thread/hooks/use-attachment-src.ts +46 -0
- package/src/components/chat/gallery-thread/hooks/use-copy-to-clipboard.ts +9 -0
- package/src/components/chat/gallery-thread/image.tsx +519 -0
- package/src/components/chat/gallery-thread/markdown-text.tsx +278 -0
- package/src/components/chat/gallery-thread/message-error.aui.tsx +105 -0
- package/src/components/chat/gallery-thread/message-timing.aui.tsx +143 -0
- package/src/components/chat/gallery-thread/private-work-step.tsx +188 -0
- package/src/components/chat/gallery-thread/reasoning.tsx +332 -0
- package/src/components/chat/gallery-thread/scroll-mode.ts +174 -0
- package/src/components/chat/gallery-thread/source.tsx +76 -0
- package/src/components/chat/gallery-thread/thread.aui.tsx +1619 -0
- package/src/components/chat/gallery-thread/tooltip-icon-button.tsx +53 -0
- package/src/components/chat/gallery-thread/typed-welcome-copy.tsx +18 -0
- package/src/components/chat/gallery-thread/ui/tooltip.tsx +22 -0
- package/src/components/chat/gallery-thread/work-chain-summary.tsx +48 -0
- package/src/components/chat/gallery-thread/work-chain.tsx +110 -0
- package/src/components/chat/gallery-thread/work-status.ts +66 -0
- package/src/components/chat/overlay-scrollbar.tsx +86 -0
- package/src/components/chat/sanitize-mermaid-svg.ts +38 -0
- package/src/components/chat/skins/SOURCE.md +36 -0
- package/src/components/chat/skins/base/attachment.aui.tsx +287 -0
- package/src/components/chat/skins/base/aui-default/README.md +45 -0
- package/src/components/chat/skins/base/aui-default/collapsible-root.tsx +19 -0
- package/src/components/chat/skins/base/aui-default/collapsible.tsx +21 -0
- package/src/components/chat/skins/base/aui-default/reasoning.aui.tsx +120 -0
- package/src/components/chat/skins/base/aui-default/reasoning.tsx +331 -0
- package/src/components/chat/skins/base/aui-default/surfaces.ts +7 -0
- package/src/components/chat/skins/base/aui-default/tool-fallback.aui.tsx +772 -0
- package/src/components/chat/skins/base/aui-default/tool-group.aui.tsx +241 -0
- package/src/components/chat/skins/base/docs-model-options.ts +6 -0
- package/src/components/chat/skins/base/elements/assistant-trace.aui.tsx +169 -0
- package/src/components/chat/skins/base/elements/composer-trigger-popover.aui.tsx +271 -0
- package/src/components/chat/skins/base/elements/directive-text.aui.tsx +29 -0
- package/src/components/chat/skins/base/elements/directive-text.tsx +76 -0
- package/src/components/chat/skins/base/elements/message-timing.aui.tsx +104 -0
- package/src/components/chat/skins/base/elements/model-selector.aui.tsx +140 -0
- package/src/components/chat/skins/base/elements/model-selector.tsx +720 -0
- package/src/components/chat/skins/base/elements/quote.aui.tsx +290 -0
- package/src/components/chat/skins/base/elements/work-chain.tsx +100 -0
- package/src/components/chat/skins/base/markdown-text.tsx +294 -0
- package/src/components/chat/skins/base/model.ts +1 -0
- package/src/components/chat/skins/base/thread.tsx +1050 -0
- package/src/components/chat/skins/base/tooltip-icon-button.tsx +56 -0
- package/src/components/chat/skins/base/ui/avatar.tsx +115 -0
- package/src/components/chat/skins/base/ui/badge.tsx +51 -0
- package/src/components/chat/skins/base/ui/button.tsx +67 -0
- package/src/components/chat/skins/base/ui/command.tsx +185 -0
- package/src/components/chat/skins/base/ui/dialog.tsx +168 -0
- package/src/components/chat/skins/base/ui/dot-matrix.tsx +267 -0
- package/src/components/chat/skins/base/ui/popover.tsx +97 -0
- package/src/components/chat/skins/base/ui/skeleton.tsx +20 -0
- package/src/components/chat/skins/base/ui/textarea.tsx +24 -0
- package/src/components/chat/skins/base/ui/tooltip.tsx +73 -0
- package/src/components/chat/skins/base-assistant-ui/config-provider.tsx +90 -0
- package/src/components/chat/skins/base-assistant-ui/defaults.ts +419 -0
- package/src/components/chat/skins/base-assistant-ui/index.tsx +44 -0
- package/src/components/chat/skins/chatgpt.tsx +448 -0
- package/src/components/chat/skins/claude.tsx +380 -0
- package/src/components/chat/skins/digichat-composer-toolbar.tsx +151 -0
- package/src/components/chat/skins/digichat-context-meter-shares.ts +158 -0
- package/src/components/chat/skins/digichat-context-meter.tsx +243 -0
- package/src/components/chat/skins/digichat-meter-tone.ts +26 -0
- package/src/components/chat/skins/digichat-usage-meter.tsx +103 -0
- package/src/components/chat/skins/digichat.tsx +144 -0
- package/src/components/chat/skins/expo-react-native.tsx +29 -0
- package/src/components/chat/skins/gemini.tsx +322 -0
- package/src/components/chat/skins/grok-icon.tsx +34 -0
- package/src/components/chat/skins/grok.tsx +369 -0
- package/src/components/chat/skins/index.ts +46 -0
- package/src/components/chat/skins/perplexity.tsx +462 -0
- package/src/components/chat/skins/product-page-assistant/assistant-modal.tsx +73 -0
- package/src/components/chat/skins/product-page-assistant/index.tsx +19 -0
- package/src/components/chat/skins/product-page-assistant/product-dashboard.tsx +164 -0
- package/src/components/chat/skins/react-ink.tsx +97 -0
- package/src/components/chat/skins/thread-skin-host-contract.ts +102 -0
- package/src/components/chat/skins/thread-skin-view.tsx +156 -0
- package/src/components/chat/skins/thread-skins.ts +143 -0
- package/src/components/chat/skins/tooltip-icon-button.tsx +35 -0
- package/src/components/chat/skins/ui/dropdown-menu.tsx +272 -0
- package/src/components/chat/skins/webpage-assistant/assistant-config.ts +238 -0
- package/src/components/chat/skins/webpage-assistant/assistant-modal.tsx +78 -0
- package/src/components/chat/skins/webpage-assistant/config-provider.tsx +132 -0
- package/src/components/chat/skins/webpage-assistant/docs-app.tsx +106 -0
- package/src/components/chat/skins/webpage-assistant/docs-article.tsx +109 -0
- package/src/components/chat/skins/webpage-assistant/docs-assistant.tsx +73 -0
- package/src/components/chat/skins/webpage-assistant/docs-nav.tsx +81 -0
- package/src/components/chat/skins/webpage-assistant/host-ui.ts +79 -0
- package/src/components/chat/skins/webpage-assistant/index.tsx +12 -0
- package/src/components/chat/skins/webpage-assistant/markdown-page.tsx +11 -0
- package/src/components/chat/skins/webpage-assistant/pages.ts +9 -0
- package/src/components/chat/skins/webpage-assistant/types.ts +178 -0
- package/src/components/chat/skins/webpage-assistant/use-mobile.ts +19 -0
- package/src/components/chat/stock/SOURCE.md +90 -0
- package/src/components/chat/stock/artifacts-panel.tsx +305 -0
- package/src/components/chat/stock/attachment.aui.tsx +280 -0
- package/src/components/chat/stock/chat-notice.tsx +143 -0
- package/src/components/chat/stock/chat-private-mode.tsx +64 -0
- package/src/components/chat/stock/deploy-ui-context.tsx +89 -0
- package/src/components/chat/stock/embed-chat-prefs.tsx +471 -0
- package/src/components/chat/stock/file.tsx +265 -0
- package/src/components/chat/stock/follow-up-suggestions.aui.tsx +83 -0
- package/src/components/chat/stock/image.tsx +531 -0
- package/src/components/chat/stock/index.ts +129 -0
- package/src/components/chat/stock/json-view.tsx +140 -0
- package/src/components/chat/stock/markdown-text.tsx +319 -0
- package/src/components/chat/stock/message-error.aui.tsx +96 -0
- package/src/components/chat/stock/message-export-menu.tsx +156 -0
- package/src/components/chat/stock/palette-row-preview.tsx +26 -0
- package/src/components/chat/stock/reasoning.aui.tsx +120 -0
- package/src/components/chat/stock/reasoning.tsx +335 -0
- package/src/components/chat/stock/skin-chrome.tsx +81 -0
- package/src/components/chat/stock/skin-credit.tsx +63 -0
- package/src/components/chat/stock/skin-palette-bridge.tsx +235 -0
- package/src/components/chat/stock/skin-palette-context.ts +16 -0
- package/src/components/chat/stock/skin-runtime.tsx +52 -0
- package/src/components/chat/stock/skin-slash-palette.tsx +393 -0
- package/src/components/chat/stock/skin-types.ts +217 -0
- package/src/components/chat/stock/stock-chat-prefs-host.tsx +501 -0
- package/src/components/chat/stock/stock-send-gate.tsx +94 -0
- package/src/components/chat/stock/stock-shape.tsx +39 -0
- package/src/components/chat/stock/thread.aui.tsx +645 -0
- package/src/components/chat/stock/tool-display.ts +6 -0
- package/src/components/chat/stock/tool-fallback.aui.tsx +866 -0
- package/src/components/chat/stock/tool-group.aui.tsx +244 -0
- package/src/components/chat/stock/tool-surface.ts +120 -0
- package/src/components/chat/stock/tooltip-icon-button.tsx +49 -0
- package/src/components/chat/stock/ui/avatar.tsx +108 -0
- package/src/components/chat/stock/ui/button.tsx +81 -0
- package/src/components/chat/stock/ui/collapsible.tsx +21 -0
- package/src/components/chat/stock/ui/dialog.tsx +163 -0
- package/src/components/chat/stock/ui/skeleton.tsx +13 -0
- package/src/components/chat/stock/ui/textarea.tsx +20 -0
- package/src/components/chat/stock/ui/tooltip.tsx +68 -0
- package/src/components/chat/stock/use-attachment-src.ts +42 -0
- package/src/components/chat/stock/use-copy-to-clipboard.ts +29 -0
- package/src/components/chat/strip-model-boilerplate.ts +42 -0
- package/src/components/chat/suggestion-cycle.tsx +230 -0
- package/src/components/chat/suggestion-scroll-row.tsx +81 -0
- package/src/components/chat/trace-grouping/chain-group-by.ts +44 -0
- package/src/components/chat/trace-grouping/chain-state.ts +141 -0
- package/src/components/chat/trace-grouping/index.ts +32 -0
- package/src/components/chat/trace-grouping/tool-row.ts +74 -0
- package/src/components/chat/trace-grouping/use-deploy-work-disclosure.ts +35 -0
- package/src/components/chat/trace-grouping/use-work-chain.ts +103 -0
- package/src/components/chat/trace-i18n/core.ts +48 -0
- package/src/components/chat/trace-i18n/index.tsx +23 -0
- package/src/components/chat/trace-i18n/locales/en.ts +24 -0
- package/src/components/chat/trace-i18n/locales/fr.ts +28 -0
- package/src/components/chat/trace-i18n/types.ts +35 -0
- package/src/components/chat/trace-spacing.ts +249 -0
- package/src/components/chat/transcript/activity-view.ts +375 -0
- package/src/components/chat/transcript/chat-export.ts +133 -0
- package/src/components/chat/transcript/index.ts +10 -0
- package/src/components/chat/transcript/save-file.ts +209 -0
- package/src/components/chat/transcript/transcript-markdown.ts +428 -0
- package/src/components/chat/transcript/types.ts +81 -0
- package/src/components/chat/turn-outcome.ts +52 -0
- package/src/components/chat/use-warmup-phase.ts +18 -0
- package/src/components/chat/work-status-lead.tsx +49 -0
- package/src/components/chrome.tsx +264 -0
- package/src/components/command-palette/CommandPalette.tsx +404 -0
- package/src/components/command-palette/index.ts +6 -0
- package/src/components/contact/ContactMailto.tsx +112 -0
- package/src/components/contact/index.ts +5 -0
- package/src/components/conviction/ConvictionMeter.tsx +40 -0
- package/src/components/conviction/SignedConvictionBadge.tsx +26 -0
- package/src/components/conviction/index.ts +7 -0
- package/src/components/data-layout/BentoGrid.tsx +52 -0
- package/src/components/data-layout/CardRail.tsx +150 -0
- package/src/components/data-layout/DotMatrixStat.tsx +65 -0
- package/src/components/data-layout/FeatureCell.tsx +80 -0
- package/src/components/data-layout/MediaFrame.tsx +125 -0
- package/src/components/data-layout/ModuleGrid.tsx +735 -0
- package/src/components/data-layout/Odometer.tsx +149 -0
- package/src/components/data-layout/ProductFrame.tsx +79 -0
- package/src/components/data-layout/TestimonialWall.tsx +139 -0
- package/src/components/data-layout/index.ts +19 -0
- package/src/components/data-layout/treemap.ts +368 -0
- package/src/components/deck/DeckStack.tsx +243 -0
- package/src/components/desk/DataTable.tsx +373 -0
- package/src/components/desk/KpiGrid.tsx +80 -0
- package/src/components/desk/Sparkline.tsx +63 -0
- package/src/components/desk/StateBlock.tsx +132 -0
- package/src/components/desk/index.ts +18 -0
- package/src/components/diagrams/ArchitectureDiagram.tsx +350 -0
- package/src/components/diagrams/ArchitectureTour.tsx +912 -0
- package/src/components/diagrams/TerminalSchematic.tsx +192 -0
- package/src/components/diagrams/architecture-svg.tsx +384 -0
- package/src/components/diagrams/index.ts +30 -0
- package/src/components/diagrams/mermaid-theme.ts +115 -0
- package/src/components/diagrams/tour-camera.ts +171 -0
- package/src/components/docs/CodeTabs.tsx +90 -0
- package/src/components/docs/CopyCommand.tsx +151 -0
- package/src/components/docs/DocsLayout.tsx +197 -0
- package/src/components/docs/DocsSearch.tsx +97 -0
- package/src/components/docs/Endpoint.tsx +135 -0
- package/src/components/document/DocumentFrame.tsx +43 -0
- package/src/components/document/GlyphList.tsx +51 -0
- package/src/components/document/PageTitle.tsx +44 -0
- package/src/components/document/Prose.tsx +38 -0
- package/src/components/document/Section.tsx +55 -0
- package/src/components/document/index.ts +13 -0
- package/src/components/effects-chrome/AnnouncementBar.tsx +88 -0
- package/src/components/effects-chrome/HorizontalScrollTrack.tsx +461 -0
- package/src/components/effects-chrome/Pipeline.tsx +226 -0
- package/src/components/effects-chrome/RotatingPrompts.tsx +116 -0
- package/src/components/effects-chrome/StackingPanels.tsx +101 -0
- package/src/components/effects-chrome/TabStrip.tsx +232 -0
- package/src/components/effects-chrome/ToastStack.tsx +201 -0
- package/src/components/effects-chrome/horizontal-track-core.ts +70 -0
- package/src/components/effects-chrome/index.ts +35 -0
- package/src/components/emblems.tsx +188 -0
- package/src/components/faviconTheme.ts +23 -0
- package/src/components/figure/Figure.tsx +38 -0
- package/src/components/figure/index.ts +2 -0
- package/src/components/finance-charts/DrawdownPlot.tsx +76 -0
- package/src/components/finance-charts/EquityCurve.tsx +71 -0
- package/src/components/finance-charts/PriceChart.tsx +119 -0
- package/src/components/finance-charts/chart-host.tsx +236 -0
- package/src/components/finance-charts/chart-scale.ts +93 -0
- package/src/components/finance-charts/demo-data.ts +88 -0
- package/src/components/finance-charts/index.ts +46 -0
- package/src/components/finance-charts/lw-chart.tsx +292 -0
- package/src/components/finance-composites/MarketBar.tsx +243 -0
- package/src/components/finance-composites/OrderBook.tsx +133 -0
- package/src/components/finance-composites/PerformanceDashboard.tsx +185 -0
- package/src/components/finance-composites/SortableTable.tsx +144 -0
- package/src/components/finance-composites/StockTicker.tsx +65 -0
- package/src/components/finance-composites/SyncedTearsheet.tsx +226 -0
- package/src/components/finance-composites/index.ts +28 -0
- package/src/components/finance-tearsheet/KpiStrip.tsx +49 -0
- package/src/components/finance-tearsheet/LiveBadge.tsx +29 -0
- package/src/components/finance-tearsheet/ReturnsMatrix.tsx +321 -0
- package/src/components/finance-tearsheet/StrategyTearsheet.tsx +99 -0
- package/src/components/finance-tearsheet/TearsheetCard.tsx +54 -0
- package/src/components/finance-tearsheet/TradeLogTable.tsx +73 -0
- package/src/components/finance-tearsheet/charts.tsx +2624 -0
- package/src/components/finance-tearsheet/demo-data.ts +177 -0
- package/src/components/finance-tearsheet/format.ts +41 -0
- package/src/components/finance-tearsheet/index.ts +120 -0
- package/src/components/finance-tearsheet/print.ts +52 -0
- package/src/components/finance-tearsheet/risk-bands.ts +48 -0
- package/src/components/finance-tearsheet/stats.ts +35 -0
- package/src/components/finance-tearsheet/strategy-sheet-model.ts +238 -0
- package/src/components/finance-tearsheet/types.ts +58 -0
- package/src/components/footer/FooterCells.tsx +109 -0
- package/src/components/footer/index.ts +6 -0
- package/src/components/graph.tsx +158 -0
- package/src/components/icons.tsx +98 -0
- package/src/components/landing/PixelWordmark.tsx +36 -0
- package/src/components/logos.ts +39 -0
- package/src/components/marquee/Marquee.tsx +204 -0
- package/src/components/metrics/PerfMetrics.tsx +68 -0
- package/src/components/metrics/StatCounter.tsx +104 -0
- package/src/components/page-geometry.tsx +177 -0
- package/src/components/pricing/Pricing.tsx +174 -0
- package/src/components/pricing/PricingMatrix.tsx +219 -0
- package/src/components/prose/index.ts +2 -0
- package/src/components/prose/prose.tsx +86 -0
- package/src/components/repo-activity/RepoActivity.tsx +599 -0
- package/src/components/repo-activity/RepoHeatmap.tsx +225 -0
- package/src/components/repo-activity/demo.ts +201 -0
- package/src/components/repo-activity/fetch.ts +211 -0
- package/src/components/repo-activity/heatmap.ts +123 -0
- package/src/components/repo-activity/index.ts +28 -0
- package/src/components/repo-activity/types.ts +99 -0
- package/src/components/stages/NumberedStages.tsx +116 -0
- package/src/components/symbols/marks.tsx +116 -0
- package/src/components/symbols/terminal-lockup.tsx +136 -0
- package/src/components/symbols/terminal-marks.tsx +226 -0
- package/src/components/terminal/ChatResponseLoader.tsx +67 -0
- package/src/components/terminal/ContainerBootLoader.tsx +82 -0
- package/src/components/terminal/TerminalStepCaret.tsx +202 -0
- package/src/components/themeInit.ts +24 -0
- package/src/components/typography/MotionReveal.tsx +108 -0
- package/src/components/typography/TypewriterReveal.tsx +101 -0
- package/src/components/typography/WordReveal.tsx +143 -0
- package/src/data/modules.ts +378 -0
- package/src/data/subsystems.ts +101 -0
- package/src/index.ts +587 -0
- package/src/lib/base-path.ts +60 -0
- package/src/lib/cx.ts +25 -0
- package/src/lib/gloomberb.ts +69 -0
- package/src/lib/record.ts +19 -0
- package/src/lib/stub-payload.ts +183 -0
- package/src/lib/useBodyScrollLock.ts +44 -0
- package/src/lib/utils.ts +6 -0
- package/src/motion/primitives.tsx +105 -0
- package/src/motion/scroll-glide.ts +62 -0
- package/src/motion/scrolly-core.ts +38 -0
- package/src/motion/scrolly.tsx +95 -0
- package/src/navigation/HashScrollManager.tsx +167 -0
- package/src/navigation/hashScroll.ts +78 -0
- package/src/replay/browser.ts +280 -0
- package/src/replay/chat-export-run.ts +121 -0
- package/src/replay/export-format.ts +25 -0
- package/src/replay/export-mount.ts +32 -0
- package/src/replay/filename.ts +54 -0
- package/src/replay/index.ts +21 -0
- package/src/replay/redact-dom.ts +178 -0
- package/src/replay/redact.ts +113 -0
- package/src/replay/snapshot.ts +659 -0
- package/src/styles/account-auth.css +339 -0
- package/src/styles/brand-wordmark.css +11 -0
- package/src/styles/card-rail.css +120 -0
- package/src/styles/chat-aui.css +1143 -0
- package/src/styles/chat-core.css +469 -0
- package/src/styles/chat-digichat.css +2531 -0
- package/src/styles/chat-math.css +70 -0
- package/src/styles/chat-skin-palette.css +138 -0
- package/src/styles/chat-stock-menu.css +37 -0
- package/src/styles/chat-widgets.css +190 -0
- package/src/styles/command-palette.css +372 -0
- package/src/styles/controls-core.css +2261 -0
- package/src/styles/controls-overlay.css +603 -0
- package/src/styles/data-layout.css +288 -0
- package/src/styles/deck.css +141 -0
- package/src/styles/diagrams.css +1860 -0
- package/src/styles/digichat-app-theme.css +250 -0
- package/src/styles/digichat-boot-loader.css +487 -0
- package/src/styles/digichat-launcher.css +377 -0
- package/src/styles/docs.css +165 -0
- package/src/styles/effects-chrome.css +888 -0
- package/src/styles/finance-composites.css +214 -0
- package/src/styles/finance-tearsheet-overlay.css +90 -0
- package/src/styles/finance-tearsheet.css +945 -0
- package/src/styles/marquee.css +168 -0
- package/src/styles/metrics.css +82 -0
- package/src/styles/nav-shell.css +551 -0
- package/src/styles/pricing.css +79 -0
- package/src/styles/repo-activity.css +575 -0
- package/src/styles/stages.css +69 -0
- package/src/styles/terminal-loaders.css +122 -0
- package/src/styles/terminal-manifest.css +228 -0
- package/src/styles/web-theme.css +1007 -0
- package/src/styles/word-reveal.css +204 -0
- package/src/theme/apply-theme.ts +214 -0
- package/src/theme/index.ts +27 -0
- package/src/theme/palette-registry.ts +855 -0
- package/src/theme/tui-prefs.ts +64 -0
- package/src/ui/alert.tsx +78 -0
- package/src/ui/avatar.tsx +104 -0
- package/src/ui/badge.tsx +75 -0
- package/src/ui/breadcrumb.tsx +61 -0
- package/src/ui/button.tsx +67 -0
- package/src/ui/card.tsx +139 -0
- package/src/ui/checkbox.tsx +27 -0
- package/src/ui/collapsible.tsx +32 -0
- package/src/ui/date-pager.tsx +325 -0
- package/src/ui/dialog.tsx +157 -0
- package/src/ui/dropdown-menu.tsx +267 -0
- package/src/ui/empty-state.tsx +165 -0
- package/src/ui/field.tsx +104 -0
- package/src/ui/form.tsx +36 -0
- package/src/ui/icon-button.tsx +36 -0
- package/src/ui/index.ts +34 -0
- package/src/ui/input.tsx +33 -0
- package/src/ui/kbd.tsx +30 -0
- package/src/ui/label.tsx +32 -0
- package/src/ui/pager.tsx +119 -0
- package/src/ui/pagination.tsx +126 -0
- package/src/ui/radio-group.tsx +51 -0
- package/src/ui/search-bar.tsx +85 -0
- package/src/ui/segmented-control.tsx +76 -0
- package/src/ui/select.tsx +257 -0
- package/src/ui/separator.tsx +24 -0
- package/src/ui/sheet.tsx +141 -0
- package/src/ui/skeleton.tsx +76 -0
- package/src/ui/slider.tsx +76 -0
- package/src/ui/switch.tsx +31 -0
- package/src/ui/table.tsx +179 -0
- package/src/ui/tabs.tsx +89 -0
- package/src/ui/tags-input.tsx +168 -0
- package/src/ui/textarea.tsx +17 -0
- package/src/ui/tooltip.tsx +71 -0
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import "../../../styles/chat-stock-menu.css";
|
|
4
|
+
import {
|
|
5
|
+
ComposerAddAttachment,
|
|
6
|
+
ComposerAttachments,
|
|
7
|
+
UserMessageAttachments,
|
|
8
|
+
} from "./attachment.aui";
|
|
9
|
+
import { File } from "./file";
|
|
10
|
+
import { ThreadFollowupSuggestions } from "./follow-up-suggestions.aui";
|
|
11
|
+
import { Image } from "./image";
|
|
12
|
+
import { useSuggestionGroup } from "../suggestion-cycle";
|
|
13
|
+
import { MarkdownText } from "./markdown-text";
|
|
14
|
+
import { AssistantTrace } from "../skins/base/elements/assistant-trace.aui";
|
|
15
|
+
import { messageHasContent } from "../trace-grouping";
|
|
16
|
+
import { MessageExportMenu } from "./message-export-menu";
|
|
17
|
+
import { TooltipIconButton } from "./tooltip-icon-button";
|
|
18
|
+
import { Button } from "./ui/button";
|
|
19
|
+
import { Skeleton } from "./ui/skeleton";
|
|
20
|
+
import { StockShapeProvider } from "./stock-shape";
|
|
21
|
+
import { cn } from "../../../lib/utils";
|
|
22
|
+
import { useStockComposerGateSubmit } from "./stock-send-gate";
|
|
23
|
+
import { MessageError } from "./message-error.aui";
|
|
24
|
+
import { SkinCredit } from "./skin-credit";
|
|
25
|
+
import { DotMatrix } from "../DotMatrix";
|
|
26
|
+
|
|
27
|
+
import { useDeployUi } from "./deploy-ui-context";
|
|
28
|
+
import {
|
|
29
|
+
ActionBarPrimitive,
|
|
30
|
+
AuiIf,
|
|
31
|
+
type AssistantState,
|
|
32
|
+
BranchPickerPrimitive,
|
|
33
|
+
ComposerPrimitive,
|
|
34
|
+
MessagePrimitive,
|
|
35
|
+
SuggestionPrimitive,
|
|
36
|
+
ThreadPrimitive,
|
|
37
|
+
type FileMessagePartComponent,
|
|
38
|
+
type ImageMessagePartComponent,
|
|
39
|
+
type ToolCallMessagePartComponent,
|
|
40
|
+
useAuiState,
|
|
41
|
+
} from "@assistant-ui/react";
|
|
42
|
+
import {
|
|
43
|
+
ArrowDownIcon,
|
|
44
|
+
ArrowUpIcon,
|
|
45
|
+
CheckIcon,
|
|
46
|
+
ChevronLeftIcon,
|
|
47
|
+
ChevronRightIcon,
|
|
48
|
+
CopyIcon,
|
|
49
|
+
DownloadIcon,
|
|
50
|
+
MicIcon,
|
|
51
|
+
MoreHorizontalIcon,
|
|
52
|
+
PencilIcon,
|
|
53
|
+
RefreshCwIcon,
|
|
54
|
+
SquareIcon,
|
|
55
|
+
} from "lucide-react";
|
|
56
|
+
import {
|
|
57
|
+
createContext,
|
|
58
|
+
useContext,
|
|
59
|
+
type ComponentType,
|
|
60
|
+
type FC,
|
|
61
|
+
type PropsWithChildren,
|
|
62
|
+
} from "react";
|
|
63
|
+
|
|
64
|
+
export type ThreadGroupPart = MessagePrimitive.GroupedParts.GroupPart;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Optional component overrides for the thread. `AssistantMessage` and
|
|
68
|
+
* `Welcome` replace whole sections; the remaining slots override how the
|
|
69
|
+
* assistant message renders tool calls and part groups. Tool UIs registered
|
|
70
|
+
* by name (toolkit `render`, `useAssistantDataUI`) take precedence over
|
|
71
|
+
* `ToolFallback`.
|
|
72
|
+
*/
|
|
73
|
+
export type ThreadComponents = {
|
|
74
|
+
AssistantMessage?: ComponentType | undefined;
|
|
75
|
+
Welcome?: ComponentType | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Optional footer slot below the composer (defaults to the shared
|
|
78
|
+
* "powered by digichat" credit; hosts may render their own footer here).
|
|
79
|
+
*/
|
|
80
|
+
Footer?: ComponentType | undefined;
|
|
81
|
+
ToolFallback?: ToolCallMessagePartComponent | undefined;
|
|
82
|
+
ToolGroup?:
|
|
83
|
+
| ComponentType<PropsWithChildren<{ group: ThreadGroupPart }>>
|
|
84
|
+
| undefined;
|
|
85
|
+
ReasoningGroup?:
|
|
86
|
+
| ComponentType<PropsWithChildren<{ group: ThreadGroupPart }>>
|
|
87
|
+
| undefined;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export type ThreadProps = {
|
|
91
|
+
components?: ThreadComponents | undefined;
|
|
92
|
+
autoFocus?: boolean | undefined;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const EMPTY_COMPONENTS: ThreadComponents = {};
|
|
96
|
+
|
|
97
|
+
const ThreadComponentsContext =
|
|
98
|
+
createContext<ThreadComponents>(EMPTY_COMPONENTS);
|
|
99
|
+
// Startup exposes a loading placeholder thread; treat it as a new chat so
|
|
100
|
+
// the composer mounts centered. Loads after startup keep the docked layout.
|
|
101
|
+
const isNewChatView = (s: AssistantState) =>
|
|
102
|
+
s.thread.messages.length === 0 &&
|
|
103
|
+
(!s.thread.isLoading || s.threads.isLoading);
|
|
104
|
+
|
|
105
|
+
// A switched thread that is still fetching its history: skeleton, not welcome.
|
|
106
|
+
const isHistoryLoadingView = (s: AssistantState) =>
|
|
107
|
+
s.thread.messages.length === 0 &&
|
|
108
|
+
s.thread.isLoading &&
|
|
109
|
+
!s.thread.isDisabled &&
|
|
110
|
+
!s.threads.isLoading;
|
|
111
|
+
|
|
112
|
+
const ThreadHistorySkeleton: FC = () => (
|
|
113
|
+
<div
|
|
114
|
+
data-slot="aui_thread-history-skeleton"
|
|
115
|
+
role="status"
|
|
116
|
+
className="animate-in fade-in fill-mode-both flex flex-col gap-y-6 [animation-delay:150ms] [animation-duration:200ms]"
|
|
117
|
+
>
|
|
118
|
+
<span className="sr-only">Loading conversation</span>
|
|
119
|
+
<Skeleton className="ml-auto h-9 w-2/5 rounded-xl motion-reduce:animate-none" />
|
|
120
|
+
<div className="flex flex-col gap-y-2">
|
|
121
|
+
<Skeleton className="h-4 w-11/12 motion-reduce:animate-none" />
|
|
122
|
+
<Skeleton className="h-4 w-4/5 motion-reduce:animate-none" />
|
|
123
|
+
<Skeleton className="h-4 w-3/5 motion-reduce:animate-none" />
|
|
124
|
+
</div>
|
|
125
|
+
<Skeleton className="ml-auto h-9 w-1/3 rounded-xl motion-reduce:animate-none" />
|
|
126
|
+
<div className="flex flex-col gap-y-2">
|
|
127
|
+
<Skeleton className="h-4 w-10/12 motion-reduce:animate-none" />
|
|
128
|
+
<Skeleton className="h-4 w-2/3 motion-reduce:animate-none" />
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
export const Thread: FC<ThreadProps> = ({
|
|
134
|
+
components = EMPTY_COMPONENTS,
|
|
135
|
+
autoFocus = true,
|
|
136
|
+
}) => {
|
|
137
|
+
const isEmpty = useAuiState(isNewChatView);
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<ThreadComponentsContext.Provider value={components}>
|
|
141
|
+
<StockShapeProvider>
|
|
142
|
+
<ThreadRoot isEmpty={isEmpty} autoFocus={autoFocus} />
|
|
143
|
+
</StockShapeProvider>
|
|
144
|
+
</ThreadComponentsContext.Provider>
|
|
145
|
+
);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
const ThreadRoot: FC<{ isEmpty: boolean; autoFocus: boolean }> = ({
|
|
149
|
+
isEmpty,
|
|
150
|
+
autoFocus,
|
|
151
|
+
}) => {
|
|
152
|
+
const { Welcome = ThreadWelcome, Footer = ThreadFooter } =
|
|
153
|
+
useContext(ThreadComponentsContext);
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<ThreadPrimitive.Root
|
|
157
|
+
className="aui-root aui-thread-root bg-surface @container flex h-full flex-col"
|
|
158
|
+
data-stock-thread=""
|
|
159
|
+
style={{
|
|
160
|
+
["--thread-max-width" as string]: "44rem",
|
|
161
|
+
["--composer-bg" as string]: "var(--card, var(--surface))",
|
|
162
|
+
["--composer-radius" as string]: "1.5rem",
|
|
163
|
+
["--composer-padding" as string]: "8px",
|
|
164
|
+
}}
|
|
165
|
+
>
|
|
166
|
+
<ThreadPrimitive.Viewport
|
|
167
|
+
turnAnchor="top"
|
|
168
|
+
data-slot="aui_thread-viewport"
|
|
169
|
+
className="relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth"
|
|
170
|
+
>
|
|
171
|
+
<div
|
|
172
|
+
className={cn(
|
|
173
|
+
"mx-auto flex w-full max-w-(--thread-max-width) flex-1 flex-col px-4 pt-4",
|
|
174
|
+
isEmpty && "justify-center",
|
|
175
|
+
)}
|
|
176
|
+
>
|
|
177
|
+
<AuiIf condition={isNewChatView}>
|
|
178
|
+
<Welcome />
|
|
179
|
+
</AuiIf>
|
|
180
|
+
<AuiIf condition={isHistoryLoadingView}>
|
|
181
|
+
<ThreadHistorySkeleton />
|
|
182
|
+
</AuiIf>
|
|
183
|
+
|
|
184
|
+
<div
|
|
185
|
+
data-slot="aui_message-group"
|
|
186
|
+
className="mb-14 flex flex-col gap-y-6 empty:hidden"
|
|
187
|
+
>
|
|
188
|
+
<ThreadPrimitive.Messages>
|
|
189
|
+
{() => <ThreadMessage />}
|
|
190
|
+
</ThreadPrimitive.Messages>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<ThreadPrimitive.ViewportFooter
|
|
194
|
+
className={cn(
|
|
195
|
+
"aui-thread-viewport-footer bg-surface flex flex-col gap-4 overflow-visible pb-2 md:pb-3",
|
|
196
|
+
!isEmpty &&
|
|
197
|
+
"sticky bottom-0 mt-auto rounded-t-(--composer-radius)",
|
|
198
|
+
)}
|
|
199
|
+
>
|
|
200
|
+
<ThreadScrollToBottom />
|
|
201
|
+
<ThreadFollowupSuggestions />
|
|
202
|
+
<Composer autoFocus={autoFocus} />
|
|
203
|
+
<Footer />
|
|
204
|
+
<AuiIf condition={(s) => isNewChatView(s) && s.composer.isEmpty}>
|
|
205
|
+
<ThreadSuggestions />
|
|
206
|
+
</AuiIf>
|
|
207
|
+
</ThreadPrimitive.ViewportFooter>
|
|
208
|
+
{isEmpty && (
|
|
209
|
+
<div className="pointer-events-none absolute inset-x-0 bottom-0 px-4 pb-2">
|
|
210
|
+
<SkinCredit />
|
|
211
|
+
</div>
|
|
212
|
+
)}
|
|
213
|
+
</div>
|
|
214
|
+
</ThreadPrimitive.Viewport>
|
|
215
|
+
</ThreadPrimitive.Root>
|
|
216
|
+
);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const ThreadMessage: FC = () => {
|
|
220
|
+
const { AssistantMessage: AssistantMessageComponent = AssistantMessage } =
|
|
221
|
+
useContext(ThreadComponentsContext);
|
|
222
|
+
const role = useAuiState((s) => s.message.role);
|
|
223
|
+
const isEditing = useAuiState((s) => s.message.composer.isEditing);
|
|
224
|
+
|
|
225
|
+
if (isEditing) return <EditComposer />;
|
|
226
|
+
if (role === "user") return <UserMessage />;
|
|
227
|
+
return <AssistantMessageComponent />;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const ThreadScrollToBottom: FC = () => {
|
|
231
|
+
return (
|
|
232
|
+
<ThreadPrimitive.ScrollToBottom asChild>
|
|
233
|
+
<TooltipIconButton
|
|
234
|
+
tooltip="Scroll to bottom"
|
|
235
|
+
variant="outline"
|
|
236
|
+
className="aui-thread-scroll-to-bottom border-hair bg-surface hover:bg-surface-2 absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible"
|
|
237
|
+
>
|
|
238
|
+
<ArrowDownIcon />
|
|
239
|
+
</TooltipIconButton>
|
|
240
|
+
</ThreadPrimitive.ScrollToBottom>
|
|
241
|
+
);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
// Branding footer: "powered by digichat" in normal flow below the composer
|
|
246
|
+
// once messages exist. Empty threads get the same line pinned to the page
|
|
247
|
+
// bottom (see the absolute block after ViewportFooter). Hosts can still
|
|
248
|
+
// override the whole Footer slot.
|
|
249
|
+
const ThreadFooter: FC = () => (
|
|
250
|
+
<AuiIf condition={(s) => !s.thread.isEmpty}>
|
|
251
|
+
<SkinCredit />
|
|
252
|
+
</AuiIf>
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
const ThreadWelcome: FC = () => {
|
|
256
|
+
return (
|
|
257
|
+
<div className="aui-thread-welcome-root mb-6 flex flex-col items-center gap-2 px-4 text-center">
|
|
258
|
+
<h1 className="aui-thread-welcome-message-inner fade-in slide-in-from-bottom-1 animate-in fill-mode-both text-2xl font-medium duration-(--dur-arrive)">
|
|
259
|
+
Ask the stack.
|
|
260
|
+
</h1>
|
|
261
|
+
<p className="aui-thread-welcome-copy fade-in animate-in fill-mode-both text-sm text-ink-mute duration-(--dur-arrive)">
|
|
262
|
+
It reads the configured docs, then answers.
|
|
263
|
+
</p>
|
|
264
|
+
</div>
|
|
265
|
+
);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const ThreadSuggestions: FC = () => {
|
|
269
|
+
// Keyed by the cycle's group offset so a new group remounts and re-runs the
|
|
270
|
+
// chips' entrance fade; hover/focus handlers hold the cycle while it is read.
|
|
271
|
+
const { groupKey, handlers } = useSuggestionGroup();
|
|
272
|
+
return (
|
|
273
|
+
<div
|
|
274
|
+
key={groupKey}
|
|
275
|
+
className="aui-thread-welcome-suggestions flex w-full flex-wrap items-center justify-center gap-2 px-4"
|
|
276
|
+
{...handlers}
|
|
277
|
+
>
|
|
278
|
+
<ThreadPrimitive.Suggestions>
|
|
279
|
+
{() => <ThreadSuggestionItem />}
|
|
280
|
+
</ThreadPrimitive.Suggestions>
|
|
281
|
+
</div>
|
|
282
|
+
);
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
const ThreadSuggestionItem: FC = () => {
|
|
286
|
+
return (
|
|
287
|
+
<div className="aui-thread-welcome-suggestion-display fade-in slide-in-from-bottom-2 animate-in fill-mode-both duration-(--duration-hover)">
|
|
288
|
+
<SuggestionPrimitive.Trigger send asChild>
|
|
289
|
+
<Button
|
|
290
|
+
variant="ghost"
|
|
291
|
+
className="aui-thread-welcome-suggestion text-ink hover:bg-surface-2 border-hair h-auto gap-1.5 rounded-md border px-3.5 py-1.5 text-sm font-normal whitespace-nowrap transition-colors"
|
|
292
|
+
>
|
|
293
|
+
<SuggestionPrimitive.Title className="aui-thread-welcome-suggestion-text-1" />
|
|
294
|
+
<SuggestionPrimitive.Description className="aui-thread-welcome-suggestion-text-2 empty:hidden" />
|
|
295
|
+
</Button>
|
|
296
|
+
</SuggestionPrimitive.Trigger>
|
|
297
|
+
</div>
|
|
298
|
+
);
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const Composer: FC<{ autoFocus: boolean }> = ({ autoFocus }) => {
|
|
302
|
+
// Embed free-tier / BYOK hold: StockSendGateProvider supplies onSubmit that
|
|
303
|
+
// preventDefaults before composer.send() so POST /api/chat never fires.
|
|
304
|
+
const gateSubmit = useStockComposerGateSubmit();
|
|
305
|
+
return (
|
|
306
|
+
<ComposerPrimitive.Root
|
|
307
|
+
className="aui-composer-root relative flex w-full flex-col"
|
|
308
|
+
onSubmit={gateSubmit}
|
|
309
|
+
>
|
|
310
|
+
<ComposerPrimitive.AttachmentDropzone asChild>
|
|
311
|
+
<div
|
|
312
|
+
data-slot="aui_composer-shell"
|
|
313
|
+
className="border-hair data-[dragging=true]:border-accent focus-within:border-hair-2 flex w-full cursor-text flex-col gap-2 rounded-(--composer-radius) border bg-(--composer-bg) p-(--composer-padding) transition-[border-color] duration-(--dur-tap) data-[dragging=true]:border-dashed data-[dragging=true]:bg-[color-mix(in_oklab,var(--accent)_50%,var(--bg))]"
|
|
314
|
+
>
|
|
315
|
+
<ComposerAttachments />
|
|
316
|
+
<ComposerPrimitive.Input
|
|
317
|
+
placeholder="Send a message..."
|
|
318
|
+
className="aui-composer-input caret-primary placeholder:text-ink-mute max-h-48 min-h-10 w-full resize-none bg-transparent px-2.5 py-1 text-base leading-6 outline-none"
|
|
319
|
+
rows={1}
|
|
320
|
+
autoFocus={autoFocus}
|
|
321
|
+
enterKeyHint="send"
|
|
322
|
+
aria-label="Message input"
|
|
323
|
+
/>
|
|
324
|
+
<ComposerAction />
|
|
325
|
+
</div>
|
|
326
|
+
</ComposerPrimitive.AttachmentDropzone>
|
|
327
|
+
</ComposerPrimitive.Root>
|
|
328
|
+
);
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const ComposerAction: FC = () => {
|
|
332
|
+
return (
|
|
333
|
+
<div className="aui-composer-action-wrapper relative flex items-center justify-between">
|
|
334
|
+
<ComposerAddAttachment />
|
|
335
|
+
<div className="flex items-center gap-1.5">
|
|
336
|
+
<AuiIf condition={(s) => s.thread.capabilities.dictation}>
|
|
337
|
+
<AuiIf condition={(s) => s.composer.dictation == null}>
|
|
338
|
+
<ComposerPrimitive.Dictate asChild>
|
|
339
|
+
<TooltipIconButton
|
|
340
|
+
tooltip="Voice input"
|
|
341
|
+
side="bottom"
|
|
342
|
+
type="button"
|
|
343
|
+
variant="ghost"
|
|
344
|
+
size="icon"
|
|
345
|
+
className="aui-composer-dictate text-ink-mute hover:text-ink size-7 rounded-full"
|
|
346
|
+
aria-label="Start voice input"
|
|
347
|
+
>
|
|
348
|
+
<MicIcon className="aui-composer-dictate-icon size-4" />
|
|
349
|
+
</TooltipIconButton>
|
|
350
|
+
</ComposerPrimitive.Dictate>
|
|
351
|
+
</AuiIf>
|
|
352
|
+
<AuiIf condition={(s) => s.composer.dictation != null}>
|
|
353
|
+
<ComposerPrimitive.StopDictation asChild>
|
|
354
|
+
<TooltipIconButton
|
|
355
|
+
tooltip="Stop dictation"
|
|
356
|
+
side="bottom"
|
|
357
|
+
type="button"
|
|
358
|
+
variant="ghost"
|
|
359
|
+
size="icon"
|
|
360
|
+
className="aui-composer-stop-dictation text-danger size-7 rounded-full"
|
|
361
|
+
aria-label="Stop voice input"
|
|
362
|
+
>
|
|
363
|
+
<SquareIcon className="aui-composer-stop-dictation-icon size-3.5 animate-pulse fill-current" />
|
|
364
|
+
</TooltipIconButton>
|
|
365
|
+
</ComposerPrimitive.StopDictation>
|
|
366
|
+
</AuiIf>
|
|
367
|
+
</AuiIf>
|
|
368
|
+
<AuiIf condition={(s) => !s.thread.isRunning}>
|
|
369
|
+
<ComposerPrimitive.Send asChild>
|
|
370
|
+
<TooltipIconButton
|
|
371
|
+
tooltip="Send message"
|
|
372
|
+
side="bottom"
|
|
373
|
+
type="button"
|
|
374
|
+
variant="default"
|
|
375
|
+
size="icon"
|
|
376
|
+
className="aui-composer-send size-7 rounded-full"
|
|
377
|
+
aria-label="Send message"
|
|
378
|
+
>
|
|
379
|
+
<ArrowUpIcon className="aui-composer-send-icon size-4" />
|
|
380
|
+
</TooltipIconButton>
|
|
381
|
+
</ComposerPrimitive.Send>
|
|
382
|
+
</AuiIf>
|
|
383
|
+
<AuiIf condition={(s) => s.thread.isRunning}>
|
|
384
|
+
<ComposerPrimitive.Cancel asChild>
|
|
385
|
+
<Button
|
|
386
|
+
type="button"
|
|
387
|
+
variant="default"
|
|
388
|
+
size="icon"
|
|
389
|
+
className="aui-composer-cancel size-7 rounded-full"
|
|
390
|
+
aria-label="Stop generating"
|
|
391
|
+
>
|
|
392
|
+
<SquareIcon className="aui-composer-cancel-icon size-3.5 fill-current" />
|
|
393
|
+
</Button>
|
|
394
|
+
</ComposerPrimitive.Cancel>
|
|
395
|
+
</AuiIf>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
);
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const AssistantMessage: FC = () => {
|
|
402
|
+
const {
|
|
403
|
+
ToolFallback: ToolFallbackComponent,
|
|
404
|
+
ToolGroup,
|
|
405
|
+
ReasoningGroup,
|
|
406
|
+
} = useContext(ThreadComponentsContext);
|
|
407
|
+
const hasContent = useAuiState((s) => messageHasContent(s.message.parts));
|
|
408
|
+
|
|
409
|
+
const ACTION_BAR_PT = "pt-1.5";
|
|
410
|
+
// Keep the action bar inside the contained root's paint box, then cancel its reserved space in flow.
|
|
411
|
+
const ACTION_BAR_HEIGHT = `min-h-7.5 ${ACTION_BAR_PT}`;
|
|
412
|
+
|
|
413
|
+
return (
|
|
414
|
+
<MessagePrimitive.Root
|
|
415
|
+
data-slot="aui_assistant-message-root"
|
|
416
|
+
data-role="assistant"
|
|
417
|
+
className="fade-in slide-in-from-bottom-1 animate-in relative -mb-7.5 pb-7.5 duration-(--dur-fast)"
|
|
418
|
+
>
|
|
419
|
+
<div
|
|
420
|
+
data-slot="aui_assistant-message-content"
|
|
421
|
+
className="text-ink px-2 leading-relaxed wrap-break-word"
|
|
422
|
+
>
|
|
423
|
+
{/* The base skin's trace (work chain, reasoning box, tool group and
|
|
424
|
+
assistant-ui's tool cards), shared so the stock thread traces the
|
|
425
|
+
same way; text, files and the indicator stay the stock look. */}
|
|
426
|
+
<AssistantTrace
|
|
427
|
+
ToolFallback={ToolFallbackComponent}
|
|
428
|
+
ToolGroup={ToolGroup}
|
|
429
|
+
ReasoningGroup={ReasoningGroup}
|
|
430
|
+
renderPart={({ part }) => {
|
|
431
|
+
switch (part.type) {
|
|
432
|
+
case "text":
|
|
433
|
+
return <MarkdownText />;
|
|
434
|
+
case "data":
|
|
435
|
+
return part.dataRendererUI;
|
|
436
|
+
case "file":
|
|
437
|
+
return (
|
|
438
|
+
<div data-slot="aui_assistant-message-file" className="py-1">
|
|
439
|
+
<File {...part} />
|
|
440
|
+
</div>
|
|
441
|
+
);
|
|
442
|
+
case "image":
|
|
443
|
+
return (
|
|
444
|
+
<div data-slot="aui_assistant-message-image" className="py-1">
|
|
445
|
+
<Image {...part} />
|
|
446
|
+
</div>
|
|
447
|
+
);
|
|
448
|
+
case "indicator":
|
|
449
|
+
// One loading affordance per turn: once anything real has
|
|
450
|
+
// arrived the work chain takes over.
|
|
451
|
+
return hasContent ? null : (
|
|
452
|
+
<span
|
|
453
|
+
data-slot="aui_assistant-message-indicator"
|
|
454
|
+
role="status"
|
|
455
|
+
className="inline-flex items-center"
|
|
456
|
+
>
|
|
457
|
+
<DotMatrix state="loading" decorative className="size-4" />
|
|
458
|
+
<span className="sr-only">Assistant is working</span>
|
|
459
|
+
</span>
|
|
460
|
+
);
|
|
461
|
+
default:
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
}}
|
|
465
|
+
/>
|
|
466
|
+
<MessageError />
|
|
467
|
+
</div>
|
|
468
|
+
|
|
469
|
+
<div
|
|
470
|
+
data-slot="aui_assistant-message-footer"
|
|
471
|
+
className={cn("ms-2 flex items-center", ACTION_BAR_HEIGHT)}
|
|
472
|
+
>
|
|
473
|
+
<BranchPicker />
|
|
474
|
+
<AssistantActionBar />
|
|
475
|
+
</div>
|
|
476
|
+
</MessagePrimitive.Root>
|
|
477
|
+
);
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
const AssistantActionBar: FC = () => {
|
|
481
|
+
return (
|
|
482
|
+
<ActionBarPrimitive.Root
|
|
483
|
+
hideWhenRunning
|
|
484
|
+
autohide="not-last"
|
|
485
|
+
className="aui-assistant-action-bar-root text-ink-mute animate-in fade-in col-start-3 row-start-2 -ms-1 flex gap-1 duration-(--duration-hover)"
|
|
486
|
+
>
|
|
487
|
+
<ActionBarPrimitive.Copy asChild>
|
|
488
|
+
<TooltipIconButton tooltip="Copy">
|
|
489
|
+
<AuiIf condition={(s) => s.message.isCopied}>
|
|
490
|
+
<CheckIcon className="animate-in zoom-in-50 fade-in duration-(--duration-hover) ease-out" />
|
|
491
|
+
</AuiIf>
|
|
492
|
+
<AuiIf condition={(s) => !s.message.isCopied}>
|
|
493
|
+
<CopyIcon className="animate-in zoom-in-75 fade-in duration-(--dur-fast)" />
|
|
494
|
+
</AuiIf>
|
|
495
|
+
</TooltipIconButton>
|
|
496
|
+
</ActionBarPrimitive.Copy>
|
|
497
|
+
<ActionBarPrimitive.Reload asChild>
|
|
498
|
+
<TooltipIconButton tooltip="Refresh">
|
|
499
|
+
<RefreshCwIcon />
|
|
500
|
+
</TooltipIconButton>
|
|
501
|
+
</ActionBarPrimitive.Reload>
|
|
502
|
+
<MessageExportMenu
|
|
503
|
+
trigger={
|
|
504
|
+
<TooltipIconButton tooltip="More" className="data-[state=open]:bg-surface-2">
|
|
505
|
+
<MoreHorizontalIcon />
|
|
506
|
+
</TooltipIconButton>
|
|
507
|
+
}
|
|
508
|
+
icon={<DownloadIcon className="size-4" />}
|
|
509
|
+
contentClassName="aui-action-bar-more-content border-hair bg-surface-2 text-ink data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1.5"
|
|
510
|
+
itemClassName="aui-action-bar-more-item hover:bg-surface-2 hover:text-ink focus:bg-surface-2 focus:text-ink data-[state=open]:text-ink flex cursor-pointer items-center gap-2 rounded-lg px-2.5 py-1.5 text-sm outline-none select-none"
|
|
511
|
+
/>
|
|
512
|
+
</ActionBarPrimitive.Root>
|
|
513
|
+
);
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
const UserFilePart: FileMessagePartComponent = (part) => (
|
|
517
|
+
<div data-slot="aui_user-message-file" className="py-1">
|
|
518
|
+
<File {...part} />
|
|
519
|
+
</div>
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
const UserImagePart: ImageMessagePartComponent = (part) => (
|
|
523
|
+
<div data-slot="aui_user-message-image" className="py-1">
|
|
524
|
+
<Image {...part} />
|
|
525
|
+
</div>
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
const UserMessage: FC = () => {
|
|
529
|
+
const { userAlign } = useDeployUi();
|
|
530
|
+
const alignEnd = userAlign === "right";
|
|
531
|
+
return (
|
|
532
|
+
<MessagePrimitive.Root
|
|
533
|
+
data-slot="aui_user-message-root"
|
|
534
|
+
data-user-align={userAlign}
|
|
535
|
+
className={cn(
|
|
536
|
+
"fade-in slide-in-from-bottom-1 animate-in grid auto-rows-auto content-start gap-y-2 px-2 duration-(--dur-fast)",
|
|
537
|
+
alignEnd
|
|
538
|
+
? "grid-cols-[minmax(72px,1fr)_auto] [&:where(>*)]:col-start-2"
|
|
539
|
+
: "grid-cols-[auto_minmax(72px,1fr)] [&:where(>*)]:col-start-1",
|
|
540
|
+
)}
|
|
541
|
+
data-role="user"
|
|
542
|
+
>
|
|
543
|
+
<UserMessageAttachments />
|
|
544
|
+
|
|
545
|
+
<div
|
|
546
|
+
className={cn(
|
|
547
|
+
"aui-user-message-content-wrapper relative min-w-0",
|
|
548
|
+
alignEnd ? "col-start-2" : "col-start-1",
|
|
549
|
+
)}
|
|
550
|
+
>
|
|
551
|
+
<div className="aui-user-message-content peer bg-surface-2 text-ink rounded-(--composer-radius) px-4 py-2 wrap-break-word empty:hidden">
|
|
552
|
+
<MessagePrimitive.Parts
|
|
553
|
+
components={{ File: UserFilePart, Image: UserImagePart }}
|
|
554
|
+
/>
|
|
555
|
+
</div>
|
|
556
|
+
<div className="aui-user-action-bar-wrapper absolute start-0 top-1/2 -translate-x-full -translate-y-1/2 pe-2 peer-empty:hidden rtl:translate-x-full">
|
|
557
|
+
<UserActionBar />
|
|
558
|
+
</div>
|
|
559
|
+
</div>
|
|
560
|
+
|
|
561
|
+
<BranchPicker
|
|
562
|
+
data-slot="aui_user-branch-picker"
|
|
563
|
+
className="col-span-full col-start-1 row-start-3 -me-1 justify-end"
|
|
564
|
+
/>
|
|
565
|
+
</MessagePrimitive.Root>
|
|
566
|
+
);
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
const UserActionBar: FC = () => {
|
|
570
|
+
return (
|
|
571
|
+
<ActionBarPrimitive.Root
|
|
572
|
+
hideWhenRunning
|
|
573
|
+
autohide="not-last"
|
|
574
|
+
className="aui-user-action-bar-root flex flex-col items-end"
|
|
575
|
+
>
|
|
576
|
+
<ActionBarPrimitive.Edit asChild>
|
|
577
|
+
<TooltipIconButton tooltip="Edit" className="aui-user-action-edit">
|
|
578
|
+
<PencilIcon />
|
|
579
|
+
</TooltipIconButton>
|
|
580
|
+
</ActionBarPrimitive.Edit>
|
|
581
|
+
</ActionBarPrimitive.Root>
|
|
582
|
+
);
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
const EditComposer: FC = () => {
|
|
586
|
+
return (
|
|
587
|
+
<MessagePrimitive.Root
|
|
588
|
+
data-slot="aui_edit-composer-wrapper"
|
|
589
|
+
className="flex flex-col px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto]"
|
|
590
|
+
>
|
|
591
|
+
<ComposerPrimitive.Root className="aui-edit-composer-root border-hair ms-auto flex w-full max-w-[85%] cursor-text flex-col rounded-(--composer-radius) border bg-(--composer-bg)">
|
|
592
|
+
<ComposerPrimitive.Input
|
|
593
|
+
className="aui-edit-composer-input text-ink min-h-14 w-full resize-none bg-transparent px-4 pt-3 pb-1 text-base outline-none"
|
|
594
|
+
autoFocus
|
|
595
|
+
/>
|
|
596
|
+
<div className="aui-edit-composer-footer mx-2.5 mb-2.5 flex items-center gap-1.5 self-end">
|
|
597
|
+
<ComposerPrimitive.Cancel asChild>
|
|
598
|
+
<Button
|
|
599
|
+
variant="ghost"
|
|
600
|
+
size="sm"
|
|
601
|
+
className="h-8 px-3.5"
|
|
602
|
+
>
|
|
603
|
+
Cancel
|
|
604
|
+
</Button>
|
|
605
|
+
</ComposerPrimitive.Cancel>
|
|
606
|
+
<ComposerPrimitive.Send asChild>
|
|
607
|
+
<Button size="sm" className="h-8 px-3.5">
|
|
608
|
+
Update
|
|
609
|
+
</Button>
|
|
610
|
+
</ComposerPrimitive.Send>
|
|
611
|
+
</div>
|
|
612
|
+
</ComposerPrimitive.Root>
|
|
613
|
+
</MessagePrimitive.Root>
|
|
614
|
+
);
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
|
|
618
|
+
className,
|
|
619
|
+
...rest
|
|
620
|
+
}) => {
|
|
621
|
+
return (
|
|
622
|
+
<BranchPickerPrimitive.Root
|
|
623
|
+
hideWhenSingleBranch
|
|
624
|
+
className={cn(
|
|
625
|
+
"aui-branch-picker-root text-ink-mute -ms-2 me-2 inline-flex items-center text-xs",
|
|
626
|
+
className,
|
|
627
|
+
)}
|
|
628
|
+
{...rest}
|
|
629
|
+
>
|
|
630
|
+
<BranchPickerPrimitive.Previous asChild>
|
|
631
|
+
<TooltipIconButton tooltip="Previous">
|
|
632
|
+
<ChevronLeftIcon />
|
|
633
|
+
</TooltipIconButton>
|
|
634
|
+
</BranchPickerPrimitive.Previous>
|
|
635
|
+
<span className="aui-branch-picker-state font-medium">
|
|
636
|
+
<BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />
|
|
637
|
+
</span>
|
|
638
|
+
<BranchPickerPrimitive.Next asChild>
|
|
639
|
+
<TooltipIconButton tooltip="Next">
|
|
640
|
+
<ChevronRightIcon />
|
|
641
|
+
</TooltipIconButton>
|
|
642
|
+
</BranchPickerPrimitive.Next>
|
|
643
|
+
</BranchPickerPrimitive.Root>
|
|
644
|
+
);
|
|
645
|
+
};
|