@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,164 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ActivityIcon,
|
|
5
|
+
AlertTriangleIcon,
|
|
6
|
+
CheckCircle2Icon,
|
|
7
|
+
DatabaseZapIcon,
|
|
8
|
+
GaugeIcon,
|
|
9
|
+
ServerCogIcon,
|
|
10
|
+
} from "lucide-react";
|
|
11
|
+
import type { CSSProperties } from "react";
|
|
12
|
+
import { useSkinChrome } from "../../stock";
|
|
13
|
+
|
|
14
|
+
export function ProductDashboard() {
|
|
15
|
+
const chrome = useSkinChrome();
|
|
16
|
+
const productName = chrome.title?.trim() || "Northstar Sync";
|
|
17
|
+
const themeStyle = {
|
|
18
|
+
"--support-accent": chrome.accent?.color ?? "#2563eb",
|
|
19
|
+
"--support-border": "#d8dee8",
|
|
20
|
+
"--support-muted": "#64748b",
|
|
21
|
+
"--support-success": "#15803d",
|
|
22
|
+
"--support-warning": "#b45309",
|
|
23
|
+
} as CSSProperties;
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<main className="h-full overflow-auto bg-slate-100 text-slate-950" style={themeStyle}>
|
|
27
|
+
<header className="border-b border-slate-200 bg-white">
|
|
28
|
+
<div className="mx-auto flex max-w-7xl items-center justify-between gap-4 px-4 py-3 sm:px-6">
|
|
29
|
+
<div className="flex items-center gap-3">
|
|
30
|
+
<div className="grid size-9 place-items-center rounded-md bg-[var(--support-accent)] text-white">
|
|
31
|
+
<DatabaseZapIcon className="size-5" />
|
|
32
|
+
</div>
|
|
33
|
+
<div>
|
|
34
|
+
<div className="font-semibold leading-tight">{productName}</div>
|
|
35
|
+
<div className="text-xs text-slate-500">{"Northstar Cloud"}</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div className="hidden items-center gap-2 rounded-md border border-[var(--support-border)] bg-white px-3 py-1.5 text-xs text-[var(--support-warning)] sm:flex">
|
|
39
|
+
<AlertTriangleIcon className="size-4" />
|
|
40
|
+
{"Workflow attention needed in us-west"}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</header>
|
|
44
|
+
|
|
45
|
+
<div className="mx-auto grid max-w-7xl gap-5 px-4 py-5 sm:px-6 lg:grid-cols-[240px_1fr]">
|
|
46
|
+
<aside className="hidden rounded-lg border border-slate-200 bg-white p-4 lg:block">
|
|
47
|
+
<div className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
|
48
|
+
{"Workspace"}
|
|
49
|
+
</div>
|
|
50
|
+
<div className="mt-2 font-semibold">{"Acme Operations"}</div>
|
|
51
|
+
<div className="mt-1 text-sm text-slate-500">{"Scale plan, us-west"}</div>
|
|
52
|
+
<nav className="mt-6 grid gap-1 text-sm">
|
|
53
|
+
<div className="rounded-md px-3 py-2 text-slate-600 first:bg-slate-100 first:text-slate-950">{"Overview"}</div>
|
|
54
|
+
<div className="rounded-md px-3 py-2 text-slate-600 first:bg-slate-100 first:text-slate-950">{"Connectors"}</div>
|
|
55
|
+
<div className="rounded-md px-3 py-2 text-slate-600 first:bg-slate-100 first:text-slate-950">{"Records"}</div>
|
|
56
|
+
<div className="rounded-md px-3 py-2 text-slate-600 first:bg-slate-100 first:text-slate-950">{"Assistant"}</div>
|
|
57
|
+
</nav>
|
|
58
|
+
</aside>
|
|
59
|
+
<section className="grid gap-5">
|
|
60
|
+
<div className="rounded-lg border border-slate-200 bg-white p-5">
|
|
61
|
+
<div className="flex flex-col justify-between gap-3 sm:flex-row sm:items-center">
|
|
62
|
+
<div>
|
|
63
|
+
<h1 className="text-xl font-semibold">{"Workspace overview"}</h1>
|
|
64
|
+
<p className="mt-1 text-sm text-[var(--support-muted)]">{"Live connector health with an embedded integration support assistant."}</p>
|
|
65
|
+
</div>
|
|
66
|
+
<div className="inline-flex w-fit items-center gap-2 rounded-md bg-emerald-50 px-3 py-2 text-sm text-[var(--support-success)]">
|
|
67
|
+
<CheckCircle2Icon className="size-4" />
|
|
68
|
+
{"Sync degraded"}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
<div className="mt-5 grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
|
|
72
|
+
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
|
|
73
|
+
<div className="text-sm text-slate-500">{"Sync success"}</div>
|
|
74
|
+
<div className="mt-2 text-2xl font-semibold">{"98.4%"}</div>
|
|
75
|
+
<div className="mt-1 text-xs text-slate-500">{"-1.8%"}</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
|
|
78
|
+
<div className="text-sm text-slate-500">{"Retry queue"}</div>
|
|
79
|
+
<div className="mt-2 text-2xl font-semibold">{"12"}</div>
|
|
80
|
+
<div className="mt-1 text-xs text-slate-500">{"+3"}</div>
|
|
81
|
+
</div>
|
|
82
|
+
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
|
|
83
|
+
<div className="text-sm text-slate-500">{"Avg response"}</div>
|
|
84
|
+
<div className="mt-2 text-2xl font-semibold">{"1h 42m"}</div>
|
|
85
|
+
<div className="mt-1 text-xs text-slate-500">{"-18m"}</div>
|
|
86
|
+
</div>
|
|
87
|
+
<div className="rounded-lg border border-slate-200 bg-slate-50 p-4">
|
|
88
|
+
<div className="text-sm text-slate-500">{"Services healthy"}</div>
|
|
89
|
+
<div className="mt-2 text-2xl font-semibold">{"4 / 5"}</div>
|
|
90
|
+
<div className="mt-1 text-xs text-slate-500">{"Sync degraded"}</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
<div className="grid gap-5 xl:grid-cols-[1.2fr_0.8fr]">
|
|
95
|
+
<div className="rounded-lg border border-slate-200 bg-white p-5">
|
|
96
|
+
<div className="flex items-center gap-2">
|
|
97
|
+
<ServerCogIcon className="size-5 text-[var(--support-accent)]" />
|
|
98
|
+
<h2 className="font-semibold">{"Connector areas"}</h2>
|
|
99
|
+
</div>
|
|
100
|
+
<div className="mt-4 grid gap-3">
|
|
101
|
+
<div className="flex items-center justify-between gap-3 rounded-md border border-slate-200 p-3">
|
|
102
|
+
<div>
|
|
103
|
+
<div className="font-medium">{"Sync Engine"}</div>
|
|
104
|
+
<div className="text-sm text-slate-500">{"Retry latency high"}</div>
|
|
105
|
+
</div>
|
|
106
|
+
<span className="rounded-md bg-slate-100 px-2 py-1 text-xs font-medium text-slate-700">
|
|
107
|
+
{"Degraded"}
|
|
108
|
+
</span>
|
|
109
|
+
</div>
|
|
110
|
+
<div className="flex items-center justify-between gap-3 rounded-md border border-slate-200 p-3">
|
|
111
|
+
<div>
|
|
112
|
+
<div className="font-medium">{"API"}</div>
|
|
113
|
+
<div className="text-sm text-slate-500">{"Normal latency"}</div>
|
|
114
|
+
</div>
|
|
115
|
+
<span className="rounded-md bg-slate-100 px-2 py-1 text-xs font-medium text-slate-700">
|
|
116
|
+
{"Operational"}
|
|
117
|
+
</span>
|
|
118
|
+
</div>
|
|
119
|
+
<div className="flex items-center justify-between gap-3 rounded-md border border-slate-200 p-3">
|
|
120
|
+
<div>
|
|
121
|
+
<div className="font-medium">{"Dashboard"}</div>
|
|
122
|
+
<div className="text-sm text-slate-500">{"No errors"}</div>
|
|
123
|
+
</div>
|
|
124
|
+
<span className="rounded-md bg-slate-100 px-2 py-1 text-xs font-medium text-slate-700">
|
|
125
|
+
{"Operational"}
|
|
126
|
+
</span>
|
|
127
|
+
</div>
|
|
128
|
+
<div className="flex items-center justify-between gap-3 rounded-md border border-slate-200 p-3">
|
|
129
|
+
<div>
|
|
130
|
+
<div className="font-medium">{"Billing"}</div>
|
|
131
|
+
<div className="text-sm text-slate-500">{"No holds"}</div>
|
|
132
|
+
</div>
|
|
133
|
+
<span className="rounded-md bg-slate-100 px-2 py-1 text-xs font-medium text-slate-700">
|
|
134
|
+
{"Operational"}
|
|
135
|
+
</span>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
<div className="rounded-lg border border-slate-200 bg-white p-5">
|
|
140
|
+
<div className="flex items-center gap-2">
|
|
141
|
+
<ActivityIcon className="size-5 text-[var(--support-accent)]" />
|
|
142
|
+
<h2 className="font-semibold">{"Recent activity"}</h2>
|
|
143
|
+
</div>
|
|
144
|
+
<div className="mt-4 grid gap-3">
|
|
145
|
+
<div className="flex gap-3 text-sm">
|
|
146
|
+
<GaugeIcon className="mt-0.5 size-4 shrink-0 text-slate-400" />
|
|
147
|
+
<span className="text-slate-700">{"Retry queue increased for Salesforce connector"}</span>
|
|
148
|
+
</div>
|
|
149
|
+
<div className="flex gap-3 text-sm">
|
|
150
|
+
<GaugeIcon className="mt-0.5 size-4 shrink-0 text-slate-400" />
|
|
151
|
+
<span className="text-slate-700">{"Incident INC-2479 opened for us-west sync workers"}</span>
|
|
152
|
+
</div>
|
|
153
|
+
<div className="flex gap-3 text-sm">
|
|
154
|
+
<GaugeIcon className="mt-0.5 size-4 shrink-0 text-slate-400" />
|
|
155
|
+
<span className="text-slate-700">{"Acme Operations uploaded sync-error.log"}</span>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</section>
|
|
161
|
+
</div>
|
|
162
|
+
</main>
|
|
163
|
+
);
|
|
164
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../lib/utils";
|
|
4
|
+
import {
|
|
5
|
+
AuiIf,
|
|
6
|
+
ComposerPrimitive,
|
|
7
|
+
ErrorPrimitive,
|
|
8
|
+
MessagePrimitive,
|
|
9
|
+
ThreadPrimitive,
|
|
10
|
+
} from "@assistant-ui/react";
|
|
11
|
+
import { MarkdownText } from "../stock/markdown-text";
|
|
12
|
+
import { SkinCredit, useComposerCopy } from "../stock";
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Web facsimile of the official React Ink Terminal Assistant.
|
|
17
|
+
* The TTY original (`ink` / `@assistant-ui/react-ink`) lives in
|
|
18
|
+
* `reference/assistant-ui-templates/react-ink` and `apps/digichat/cli`.
|
|
19
|
+
* Next.js must not import those packages.
|
|
20
|
+
*/
|
|
21
|
+
export function ReactInkWeb() {
|
|
22
|
+
const { title, welcome, placeholder } = useComposerCopy(
|
|
23
|
+
'Working in this project. fetchUser() is flaky in prod and has no retry logic.',
|
|
24
|
+
"Type a message... (Enter to send)",
|
|
25
|
+
);
|
|
26
|
+
return (
|
|
27
|
+
<ThreadPrimitive.Root className="flex h-full flex-col bg-zinc-950 p-4 font-mono text-[13px] leading-5 text-zinc-100">
|
|
28
|
+
<div className="mb-2 shrink-0">
|
|
29
|
+
<span className="font-bold text-cyan-400">{title || "demo-agent"}</span>
|
|
30
|
+
<span className="text-zinc-500">{" ~/acme-app"}</span>
|
|
31
|
+
</div>
|
|
32
|
+
<div className="mb-3 shrink-0 text-zinc-500">model: demo · terminal</div>
|
|
33
|
+
|
|
34
|
+
<AuiIf condition={(s) => s.thread.isEmpty}>
|
|
35
|
+
<div className="mb-3 text-zinc-200">
|
|
36
|
+
{welcome}
|
|
37
|
+
</div>
|
|
38
|
+
</AuiIf>
|
|
39
|
+
|
|
40
|
+
<ThreadPrimitive.Viewport className="min-h-0 flex-1 overflow-y-auto">
|
|
41
|
+
<ThreadPrimitive.Messages>
|
|
42
|
+
{({ message }) =>
|
|
43
|
+
message.role === "user" ? <InkUserMessage /> : <InkAssistantMessage />
|
|
44
|
+
}
|
|
45
|
+
</ThreadPrimitive.Messages>
|
|
46
|
+
</ThreadPrimitive.Viewport>
|
|
47
|
+
|
|
48
|
+
<div className="mt-3 shrink-0 rounded border border-zinc-600 px-2 py-1">
|
|
49
|
+
<div className="flex items-start gap-1">
|
|
50
|
+
<span className="text-zinc-500">{"> "}</span>
|
|
51
|
+
<ComposerPrimitive.Root className="flex min-w-0 flex-1 items-start gap-1">
|
|
52
|
+
<ComposerPrimitive.Input
|
|
53
|
+
placeholder={placeholder}
|
|
54
|
+
className={cn(
|
|
55
|
+
"w-full bg-transparent text-zinc-100 outline-none placeholder:text-zinc-600",
|
|
56
|
+
)}
|
|
57
|
+
/>
|
|
58
|
+
<ComposerPrimitive.Send className="sr-only">
|
|
59
|
+
send
|
|
60
|
+
</ComposerPrimitive.Send>
|
|
61
|
+
</ComposerPrimitive.Root>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<SkinCredit className="mt-1 font-mono text-zinc-500 opacity-100" />
|
|
66
|
+
</ThreadPrimitive.Root>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function InkUserMessage() {
|
|
71
|
+
return (
|
|
72
|
+
<MessagePrimitive.Root className="mb-3">
|
|
73
|
+
<span className="font-bold text-green-400">You: </span>
|
|
74
|
+
<MessagePrimitive.Parts>
|
|
75
|
+
{({ part }) =>
|
|
76
|
+
part.type === "text" ? (
|
|
77
|
+
<span className="whitespace-pre-wrap">{part.text}</span>
|
|
78
|
+
) : null
|
|
79
|
+
}
|
|
80
|
+
</MessagePrimitive.Parts>
|
|
81
|
+
</MessagePrimitive.Root>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function InkAssistantMessage() {
|
|
86
|
+
return (
|
|
87
|
+
<MessagePrimitive.Root className="mb-3">
|
|
88
|
+
<div className="font-bold text-blue-400">AI:</div>
|
|
89
|
+
<MessagePrimitive.Parts>
|
|
90
|
+
{({ part }) => (part.type === "text" ? <MarkdownText /> : null)}
|
|
91
|
+
</MessagePrimitive.Parts>
|
|
92
|
+
<ErrorPrimitive.Root className="mt-1 text-red-400">
|
|
93
|
+
<ErrorPrimitive.Message />
|
|
94
|
+
</ErrorPrimitive.Root>
|
|
95
|
+
</MessagePrimitive.Root>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a host must provide so a stock skin renders correctly (WS3).
|
|
3
|
+
*
|
|
4
|
+
* "What a skin needs to render correctly" used to be implicit — /baseline
|
|
5
|
+
* learned each item the hard way, one bug at a time. This descriptor names
|
|
6
|
+
* them so a new host mounts `<Skin />` and cannot get it subtly wrong.
|
|
7
|
+
* WS4 carries this contract into the package alongside the skins.
|
|
8
|
+
*
|
|
9
|
+
* Each item cites the file that implements it. The companion test pins every
|
|
10
|
+
* item against the actual sources, so drift fails loudly.
|
|
11
|
+
*/
|
|
12
|
+
export interface SkinHostContract {
|
|
13
|
+
/** Per-skin scope marker the theme grammar keys off. */
|
|
14
|
+
scopeMarker: {
|
|
15
|
+
attribute: "data-thread-skin";
|
|
16
|
+
/**
|
|
17
|
+
* Hosts set this per skin on their wrapper; the package
|
|
18
|
+
* ThreadPrimitive.Root additionally hard-codes "digichat"
|
|
19
|
+
* (gallery-thread/thread.aui.tsx) so the first-party thread
|
|
20
|
+
* always matches its theme grammar.
|
|
21
|
+
*/
|
|
22
|
+
setBy: string[];
|
|
23
|
+
};
|
|
24
|
+
/** Tailwind must scan the kit or kit-only utilities are dropped (diamonds). */
|
|
25
|
+
tailwindSources: {
|
|
26
|
+
hostStylesheet: string;
|
|
27
|
+
sourceDirective: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Font variables the grammar references (else the declaration is invalid).
|
|
31
|
+
*
|
|
32
|
+
* DIG-2375 moved the `next/font` call out of the layout into the surface's one
|
|
33
|
+
* font config, so the host now has two files to satisfy: the config that
|
|
34
|
+
* loads the face, and the layout that applies `fontVariables` to `<html>`.
|
|
35
|
+
*/
|
|
36
|
+
fontVariables: {
|
|
37
|
+
/** Face variable the host font config sets. */
|
|
38
|
+
variable: "--font-mono-face";
|
|
39
|
+
/** The single file allowed to call `next/font` for this host. */
|
|
40
|
+
hostFontConfig: string;
|
|
41
|
+
/** Layout that applies `fontVariables` from that config. */
|
|
42
|
+
hostLayout: string;
|
|
43
|
+
/**
|
|
44
|
+
* Retired-name alias the skin CSS still reads. It is a plain CSS alias in
|
|
45
|
+
* `digichat-app-theme.css`, not a loader, so swapping the face never
|
|
46
|
+
* re-ships a second font file.
|
|
47
|
+
*/
|
|
48
|
+
alias: "--font-geist-mono";
|
|
49
|
+
};
|
|
50
|
+
/** Theme dataset + classes the first-party palette hangs off. */
|
|
51
|
+
themeRoot: {
|
|
52
|
+
dataset: "theme";
|
|
53
|
+
classes: ["light", "dark"];
|
|
54
|
+
hostClient: string;
|
|
55
|
+
};
|
|
56
|
+
/** Prefs host gating the `/` palette + `@`-mention. */
|
|
57
|
+
prefsHost: {
|
|
58
|
+
module: string;
|
|
59
|
+
hook: "useStockChatPrefs";
|
|
60
|
+
hostClient: string;
|
|
61
|
+
};
|
|
62
|
+
/** Package stylesheets every stock-skin host must load (WS1). */
|
|
63
|
+
stylesheets: string[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const DIGICHAT_SKIN_HOST_CONTRACT: SkinHostContract = {
|
|
67
|
+
scopeMarker: {
|
|
68
|
+
attribute: "data-thread-skin",
|
|
69
|
+
// Step 1 (single-route plan): ProductStockShell delegates its render core
|
|
70
|
+
// to DigiChatHost, which now renders the marker for all product/embed
|
|
71
|
+
// traffic. chat-shell + embed-client keep their own wrapper markers.
|
|
72
|
+
setBy: [
|
|
73
|
+
"src/components/stock/digichat-host.tsx",
|
|
74
|
+
"src/components/chat-shell.tsx",
|
|
75
|
+
"src/app/(digichat)/embed/embed-client.tsx",
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
tailwindSources: {
|
|
79
|
+
hostStylesheet: "src/app/(baseline)/baseline.css",
|
|
80
|
+
sourceDirective: '@source "../../../../../packages/ui/src/components/chat"',
|
|
81
|
+
},
|
|
82
|
+
fontVariables: {
|
|
83
|
+
variable: "--font-mono-face",
|
|
84
|
+
hostFontConfig: "src/app/fonts.ts",
|
|
85
|
+
hostLayout: "src/app/(baseline)/layout.tsx",
|
|
86
|
+
alias: "--font-geist-mono",
|
|
87
|
+
},
|
|
88
|
+
themeRoot: {
|
|
89
|
+
dataset: "theme",
|
|
90
|
+
classes: ["light", "dark"],
|
|
91
|
+
hostClient: "src/app/(baseline)/baseline/baseline-client.tsx",
|
|
92
|
+
},
|
|
93
|
+
prefsHost: {
|
|
94
|
+
module: "@digithings-ai/ui/chat/stock",
|
|
95
|
+
hook: "useStockChatPrefs",
|
|
96
|
+
hostClient: "src/app/(baseline)/baseline/baseline-client.tsx",
|
|
97
|
+
},
|
|
98
|
+
stylesheets: [
|
|
99
|
+
"@digithings-ai/ui/styles/digichat-app-theme.css",
|
|
100
|
+
"@digithings-ai/ui/styles/chat-digichat.css",
|
|
101
|
+
],
|
|
102
|
+
};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { lazy, Suspense, type FC, type LazyExoticComponent } from "react";
|
|
4
|
+
import type { ComposerLayout } from "@digithings-ai/ui/chat/thread";
|
|
5
|
+
import { isCloneSkin, type CloneSkin, type ThreadSkin } from "./thread-skins";
|
|
6
|
+
import type { DigichatSkinOptions } from "./digichat";
|
|
7
|
+
import { ChatPrivateModeProvider } from "../stock/chat-private-mode";
|
|
8
|
+
|
|
9
|
+
// Per-skin on-demand chunks (WS4 Step 5): each skin ships only when its id is
|
|
10
|
+
// selected. The `.then` interop maps the named export to the default that
|
|
11
|
+
// lazy() expects. Imports of types only (above) are erased, so they pull no
|
|
12
|
+
// chunk; the DigichatSkin *value* must stay out of the barrel for the same
|
|
13
|
+
// reason (hosts render it exclusively through ThreadSkinView).
|
|
14
|
+
const Base = lazy(() =>
|
|
15
|
+
import("./base/thread").then((m) => ({ default: m.Base })),
|
|
16
|
+
);
|
|
17
|
+
const ChatGPT = lazy(() =>
|
|
18
|
+
import("./chatgpt").then((m) => ({ default: m.ChatGPT })),
|
|
19
|
+
);
|
|
20
|
+
const Claude = lazy(() =>
|
|
21
|
+
import("./claude").then((m) => ({ default: m.Claude })),
|
|
22
|
+
);
|
|
23
|
+
const Grok = lazy(() =>
|
|
24
|
+
import("./grok").then((m) => ({ default: m.Grok })),
|
|
25
|
+
);
|
|
26
|
+
const Gemini = lazy(() =>
|
|
27
|
+
import("./gemini").then((m) => ({ default: m.Gemini })),
|
|
28
|
+
);
|
|
29
|
+
const Perplexity = lazy(() =>
|
|
30
|
+
import("./perplexity").then((m) => ({ default: m.Perplexity })),
|
|
31
|
+
);
|
|
32
|
+
const ReactInkWeb = lazy(() =>
|
|
33
|
+
import("./react-ink").then((m) => ({ default: m.ReactInkWeb })),
|
|
34
|
+
);
|
|
35
|
+
const ExpoReactNative = lazy(() =>
|
|
36
|
+
import("./expo-react-native").then((m) => ({ default: m.ExpoReactNative })),
|
|
37
|
+
);
|
|
38
|
+
const ConfigurableBase = lazy(() =>
|
|
39
|
+
import("./base-assistant-ui").then((m) => ({ default: m.ConfigurableBase })),
|
|
40
|
+
);
|
|
41
|
+
const WebpageAssistant = lazy(() =>
|
|
42
|
+
import("./webpage-assistant").then((m) => ({ default: m.WebpageAssistant })),
|
|
43
|
+
);
|
|
44
|
+
const ProductPageAssistant = lazy(() =>
|
|
45
|
+
import("./product-page-assistant").then((m) => ({
|
|
46
|
+
default: m.ProductPageAssistant,
|
|
47
|
+
})),
|
|
48
|
+
);
|
|
49
|
+
const DigichatSkin = lazy(() =>
|
|
50
|
+
import("./digichat").then((m) => ({ default: m.DigichatSkin })),
|
|
51
|
+
);
|
|
52
|
+
// The product `/` palette for every skin that is not digichat (digichat wires
|
|
53
|
+
// the same palette into its own composer). Its own chunk, like the skins.
|
|
54
|
+
const SkinPaletteBridge = lazy(() =>
|
|
55
|
+
import("../stock/skin-palette-bridge").then((m) => ({
|
|
56
|
+
default: m.SkinPaletteBridge,
|
|
57
|
+
})),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const CLONE_THREADS: Record<CloneSkin, LazyExoticComponent<FC>> = {
|
|
61
|
+
chatgpt: ChatGPT,
|
|
62
|
+
claude: Claude,
|
|
63
|
+
grok: Grok,
|
|
64
|
+
gemini: Gemini,
|
|
65
|
+
perplexity: Perplexity,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export type ThreadSkinViewProps = {
|
|
69
|
+
skin: ThreadSkin;
|
|
70
|
+
/** Explicit composer layout for the digichat skin (else expanded). */
|
|
71
|
+
composerLayout?: ComposerLayout;
|
|
72
|
+
/**
|
|
73
|
+
* First-party skin wiring (product copy, slash commands, pending headers).
|
|
74
|
+
* Provided by the host app — e.g. digichat's `DIGICHAT_SKIN_OPTIONS`.
|
|
75
|
+
* The `digichat` branch reads all of it. Every other skin gets the same
|
|
76
|
+
* slash palette (`slash`, `privateMode`) through `SkinPaletteBridge`; the
|
|
77
|
+
* rest (copy, layout) stays digichat-only (WS4).
|
|
78
|
+
*/
|
|
79
|
+
digichat?: DigichatSkinOptions;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Mount the selected Thread: 11 official assistant-ui catalog ids, plus
|
|
84
|
+
* first-party `digichat`. `base` is the fixed Base demo. `base-assistant-ui`
|
|
85
|
+
* is the same Thread inside the official brandTheme / labels config shell.
|
|
86
|
+
* Layout templates wrap a Thread in docs / product chrome.
|
|
87
|
+
* `react-ink` and `expo-react-native` are web facsimiles; TTY / Expo sources
|
|
88
|
+
* stay under `reference/assistant-ui-templates/` and are not imported here.
|
|
89
|
+
*/
|
|
90
|
+
export function ThreadSkinView(props: ThreadSkinViewProps) {
|
|
91
|
+
// Suspense boundary for the per-skin chunks above. Fallback is null so no
|
|
92
|
+
// loading chrome flashes when a newly selected skin's chunk arrives late;
|
|
93
|
+
// once loaded the render is identical to the static version (WS4 Step 5).
|
|
94
|
+
// Every skin reads the session's private flag from here (the message
|
|
95
|
+
// export menus hide, the export runners refuse), not only digichat.
|
|
96
|
+
return (
|
|
97
|
+
<ChatPrivateModeProvider privateMode={props.digichat?.privateMode}>
|
|
98
|
+
<Suspense fallback={null}>
|
|
99
|
+
<ThreadSkinSwitch {...props} />
|
|
100
|
+
</Suspense>
|
|
101
|
+
</ChatPrivateModeProvider>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function ThreadSkinSwitch({
|
|
106
|
+
skin,
|
|
107
|
+
composerLayout,
|
|
108
|
+
digichat,
|
|
109
|
+
}: ThreadSkinViewProps) {
|
|
110
|
+
if (skin === "digichat") {
|
|
111
|
+
return <DigichatSkin composerLayout={composerLayout} {...digichat} />;
|
|
112
|
+
}
|
|
113
|
+
if (!digichat?.slash) return <SkinThread skin={skin} />;
|
|
114
|
+
return (
|
|
115
|
+
<SkinPaletteBridge
|
|
116
|
+
slash={digichat.slash}
|
|
117
|
+
privateMode={digichat.privateMode}
|
|
118
|
+
>
|
|
119
|
+
<SkinThread skin={skin} />
|
|
120
|
+
</SkinPaletteBridge>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function SkinThread({ skin }: { skin: Exclude<ThreadSkin, "digichat"> }) {
|
|
125
|
+
if (isCloneSkin(skin)) {
|
|
126
|
+
const Clone = CLONE_THREADS[skin];
|
|
127
|
+
return <Clone />;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (skin === "base") {
|
|
131
|
+
return <Base />;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (skin === "base-assistant-ui") {
|
|
135
|
+
return <ConfigurableBase />;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (skin === "react-ink") {
|
|
139
|
+
return <ReactInkWeb />;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (skin === "expo-react-native") {
|
|
143
|
+
return <ExpoReactNative />;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (skin === "webpage-assistant") {
|
|
147
|
+
return <WebpageAssistant />;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return <ProductPageAssistant />;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Registry + host contract ship with the skins so any host can list skin ids
|
|
154
|
+
// and satisfy the mount requirements without importing the app (WS4).
|
|
155
|
+
export * from "./thread-skins";
|
|
156
|
+
export * from "./thread-skin-host-contract";
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official assistant-ui templates a digichat container can pick at deploy time.
|
|
3
|
+
*
|
|
4
|
+
* Ids 1–11 match assistant-ui `list_templates`. `digichat` is the first-party
|
|
5
|
+
* Thread — the gallery `/chatbot` module at `@digithings-ai/ui/chat/thread`
|
|
6
|
+
* (`thread.aui.tsx` + slots + cube glyphs), not a catalog clone.
|
|
7
|
+
* `base` is the fixed Base demo. `base-assistant-ui` is the configurable
|
|
8
|
+
* Base shell (brandTheme + labels). Same Thread, different catalog product.
|
|
9
|
+
*
|
|
10
|
+
* They are vendored in the image — not a CDN switch and not shadcn styles.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export const THREAD_SKINS = [
|
|
16
|
+
"base",
|
|
17
|
+
"chatgpt",
|
|
18
|
+
"claude",
|
|
19
|
+
"grok",
|
|
20
|
+
"gemini",
|
|
21
|
+
"perplexity",
|
|
22
|
+
"react-ink",
|
|
23
|
+
"expo-react-native",
|
|
24
|
+
"base-assistant-ui",
|
|
25
|
+
"webpage-assistant",
|
|
26
|
+
"product-page-assistant",
|
|
27
|
+
"digichat",
|
|
28
|
+
] as const;
|
|
29
|
+
|
|
30
|
+
export type ThreadSkin = (typeof THREAD_SKINS)[number];
|
|
31
|
+
|
|
32
|
+
export const DEFAULT_THREAD_SKIN: ThreadSkin = "base";
|
|
33
|
+
|
|
34
|
+
/** First-party marketing / OCC hosts. Unset `skin` → `digichat`, not catalog `base`. */
|
|
35
|
+
export const FIRST_PARTY_DEFAULT_SKIN_HOSTS: ReadonlySet<string> = new Set([
|
|
36
|
+
"digithings.ai",
|
|
37
|
+
"www.digithings.ai",
|
|
38
|
+
"occ.digithings.ai",
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
export const FIRST_PARTY_DEFAULT_SKIN_SLUGS: ReadonlySet<string> = new Set([
|
|
42
|
+
"digithings",
|
|
43
|
+
"digithings-ai",
|
|
44
|
+
"occ",
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Runtime default for a tenant host/slug when YAML / DIGICHAT_EMBED_TENANTS
|
|
49
|
+
* omit `skin`. Third-party tenants stay on catalog `base`. Explicit `skin`
|
|
50
|
+
* must still win at the call site.
|
|
51
|
+
*/
|
|
52
|
+
export function defaultThreadSkinForTenant(opts: {
|
|
53
|
+
host?: string | null;
|
|
54
|
+
slug?: string | null;
|
|
55
|
+
aliases?: readonly string[] | null;
|
|
56
|
+
}): ThreadSkin {
|
|
57
|
+
const hosts = [opts.host, ...(opts.aliases ?? [])];
|
|
58
|
+
for (const raw of hosts) {
|
|
59
|
+
const host = raw?.trim().toLowerCase().split("/")[0].split(":")[0].replace(/\.$/, "");
|
|
60
|
+
if (host && FIRST_PARTY_DEFAULT_SKIN_HOSTS.has(host)) return "digichat";
|
|
61
|
+
}
|
|
62
|
+
const slug = opts.slug?.trim().toLowerCase();
|
|
63
|
+
if (slug && FIRST_PARTY_DEFAULT_SKIN_SLUGS.has(slug)) return "digichat";
|
|
64
|
+
return DEFAULT_THREAD_SKIN;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const CLONE_SKINS = [
|
|
68
|
+
"chatgpt",
|
|
69
|
+
"claude",
|
|
70
|
+
"grok",
|
|
71
|
+
"gemini",
|
|
72
|
+
"perplexity",
|
|
73
|
+
] as const;
|
|
74
|
+
|
|
75
|
+
export type CloneSkin = (typeof CLONE_SKINS)[number];
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Catalog templates that own the viewport (docs shell, product dashboard,
|
|
79
|
+
* Expo phone frame). Host chrome (ChatShell CLI, embed header, memory
|
|
80
|
+
* sidebar) must not wrap these — the template is the page.
|
|
81
|
+
*/
|
|
82
|
+
export const LAYOUT_SKINS = [
|
|
83
|
+
"webpage-assistant",
|
|
84
|
+
"product-page-assistant",
|
|
85
|
+
"expo-react-native",
|
|
86
|
+
] as const;
|
|
87
|
+
|
|
88
|
+
export type LayoutSkin = (typeof LAYOUT_SKINS)[number];
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
export function threadSkinChoices(): string {
|
|
93
|
+
return THREAD_SKINS.join(", ");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function isThreadSkin(value: unknown): value is ThreadSkin {
|
|
97
|
+
return typeof value === "string" && (THREAD_SKINS as readonly string[]).includes(value);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function isCloneSkin(value: ThreadSkin): value is CloneSkin {
|
|
101
|
+
return (CLONE_SKINS as readonly string[]).includes(value);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Skins that carry the digithings website's dotted vertical guide lines
|
|
106
|
+
* (`LayoutLines`). The lines are part of the house look, so only the house
|
|
107
|
+
* skin draws them; every other skin hides them by default.
|
|
108
|
+
*/
|
|
109
|
+
export const SITE_RAILS_SKINS = ["digichat"] as const;
|
|
110
|
+
|
|
111
|
+
export function skinShowsSiteRails(value: string | null | undefined): boolean {
|
|
112
|
+
return (SITE_RAILS_SKINS as readonly string[]).includes(value ?? "");
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function skinOwnsPageChrome(value: ThreadSkin): boolean {
|
|
116
|
+
return (LAYOUT_SKINS as readonly string[]).includes(value);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export const FRAMED_CHROME_MODES = ["modal", "sidebar"] as const;
|
|
120
|
+
export type FramedChromeMode = (typeof FRAMED_CHROME_MODES)[number];
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* True for the modes that mount the chat inside a frame rather than the page.
|
|
124
|
+
*
|
|
125
|
+
* Lives here, not in `components/stock/presentation-frame.tsx`: that module is
|
|
126
|
+
* `"use client"`, and `app/(digichat)/page.tsx` is a server component, so
|
|
127
|
+
* importing the predicate from there made the server *invoke* a client function
|
|
128
|
+
* at render time ("Attempted to call isFramedPresentation() from the server but
|
|
129
|
+
* isFramedPresentation is on the client"). This module is plain, so both sides
|
|
130
|
+
* can share one definition of the invariant.
|
|
131
|
+
*/
|
|
132
|
+
export function isFramedPresentation(mode: string): mode is FramedChromeMode {
|
|
133
|
+
return (FRAMED_CHROME_MODES as readonly string[]).includes(mode);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Parse a query/env/YAML value; unknown → default. */
|
|
137
|
+
export function parseThreadSkin(
|
|
138
|
+
value: string | null | undefined,
|
|
139
|
+
fallback: ThreadSkin = DEFAULT_THREAD_SKIN,
|
|
140
|
+
): ThreadSkin {
|
|
141
|
+
const trimmed = value?.trim().toLowerCase();
|
|
142
|
+
return isThreadSkin(trimmed) ? trimmed : fallback;
|
|
143
|
+
}
|