@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,243 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useAuiState } from "@assistant-ui/react";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
CONTEXT_BAR_CELLS,
|
|
7
|
+
computeContextShares,
|
|
8
|
+
} from "./digichat-context-meter-shares";
|
|
9
|
+
import { meterTone } from "./digichat-meter-tone";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Context used, as the segmented digichat cube bar. The bar is the same
|
|
13
|
+
* one that used to sit inside the breakdown card: its lit span is the
|
|
14
|
+
* fraction of the model's window the last turn sent, coloured by
|
|
15
|
+
* system/tools/user. Hovering (or focusing) the bar opens the legend.
|
|
16
|
+
*
|
|
17
|
+
* The provider reports only the prompt total (inputTokens). The system /
|
|
18
|
+
* tools / user split is therefore an estimate: user text is counted from the
|
|
19
|
+
* thread, tool schemas get a flat per-tool allowance, and the remainder is
|
|
20
|
+
* the system prompt. Values carry a `~` so the card never implies precision
|
|
21
|
+
* the backend does not send.
|
|
22
|
+
*
|
|
23
|
+
* The split itself lives in `digichat-context-meter-shares.ts`: the three
|
|
24
|
+
* quantities are a partition of the reported total, so no share can print
|
|
25
|
+
* above 100 and the three always describe the same turn.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export const CONTEXT_WINDOWS: Record<string, number> = {
|
|
29
|
+
"deepseek/deepseek-v4.1-flash-1017": 1_048_576,
|
|
30
|
+
"deepseek/deepseek-v4.1-flash": 1_048_576,
|
|
31
|
+
"openai/gpt-oss-120b": 128_000,
|
|
32
|
+
"openai/gpt-6-luna": 1_050_000,
|
|
33
|
+
"google/gemini-3.5-flash-lite": 1_000_000,
|
|
34
|
+
"z-ai/glm-5.3-flash": 1_048_576,
|
|
35
|
+
"z-ai/glm-5.3": 1_000_000,
|
|
36
|
+
"qwen/qwen3.8-flash": 1_000_000,
|
|
37
|
+
"qwen/qwen3.8-27b": 262_144,
|
|
38
|
+
"google/gemma-4-31b-it": 262_144,
|
|
39
|
+
"google/gemini-3.8-flash": 1_048_576,
|
|
40
|
+
"xiaomi/mimo-v2.6-flash": 1_048_576,
|
|
41
|
+
"xiaomi/mimo-v2.6-pro": 1_048_576,
|
|
42
|
+
"minimax/minimax-m3": 200_000,
|
|
43
|
+
"z-ai/glm-4.7-flash": 200_000,
|
|
44
|
+
// models.dev context_window for gpt-5.6-terra (bare Foundry id and the openai/ slug).
|
|
45
|
+
"gpt-5.6-terra": 1_050_000,
|
|
46
|
+
"openai/gpt-5.6-terra": 1_050_000,
|
|
47
|
+
// The OpenAI models an Azure AI Foundry agent is usually deployed on. A
|
|
48
|
+
// deployment whose id is not listed here gets no bar at all (see the
|
|
49
|
+
// unknown-window rule below).
|
|
50
|
+
"gpt-4o": 128_000,
|
|
51
|
+
"gpt-4o-mini": 128_000,
|
|
52
|
+
"gpt-4.1": 1_047_576,
|
|
53
|
+
"gpt-4.1-mini": 1_047_576,
|
|
54
|
+
"gpt-4.1-nano": 1_047_576,
|
|
55
|
+
"o3": 200_000,
|
|
56
|
+
"o3-mini": 200_000,
|
|
57
|
+
"o4-mini": 200_000,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Tokens for a model id that has its own window. A built-in key such as
|
|
62
|
+
* `constructor` is not one.
|
|
63
|
+
*/
|
|
64
|
+
export function contextWindowFor(modelId: string): number | undefined {
|
|
65
|
+
const id = modelId.trim();
|
|
66
|
+
if (!id || !Object.hasOwn(CONTEXT_WINDOWS, id)) return undefined;
|
|
67
|
+
return CONTEXT_WINDOWS[id];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const format = (n: number): string =>
|
|
71
|
+
n >= 1_000_000
|
|
72
|
+
? `${(n / 1_000_000).toFixed(1)}m`
|
|
73
|
+
: n >= 1000
|
|
74
|
+
? `${(n / 1000).toFixed(1)}k`
|
|
75
|
+
: String(n);
|
|
76
|
+
|
|
77
|
+
const textOf = (message: unknown): string => {
|
|
78
|
+
const parts = (message as { content?: unknown; parts?: unknown })?.parts;
|
|
79
|
+
if (Array.isArray(parts)) {
|
|
80
|
+
return parts
|
|
81
|
+
.filter(
|
|
82
|
+
(part): part is { type: string; text: string } =>
|
|
83
|
+
typeof part === "object" &&
|
|
84
|
+
part !== null &&
|
|
85
|
+
(part as { type?: unknown }).type === "text" &&
|
|
86
|
+
typeof (part as { text?: unknown }).text === "string",
|
|
87
|
+
)
|
|
88
|
+
.map((part) => part.text)
|
|
89
|
+
.join("");
|
|
90
|
+
}
|
|
91
|
+
const content = (message as { content?: unknown })?.content;
|
|
92
|
+
return typeof content === "string" ? content : "";
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export function DigichatContextMeter({
|
|
96
|
+
model,
|
|
97
|
+
toolCount = 0,
|
|
98
|
+
}: {
|
|
99
|
+
model: string;
|
|
100
|
+
/** Connected MCP + catalog tool count, used for the schema estimate. */
|
|
101
|
+
toolCount?: number;
|
|
102
|
+
}) {
|
|
103
|
+
// Select primitives, never a fresh object: useAuiState compares with
|
|
104
|
+
// Object.is, and a new `{input, userChars}` every render loops forever.
|
|
105
|
+
const reportedInput = useAuiState((s) => {
|
|
106
|
+
const messages = s.thread.messages;
|
|
107
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
108
|
+
const custom = (
|
|
109
|
+
messages[index]?.metadata as {
|
|
110
|
+
custom?: { usage?: { inputTokens?: unknown } };
|
|
111
|
+
}
|
|
112
|
+
)?.custom;
|
|
113
|
+
if (typeof custom?.usage?.inputTokens === "number") {
|
|
114
|
+
return custom.usage.inputTokens;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
});
|
|
119
|
+
// The model the backend says it served the turn with. A tenant whose
|
|
120
|
+
// session model is empty (a Foundry agent) is named here instead.
|
|
121
|
+
const reportedModel = useAuiState((s) => {
|
|
122
|
+
const messages = s.thread.messages;
|
|
123
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
124
|
+
const custom = (
|
|
125
|
+
messages[index]?.metadata as {
|
|
126
|
+
custom?: { usage?: { inputTokens?: unknown }; model?: unknown };
|
|
127
|
+
}
|
|
128
|
+
)?.custom;
|
|
129
|
+
if (
|
|
130
|
+
typeof custom?.usage?.inputTokens === "number" &&
|
|
131
|
+
typeof custom.model === "string"
|
|
132
|
+
) {
|
|
133
|
+
return custom.model;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
});
|
|
138
|
+
const userChars = useAuiState((s) => {
|
|
139
|
+
let total = 0;
|
|
140
|
+
for (const message of s.thread.messages) {
|
|
141
|
+
if ((message as { role?: string }).role === "user") {
|
|
142
|
+
total += textOf(message).length;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return total;
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// A report with its own window is the model that served the turn.
|
|
149
|
+
// A report with no window leaves the session model, so OCC keeps the
|
|
150
|
+
// bar. The house session is empty until digigraph reports an id.
|
|
151
|
+
const reported = reportedModel?.trim() || "";
|
|
152
|
+
const session = model.trim();
|
|
153
|
+
const activeModel =
|
|
154
|
+
reported && contextWindowFor(reported) !== undefined ? reported : session;
|
|
155
|
+
const window = contextWindowFor(activeModel);
|
|
156
|
+
// No bar without a known window: the fill is a fraction of it.
|
|
157
|
+
if (window === undefined) return null;
|
|
158
|
+
|
|
159
|
+
// No fabricated fill: until a turn reports usage the grid stays empty.
|
|
160
|
+
const input = reportedInput ?? 0;
|
|
161
|
+
const label = `${format(input)} / ${format(window)} tokens`;
|
|
162
|
+
// The same amber/orange/red scale the usage meter uses: a full context is
|
|
163
|
+
// as much a limit as a spent turn budget. The tone tints the bar only; the
|
|
164
|
+
// legend keeps the system/tools/user colours that explain the split.
|
|
165
|
+
const tone = meterTone(window > 0 ? input / window : 0);
|
|
166
|
+
|
|
167
|
+
// The three shares are a partition of the reported total, so no share
|
|
168
|
+
// can print above 100 and the printed numbers describe the same turn.
|
|
169
|
+
const {
|
|
170
|
+
systemTokens,
|
|
171
|
+
toolTokens,
|
|
172
|
+
userTokens,
|
|
173
|
+
systemPct: sysPct,
|
|
174
|
+
toolPct: toolPct,
|
|
175
|
+
userPct: userPct,
|
|
176
|
+
systemCells: sysCells,
|
|
177
|
+
toolCells: toolCells,
|
|
178
|
+
userCells: userCells,
|
|
179
|
+
} = computeContextShares({ input, userChars, toolCount, window });
|
|
180
|
+
|
|
181
|
+
return (
|
|
182
|
+
<span className={`aui-context-meter-wrap ${tone}`.trim()}>
|
|
183
|
+
<span
|
|
184
|
+
className="aui-context-meter"
|
|
185
|
+
role="img"
|
|
186
|
+
tabIndex={0}
|
|
187
|
+
aria-label={`Context ${label}`}
|
|
188
|
+
>
|
|
189
|
+
{Array.from({ length: CONTEXT_BAR_CELLS }, (_, index) => {
|
|
190
|
+
const tone =
|
|
191
|
+
index < sysCells
|
|
192
|
+
? "is-system"
|
|
193
|
+
: index < sysCells + toolCells
|
|
194
|
+
? "is-tools"
|
|
195
|
+
: index < sysCells + toolCells + userCells
|
|
196
|
+
? "is-user"
|
|
197
|
+
: "";
|
|
198
|
+
return (
|
|
199
|
+
<span
|
|
200
|
+
key={index}
|
|
201
|
+
className={tone ? `aui-context-bar-cell ${tone}` : "aui-context-bar-cell"}
|
|
202
|
+
/>
|
|
203
|
+
);
|
|
204
|
+
})}
|
|
205
|
+
</span>
|
|
206
|
+
<span className="aui-context-card" role="tooltip">
|
|
207
|
+
<span className="aui-context-card-row aui-context-card-total">
|
|
208
|
+
<span>Context</span>
|
|
209
|
+
<span>
|
|
210
|
+
{format(input)} / {format(window)}
|
|
211
|
+
</span>
|
|
212
|
+
</span>
|
|
213
|
+
<span className="aui-context-card-row">
|
|
214
|
+
<span className="aui-context-legend">
|
|
215
|
+
<span className="aui-context-swatch is-system" aria-hidden />
|
|
216
|
+
System
|
|
217
|
+
</span>
|
|
218
|
+
<span>
|
|
219
|
+
~{format(systemTokens)} · {sysPct}%
|
|
220
|
+
</span>
|
|
221
|
+
</span>
|
|
222
|
+
<span className="aui-context-card-row">
|
|
223
|
+
<span className="aui-context-legend">
|
|
224
|
+
<span className="aui-context-swatch is-tools" aria-hidden />
|
|
225
|
+
Tools
|
|
226
|
+
</span>
|
|
227
|
+
<span>
|
|
228
|
+
~{format(toolTokens)} · {toolPct}%
|
|
229
|
+
</span>
|
|
230
|
+
</span>
|
|
231
|
+
<span className="aui-context-card-row">
|
|
232
|
+
<span className="aui-context-legend">
|
|
233
|
+
<span className="aui-context-swatch is-user" aria-hidden />
|
|
234
|
+
User
|
|
235
|
+
</span>
|
|
236
|
+
<span>
|
|
237
|
+
~{format(userTokens)} · {userPct}%
|
|
238
|
+
</span>
|
|
239
|
+
</span>
|
|
240
|
+
</span>
|
|
241
|
+
</span>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fill thresholds shared by the usage meter and the context meter.
|
|
3
|
+
*
|
|
4
|
+
* One scale for both bars: amber once more than half is spent, orange past
|
|
5
|
+
* four fifths, red past nine tenths. The colours themselves live in
|
|
6
|
+
* `chat-digichat.css` (`--warn` / `--danger`, mixed for the middle band), so
|
|
7
|
+
* a theme restyle never has to touch this module.
|
|
8
|
+
*/
|
|
9
|
+
export const METER_WARN_AT = 0.6;
|
|
10
|
+
export const METER_HOT_AT = 0.8;
|
|
11
|
+
export const METER_CRITICAL_AT = 0.9;
|
|
12
|
+
|
|
13
|
+
export type MeterTone = "" | "is-warn" | "is-hot" | "is-critical";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The tone class for a fill ratio. Zero and anything non-finite stay
|
|
17
|
+
* untoned: an empty bar is not "nearly full", and a bar with no denominator
|
|
18
|
+
* must not borrow a warning colour.
|
|
19
|
+
*/
|
|
20
|
+
export function meterTone(ratio: number): MeterTone {
|
|
21
|
+
if (!Number.isFinite(ratio) || ratio <= 0) return "";
|
|
22
|
+
if (ratio >= METER_CRITICAL_AT) return "is-critical";
|
|
23
|
+
if (ratio >= METER_HOT_AT) return "is-hot";
|
|
24
|
+
if (ratio >= METER_WARN_AT) return "is-warn";
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { CONTEXT_BAR_CELLS } from "./digichat-context-meter-shares";
|
|
4
|
+
import { meterTone } from "./digichat-meter-tone";
|
|
5
|
+
|
|
6
|
+
export type UsageMeterValue = {
|
|
7
|
+
/** Turns the visitor has spent. */
|
|
8
|
+
used: number;
|
|
9
|
+
/** Turns the gate currently allows: the free budget, or the unlocked one. */
|
|
10
|
+
limit: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The trial gate's turn budget as the segmented digichat cube bar.
|
|
15
|
+
*
|
|
16
|
+
* The bar sits in the composer toolbar where the context meter would be. It
|
|
17
|
+
* is a gate number, not a token estimate: a tenant whose backend reports no
|
|
18
|
+
* usage (a Foundry agent) still has a budget to show, and one that does
|
|
19
|
+
* report usage still has turns that matter more than tokens.
|
|
20
|
+
*
|
|
21
|
+
* Shape: a small budget (the three free turns) gets one cell per turn, so
|
|
22
|
+
* each turn is visible as a cell. A large one (the unlocked hundred) fills
|
|
23
|
+
* the same 25-cell grid the context bar uses, proportionally. Both occupy the
|
|
24
|
+
* same toolbar slot, so unlocking does not move the row.
|
|
25
|
+
*
|
|
26
|
+
* The fill is deliberately the used fraction: the bar starts empty and grows
|
|
27
|
+
* as turns are spent, the way the context bar grows. Unlocking resets the
|
|
28
|
+
* fraction because the denominator changes, which is the point of the
|
|
29
|
+
* unlock, not a regression.
|
|
30
|
+
*/
|
|
31
|
+
export function usageBarShape(
|
|
32
|
+
used: number,
|
|
33
|
+
limit: number,
|
|
34
|
+
): { cells: number; lit: number } {
|
|
35
|
+
// A non-finite count has no place on the bar; treat it as unspent rather
|
|
36
|
+
// than letting NaN reach the aria-label or the cell count.
|
|
37
|
+
const finite = (value: number): number =>
|
|
38
|
+
Number.isFinite(value) ? value : 0;
|
|
39
|
+
const safeLimit = Math.max(0, Math.floor(finite(limit)));
|
|
40
|
+
const safeUsed = Math.max(0, Math.min(safeLimit, Math.floor(finite(used))));
|
|
41
|
+
if (safeLimit === 0) return { cells: 0, lit: 0 };
|
|
42
|
+
if (safeLimit <= CONTEXT_BAR_CELLS) {
|
|
43
|
+
return { cells: safeLimit, lit: safeUsed };
|
|
44
|
+
}
|
|
45
|
+
// Never zero-lit while a turn has been spent: a proportional fill that
|
|
46
|
+
// rounds to nothing would read as "no turns used". Never full until the
|
|
47
|
+
// budget is: at 99/100 one cell stays dark, so a full bar always means
|
|
48
|
+
// "no turns left".
|
|
49
|
+
if (safeUsed === 0) return { cells: CONTEXT_BAR_CELLS, lit: 0 };
|
|
50
|
+
if (safeUsed >= safeLimit) {
|
|
51
|
+
return { cells: CONTEXT_BAR_CELLS, lit: CONTEXT_BAR_CELLS };
|
|
52
|
+
}
|
|
53
|
+
const proportional = Math.round((safeUsed / safeLimit) * CONTEXT_BAR_CELLS);
|
|
54
|
+
return {
|
|
55
|
+
cells: CONTEXT_BAR_CELLS,
|
|
56
|
+
lit: Math.max(1, Math.min(CONTEXT_BAR_CELLS - 1, proportional)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function DigichatUsageMeter({ usage }: { usage: UsageMeterValue }) {
|
|
61
|
+
const { cells, lit } = usageBarShape(usage.used, usage.limit);
|
|
62
|
+
if (cells === 0) return null;
|
|
63
|
+
|
|
64
|
+
const finite = (value: number): number =>
|
|
65
|
+
Number.isFinite(value) ? value : 0;
|
|
66
|
+
const limit = Math.max(0, Math.floor(finite(usage.limit)));
|
|
67
|
+
const used = Math.max(0, Math.min(limit, Math.floor(finite(usage.used))));
|
|
68
|
+
const left = Math.max(0, limit - used);
|
|
69
|
+
const tone = meterTone(limit > 0 ? used / limit : 0);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<span className={`aui-context-meter-wrap aui-usage-meter-wrap ${tone}`.trim()}>
|
|
73
|
+
<span
|
|
74
|
+
className={`aui-context-meter aui-usage-meter ${tone}`.trim()}
|
|
75
|
+
role="img"
|
|
76
|
+
tabIndex={0}
|
|
77
|
+
aria-label={`Turns: ${left} of ${limit} left`}
|
|
78
|
+
data-testid="embed-usage-meter"
|
|
79
|
+
>
|
|
80
|
+
{Array.from({ length: cells }, (_, index) => (
|
|
81
|
+
<span
|
|
82
|
+
key={index}
|
|
83
|
+
className={
|
|
84
|
+
index < lit ? "aui-context-bar-cell is-usage" : "aui-context-bar-cell"
|
|
85
|
+
}
|
|
86
|
+
/>
|
|
87
|
+
))}
|
|
88
|
+
</span>
|
|
89
|
+
<span className="aui-context-card" role="tooltip">
|
|
90
|
+
<span className="aui-context-card-row aui-context-card-total">
|
|
91
|
+
<span>Turns left</span>
|
|
92
|
+
<span>{left}</span>
|
|
93
|
+
</span>
|
|
94
|
+
<span className="aui-context-card-row">
|
|
95
|
+
<span>Used</span>
|
|
96
|
+
<span>
|
|
97
|
+
{used} / {limit}
|
|
98
|
+
</span>
|
|
99
|
+
</span>
|
|
100
|
+
</span>
|
|
101
|
+
</span>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import "../../../styles/chat-core.css";
|
|
4
|
+
import "../../../styles/chat-widgets.css";
|
|
5
|
+
import "../../../styles/chat-aui.css";
|
|
6
|
+
import "../../../styles/chat-digichat.css";
|
|
7
|
+
import "../../../styles/digichat-boot-loader.css";
|
|
8
|
+
|
|
9
|
+
import { useCallback, type FormEvent } from "react";
|
|
10
|
+
import {
|
|
11
|
+
DigichatThread,
|
|
12
|
+
type ComposerLayout,
|
|
13
|
+
} from "../DigichatThread";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
useComposerCopy,
|
|
17
|
+
useSkinChrome,
|
|
18
|
+
} from "../stock/skin-chrome";
|
|
19
|
+
import {
|
|
20
|
+
useDeployUi,
|
|
21
|
+
useDisclosureUi,
|
|
22
|
+
} from "../stock/deploy-ui-context";
|
|
23
|
+
import { workVisibilityForView } from "../stock/skin-types";
|
|
24
|
+
import { useStockComposerGateSubmit } from "../stock/stock-send-gate";
|
|
25
|
+
import { useEmbedChatPrefsOptional } from "../stock/embed-chat-prefs";
|
|
26
|
+
import {
|
|
27
|
+
useSkinSlashPalette,
|
|
28
|
+
type DigichatSkinSlash,
|
|
29
|
+
} from "../stock/skin-slash-palette";
|
|
30
|
+
import { DigichatComposerToolbar } from "./digichat-composer-toolbar";
|
|
31
|
+
|
|
32
|
+
// The slash wiring types moved to the skin-agnostic palette module; the
|
|
33
|
+
// re-export keeps `@digithings-ai/ui/chat/skins` imports unchanged.
|
|
34
|
+
export type {
|
|
35
|
+
DigichatSkinSlash,
|
|
36
|
+
SkinPaletteApply,
|
|
37
|
+
SkinPaletteFrame,
|
|
38
|
+
SkinPaletteKind,
|
|
39
|
+
SkinSlashAction,
|
|
40
|
+
SkinSlashAdapterLike,
|
|
41
|
+
SkinSlashCommand,
|
|
42
|
+
SkinSlashExtraDef,
|
|
43
|
+
} from "../stock/skin-slash-palette";
|
|
44
|
+
|
|
45
|
+
export type DigichatSkinCopy = {
|
|
46
|
+
welcome?: string;
|
|
47
|
+
placeholder?: string;
|
|
48
|
+
suggestions?: readonly string[];
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export type DigichatSkinOptions = {
|
|
52
|
+
/**
|
|
53
|
+
* Explicit override — a deployment can still force compact regardless of
|
|
54
|
+
* chrome mode. Omitted means the expanded composer everywhere.
|
|
55
|
+
*/
|
|
56
|
+
composerLayout?: ComposerLayout;
|
|
57
|
+
/** Welcome/placeholder/suggestion copy (host: BASELINE_EMBED_* constants). */
|
|
58
|
+
copy?: DigichatSkinCopy;
|
|
59
|
+
/**
|
|
60
|
+
* Page-context attachment name (host: PAGE_CONTEXT_ATTACHMENT_NAME).
|
|
61
|
+
* Protocol default mirrors the app literal ("page-context.html").
|
|
62
|
+
*/
|
|
63
|
+
hiddenAttachmentName?: string;
|
|
64
|
+
/** Product slash wiring; absent = slash/mention adapters stay disabled. */
|
|
65
|
+
slash?: DigichatSkinSlash;
|
|
66
|
+
/**
|
|
67
|
+
* Private session, set per session by the host. Hides reasoning text and
|
|
68
|
+
* tool-call output and shows the mode badge. Display-only: the model still
|
|
69
|
+
* produces the work, and the stores still hold the real text.
|
|
70
|
+
*/
|
|
71
|
+
privateMode?: boolean;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* First-party digichat Thread. Explicit ThreadSkinView branch — never fall
|
|
76
|
+
* through to product-page-assistant. Always left-aligned regardless of YAML.
|
|
77
|
+
*/
|
|
78
|
+
/** Module-scope so it is a stable component reference, not recreated per render. */
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
export function DigichatSkin({
|
|
82
|
+
composerLayout,
|
|
83
|
+
copy,
|
|
84
|
+
// Protocol default mirrors the app's PAGE_CONTEXT_ATTACHMENT_NAME
|
|
85
|
+
// ("page-context.html"); hosts pass it explicitly.
|
|
86
|
+
hiddenAttachmentName = "page-context.html",
|
|
87
|
+
slash: slashWiring,
|
|
88
|
+
privateMode,
|
|
89
|
+
}: DigichatSkinOptions) {
|
|
90
|
+
const { welcome, welcomeBody, placeholder, suggestions } = useComposerCopy(
|
|
91
|
+
copy?.welcome ?? "",
|
|
92
|
+
copy?.placeholder ?? "",
|
|
93
|
+
);
|
|
94
|
+
const skinChrome = useSkinChrome();
|
|
95
|
+
const { pageContext } = skinChrome;
|
|
96
|
+
const reasoningUi = useDisclosureUi("reasoning");
|
|
97
|
+
const toolCallsUi = useDisclosureUi("toolCalls");
|
|
98
|
+
// The raw view level is what decides how much of the work is shown.
|
|
99
|
+
const deployUi = useDeployUi();
|
|
100
|
+
const workVisibility = workVisibilityForView(deployUi.view);
|
|
101
|
+
const gateSubmit = useStockComposerGateSubmit();
|
|
102
|
+
const prefs = useEmbedChatPrefsOptional();
|
|
103
|
+
// The `/` palette logic is shared with every other skin (SkinPaletteBridge).
|
|
104
|
+
const palette = useSkinSlashPalette({ slash: slashWiring, privateMode });
|
|
105
|
+
const paletteSubmit = palette.handleSubmit;
|
|
106
|
+
|
|
107
|
+
const onComposerSubmit = useCallback(
|
|
108
|
+
(event: FormEvent<HTMLFormElement>) => {
|
|
109
|
+
if (paletteSubmit(event)) return;
|
|
110
|
+
gateSubmit?.(event);
|
|
111
|
+
},
|
|
112
|
+
[paletteSubmit, gateSubmit],
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<DigichatThread
|
|
117
|
+
welcome={welcome}
|
|
118
|
+
welcomeBody={welcomeBody}
|
|
119
|
+
suggestions={
|
|
120
|
+
suggestions.length > 0 ? suggestions : (copy?.suggestions ?? [])
|
|
121
|
+
}
|
|
122
|
+
placeholder={placeholder}
|
|
123
|
+
onComposerSubmit={onComposerSubmit}
|
|
124
|
+
composerLayout={composerLayout ?? "expanded"}
|
|
125
|
+
slash={palette.slash}
|
|
126
|
+
mention={palette.mention}
|
|
127
|
+
hiddenAttachmentNames={
|
|
128
|
+
pageContext === "silent" ? [hiddenAttachmentName] : undefined
|
|
129
|
+
}
|
|
130
|
+
reasoningMode={reasoningUi.mode}
|
|
131
|
+
toolCallsMode={toolCallsUi.mode}
|
|
132
|
+
workVisibility={workVisibility}
|
|
133
|
+
privateMode={privateMode}
|
|
134
|
+
composerToolbar={
|
|
135
|
+
prefs && prefs.prefs.toolbar !== false ? (
|
|
136
|
+
<DigichatComposerToolbar prefs={prefs} />
|
|
137
|
+
) : undefined
|
|
138
|
+
}
|
|
139
|
+
scrollbars={prefs?.prefs.scrollbars ?? "always"}
|
|
140
|
+
scrollMode={prefs?.prefs.scroll}
|
|
141
|
+
density={prefs?.prefs.density ?? "default"}
|
|
142
|
+
/>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Thread } from "../stock/thread.aui";
|
|
4
|
+
import { useComposerCopy } from "../stock";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Web facsimile of the official Expo React Native Assistant.
|
|
8
|
+
* The native starter is vendored at
|
|
9
|
+
* `reference/assistant-ui-templates/expo-react-native` and is not imported
|
|
10
|
+
* by Next.js (`react-native` / Expo stay out of the web bundle).
|
|
11
|
+
*/
|
|
12
|
+
export function ExpoReactNative() {
|
|
13
|
+
const { title } = useComposerCopy("How can I help you today?", "Send a message...");
|
|
14
|
+
return (
|
|
15
|
+
<div className="flex h-full items-center justify-center bg-zinc-200 p-4">
|
|
16
|
+
<div className="flex h-[min(740px,100%)] w-[min(390px,100%)] flex-col overflow-hidden rounded-[2rem] border border-zinc-300 bg-white shadow-2xl">
|
|
17
|
+
<header className="flex shrink-0 items-center justify-between border-b border-zinc-200 px-4 py-3">
|
|
18
|
+
<div className="text-sm font-semibold tracking-tight">
|
|
19
|
+
{title || "assistant-ui"}
|
|
20
|
+
</div>
|
|
21
|
+
<div className="text-xs text-zinc-500">Expo</div>
|
|
22
|
+
</header>
|
|
23
|
+
<div className="min-h-0 flex-1 bg-white">
|
|
24
|
+
<Thread />
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|